| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 java.io.PrintWriter; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.codehaus.jam.JAnnotation; |
| import org.codehaus.jam.JAnnotationValue; |
| import org.codehaus.jam.JClass; |
| import org.codehaus.jam.JProperty; |
| |
| /** |
| * |
| */ |
| public class CppMarshallingClassesGenerator extends CppMarshallingHeadersGenerator { |
| |
| protected String getFilePostFix() { |
| return ".cpp"; |
| } |
| |
| 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 + "( DataStreamMarshaller.readByte(dataIn) );"); |
| } else if (type.equals("char")) { |
| out.println("info." + setter + "( DataStreamMarshaller.readChar(dataIn) );"); |
| } else if (type.equals("short")) { |
| out.println("info." + setter + "( DataStreamMarshaller.readShort(dataIn) );"); |
| } else if (type.equals("int")) { |
| out.println("info." + setter + "( DataStreamMarshaller.readInt(dataIn) );"); |
| } 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[]") || type.equals("ByteSequence")) { |
| if (size != null) { |
| out.println("info." + setter + "( readBytes(dataIn, " + size.asInt() + ") );"); |
| } else { |
| out.println("info." + setter + "( readBytes(dataIn, bs.readBoolean()) );"); |
| } |
| } else if (isThrowable(property.getType())) { |
| out.println("info." + setter + "( unmarshalBrokerError(wireFormat, dataIn, bs) );"); |
| } else if (isCachedProperty(property)) { |
| out.println("info." + setter + "( (" + type + ") unmarshalCachedObject(wireFormat, dataIn, bs) );"); |
| } else { |
| out.println("info." + setter + "( (" + type + ") unmarshalNestedObject(wireFormat, dataIn, bs) );"); |
| } |
| } |
| |
| protected void generateUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) { |
| JClass propertyType = property.getType(); |
| String arrayType = propertyType.getArrayComponentType().getSimpleName(); |
| String setter = property.getGetter().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." + setter + "( value );"); |
| out.println(" }"); |
| } else { |
| out.println(" if (bs.readBoolean()) {"); |
| out.println(" short size = DataStreamMarshaller.readShort(dataIn);"); |
| 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." + 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[]") || 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.getGetter().getSimpleName() + "()"; |
| |
| out.print(indent); |
| if (type.equals("boolean")) { |
| out.println("bs.readBoolean();"); |
| } else if (type.equals("byte")) { |
| out.println("DataStreamMarshaller.writeByte(" + getter + ", dataOut);"); |
| } else if (type.equals("char")) { |
| out.println("DataStreamMarshaller.writeChar(" + getter + ", dataOut);"); |
| } else if (type.equals("short")) { |
| out.println("DataStreamMarshaller.writeShort(" + getter + ", dataOut);"); |
| } else if (type.equals("int")) { |
| out.println("DataStreamMarshaller.writeInt(" + getter + ", dataOut);"); |
| } 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.write(" + getter + ", 0, " + size.asInt() + ");"); |
| } else { |
| out.println("if(bs.readBoolean()) {"); |
| out.println(" DataStreamMarshaller.writeInt(" + getter + ".Length, dataOut);"); |
| 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);"); |
| } |
| } |
| } |
| } |
| |
| protected void generateFile(PrintWriter out) throws Exception { |
| generateLicence(out); |
| |
| out.println("#include \"marshal/" + className + ".hpp\""); |
| out.println(""); |
| out.println("using namespace apache::activemq::client::marshal;"); |
| out.println(""); |
| out.println("/*"); |
| out.println(" * Marshalling code for Open Wire Format for " + jclass.getSimpleName() + ""); |
| out.println(" *"); |
| out.println(" * NOTE!: This file is autogenerated - do not modify!"); |
| out.println(" * if you need to make a change, please see the Groovy scripts in the"); |
| out.println(" * activemq-core module"); |
| out.println(" */"); |
| out.println(""); |
| out.println("" + className + "::" + className + "()"); |
| out.println("{"); |
| out.println(" // no-op"); |
| out.println("}"); |
| out.println(""); |
| out.println("" + className + "::~" + className + "()"); |
| out.println("{"); |
| out.println(" // no-op"); |
| out.println("}"); |
| out.println(""); |
| |
| if (!isAbstractClass()) { |
| out.println(""); |
| out.println(""); |
| out.println("IDataStructure* " + className + "::createObject() "); |
| out.println("{"); |
| out.println(" return new " + jclass.getSimpleName() + "();"); |
| out.println("}"); |
| out.println(""); |
| out.println("char " + className + "::getDataStructureType() "); |
| out.println("{"); |
| out.println(" return " + jclass.getSimpleName() + ".ID_" + jclass.getSimpleName() + ";"); |
| out.println("}"); |
| } |
| |
| out.println(""); |
| out.println(" /* "); |
| out.println(" * Un-marshal an object instance from the data input stream"); |
| out.println(" */ "); |
| out.println("void " + className + "::unmarshal(ProtocolFormat& wireFormat, Object o, BinaryReader& dataIn, BooleanStream& bs) "); |
| out.println("{"); |
| out.println(" base.unmarshal(wireFormat, o, dataIn, bs);"); |
| |
| List properties = getProperties(); |
| boolean marshallerAware = isMarshallerAware(); |
| if (!properties.isEmpty() || marshallerAware) { |
| out.println(""); |
| out.println(" " + jclass.getSimpleName() + "& info = (" + jclass.getSimpleName() + "&) o;"); |
| } |
| |
| if (marshallerAware) { |
| out.println(""); |
| out.println(" info.beforeUnmarshall(wireFormat);"); |
| out.println(" "); |
| } |
| |
| generateTightUnmarshalBody(out); |
| |
| if (marshallerAware) { |
| out.println(""); |
| out.println(" info.afterUnmarshall(wireFormat);"); |
| } |
| |
| out.println(""); |
| out.println("}"); |
| out.println(""); |
| out.println(""); |
| out.println("/*"); |
| out.println(" * Write the booleans that this object uses to a BooleanStream"); |
| out.println(" */"); |
| out.println("int " + className + "::marshal1(ProtocolFormat& wireFormat, Object& o, BooleanStream& bs) {"); |
| out.println(" " + jclass.getSimpleName() + "& info = (" + jclass.getSimpleName() + "&) o;"); |
| |
| if (marshallerAware) { |
| out.println(""); |
| out.println(" info.beforeMarshall(wireFormat);"); |
| } |
| |
| out.println(""); |
| out.println(" int rc = base.marshal1(wireFormat, info, bs);"); |
| |
| int baseSize = generateMarshal1Body(out); |
| |
| out.println(""); |
| out.println(" return rc + " + baseSize + ";"); |
| out.println("}"); |
| out.println(""); |
| out.println("/* "); |
| out.println(" * Write a object instance to data output stream"); |
| out.println(" */"); |
| out.println("void " + className + "::marshal2(ProtocolFormat& wireFormat, Object& o, BinaryWriter& dataOut, BooleanStream& bs) {"); |
| out.println(" base.marshal2(wireFormat, o, dataOut, bs);"); |
| |
| if (!properties.isEmpty() || marshallerAware) { |
| out.println(""); |
| out.println(" " + jclass.getSimpleName() + "& info = (" + jclass.getSimpleName() + "&) o;"); |
| } |
| |
| generateMarshal2Body(out); |
| |
| if (marshallerAware) { |
| out.println(""); |
| out.println(" info.afterMarshall(wireFormat);"); |
| } |
| |
| out.println(""); |
| out.println("}"); |
| } |
| |
| @SuppressWarnings("unchecked") |
| public void generateFactory(PrintWriter out) { |
| generateLicence(out); |
| out.println(""); |
| out.println("// Marshalling code for Open Wire Format"); |
| out.println("//"); |
| out.println("//"); |
| out.println("// NOTE!: This file is autogenerated - do not modify!"); |
| out.println("// if you need to make a change, please see the Groovy scripts in the"); |
| out.println("// activemq-openwire module"); |
| out.println("//"); |
| out.println(""); |
| out.println("#include \"marshal/" + className + ".hpp\""); |
| out.println(""); |
| |
| 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()); |
| } |
| }); |
| |
| for (Iterator iter = list.iterator(); iter.hasNext();) { |
| JClass jclass = (JClass)iter.next(); |
| out.println("#include \"marshal/" + jclass.getSimpleName() + "Marshaller.hpp\""); |
| } |
| |
| out.println(""); |
| out.println(""); |
| out.println("using namespace apache::activemq::client::marshal;"); |
| out.println(""); |
| out.println(""); |
| out.println("void MarshallerFactory::configure(ProtocolFormat& format) "); |
| out.println("{"); |
| |
| for (Iterator iter = list.iterator(); iter.hasNext();) { |
| JClass jclass = (JClass)iter.next(); |
| out.println(" format.addMarshaller(new " + jclass.getSimpleName() + "Marshaller());"); |
| } |
| |
| out.println(""); |
| out.println("}"); |
| |
| } |
| } |