mirror of https://github.com/apache/activemq.git
Latest spike of the refactor of the code generation; almost done refactoing it so I can look at the C++ code shortly...
git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@379824 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9c4223615d
commit
54db62a395
|
@ -16,6 +16,8 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.activemq.openwire.tool;
|
package org.apache.activemq.openwire.tool;
|
||||||
|
|
||||||
|
import org.codehaus.jam.JClass;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,9 +28,12 @@ public abstract class OpenWireCSharpClassesScript extends OpenWireClassesScript
|
||||||
|
|
||||||
public Object run() {
|
public Object run() {
|
||||||
filePostFix = ".cs";
|
filePostFix = ".cs";
|
||||||
|
if (destDir == null) {
|
||||||
destDir = new File("../openwire-dotnet/src/OpenWire.Client/Commands");
|
destDir = new File("../openwire-dotnet/src/OpenWire.Client/Commands");
|
||||||
|
}
|
||||||
|
|
||||||
return super.run();
|
return super.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,246 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.activemq.openwire.tool;
|
||||||
|
|
||||||
|
import org.codehaus.jam.JAnnotation;
|
||||||
|
import org.codehaus.jam.JAnnotationValue;
|
||||||
|
import org.codehaus.jam.JClass;
|
||||||
|
import org.codehaus.jam.JProperty;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @version $Revision$
|
||||||
|
*/
|
||||||
|
public abstract class OpenWireCSharpMarshallingScript extends OpenWireJavaMarshallingScript {
|
||||||
|
|
||||||
|
public Object run() {
|
||||||
|
filePostFix = ".cs";
|
||||||
|
if (destDir == null) {
|
||||||
|
destDir = new File("../openwire-dotnet/src/OpenWire.Client/IO");
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void generateUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
|
||||||
|
out.print(" ");
|
||||||
|
String propertyName = property.getSimpleName();
|
||||||
|
String type = property.getType().getSimpleName();
|
||||||
|
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("info." + propertyName + " = bs.ReadBoolean();");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
out.println("info." + propertyName + " = dataIn.ReadByte();");
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
out.println("info." + propertyName + " = dataIn.ReadChar();");
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
out.println("info." + propertyName + " = dataIn.ReadInt16();");
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
out.println("info." + propertyName + " = dataIn.ReadInt32();");
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("info." + propertyName + " = UnmarshalLong(wireFormat, dataIn, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("info." + propertyName + " = ReadString(dataIn, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]") || type.equals("ByteSequence")) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("info." + propertyName + " = ReadBytes(dataIn, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("info." + propertyName + " = ReadBytes(dataIn, bs.ReadBoolean());");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isThrowable(property.getType())) {
|
||||||
|
out.println("info." + propertyName + " = UnmarshalBrokerError(wireFormat, dataIn, bs);");
|
||||||
|
}
|
||||||
|
else if (isCachedProperty(property)) {
|
||||||
|
out.println("info." + propertyName + " = (" + type + ") UnmarshalCachedObject(wireFormat, dataIn, bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("info." + propertyName + " = (" + type + ") UnmarshalNestedObject(wireFormat, dataIn, bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String arrayType = propertyType.getArrayComponentType().getSimpleName();
|
||||||
|
String propertyName = property.getSimpleName();
|
||||||
|
out.println();
|
||||||
|
if (size != null) {
|
||||||
|
out.println(" {");
|
||||||
|
out.println(" " + arrayType + "[] value = new " + arrayType + "[" + size.asInt() + "];");
|
||||||
|
out.println(" " + "for( int i=0; i < " + size.asInt() + "; i++ ) {");
|
||||||
|
out.println(" value[i] = (" + arrayType + ") UnmarshalNestedObject(wireFormat,dataIn, bs);");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" info." + propertyName + " = value;");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println(" if (bs.ReadBoolean()) {");
|
||||||
|
out.println(" short size = dataIn.ReadInt16();");
|
||||||
|
out.println(" " + arrayType + "[] value = new " + arrayType + "[size];");
|
||||||
|
out.println(" for( int i=0; i < size; i++ ) {");
|
||||||
|
out.println(" value[i] = (" + arrayType + ") UnmarshalNestedObject(wireFormat,dataIn, bs);");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" info." + propertyName + " = value;");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" else {");
|
||||||
|
out.println(" info." + propertyName + " = null;");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int generateMarshal1Body(PrintWriter out) {
|
||||||
|
List properties = getProperties();
|
||||||
|
int baseSize = 0;
|
||||||
|
for (Iterator iter = properties.iterator(); iter.hasNext();) {
|
||||||
|
JProperty property = (JProperty) iter.next();
|
||||||
|
JAnnotation annotation = property.getAnnotation("openwire:property");
|
||||||
|
JAnnotationValue size = annotation.getValue("size");
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String type = propertyType.getSimpleName();
|
||||||
|
String getter = "info." + property.getSimpleName();
|
||||||
|
|
||||||
|
out.print(indent);
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("bs.WriteBoolean(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("rc += Marshal1Long(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("rc += WriteString(" + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]") || type.equals("ByteSequence")) {
|
||||||
|
if (size == null) {
|
||||||
|
out.println("bs.WriteBoolean(" + getter + "!=null);");
|
||||||
|
out.println(" rc += " + getter + "==null ? 0 : " + getter + ".Length+4;");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
baseSize += size.asInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (propertyType.isArrayType()) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("rc += MarshalObjectArrayConstSize(wireFormat, " + getter + ", bs, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("rc += MarshalObjectArray(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isThrowable(propertyType)) {
|
||||||
|
out.println("rc += MarshalBrokerError(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isCachedProperty(property)) {
|
||||||
|
out.println("rc += Marshal1CachedObject(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("rc += Marshal1NestedObject(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return baseSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateMarshal2Body(PrintWriter out) {
|
||||||
|
List properties = getProperties();
|
||||||
|
for (Iterator iter = properties.iterator(); iter.hasNext();) {
|
||||||
|
JProperty property = (JProperty) iter.next();
|
||||||
|
JAnnotation annotation = property.getAnnotation("openwire:property");
|
||||||
|
JAnnotationValue size = annotation.getValue("size");
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String type = propertyType.getSimpleName();
|
||||||
|
String getter = "info." + property.getSimpleName();
|
||||||
|
|
||||||
|
out.print(indent);
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("bs.ReadBoolean();");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
out.println("dataOut.Write((byte) " + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
out.println("dataOut.Write((char) " + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
out.println("dataOut.Write((short)" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
out.println("dataOut.Write((int) " + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("Marshal2Long(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("WriteString(" + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]") || type.equals("ByteSequence")) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("dataOut.WriteBytes(" + getter + ", 0, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("if(bs.ReadBoolean()) {");
|
||||||
|
out.println(" dataOut.Write((int)" + getter + ".Length);");
|
||||||
|
out.println(" dataOut.Write(" + getter + ");");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (propertyType.isArrayType()) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("MarshalObjectArrayConstSize(wireFormat, " + getter + ", dataOut, bs, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("MarshalObjectArray(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isThrowable(propertyType)) {
|
||||||
|
out.println("MarshalBrokerError(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isCachedProperty(property)) {
|
||||||
|
out.println("Marshal2CachedObject(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("Marshal2NestedObject(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,9 +31,8 @@ import java.util.*;
|
||||||
*/
|
*/
|
||||||
public abstract class OpenWireClassesScript extends OpenWireScript {
|
public abstract class OpenWireClassesScript extends OpenWireScript {
|
||||||
protected Set manuallyMaintainedClasses = new HashSet();
|
protected Set manuallyMaintainedClasses = new HashSet();
|
||||||
protected File destDir = new File("target/generated/classes");
|
protected File destDir;
|
||||||
protected File destFile;
|
protected File destFile;
|
||||||
protected String filePostFix = "";
|
|
||||||
|
|
||||||
protected JClass jclass;
|
protected JClass jclass;
|
||||||
protected JClass superclass;
|
protected JClass superclass;
|
||||||
|
@ -43,16 +42,14 @@ public abstract class OpenWireClassesScript extends OpenWireScript {
|
||||||
protected StringBuffer buffer;
|
protected StringBuffer buffer;
|
||||||
|
|
||||||
public OpenWireClassesScript() {
|
public OpenWireClassesScript() {
|
||||||
String[] names = { "ActiveMQDestination", "ActiveMQTempDestination", "ActiveMQQueue", "ActiveMQTopic", "ActiveMQTempQueue", "ActiveMQTempTopic",
|
initialiseManuallyMaintainedClasses();
|
||||||
"BaseCommand", "ActiveMQMessage", "ActiveMQTextMessage", "ActiveMQMapMessage", "ActiveMQBytesMessage", "ActiveMQStreamMessage",
|
|
||||||
"ActiveMQStreamMessage", "DataStructureSupport" };
|
|
||||||
|
|
||||||
for (int i = 0; i < names.length; i++) {
|
|
||||||
manuallyMaintainedClasses.add(names[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object run() {
|
public Object run() {
|
||||||
|
if (destDir == null) {
|
||||||
|
throw new IllegalArgumentException("No destDir defined!");
|
||||||
|
}
|
||||||
|
System.out.println(getClass().getName() + " generating files in: " + destDir);
|
||||||
destDir.mkdirs();
|
destDir.mkdirs();
|
||||||
buffer = new StringBuffer();
|
buffer = new StringBuffer();
|
||||||
|
|
||||||
|
@ -132,4 +129,26 @@ public abstract class OpenWireClassesScript extends OpenWireScript {
|
||||||
return jclass.getSimpleName();
|
return jclass.getSimpleName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAbstractClass() {
|
||||||
|
return jclass != null & jclass.isAbstract();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAbstractClassText() {
|
||||||
|
return isAbstractClass() ? "abstract " : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMarshallerAware() {
|
||||||
|
return isMarshallAware(jclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initialiseManuallyMaintainedClasses() {
|
||||||
|
String[] names = { "ActiveMQDestination", "ActiveMQTempDestination", "ActiveMQQueue", "ActiveMQTopic", "ActiveMQTempQueue", "ActiveMQTempTopic",
|
||||||
|
"BaseCommand", "ActiveMQMessage", "ActiveMQTextMessage", "ActiveMQMapMessage", "ActiveMQBytesMessage", "ActiveMQStreamMessage",
|
||||||
|
"ActiveMQStreamMessage", "DataStructureSupport" };
|
||||||
|
|
||||||
|
for (int i = 0; i < names.length; i++) {
|
||||||
|
manuallyMaintainedClasses.add(names[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,9 @@ public abstract class OpenWireCppClassesScript extends OpenWireClassesScript {
|
||||||
|
|
||||||
public Object run() {
|
public Object run() {
|
||||||
filePostFix = getFilePostFix();
|
filePostFix = getFilePostFix();
|
||||||
|
if (destDir == null) {
|
||||||
destDir = new File("../openwire-cpp/src/command");
|
destDir = new File("../openwire-cpp/src/command");
|
||||||
|
}
|
||||||
return super.run();
|
return super.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,347 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.activemq.openwire.tool;
|
||||||
|
|
||||||
|
import org.codehaus.jam.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @version $Revision$
|
||||||
|
*/
|
||||||
|
public abstract class OpenWireJavaMarshallingScript extends OpenWireClassesScript {
|
||||||
|
|
||||||
|
protected List concreteClasses = new ArrayList();
|
||||||
|
protected File factoryFile;
|
||||||
|
protected String factoryFileName = "MarshallerFactory";
|
||||||
|
protected String indent = " ";
|
||||||
|
|
||||||
|
public Object run() {
|
||||||
|
if (destDir == null) {
|
||||||
|
destDir = new File("src/main/java/org/apache/activemq/openwire/v" + getOpenwireVersion());
|
||||||
|
}
|
||||||
|
Object answer = super.run();
|
||||||
|
processFactory();
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processFactory() {
|
||||||
|
if (factoryFile == null) {
|
||||||
|
factoryFile = new File(destDir, factoryFileName + filePostFix);
|
||||||
|
}
|
||||||
|
PrintWriter out = null;
|
||||||
|
try {
|
||||||
|
out = new PrintWriter(new FileWriter(factoryFile));
|
||||||
|
generateFactory(out);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void generateFactory(PrintWriter out);
|
||||||
|
|
||||||
|
protected void processClass(JClass jclass) {
|
||||||
|
super.processClass(jclass);
|
||||||
|
|
||||||
|
if (!jclass.isAbstract()) {
|
||||||
|
concreteClasses.add(jclass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getClassName(JClass jclass) {
|
||||||
|
return super.getClassName(jclass) + "Marshaller";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBaseClassName(JClass jclass) {
|
||||||
|
String answer = "DataStreamMarshaller";
|
||||||
|
JClass superclass = jclass.getSuperclass();
|
||||||
|
if (superclass != null) {
|
||||||
|
String superName = superclass.getSimpleName();
|
||||||
|
if (!superName.equals("Object") && !superName.equals("JNDIBaseStorable") && !superName.equals("DataStructureSupport")) {
|
||||||
|
answer = superName + "Marshaller";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initialiseManuallyMaintainedClasses() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateUnmarshalBody(PrintWriter out) {
|
||||||
|
List properties = getProperties();
|
||||||
|
for (Iterator iter = properties.iterator(); iter.hasNext();) {
|
||||||
|
JProperty property = (JProperty) iter.next();
|
||||||
|
JAnnotation annotation = property.getAnnotation("openwire:property");
|
||||||
|
JAnnotationValue size = annotation.getValue("size");
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String propertyTypeName = propertyType.getSimpleName();
|
||||||
|
|
||||||
|
if (propertyType.isArrayType() && !propertyTypeName.equals("byte[]")) {
|
||||||
|
generateUnmarshalBodyForArrayProperty(out, property, size);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
generateUnmarshalBodyForProperty(out, property, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
|
||||||
|
out.print(" ");
|
||||||
|
String setter = property.getSetter().getSimpleName();
|
||||||
|
String type = property.getType().getSimpleName();
|
||||||
|
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("info." + setter + "(bs.readBoolean());");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
out.println("info." + setter + "(dataIn.readByte());");
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
out.println("info." + setter + "(dataIn.readChar());");
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
out.println("info." + setter + "(dataIn.readShort());");
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
out.println("info." + setter + "(dataIn.readInt());");
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("info." + setter + "(unmarshalLong(wireFormat, dataIn, bs));");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("info." + setter + "(readString(dataIn, bs));");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]")) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("{");
|
||||||
|
out.println(" byte data[] = new byte[" + size.asInt() + "];");
|
||||||
|
out.println(" dataIn.readFully(data);");
|
||||||
|
out.println(" info." + setter + "(data);");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("if( bs.readBoolean() ) {");
|
||||||
|
out.println(" int size = dataIn.readInt();");
|
||||||
|
out.println(" byte data[] = new byte[size];");
|
||||||
|
out.println(" dataIn.readFully(data);");
|
||||||
|
out.println(" info." + setter + "(data);");
|
||||||
|
out.println(" } else {");
|
||||||
|
out.println(" info." + setter + "(null);");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type.equals("ByteSequence")) {
|
||||||
|
out.println("if( bs.readBoolean() ) {");
|
||||||
|
out.println(" int size = dataIn.readInt();");
|
||||||
|
out.println(" byte data[] = new byte[size];");
|
||||||
|
out.println(" dataIn.readFully(data);");
|
||||||
|
out.println(" info." + setter + "(new org.activeio.ByteSequence(data,0,size));");
|
||||||
|
out.println(" } else {");
|
||||||
|
out.println(" info." + setter + "(null);");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
else if (isThrowable(property.getType())) {
|
||||||
|
out.println("info." + setter + "((" + type + ") unmarsalThrowable(wireFormat, dataIn, bs));");
|
||||||
|
}
|
||||||
|
else if (isCachedProperty(property)) {
|
||||||
|
out.println("info." + setter + "((" + type + ") unmarsalCachedObject(wireFormat, dataIn, bs));");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("info." + setter + "((" + type + ") unmarsalNestedObject(wireFormat, dataIn, bs));");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String arrayType = propertyType.getArrayComponentType().getSimpleName();
|
||||||
|
String setter = property.getSetter().getSimpleName();
|
||||||
|
out.println();
|
||||||
|
if (size != null) {
|
||||||
|
out.println(" {");
|
||||||
|
out.println(" " + arrayType + " value[] = new " + arrayType + "[" + size.asInt() + "];");
|
||||||
|
out.println(" " + "for( int i=0; i < " + size.asInt() + "; i++ ) {");
|
||||||
|
out.println(" value[i] = (" + arrayType + ") unmarsalNestedObject(wireFormat,dataIn, bs);");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" info." + setter + "(value);");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println(" if (bs.readBoolean()) {");
|
||||||
|
out.println(" short size = dataIn.readShort();");
|
||||||
|
out.println(" " + arrayType + " value[] = new " + arrayType + "[size];");
|
||||||
|
out.println(" for( int i=0; i < size; i++ ) {");
|
||||||
|
out.println(" value[i] = (" + arrayType + ") unmarsalNestedObject(wireFormat,dataIn, bs);");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" info." + setter + "(value);");
|
||||||
|
out.println(" }");
|
||||||
|
out.println(" else {");
|
||||||
|
out.println(" info." + setter + "(null);");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int generateMarshal1Body(PrintWriter out) {
|
||||||
|
List properties = getProperties();
|
||||||
|
int baseSize = 0;
|
||||||
|
for (Iterator iter = properties.iterator(); iter.hasNext();) {
|
||||||
|
JProperty property = (JProperty) iter.next();
|
||||||
|
JAnnotation annotation = property.getAnnotation("openwire:property");
|
||||||
|
JAnnotationValue size = annotation.getValue("size");
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String type = propertyType.getSimpleName();
|
||||||
|
String getter = "info." + property.getGetter().getSimpleName() + "()";
|
||||||
|
|
||||||
|
out.print(indent);
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("bs.writeBoolean(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
baseSize += 1;
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("rc+=marshal1Long(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("rc += writeString(" + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]")) {
|
||||||
|
if (size == null) {
|
||||||
|
out.println("bs.writeBoolean(" + getter + "!=null);");
|
||||||
|
out.println(" rc += " + getter + "==null ? 0 : " + getter + ".length+4;");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
baseSize += size.asInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type.equals("ByteSequence")) {
|
||||||
|
out.println("bs.writeBoolean(" + getter + "!=null);");
|
||||||
|
out.println(" rc += " + getter + "==null ? 0 : " + getter + ".getLength()+4;");
|
||||||
|
}
|
||||||
|
else if (propertyType.isArrayType()) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("rc += marshalObjectArrayConstSize(wireFormat, " + getter + ", bs, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("rc += marshalObjectArray(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isThrowable(propertyType)) {
|
||||||
|
out.println("rc += marshalThrowable(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isCachedProperty(property)) {
|
||||||
|
out.println("rc += marshal1CachedObject(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("rc += marshal1NestedObject(wireFormat, " + getter + ", bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return baseSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void generateMarshal2Body(PrintWriter out) {
|
||||||
|
List properties = getProperties();
|
||||||
|
for (Iterator iter = properties.iterator(); iter.hasNext();) {
|
||||||
|
JProperty property = (JProperty) iter.next();
|
||||||
|
JAnnotation annotation = property.getAnnotation("openwire:property");
|
||||||
|
JAnnotationValue size = annotation.getValue("size");
|
||||||
|
JClass propertyType = property.getType();
|
||||||
|
String type = propertyType.getSimpleName();
|
||||||
|
String getter = "info." + property.getGetter().getSimpleName() + "()";
|
||||||
|
|
||||||
|
out.print(indent);
|
||||||
|
if (type.equals("boolean")) {
|
||||||
|
out.println("bs.readBoolean();");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte")) {
|
||||||
|
out.println("dataOut.writeByte(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("char")) {
|
||||||
|
out.println("dataOut.writeChar(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("short")) {
|
||||||
|
out.println("dataOut.writeShort(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("int")) {
|
||||||
|
out.println("dataOut.writeInt(" + getter + ");");
|
||||||
|
}
|
||||||
|
else if (type.equals("long")) {
|
||||||
|
out.println("marshal2Long(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("String")) {
|
||||||
|
out.println("writeString(" + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else if (type.equals("byte[]")) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("dataOut.write(" + getter + ", 0, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("if(bs.readBoolean()) {");
|
||||||
|
out.println(" dataOut.writeInt(" + getter + ".length);");
|
||||||
|
out.println(" dataOut.write(" + getter + ");");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type.equals("ByteSequence")) {
|
||||||
|
out.println("if(bs.readBoolean()) {");
|
||||||
|
out.println(" org.activeio.ByteSequence data = " + getter + ";");
|
||||||
|
out.println(" dataOut.writeInt(data.getLength());");
|
||||||
|
out.println(" dataOut.write(data.getData(), data.getOffset(), data.getLength());");
|
||||||
|
out.println(" }");
|
||||||
|
}
|
||||||
|
else if (propertyType.isArrayType()) {
|
||||||
|
if (size != null) {
|
||||||
|
out.println("marshalObjectArrayConstSize(wireFormat, " + getter + ", dataOut, bs, " + size.asInt() + ");");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("marshalObjectArray(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isThrowable(propertyType)) {
|
||||||
|
out.println("marshalThrowable(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isCachedProperty(property)) {
|
||||||
|
out.println("marshal2CachedObject(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
out.println("marshal2NestedObject(wireFormat, " + getter + ", dataOut, bs);");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,10 +30,12 @@ import org.codehaus.jam.JamService;
|
||||||
*/
|
*/
|
||||||
public abstract class OpenWireScript extends GramSupport {
|
public abstract class OpenWireScript extends GramSupport {
|
||||||
|
|
||||||
|
private String openwireVersion;
|
||||||
|
protected String filePostFix = ".java";
|
||||||
|
|
||||||
public boolean isValidProperty(JProperty it) {
|
public boolean isValidProperty(JProperty it) {
|
||||||
JMethod getter = it.getGetter();
|
JMethod getter = it.getGetter();
|
||||||
return getter != null && it.getSetter() != null && getter.isStatic() == false
|
return getter != null && it.getSetter() != null && getter.isStatic() == false && getter.getAnnotation("openwire:property") != null;
|
||||||
&& getter.getAnnotation("openwire:property") != null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCachedProperty(JProperty it) {
|
public boolean isCachedProperty(JProperty it) {
|
||||||
|
@ -48,8 +50,7 @@ public abstract class OpenWireScript extends GramSupport {
|
||||||
JField[] fields = j.getFields();
|
JField[] fields = j.getFields();
|
||||||
for (int i = 0; i < fields.length; i++) {
|
for (int i = 0; i < fields.length; i++) {
|
||||||
JField field = fields[i];
|
JField field = fields[i];
|
||||||
if (field.isStatic() && field.isPublic() && field.isFinal()
|
if (field.isStatic() && field.isPublic() && field.isFinal() && field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
|
||||||
&& field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,13 +65,25 @@ public abstract class OpenWireScript extends GramSupport {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMarshallAware(JClass j) {
|
public boolean isMarshallAware(JClass j) {
|
||||||
|
if (filePostFix.endsWith("java")) {
|
||||||
JClass[] interfaces = j.getInterfaces();
|
JClass[] interfaces = j.getInterfaces();
|
||||||
for (int i = 0; i < interfaces.length; i++) {
|
for (int i = 0; i < interfaces.length; i++) {
|
||||||
if (interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware")) {
|
if (interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false; //j.getSuperclass()!=null && isMarshallAware(j.getSuperclass());
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String simpleName = j.getSimpleName();
|
||||||
|
return simpleName.equals("ActiveMQMessage");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* else { // is it a message type String simpleName = j.getSimpleName();
|
||||||
|
* JClass superclass = j.getSuperclass(); return
|
||||||
|
* simpleName.equals("ActiveMQMessage") || (superclass != null &&
|
||||||
|
* superclass.getSimpleName().equals("ActiveMQMessage")); }
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public JamService getJam() {
|
public JamService getJam() {
|
||||||
|
@ -81,6 +94,17 @@ public abstract class OpenWireScript extends GramSupport {
|
||||||
return getJam().getClasses();
|
return getJam().getClasses();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getOpenwireVersion() {
|
||||||
|
if (openwireVersion == null) {
|
||||||
|
openwireVersion = System.getProperty("openwire.version");
|
||||||
|
}
|
||||||
|
return openwireVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpenwireVersion(String openwireVersion) {
|
||||||
|
this.openwireVersion = openwireVersion;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the Java type to a C# type name
|
* Converts the Java type to a C# type name
|
||||||
*/
|
*/
|
||||||
|
@ -103,7 +127,6 @@ public abstract class OpenWireScript extends GramSupport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getOpenWireOpCode(JClass aClass) {
|
public String getOpenWireOpCode(JClass aClass) {
|
||||||
return annotationValue(aClass, "openwire:marshaller", "code", "0");
|
return annotationValue(aClass, "openwire:marshaller", "code", "0");
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ namespace OpenWire.Client.Commands
|
||||||
// TODO generate ToString method
|
// TODO generate ToString method
|
||||||
|
|
||||||
|
|
||||||
public override byte GetCommandType() {
|
public override byte GetDataStructureType() {
|
||||||
return ID_${jclass.simpleName};
|
return ID_${jclass.simpleName};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,87 +14,31 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import org.apache.activemq.openwire.tool.OpenWireScript
|
import org.apache.activemq.openwire.tool.OpenWireCSharpMarshallingScript
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the Java marshalling code for the Open Wire Format
|
* Generates the C# marshalling code for the Open Wire Format
|
||||||
*
|
*
|
||||||
* @version $Revision$
|
* @version $Revision$
|
||||||
*/
|
*/
|
||||||
class GenerateCSharpMarshalling extends OpenWireScript {
|
class GenerateCSharpMarshalling extends OpenWireCSharpMarshallingScript {
|
||||||
|
|
||||||
Object run() {
|
void generateFile(PrintWriter out) {
|
||||||
def destDir = new File("../openwire-dotnet/src/OpenWire.Client/IO")
|
|
||||||
destDir.mkdirs()
|
|
||||||
|
|
||||||
def messageClasses = classes.findAll {
|
|
||||||
it.getAnnotation("openwire:marshaller")!=null
|
|
||||||
}
|
|
||||||
|
|
||||||
println "Generating Java marshalling code to directory ${destDir}"
|
|
||||||
|
|
||||||
def buffer = new StringBuffer()
|
|
||||||
def readMethodBuffer = new StringBuffer()
|
|
||||||
def writeMethodBuffer = new StringBuffer()
|
|
||||||
|
|
||||||
int counter = 0
|
|
||||||
Map map = [:]
|
|
||||||
def propertyList = null
|
|
||||||
def type = null
|
|
||||||
|
|
||||||
for (jclass in messageClasses) {
|
|
||||||
|
|
||||||
println "Processing $jclass.simpleName"
|
|
||||||
|
|
||||||
propertyList = jclass.declaredProperties.findAll { isValidProperty(it) }
|
|
||||||
def file = new File(destDir, jclass.simpleName + "Marshaller.cs")
|
|
||||||
|
|
||||||
String baseClass = "AbstractCommandMarshaller"
|
|
||||||
if (jclass.superclass?.simpleName == "ActiveMQMessage") {
|
|
||||||
baseClass = "ActiveMQMessageMarshaller"
|
|
||||||
}
|
|
||||||
|
|
||||||
//def notAbstract = jclass.simpleName != "ActiveMQDestination"
|
|
||||||
def notAbstract = jclass.isAbstract() == false
|
|
||||||
def abstractText = (notAbstract) ? "" : "abstract "
|
|
||||||
|
|
||||||
def marshallerType = jclass.simpleName + "Marshaller"
|
|
||||||
def marshallerField = decapitalize(marshallerType)
|
|
||||||
|
|
||||||
if (notAbstract) {
|
|
||||||
buffer << """
|
|
||||||
|
|
||||||
private static $marshallerType $marshallerField = new $marshallerType();
|
|
||||||
|
|
||||||
public static $marshallerType $marshallerType
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return $marshallerField;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"""
|
|
||||||
readMethodBuffer << """
|
|
||||||
case ${jclass.simpleName}.ID_${jclass.simpleName}:
|
|
||||||
return ${marshallerField}.ReadCommand(dataIn);
|
|
||||||
|
|
||||||
"""
|
|
||||||
writeMethodBuffer << """
|
|
||||||
case ${jclass.simpleName}.ID_${jclass.simpleName}:
|
|
||||||
${marshallerField}.WriteCommand(command, dataOut);
|
|
||||||
break;
|
|
||||||
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
file.withWriter { out |
|
|
||||||
out << """//
|
out << """//
|
||||||
// Marshalling code for Open Wire Format for ${jclass.simpleName}
|
|
||||||
//
|
//
|
||||||
|
// Copyright 2005-2006 The Apache Software Foundation
|
||||||
//
|
//
|
||||||
// NOTE!: This file is autogenerated - do not modify!
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
// if you need to make a change, please see the Groovy scripts in the
|
// you may not use this file except in compliance with the License.
|
||||||
// activemq-openwire module
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
@ -108,221 +52,124 @@ using OpenWire.Client.IO;
|
||||||
|
|
||||||
namespace OpenWire.Client.IO
|
namespace OpenWire.Client.IO
|
||||||
{
|
{
|
||||||
public ${abstractText}class $marshallerType : $baseClass
|
//
|
||||||
|
// Marshalling code for Open Wire Format for ${jclass.simpleName}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// NOTE!: This file is autogenerated - do not modify!
|
||||||
|
// if you need to make a change, please see the Groovy scripts in the
|
||||||
|
// activemq-core module
|
||||||
|
//
|
||||||
|
public ${abstractClassText}class $className : $baseClass
|
||||||
{
|
{
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if (notAbstract)
|
|
||||||
out << """
|
if( !abstractClass ) out << """
|
||||||
public override Command CreateCommand() {
|
|
||||||
|
public override DataStructure CreateObject()
|
||||||
|
{
|
||||||
return new ${jclass.simpleName}();
|
return new ${jclass.simpleName}();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override byte GetDataStructureType()
|
||||||
|
{
|
||||||
|
return ${jclass.simpleName}.ID_${jclass.simpleName};
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
public override void BuildCommand(Command command, BinaryReader dataIn) {
|
//
|
||||||
base.BuildCommand(command, dataIn);
|
// Un-marshal an object instance from the data input stream
|
||||||
|
//
|
||||||
|
public override void Unmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs)
|
||||||
|
{
|
||||||
|
base.Unmarshal(wireFormat, o, dataIn, bs);
|
||||||
"""
|
"""
|
||||||
if (!propertyList.empty) {
|
|
||||||
out << """
|
if( !properties.isEmpty() || marshallerAware ) out << """
|
||||||
${jclass.simpleName} info = (${jclass.simpleName}) command;
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
for (property in propertyList) {
|
|
||||||
def propertyName = property.simpleName
|
|
||||||
out << " info.${propertyName} = "
|
|
||||||
|
|
||||||
type = toCSharpType(property.type)
|
if( marshallerAware ) out << """
|
||||||
switch (type) {
|
info.BeforeUnmarshall(wireFormat);
|
||||||
case "string":
|
|
||||||
out << "dataIn.ReadString()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "bool":
|
|
||||||
out << "dataIn.ReadBoolean()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "byte":
|
|
||||||
out << "dataIn.ReadByte()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "byte[]":
|
|
||||||
out << "ReadBytes(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "char":
|
|
||||||
out << "dataIn.ReadChar()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "short":
|
|
||||||
out << "dataIn.ReadInt16()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "int":
|
|
||||||
out << "dataIn.ReadInt32()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "long":
|
|
||||||
out << "dataIn.ReadInt64()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "float":
|
|
||||||
out << "dataIn.ReadDecimal()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "double":
|
|
||||||
out << "dataIn.ReadDouble()"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "ActiveMQDestination":
|
|
||||||
out << "ReadDestination(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerError":
|
|
||||||
out << "ReadBrokerError(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerId[]":
|
|
||||||
out << "ReadBrokerIds(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerInfo[]":
|
|
||||||
out << "ReadBrokerInfos(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "DataStructure[]":
|
|
||||||
out << "ReadDataStructures(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "DataStructure":
|
|
||||||
out << "CommandMarshallerRegistry.ReadCommand(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "Throwable":
|
|
||||||
out << "ReadThrowable(dataIn)"
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (property.type.isAbstract())
|
|
||||||
out << "(${type}) CommandMarshallerRegistry.ReadCommand(dataIn)"
|
|
||||||
else
|
|
||||||
out << "(${type}) CommandMarshallerRegistry.${type}Marshaller.ReadCommand(dataIn)"
|
|
||||||
}
|
|
||||||
out << """;
|
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
|
generateUnmarshalBody(out)
|
||||||
|
|
||||||
|
if( marshallerAware ) out << """
|
||||||
|
info.AfterUnmarshall(wireFormat);
|
||||||
|
"""
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WriteCommand(Command command, BinaryWriter dataOut) {
|
|
||||||
base.WriteCommand(command, dataOut);
|
//
|
||||||
|
// Write the booleans that this object uses to a BooleanStream
|
||||||
|
//
|
||||||
|
public override int Marshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs) {
|
||||||
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
"""
|
"""
|
||||||
if (!propertyList.empty) {
|
|
||||||
|
|
||||||
|
if( marshallerAware ) out << """
|
||||||
|
info.BeforeMarshall(wireFormat);
|
||||||
|
"""
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
${jclass.simpleName} info = (${jclass.simpleName}) command;
|
int rc = base.Marshal1(wireFormat, info, bs);
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
|
|
||||||
for (property in propertyList) {
|
def baseSize = generateMarshal1Body(out)
|
||||||
def propertyName = property.simpleName
|
|
||||||
if (propertyName == jclass.simpleName) {
|
|
||||||
// TODO think of a better naming convention :)
|
|
||||||
propertyName += "Value"
|
|
||||||
}
|
|
||||||
def getter = "info." + propertyName
|
|
||||||
out << " "
|
|
||||||
|
|
||||||
type = toCSharpType(property.type)
|
|
||||||
switch (type) {
|
|
||||||
case "string":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "bool":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "byte":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "byte[]":
|
|
||||||
out << "WriteBytes($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "char":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "short":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "int":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "long":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "float":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "double":
|
|
||||||
out << "dataOut.Write($getter);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "ActiveMQDestination":
|
|
||||||
out << "WriteDestination($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerError":
|
|
||||||
out << "WriteBrokerError($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerId[]":
|
|
||||||
out << "WriteBrokerIds($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "BrokerInfo[]":
|
|
||||||
out << "WriteBrokerInfos($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "DataStructure[]":
|
|
||||||
out << "WriteDataStructures($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "DataStructure":
|
|
||||||
out << "CommandMarshallerRegistry.WriteCommand((Command) $getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "Throwable":
|
|
||||||
out << "WriteThrowable($getter, dataOut);"
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (property.type.isAbstract())
|
|
||||||
out << "CommandMarshallerRegistry.WriteCommand($getter, dataOut);"
|
|
||||||
else
|
|
||||||
out << "CommandMarshallerRegistry.${type}Marshaller.WriteCommand($getter, dataOut);"
|
|
||||||
}
|
|
||||||
out << """
|
out << """
|
||||||
"""
|
return rc + ${baseSize};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a object instance to data output stream
|
||||||
|
//
|
||||||
|
public override void Marshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs) {
|
||||||
|
base.Marshal2(wireFormat, o, dataOut, bs);
|
||||||
|
"""
|
||||||
|
|
||||||
|
if( !properties.isEmpty() || marshallerAware ) out << """
|
||||||
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
|
"""
|
||||||
|
|
||||||
|
generateMarshal2Body(out)
|
||||||
|
|
||||||
|
if( marshallerAware ) out << """
|
||||||
|
info.AfterMarshall(wireFormat);
|
||||||
|
"""
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
def file = new File(destDir, "CommandMarshallerRegistry.cs")
|
|
||||||
file.withWriter { out |
|
void generateFactory(PrintWriter out) {
|
||||||
out << """//
|
out << """//
|
||||||
|
//
|
||||||
|
// Copyright 2005-2006 The Apache Software Foundation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
// Marshalling code for Open Wire Format for ${jclass.simpleName}
|
// Marshalling code for Open Wire Format for ${jclass.simpleName}
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -342,40 +189,22 @@ using OpenWire.Client.IO;
|
||||||
|
|
||||||
namespace OpenWire.Client.IO
|
namespace OpenWire.Client.IO
|
||||||
{
|
{
|
||||||
public class CommandMarshallerRegistry
|
public class MarshallerFactory
|
||||||
{
|
{
|
||||||
public static Command ReadCommand(BinaryReader dataIn)
|
public void configure(OpenWireFormat format)
|
||||||
{
|
{
|
||||||
byte commandID = dataIn.ReadByte();
|
"""
|
||||||
switch (commandID)
|
|
||||||
{
|
for (jclass in concreteClasses) {
|
||||||
$readMethodBuffer
|
out << """
|
||||||
default:
|
format.addMarshaller(new ${jclass.simpleName}Marshaller());"""
|
||||||
throw new Exception("Unknown command type: " + commandID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out << """
|
||||||
public static void WriteCommand(Command command, BinaryWriter dataOut)
|
|
||||||
{
|
|
||||||
byte commandID = command.GetCommandType();
|
|
||||||
dataOut.Write(commandID);
|
|
||||||
switch (commandID)
|
|
||||||
{
|
|
||||||
$writeMethodBuffer
|
|
||||||
default:
|
|
||||||
throw new Exception("Unknown command type: " + commandID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Properties
|
|
||||||
$buffer
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,49 +14,16 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import org.apache.activemq.openwire.tool.OpenWireScript
|
import org.apache.activemq.openwire.tool.OpenWireJavaMarshallingScript
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the Java marshalling code for the Open Wire Format
|
* Generates the Java marshalling code for the Open Wire Format
|
||||||
*
|
*
|
||||||
* @version $Revision$
|
* @version $Revision$
|
||||||
*/
|
*/
|
||||||
class GenerateJavaMarshalling extends OpenWireScript {
|
class GenerateJavaMarshalling extends OpenWireJavaMarshallingScript {
|
||||||
|
|
||||||
Object run() {
|
void generateFile(PrintWriter out) {
|
||||||
|
|
||||||
def openwireVersion = System.getProperty("openwire.version");
|
|
||||||
|
|
||||||
def destDir = new File("src/main/java/org/apache/activemq/openwire/v${openwireVersion}")
|
|
||||||
println "Generating Java marshalling code to directory ${destDir}"
|
|
||||||
|
|
||||||
def openwireClasses = classes.findAll {
|
|
||||||
it.getAnnotation("openwire:marshaller")!=null
|
|
||||||
}
|
|
||||||
|
|
||||||
def concreteClasses = new ArrayList()
|
|
||||||
def buffer = new StringBuffer()
|
|
||||||
int counter = 0
|
|
||||||
Map map = [:]
|
|
||||||
|
|
||||||
destDir.mkdirs()
|
|
||||||
for (jclass in openwireClasses) {
|
|
||||||
|
|
||||||
println "Processing ${jclass.simpleName}"
|
|
||||||
def isAbstract = isAbstract(jclass);
|
|
||||||
if( !isAbstract ) {
|
|
||||||
concreteClasses.add(jclass)
|
|
||||||
}
|
|
||||||
|
|
||||||
def properties = jclass.declaredProperties.findAll { isValidProperty(it) }
|
|
||||||
|
|
||||||
def file = new File(destDir, jclass.simpleName + "Marshaller.java")
|
|
||||||
|
|
||||||
buffer << """
|
|
||||||
${jclass.simpleName}Marshaller.class
|
|
||||||
"""
|
|
||||||
|
|
||||||
file.withWriter { out |
|
|
||||||
out << """/**
|
out << """/**
|
||||||
*
|
*
|
||||||
* Copyright 2005-2006 The Apache Software Foundation
|
* Copyright 2005-2006 The Apache Software Foundation
|
||||||
|
@ -88,18 +55,10 @@ for (pkg in jclass.importedPackages) {
|
||||||
out << "import "+clazz.qualifiedName+";"
|
out << "import "+clazz.qualifiedName+";"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def baseClass = "DataStreamMarshaller"
|
|
||||||
if (!jclass.superclass.simpleName.equals("JNDIBaseStorable") && !jclass.superclass.simpleName.equals("DataStructureSupport") && !jclass.superclass.simpleName.equals("Object") ) {
|
|
||||||
baseClass = jclass.superclass.simpleName + "Marshaller";
|
|
||||||
}
|
|
||||||
|
|
||||||
def marshallerAware = isMarshallAware(jclass);
|
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marshalling code for Open Wire Format for ${jclass.simpleName}
|
* Marshalling code for Open Wire Format for ${className}
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* NOTE!: This file is auto generated - do not modify!
|
* NOTE!: This file is auto generated - do not modify!
|
||||||
|
@ -109,10 +68,10 @@ out << """
|
||||||
*
|
*
|
||||||
* @version \$Revision\$
|
* @version \$Revision\$
|
||||||
*/
|
*/
|
||||||
public """+ (isAbstract?"abstract ":"") + """class ${jclass.simpleName}Marshaller extends ${baseClass} {
|
public ${abstractClassText}class ${className} extends ${baseClass} {
|
||||||
"""
|
"""
|
||||||
if( !isAbstract ) {
|
|
||||||
out << """
|
if( !abstractClass ) out << """
|
||||||
/**
|
/**
|
||||||
* Return the type of Data Structure we marshal
|
* Return the type of Data Structure we marshal
|
||||||
* @return short representation of the type data structure
|
* @return short representation of the type data structure
|
||||||
|
@ -128,7 +87,7 @@ out << """
|
||||||
return new ${jclass.simpleName}();
|
return new ${jclass.simpleName}();
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
out << """
|
out << """
|
||||||
/**
|
/**
|
||||||
* Un-marshal an object instance from the data input stream
|
* Un-marshal an object instance from the data input stream
|
||||||
|
@ -140,116 +99,22 @@ out << """
|
||||||
public void unmarshal(OpenWireFormat wireFormat, Object o, DataInputStream dataIn, BooleanStream bs) throws IOException {
|
public void unmarshal(OpenWireFormat wireFormat, Object o, DataInputStream dataIn, BooleanStream bs) throws IOException {
|
||||||
super.unmarshal(wireFormat, o, dataIn, bs);
|
super.unmarshal(wireFormat, o, dataIn, bs);
|
||||||
"""
|
"""
|
||||||
if( !properties.isEmpty() ) {
|
|
||||||
out << """
|
if( !properties.isEmpty() ) out << """
|
||||||
${jclass.simpleName} info = (${jclass.simpleName})o;
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
if( marshallerAware ) {
|
if( marshallerAware ) out << """
|
||||||
out << """
|
|
||||||
info.beforeUnmarshall(wireFormat);
|
info.beforeUnmarshall(wireFormat);
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
for (property in properties) {
|
|
||||||
def annotation = property.getter.getAnnotation("openwire:property");
|
|
||||||
def size = annotation.getValue("size");
|
|
||||||
def type = property.type.qualifiedName
|
|
||||||
def cached = isCachedProperty(property);
|
|
||||||
|
|
||||||
out << " "
|
generateUnmarshalBody(out)
|
||||||
switch (type) {
|
|
||||||
case "boolean":
|
if( marshallerAware ) out << """
|
||||||
out << "info.${property.setter.simpleName}(bs.readBoolean());"; break;
|
|
||||||
case "byte":
|
|
||||||
out << "info.${property.setter.simpleName}(dataIn.readByte());"; break;
|
|
||||||
case "char":
|
|
||||||
out << "info.${property.setter.simpleName}(dataIn.readChar());"; break;
|
|
||||||
case "short":
|
|
||||||
out << "info.${property.setter.simpleName}(dataIn.readShort());"; break;
|
|
||||||
case "int":
|
|
||||||
out << "info.${property.setter.simpleName}(dataIn.readInt());"; break;
|
|
||||||
case "long":
|
|
||||||
out << "info.${property.setter.simpleName}(unmarshalLong(wireFormat, dataIn, bs));"; break;
|
|
||||||
case "byte[]":
|
|
||||||
if( size != null ) {
|
|
||||||
out << """{
|
|
||||||
byte data[] = new byte[${size.asInt()}];
|
|
||||||
dataIn.readFully(data);
|
|
||||||
info.${property.setter.simpleName}(data);
|
|
||||||
}
|
|
||||||
""";
|
|
||||||
} else {
|
|
||||||
out << """{
|
|
||||||
if( bs.readBoolean() ) {
|
|
||||||
int size = dataIn.readInt();
|
|
||||||
byte data[] = new byte[size];
|
|
||||||
dataIn.readFully(data);
|
|
||||||
info.${property.setter.simpleName}(data);
|
|
||||||
} else {
|
|
||||||
info.${property.setter.simpleName}(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "org.activeio.ByteSequence":
|
|
||||||
out << """
|
|
||||||
if( bs.readBoolean() ) {
|
|
||||||
int size = dataIn.readInt();
|
|
||||||
byte data[] = new byte[size];
|
|
||||||
dataIn.readFully(data);
|
|
||||||
info.${property.setter.simpleName}(new org.activeio.ByteSequence(data,0,size));
|
|
||||||
} else {
|
|
||||||
info.${property.setter.simpleName}(null);
|
|
||||||
}
|
|
||||||
""";
|
|
||||||
break;
|
|
||||||
case "java.lang.String":
|
|
||||||
out << "info.${property.setter.simpleName}(readString(dataIn, bs));"; break;
|
|
||||||
default:
|
|
||||||
if( property.type.arrayType ) {
|
|
||||||
def arrayType = property.type.arrayComponentType.qualifiedName;
|
|
||||||
if( size!=null ) {
|
|
||||||
out << """
|
|
||||||
${arrayType} value[] = new ${arrayType}[${size}];
|
|
||||||
for( int i=0; i < ${size}; i++ ) {
|
|
||||||
value[i] = (${arrayType})unmarsalNestedObject(wireFormat,dataIn, bs);
|
|
||||||
}
|
|
||||||
info.${property.setter.simpleName}(value);
|
|
||||||
"""
|
|
||||||
} else {
|
|
||||||
out << """
|
|
||||||
if( bs.readBoolean() ) {
|
|
||||||
short size = dataIn.readShort();
|
|
||||||
${arrayType} value[] = new ${arrayType}[size];
|
|
||||||
for( int i=0; i < size; i++ ) {
|
|
||||||
value[i] = (${arrayType})unmarsalNestedObject(wireFormat,dataIn, bs);
|
|
||||||
}
|
|
||||||
info.${property.setter.simpleName}(value);
|
|
||||||
} else {
|
|
||||||
info.${property.setter.simpleName}(null);
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
} else if( isThrowable(property.type) ) {
|
|
||||||
out << "info.${property.setter.simpleName}((${type}) unmarsalThrowable(wireFormat, dataIn, bs));"
|
|
||||||
} else {
|
|
||||||
if ( cached ) {
|
|
||||||
out << "info.${property.setter.simpleName}((${type}) unmarsalCachedObject(wireFormat, dataIn, bs));"
|
|
||||||
} else {
|
|
||||||
out << "info.${property.setter.simpleName}((${type}) unmarsalNestedObject(wireFormat, dataIn, bs));"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out << """
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
if( marshallerAware ) {
|
|
||||||
out << """
|
|
||||||
info.afterUnmarshall(wireFormat);
|
info.afterUnmarshall(wireFormat);
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
out << """
|
out << """
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,76 +124,23 @@ out << """
|
||||||
*/
|
*/
|
||||||
public int marshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs) throws IOException {
|
public int marshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs) throws IOException {
|
||||||
"""
|
"""
|
||||||
if( !properties.isEmpty() ) {
|
|
||||||
out << """
|
|
||||||
|
if( !properties.isEmpty() ) out << """
|
||||||
${jclass.simpleName} info = (${jclass.simpleName})o;
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
if( marshallerAware ) {
|
|
||||||
out << """
|
if( marshallerAware ) out << """
|
||||||
info.beforeMarshall(wireFormat);
|
info.beforeMarshall(wireFormat);
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
def baseSize=0;
|
|
||||||
out << """
|
out << """
|
||||||
int rc = super.marshal1(wireFormat, o, bs);
|
int rc = super.marshal1(wireFormat, o, bs);
|
||||||
"""
|
"""
|
||||||
for (property in properties) {
|
|
||||||
def annotation = property.getter.getAnnotation("openwire:property");
|
|
||||||
def size = annotation.getValue("size");
|
|
||||||
def getter = "info." + property.getter.simpleName + "()"
|
|
||||||
def cached = isCachedProperty(property);
|
|
||||||
|
|
||||||
out << " "
|
def baseSize = generateMarshal1Body(out)
|
||||||
|
|
||||||
def type = property.type.qualifiedName
|
|
||||||
switch (type) {
|
|
||||||
case "boolean":
|
|
||||||
out << "bs.writeBoolean($getter);"; break;
|
|
||||||
case "byte": baseSize+=1; break;
|
|
||||||
case "char": baseSize+=2; break;
|
|
||||||
case "short": baseSize+=2; break;
|
|
||||||
case "int": baseSize+=4; break;
|
|
||||||
case "long":
|
|
||||||
out << "rc+=marshal1Long(wireFormat, $getter, bs);"; break;
|
|
||||||
case "byte[]":
|
|
||||||
if( size ==null ) {
|
|
||||||
out << """
|
|
||||||
bs.writeBoolean($getter!=null);
|
|
||||||
rc += ${getter}==null ? 0 : ${getter}.length+4;
|
|
||||||
""";
|
|
||||||
} else {
|
|
||||||
baseSize += size.asInt();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "org.activeio.ByteSequence":
|
|
||||||
out << """
|
|
||||||
bs.writeBoolean($getter!=null);
|
|
||||||
rc += ${getter}==null ? 0 : ${getter}.getLength()+4;
|
|
||||||
""";
|
|
||||||
break;
|
|
||||||
case "java.lang.String":
|
|
||||||
out << "rc += writeString($getter, bs);"; break;
|
|
||||||
default:
|
|
||||||
if( property.type.arrayType ) {
|
|
||||||
if( size!=null ) {
|
|
||||||
out << "rc += marshalObjectArrayConstSize(wireFormat, $getter, bs, $size);"; break;
|
|
||||||
} else {
|
|
||||||
out << "rc += marshalObjectArray(wireFormat, $getter, bs);"; break;
|
|
||||||
}
|
|
||||||
} else if( isThrowable(property.type) ) {
|
|
||||||
out << "rc += marshalThrowable(wireFormat, $getter, bs);"; break;
|
|
||||||
} else {
|
|
||||||
if( cached ) {
|
|
||||||
out << "rc += marshal1CachedObject(wireFormat, $getter, bs);"; break;
|
|
||||||
} else {
|
|
||||||
out << "rc += marshal1NestedObject(wireFormat, $getter, bs);"; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out << """
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
out << """
|
out << """
|
||||||
return rc + ${baseSize};
|
return rc + ${baseSize};
|
||||||
}
|
}
|
||||||
|
@ -343,90 +155,25 @@ for (property in properties) {
|
||||||
public void marshal2(OpenWireFormat wireFormat, Object o, DataOutputStream dataOut, BooleanStream bs) throws IOException {
|
public void marshal2(OpenWireFormat wireFormat, Object o, DataOutputStream dataOut, BooleanStream bs) throws IOException {
|
||||||
super.marshal2(wireFormat, o, dataOut, bs);
|
super.marshal2(wireFormat, o, dataOut, bs);
|
||||||
"""
|
"""
|
||||||
if( !properties.isEmpty() ) {
|
|
||||||
out << """
|
if( !properties.isEmpty() ) out << """
|
||||||
${jclass.simpleName} info = (${jclass.simpleName})o;
|
${jclass.simpleName} info = (${jclass.simpleName})o;
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
for (property in properties) {
|
|
||||||
def annotation = property.getter.getAnnotation("openwire:property");
|
|
||||||
def size = annotation.getValue("size");
|
|
||||||
def getter = "info." + property.getter.simpleName + "()"
|
|
||||||
def cached = isCachedProperty(property);
|
|
||||||
|
|
||||||
out << " "
|
generateMarshal2Body(out)
|
||||||
|
|
||||||
def type = property.type.qualifiedName
|
if( marshallerAware ) out << """
|
||||||
switch (type) {
|
|
||||||
case "boolean":
|
|
||||||
out << "bs.readBoolean();"; break;
|
|
||||||
case "byte":
|
|
||||||
out << "dataOut.writeByte($getter);"; break;
|
|
||||||
case "char":
|
|
||||||
out << "dataOut.writeChar($getter);"; break;
|
|
||||||
case "short":
|
|
||||||
out << "dataOut.writeShort($getter);"; break;
|
|
||||||
case "int":
|
|
||||||
out << "dataOut.writeInt($getter);"; break;
|
|
||||||
case "long":
|
|
||||||
out << "marshal2Long(wireFormat, $getter, dataOut, bs);"; break;
|
|
||||||
case "byte[]":
|
|
||||||
if( size !=null ) {
|
|
||||||
out << "dataOut.write($getter, 0, ${size.asInt()});";
|
|
||||||
} else {
|
|
||||||
out << """
|
|
||||||
if(bs.readBoolean()) {
|
|
||||||
dataOut.writeInt(${getter}.length);
|
|
||||||
dataOut.write(${getter});
|
|
||||||
}
|
|
||||||
""";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "org.activeio.ByteSequence":
|
|
||||||
out << """
|
|
||||||
if(bs.readBoolean()) {
|
|
||||||
org.activeio.ByteSequence data = ${getter};
|
|
||||||
dataOut.writeInt(data.getLength());
|
|
||||||
dataOut.write(data.getData(), data.getOffset(), data.getLength());
|
|
||||||
}
|
|
||||||
""";
|
|
||||||
break;
|
|
||||||
case "java.lang.String":
|
|
||||||
out << "writeString($getter, dataOut, bs);"; break;
|
|
||||||
default:
|
|
||||||
if( property.type.arrayType ) {
|
|
||||||
if( size!=null ) {
|
|
||||||
out << "marshalObjectArrayConstSize(wireFormat, $getter, dataOut, bs, $size);"; break;
|
|
||||||
} else {
|
|
||||||
out << "marshalObjectArray(wireFormat, $getter, dataOut, bs);"; break;
|
|
||||||
}
|
|
||||||
} else if( isThrowable(property.type) ) {
|
|
||||||
out << "marshalThrowable(wireFormat, $getter, dataOut, bs);"; break;
|
|
||||||
} else {
|
|
||||||
if( cached ) {
|
|
||||||
out << "marshal2CachedObject(wireFormat, $getter, dataOut, bs);"; break;
|
|
||||||
} else {
|
|
||||||
out << "marshal2NestedObject(wireFormat, $getter, dataOut, bs);"; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out << """
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
if( marshallerAware ) {
|
|
||||||
out << """
|
|
||||||
info.afterMarshall(wireFormat);
|
info.afterMarshall(wireFormat);
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
out << """
|
out << """
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
def file = new File(destDir, "MarshallerFactory.java")
|
|
||||||
file.withWriter { out |
|
void generateFactory(PrintWriter out) {
|
||||||
out << """/**
|
out << """/**
|
||||||
*
|
*
|
||||||
* Copyright 2005-2006 The Apache Software Foundation
|
* Copyright 2005-2006 The Apache Software Foundation
|
||||||
|
@ -468,10 +215,12 @@ public class MarshallerFactory {
|
||||||
static final private DataStreamMarshaller marshaller[] = new DataStreamMarshaller[256];
|
static final private DataStreamMarshaller marshaller[] = new DataStreamMarshaller[256];
|
||||||
static {
|
static {
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for (jclass in concreteClasses) {
|
for (jclass in concreteClasses) {
|
||||||
out << """
|
out << """
|
||||||
add(new ${jclass.simpleName}Marshaller());"""
|
add(new ${jclass.simpleName}Marshaller());"""
|
||||||
}
|
}
|
||||||
|
|
||||||
out << """
|
out << """
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -486,6 +235,4 @@ out << """
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue