You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2009/07/24 22:03:53 UTC

svn commit: r797631 - in /activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator: ./ src/main/java/org/apache/activemq/openwire/tool/marshallers/

Author: tabish
Date: Fri Jul 24 20:03:53 2009
New Revision: 797631

URL: http://svn.apache.org/viewvc?rev=797631&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQCPP-254

Update the generator to produce better marshallers and handle the ActiveMQ 5.3 codebase.

Modified:
    activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/pom.xml
    activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingClassesGenerator.java
    activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingHeadersGenerator.java

Modified: activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/pom.xml
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/pom.xml?rev=797631&r1=797630&r2=797631&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/pom.xml (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/pom.xml Fri Jul 24 20:03:53 2009
@@ -53,16 +53,6 @@
           <value>Sun Microsystems Inc.</value>
         </property>
       </activation>
-      <dependencies>
-        <dependency>
-          <groupId>com.sun</groupId>
-          <artifactId>tools</artifactId>
-          <version>1.5</version>
-           <scope>system</scope>
-           <!-- Only a JDK of 1.5.0 B11 or greater seems to work. -->
-           <systemPath>/opt/local/jdk1.5/lib/tools.jar</systemPath>
-        </dependency>
-      </dependencies>
     </profile>
   </profiles>
 

Modified: activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingClassesGenerator.java
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingClassesGenerator.java?rev=797631&r1=797630&r2=797631&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingClassesGenerator.java (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingClassesGenerator.java Fri Jul 24 20:03:53 2009
@@ -26,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -56,9 +55,7 @@
             return true;
         }
 
-        List properties = getProperties();
-        for (Iterator iter = properties.iterator(); iter.hasNext();) {
-            JProperty property = (JProperty) iter.next();
+        for ( JProperty property : getProperties() ) {
             JClass propertyType = property.getType();
             String type = propertyType.getSimpleName();
 
@@ -87,9 +84,7 @@
             return true;
         }
 
-        List properties = getProperties();
-        for (Iterator iter = properties.iterator(); iter.hasNext();) {
-            JProperty property = (JProperty) iter.next();
+        for ( JProperty property : getProperties() ) {
             JClass propertyType = property.getType();
             String type = propertyType.getSimpleName();
 
@@ -107,12 +102,26 @@
     // This section is for the tight wire format encoding generator
     //////////////////////////////////////////////////////////////////////////////////////
 
+    protected void generateTightUnmarshalBody(PrintWriter out) {
+        for ( JProperty property : getProperties() ) {
+            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[]")) {
+                generateTightUnmarshalBodyForArrayProperty(out, property, size);
+            } else {
+                generateTightUnmarshalBodyForProperty(out, property, size);
+            }
+        }
+    }
+
     protected void generateTightUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
 
         String setter = property.getSetter().getSimpleName();
         String type = property.getType().getSimpleName();
         String nativeType = toCppType(property.getType());
-        String propertyName = property.getType().getSimpleName();
 
         if( type.equals("boolean") ) {
             out.println("        info->" + setter + "( bs->readBoolean() );");
@@ -188,10 +197,8 @@
     }
 
     protected int generateTightMarshal1Body(PrintWriter out) {
-        List properties = getProperties();
         int baseSize = 0;
-        for (Iterator iter = properties.iterator(); iter.hasNext();) {
-            JProperty property = (JProperty) iter.next();
+        for ( JProperty property : getProperties() ) {
             JAnnotation annotation = property.getAnnotation("openwire:property");
             JAnnotationValue size = annotation.getValue("size");
             JClass propertyType = property.getType();
@@ -253,10 +260,11 @@
     }
 
     protected void generateTightMarshal2Body(PrintWriter out) {
-        List properties = getProperties();
+
         int count = 0;
-        for (Iterator iter = properties.iterator(); iter.hasNext();) {
-            JProperty property = (JProperty) iter.next();
+
+        for ( JProperty property : getProperties() ) {
+
             JAnnotation annotation = property.getAnnotation("openwire:property");
             JAnnotationValue size = annotation.getValue("size");
             JClass propertyType = property.getType();
@@ -322,9 +330,25 @@
     // This section is for the loose wire format encoding generator
     //////////////////////////////////////////////////////////////////////////////////////
 
+    protected void generateLooseUnmarshalBody(PrintWriter out) {
+
+        for ( JProperty property : getProperties() ) {
+
+            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[]")) {
+                generateLooseUnmarshalBodyForArrayProperty(out, property, size);
+            } else {
+                generateLooseUnmarshalBodyForProperty(out, property, size);
+            }
+        }
+    }
+
     protected void generateLooseUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
 
-        String propertyName = property.getSimpleName();
         String type = property.getType().getSimpleName();
         String nativeType = toCppType(property.getType());
         String setter = property.getSetter().getSimpleName();
@@ -375,7 +399,6 @@
     protected void generateLooseUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
         JClass propertyType = property.getType();
         String arrayType = propertyType.getArrayComponentType().getSimpleName();
-        String propertyName = property.getSimpleName();
         String setter = property.getSetter().getSimpleName();
         String getter = property.getGetter().getSimpleName();
 
@@ -406,9 +429,9 @@
 
 
     protected void generateLooseMarshalBody(PrintWriter out) {
-        List properties = getProperties();
-        for (Iterator iter = properties.iterator(); iter.hasNext();) {
-            JProperty property = (JProperty) iter.next();
+
+        for ( JProperty property : getProperties() ) {
+
             JAnnotation annotation = property.getAnnotation("openwire:property");
             JAnnotationValue size = annotation.getValue("size");
             JClass propertyType = property.getType();
@@ -524,7 +547,7 @@
 out.println("        "+baseClass+"::tightUnmarshal( wireFormat, dataStructure, dataIn, bs );");
 out.println("");
 
-    List properties = getProperties();
+    List<JProperty> properties = getProperties();
     boolean marshallerAware = isMarshallerAware();
     if( !properties.isEmpty() || marshallerAware ) {
 
@@ -673,18 +696,15 @@
 
 out.println("#include <activemq/wireformat/openwire/marshal/v"+getOpenwireVersion()+"/MarshallerFactory.h>");
 
-    List list = new ArrayList(getConcreteClasses());
-    Collections.sort(list, new Comparator(){
-        public int compare(Object o1, Object o2) {
-            JClass c1 = (JClass) o1;
-            JClass c2 = (JClass) o2;
-            return c1.getSimpleName().compareTo(c2.getSimpleName());
-    }});
+        List<JClass> list = new ArrayList<JClass>(getConcreteClasses());
+        Collections.sort(list, new Comparator<JClass>(){
+            public int compare(JClass c1, JClass c2) {
+                return c1.getSimpleName().compareTo(c2.getSimpleName());
+        }});
 
-    for (Iterator iter = list.iterator(); iter.hasNext();) {
-        JClass jclass = (JClass) iter.next();
+        for ( JClass jclass : list ) {
 out.println("#include <activemq/wireformat/openwire/marshal/v"+getOpenwireVersion()+"/"+jclass.getSimpleName()+"Marshaller.h>");
-    }
+        }
 
 out.println("");
 out.println("/*");
@@ -708,10 +728,9 @@
 out.println("void MarshallerFactory::configure( OpenWireFormat* format ) {");
 out.println("");
 
-    for (Iterator iter = list.iterator(); iter.hasNext();) {
-        JClass jclass = (JClass) iter.next();
+        for ( JClass jclass : list ) {
 out.println("    format->addMarshaller( new "+jclass.getSimpleName()+"Marshaller() );");
-}
+        }
 
 out.println("}");
 out.println("");

Modified: activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingHeadersGenerator.java
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingHeadersGenerator.java?rev=797631&r1=797630&r2=797631&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingHeadersGenerator.java (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp-openwire-generator/src/main/java/org/apache/activemq/openwire/tool/marshallers/AmqCppMarshallingHeadersGenerator.java Fri Jul 24 20:03:53 2009
@@ -18,29 +18,82 @@
 package org.apache.activemq.openwire.tool.marshallers;
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.apache.activemq.openwire.tool.JavaMarshallingGenerator;
+import org.apache.activemq.openwire.tool.MultiSourceGenerator;
+import org.codehaus.jam.JAnnotation;
+import org.codehaus.jam.JAnnotationValue;
 import org.codehaus.jam.JClass;
+import org.codehaus.jam.JProperty;
 
 /**
  *
  * @version $Revision: 381410 $
  */
-public class AmqCppMarshallingHeadersGenerator extends JavaMarshallingGenerator {
+public class AmqCppMarshallingHeadersGenerator extends MultiSourceGenerator {
 
     protected String targetDir="./src/main";
+    protected List<JClass> concreteClasses = new ArrayList<JClass>();
+    protected File factoryFile;
+    protected String factoryFileName = "MarshallerFactory";
+    protected String indent = "    ";
+
+    /**
+     * Overrides the base class init since we don't mark any marshaller classes as
+     * being manually maintained.
+     */
+    protected void initialiseManuallyMaintainedClasses() {
+    }
+
+    /**
+     * Returns all the valid properties available on the current class. Overrides the
+     * method in {@link MultiSourceGenerator} to add filtering on the Openwire Version
+     * number so that we can rerun this tool for older versions and produce an exact
+     * match to what was previously generated.
+     *
+     * @return List of Properties valid for the current {@link JClass} and Openwire version.
+     */
+    public List<JProperty> getProperties() {
+        List<JProperty> answer = new ArrayList<JProperty>();
+        JProperty[] properties = jclass.getDeclaredProperties();
+        for (int i = 0; i < properties.length; i++) {
+            JProperty property = properties[i];
+            if (isValidProperty(property)) {
+
+                JAnnotation annotation = property.getAnnotation("openwire:property");
+                JAnnotationValue version = annotation.getValue("version");
+
+                if( version.asInt() <= this.getOpenwireVersion() ) {
+                    answer.add(property);
+                }
+            }
+        }
+        return answer;
+    }
 
     public Object run() {
         filePostFix = getFilePostFix();
         if (destDir == null) {
             destDir = new File(targetDir+"/activemq/wireformat/openwire/marshal/v"+getOpenwireVersion());
         }
-        return super.run();
+        Object answer = super.run();
+        processFactory();
+        return answer;
     }
 
     protected void processClass(JClass jclass) {
-        super.processClass( 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) {
@@ -60,9 +113,17 @@
             answer = "MessageMarshaller";
         }
 
-        // We didn't map it, so let the base class handle it.
+        // We didn't map it directly so we turn it into something generic.
         if( answer.equals( jclass.getSimpleName() ) ) {
-            answer = super.getBaseClassName(jclass);
+            answer = "BaseDataStreamMarshaller";
+            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;
         }
 
         return answer;
@@ -298,6 +359,23 @@
 out.println("");
         }
 
+    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();
+            }
+        }
+    }
+
     public void generateFactory(PrintWriter out) {
         generateLicence(out);
 out.println("#ifndef _ACTIVEMQ_WIREFORMAT_OPENWIRE_MARSAHAL_V"+getOpenwireVersion()+"_MARSHALERFACTORY_H_");
@@ -338,6 +416,14 @@
 out.println("#endif /*_ACTIVEMQ_WIREFORMAT_OPENWIRE_MARSHAL_V"+getOpenwireVersion()+"_MARSHALLERFACTORY_H_*/");
     }
 
+    public List<JClass> getConcreteClasses() {
+        return concreteClasses;
+    }
+
+    public void setConcreteClasses(List<JClass> concreteClasses) {
+        this.concreteClasses = concreteClasses;
+    }
+
     public String getTargetDir() {
         return targetDir;
     }