Author: jstrachan
Date: Wed Feb 22 09:40:18 2006
New Revision: 379824
URL: http://svn.apache.org/viewcvs?rev=379824&view=rev
Log:
Latest spike of the refactor of the code generation; almost done refactoing it so I can look at the C++ code shortly...
Added:
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java (with props)
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java (with props)
Modified:
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpClassesScript.java
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireClassesScript.java
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCppClassesScript.java
incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireScript.java
incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpClasses.groovy
incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpMarshalling.groovy
incubator/activemq/trunk/activemq-core/src/gram/script/GenerateJavaMarshalling.groovy
Modified: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpClassesScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpClassesScript.java?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpClassesScript.java (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpClassesScript.java Wed Feb 22 09:40:18 2006
@@ -16,6 +16,8 @@
*/
package org.apache.activemq.openwire.tool;
+import org.codehaus.jam.JClass;
+
import java.io.File;
/**
@@ -26,9 +28,12 @@
public Object run() {
filePostFix = ".cs";
- destDir = new File("../openwire-dotnet/src/OpenWire.Client/Commands");
+ if (destDir == null) {
+ destDir = new File("../openwire-dotnet/src/OpenWire.Client/Commands");
+ }
return super.run();
}
+
}
Added: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java?rev=379824&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java (added)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java Wed Feb 22 09:40:18 2006
@@ -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);");
+ }
+ }
+ }
+ }
+}
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCSharpMarshallingScript.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireClassesScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireClassesScript.java?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireClassesScript.java (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireClassesScript.java Wed Feb 22 09:40:18 2006
@@ -31,9 +31,8 @@
*/
public abstract class OpenWireClassesScript extends OpenWireScript {
protected Set manuallyMaintainedClasses = new HashSet();
- protected File destDir = new File("target/generated/classes");
+ protected File destDir;
protected File destFile;
- protected String filePostFix = "";
protected JClass jclass;
protected JClass superclass;
@@ -43,16 +42,14 @@
protected StringBuffer buffer;
public OpenWireClassesScript() {
- 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]);
- }
+ initialiseManuallyMaintainedClasses();
}
public Object run() {
+ if (destDir == null) {
+ throw new IllegalArgumentException("No destDir defined!");
+ }
+ System.out.println(getClass().getName() + " generating files in: " + destDir);
destDir.mkdirs();
buffer = new StringBuffer();
@@ -80,7 +77,7 @@
}
return answer;
}
-
+
protected boolean isValidClass(JClass jclass) {
if (jclass.getAnnotation("openwire:marshaller") == null) {
return false;
@@ -130,6 +127,28 @@
protected String getClassName(JClass jclass) {
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]);
+ }
}
}
Modified: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCppClassesScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCppClassesScript.java?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCppClassesScript.java (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireCppClassesScript.java Wed Feb 22 09:40:18 2006
@@ -28,7 +28,9 @@
public Object run() {
filePostFix = getFilePostFix();
- destDir = new File("../openwire-cpp/src/command");
+ if (destDir == null) {
+ destDir = new File("../openwire-cpp/src/command");
+ }
return super.run();
}
Added: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java?rev=379824&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java (added)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java Wed Feb 22 09:40:18 2006
@@ -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);");
+ }
+ }
+ }
+ }
+}
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireJavaMarshallingScript.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireScript.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireScript.java?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireScript.java (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/java/org/apache/activemq/openwire/tool/OpenWireScript.java Wed Feb 22 09:40:18 2006
@@ -30,26 +30,27 @@
*/
public abstract class OpenWireScript extends GramSupport {
+ private String openwireVersion;
+ protected String filePostFix = ".java";
+
public boolean isValidProperty(JProperty it) {
JMethod getter = it.getGetter();
- return getter != null && it.getSetter() != null && getter.isStatic() == false
- && getter.getAnnotation("openwire:property") != null;
+ return getter != null && it.getSetter() != null && getter.isStatic() == false && getter.getAnnotation("openwire:property") != null;
}
-
+
public boolean isCachedProperty(JProperty it) {
JMethod getter = it.getGetter();
- if( !isValidProperty(it) )
+ if (!isValidProperty(it))
return false;
JAnnotationValue value = getter.getAnnotation("openwire:property").getValue("cache");
- return value!=null && value.asBoolean();
+ return value != null && value.asBoolean();
}
public boolean isAbstract(JClass j) {
JField[] fields = j.getFields();
for (int i = 0; i < fields.length; i++) {
JField field = fields[i];
- if (field.isStatic() && field.isPublic() && field.isFinal()
- && field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
+ if (field.isStatic() && field.isPublic() && field.isFinal() && field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
return false;
}
}
@@ -60,19 +61,31 @@
if (j.getQualifiedName().equals(Throwable.class.getName())) {
return true;
}
- return j.getSuperclass()!=null && isThrowable(j.getSuperclass());
+ return j.getSuperclass() != null && isThrowable(j.getSuperclass());
}
-
+
public boolean isMarshallAware(JClass j) {
- JClass[] interfaces = j.getInterfaces();
- for (int i = 0; i < interfaces.length; i++) {
- if( interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware") ) {
- return true;
+ if (filePostFix.endsWith("java")) {
+ JClass[] interfaces = j.getInterfaces();
+ for (int i = 0; i < interfaces.length; i++) {
+ if (interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware")) {
+ return true;
+ }
}
+ return false;
}
- return false; //j.getSuperclass()!=null && isMarshallAware(j.getSuperclass());
+ 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() {
return (JamService) getBinding().getVariable("jam");
}
@@ -80,7 +93,18 @@
public JamClassIterator 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
*/
@@ -103,7 +127,6 @@
}
}
-
public String getOpenWireOpCode(JClass aClass) {
return annotationValue(aClass, "openwire:marshaller", "code", "0");
}
Modified: incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpClasses.groovy
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpClasses.groovy?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpClasses.groovy (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpClasses.groovy Wed Feb 22 09:40:18 2006
@@ -59,7 +59,7 @@
//
public class ${jclass.simpleName} : $baseClass
{
- public const byte ID_${jclass.simpleName} = ${getOpenWireOpCode(jclass)};
+ public const byte ID_${jclass.simpleName} = ${getOpenWireOpCode(jclass)};
"""
for (property in properties) {
@@ -76,7 +76,7 @@
// TODO generate ToString method
- public override byte GetCommandType() {
+ public override byte GetDataStructureType() {
return ID_${jclass.simpleName};
}
Modified: incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpMarshalling.groovy
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpMarshalling.groovy?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpMarshalling.groovy (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/script/GenerateCSharpMarshalling.groovy Wed Feb 22 09:40:18 2006
@@ -14,87 +14,31 @@
* See the License for the specific language governing permissions and
* 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$
*/
-class GenerateCSharpMarshalling extends OpenWireScript {
+class GenerateCSharpMarshalling extends OpenWireCSharpMarshallingScript {
- Object run() {
- 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 << """//
-// Marshalling code for Open Wire Format for ${jclass.simpleName}
+ void generateFile(PrintWriter out) {
+ out << """//
//
+// Copyright 2005-2006 The Apache Software Foundation
//
-// NOTE!: This file is autogenerated - do not modify!
-// if you need to make a change, please see the Groovy scripts in the
-// activemq-openwire module
+// 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.
//
using System;
@@ -108,221 +52,124 @@
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( !abstractClass ) out << """
+
+ public override DataStructure CreateObject()
{
+ return new ${jclass.simpleName}();
+ }
+ public override byte GetDataStructureType()
+ {
+ return ${jclass.simpleName}.ID_${jclass.simpleName};
+ }
"""
- if (notAbstract)
- out << """
- public override Command CreateCommand() {
- return new ${jclass.simpleName}();
- }
+
+out << """
+ //
+ // 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);
"""
- out << """
- public override void BuildCommand(Command command, BinaryReader dataIn) {
- base.BuildCommand(command, dataIn);
-"""
- if (!propertyList.empty) {
- out << """
- ${jclass.simpleName} info = (${jclass.simpleName}) command;
-"""
- }
- for (property in propertyList) {
- def propertyName = property.simpleName
- out << " info.${propertyName} = "
-
- type = toCSharpType(property.type)
- switch (type) {
- 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 << """;
+
+if( !properties.isEmpty() || marshallerAware ) out << """
+ ${jclass.simpleName} info = (${jclass.simpleName})o;
"""
- }
- out << """
- }
+if( marshallerAware ) out << """
+ info.BeforeUnmarshall(wireFormat);
+
+"""
+
+generateUnmarshalBody(out)
- public override void WriteCommand(Command command, BinaryWriter dataOut) {
- base.WriteCommand(command, dataOut);
+if( marshallerAware ) out << """
+ info.AfterUnmarshall(wireFormat);
"""
- if (!propertyList.empty) {
- out << """
- ${jclass.simpleName} info = (${jclass.simpleName}) command;
-"""
- }
-
- for (property in propertyList) {
- 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 << """
+ }
+
+
+ //
+ // 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;
"""
- }
- out << """
- }
+
+if( marshallerAware ) out << """
+ info.BeforeMarshall(wireFormat);
+"""
+
+out << """
+ int rc = base.Marshal1(wireFormat, info, bs);
+"""
+
+def baseSize = generateMarshal1Body(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 << """
+ }
+ }
}
"""
- }
}
-
- def file = new File(destDir, "CommandMarshallerRegistry.cs")
- file.withWriter { out |
- out << """//
+
+
+ void generateFactory(PrintWriter 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}
//
//
@@ -342,40 +189,22 @@
namespace OpenWire.Client.IO
{
- public class CommandMarshallerRegistry
+ public class MarshallerFactory
{
- public static Command ReadCommand(BinaryReader dataIn)
- {
- byte commandID = dataIn.ReadByte();
- switch (commandID)
- {
-$readMethodBuffer
- default:
- throw new Exception("Unknown command type: " + commandID);
- }
- }
-
-
- 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
-
+ public void configure(OpenWireFormat format)
+ {
+"""
+
+ for (jclass in concreteClasses) {
+ out << """
+ format.addMarshaller(new ${jclass.simpleName}Marshaller());"""
+ }
+
+ out << """
+ }
}
}
"""
-
- }
}
-}
\ No newline at end of file
+}
+
\ No newline at end of file
Modified: incubator/activemq/trunk/activemq-core/src/gram/script/GenerateJavaMarshalling.groovy
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/gram/script/GenerateJavaMarshalling.groovy?rev=379824&r1=379823&r2=379824&view=diff
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/gram/script/GenerateJavaMarshalling.groovy (original)
+++ incubator/activemq/trunk/activemq-core/src/gram/script/GenerateJavaMarshalling.groovy Wed Feb 22 09:40:18 2006
@@ -14,50 +14,17 @@
* See the License for the specific language governing permissions and
* 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
*
* @version $Revision$
*/
-class GenerateJavaMarshalling extends OpenWireScript {
+class GenerateJavaMarshalling extends OpenWireJavaMarshallingScript {
- Object run() {
-
- 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 << """/**
+ void generateFile(PrintWriter out) {
+ out << """/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
@@ -88,18 +55,10 @@
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 << """
/**
- * 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!
@@ -109,10 +68,10 @@
*
* @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 short representation of the type data structure
@@ -128,7 +87,7 @@
return new ${jclass.simpleName}();
}
"""
-}
+
out << """
/**
* Un-marshal an object instance from the data input stream
@@ -140,117 +99,23 @@
public void unmarshal(OpenWireFormat wireFormat, Object o, DataInputStream dataIn, BooleanStream bs) throws IOException {
super.unmarshal(wireFormat, o, dataIn, bs);
"""
-if( !properties.isEmpty() ) {
-out << """
+
+if( !properties.isEmpty() ) out << """
${jclass.simpleName} info = (${jclass.simpleName})o;
"""
-}
-if( marshallerAware ) {
-out << """
+
+if( marshallerAware ) out << """
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 << " "
- switch (type) {
- case "boolean":
- 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 << """
+
+generateUnmarshalBody(out)
+
+if( marshallerAware ) out << """
info.afterUnmarshall(wireFormat);
"""
-}
- out << """
+
+out << """
}
@@ -259,78 +124,25 @@
*/
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;
"""
-}
-if( marshallerAware ) {
-out << """
+
+
+if( marshallerAware ) out << """
info.beforeMarshall(wireFormat);
"""
-}
- def baseSize=0;
+
out << """
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 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 << """
- return rc+${baseSize};
+def baseSize = generateMarshal1Body(out)
+
+out << """
+ return rc + ${baseSize};
}
/**
@@ -343,91 +155,26 @@
public void marshal2(OpenWireFormat wireFormat, Object o, DataOutputStream dataOut, BooleanStream bs) throws IOException {
super.marshal2(wireFormat, o, dataOut, bs);
"""
-if( !properties.isEmpty() ) {
-out << """
+
+if( !properties.isEmpty() ) out << """
${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 << " "
- def type = property.type.qualifiedName
- 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 << """
+generateMarshal2Body(out)
+
+if( marshallerAware ) out << """
info.afterMarshall(wireFormat);
"""
-}
- out << """
+
+out << """
}
}
"""
- }
}
-
- def file = new File(destDir, "MarshallerFactory.java")
- file.withWriter { out |
-out << """/**
+
+
+ void generateFactory(PrintWriter out) {
+ out << """/**
*
* Copyright 2005-2006 The Apache Software Foundation
*
@@ -468,10 +215,12 @@
static final private DataStreamMarshaller marshaller[] = new DataStreamMarshaller[256];
static {
"""
+
for (jclass in concreteClasses) {
out << """
add(new ${jclass.simpleName}Marshaller());"""
}
+
out << """
}
@@ -485,7 +234,5 @@
}
}
"""
- }
-
}
}
|