blob: 94a80866edc5f6594bbd3a71cdf9f0661573b428 [file] [log] [blame]
/**
* 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.commands;
import java.io.PrintWriter;
import java.util.Set;
import org.codehaus.jam.JProperty;
public class CommandSourceGenerator extends CommandCodeGenerator {
public void generate( PrintWriter out ) {
// Start with the license.
generateLicence(out);
populateIncludeFilesSet();
for( String include : getIncludeFiles() ) {
if( include != null ) {
out.println("#include "+include);
}
}
out.println("");
out.println("using namespace std;");
out.println("using namespace activemq;");
out.println("using namespace activemq::exceptions;");
out.println("using namespace activemq::commands;");
out.println("using namespace decaf::lang;");
out.println("using namespace decaf::lang::exceptions;");
out.println("");
out.println("/*");
out.println(" *");
out.println(" * Command code for OpenWire format for "+getClassName() );
out.println(" *");
out.println(" * NOTE!: This file is auto generated - do not modify!");
out.println(" * if you need to make a change, please see the Java Classes in the");
out.println(" * activemq-cpp-openwire-generator module");
out.println(" *");
out.println(" */");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+getClassName()+"::"+getClassName()+"() : " + getBaseClassName() + "() {");
out.println("");
generateDefaultConstructorBody(out);
out.println("}");
out.println("");
if( isAssignable() ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+getClassName()+"::"+getClassName()+"( const "+getClassName()+"& other ) : " + getBaseClassName() + "() {");
out.println(" this->copyDataStructure( &other );");
out.println("}");
out.println("");
}
generateAdditionalConstructors(out);
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+getClassName()+"::~"+getClassName()+"() {");
generateDestructorBody(out);
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(getClassName()+"* "+getClassName()+"::cloneDataStructure() const {");
generateCloneDataStructureBody(out);
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("void "+getClassName()+"::copyDataStructure( const DataStructure* src ) {");
out.println("");
out.println(" // Protect against invalid self assignment.");
out.println(" if( this == src ) {");
out.println(" return;");
out.println(" }");
out.println("");
out.println(" const "+getClassName()+"* srcPtr = dynamic_cast<const "+getClassName()+"*>( src );");
out.println("");
out.println(" if( srcPtr == NULL || src == NULL ) {");
out.println(" throw decaf::lang::exceptions::NullPointerException(");
out.println(" __FILE__, __LINE__,");
out.println(" \""+getClassName()+"::copyDataStructure - src is NULL or invalid\" );");
out.println(" }");
out.println("");
if( getBaseClassName() != null ) {
out.println(" // Copy the data of the base class or classes");
out.println(" "+ getBaseClassName() +"::copyDataStructure( src );");
out.println("");
}
generateCopyDataStructureBody(out);
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("unsigned char "+getClassName()+"::getDataStructureType() const {");
out.println(" return "+getClassName()+"::ID_" + getClassName().toUpperCase() + ";");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("std::string "+getClassName()+"::toString() const {");
out.println("");
out.println(" ostringstream stream;" );
out.println("");
out.println(" stream << \"Begin Class = "+getClassName()+"\" << std::endl;" );
out.println(" stream << \" Value of "+getClassName()+"::ID_" + getClassName().toUpperCase() + " = "+getOpenWireOpCode()+"\" << std::endl;");
generateToStringBody(out);
if( getBaseClassName() != null ) {
out.println(" stream << "+ getBaseClassName() +"::toString();");
}
out.println(" stream << \"End Class = "+getClassName()+"\" << std::endl;" );
out.println("");
out.println(" return stream.str();");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("bool "+getClassName()+"::equals( const DataStructure* value ) const {");
out.println("");
out.println(" if( this == value ) {");
out.println(" return true;");
out.println(" }");
out.println("");
out.println(" const "+getClassName()+"* valuePtr = dynamic_cast<const "+getClassName()+"*>( value );");
out.println("");
out.println(" if( valuePtr == NULL || value == NULL ) {");
out.println(" return false;");
out.println(" }");
out.println("");
generateEqualsBody(out);
if( getBaseClassName() != null ) {
out.println(" if( !"+ getBaseClassName() +"::equals( value ) ) {");
out.println(" return false;");
out.println(" }");
}
out.println(" return true;" );
out.println("}");
out.println("");
generatePropertyAccessors(out);
if( isComparable() ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("int " + getClassName() + "::compareTo( const "+getClassName()+"& value ) const {");
out.println("");
out.println(" if( this == &value ) {");
out.println(" return 0;");
out.println(" }");
out.println("");
generateCompareToBody(out);
out.println(" return 0;");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("bool " + getClassName() + "::equals( const "+getClassName()+"& value ) const {");
out.println(" return this->equals( &value );");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("bool " + getClassName() + "::operator==( const "+getClassName()+"& value ) const {");
out.println(" return this->compareTo( value ) == 0;");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("bool " + getClassName() + "::operator<( const "+getClassName()+"& value ) const {");
out.println(" return this->compareTo( value ) < 0;");
out.println("}");
out.println("");
}
if( isAssignable() ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+getClassName()+"& "+getClassName()+"::operator= ( const "+getClassName()+"& other ) {");
out.println(" this->copyDataStructure( &other );");
out.println(" return *this;");
out.println("}");
out.println("");
}
if( getBaseClassName().equals( "BaseCommand" ) ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("decaf::lang::Pointer<commands::Command> "+getClassName()+"::visit( activemq::state::CommandVisitor* visitor ) ");
out.println(" throw( activemq::exceptions::ActiveMQException ) {");
out.println("");
out.println(" return visitor->process"+getClassName()+"( this );");
out.println("}");
}
generateAdditionalMethods(out);
}
protected void populateIncludeFilesSet() {
Set<String> includes = getIncludeFiles();
includes.add("<activemq/commands/"+getClassName()+".h>");
includes.add("<activemq/state/CommandVisitor.h>");
includes.add("<activemq/exceptions/ActiveMQException.h>");
includes.add("<decaf/lang/exceptions/NullPointerException.h>");
if( isComparable() ) {
includes.add("<apr_strings.h>");
}
}
protected void generateDefaultConstructorBody( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String type = toCppType(property.getType());
String value = toCppDefaultValue(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
if( property.getType().isPrimitiveType() ||
type.startsWith("std::string") ) {
out.println(" this->"+parameterName+" = "+value+";");
}
}
}
protected void generateDestructorBody( PrintWriter out ) {
}
protected void generateAdditionalConstructors( PrintWriter out ) {
}
protected void generateCloneDataStructureBody( PrintWriter out ) {
String newInstance = decapitalize( getClassName() );
out.println(" std::auto_ptr<"+getClassName()+"> "+newInstance+"( new "+getClassName()+"() );");
out.println("");
out.println(" // Copy the data from the base class or classes");
out.println(" "+newInstance+"->copyDataStructure( this );");
out.println("");
out.println(" return "+newInstance+".release();");
}
protected void generateCopyDataStructureBody( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String getter = property.getGetter().getSimpleName();
String setter = property.getSetter().getSimpleName();
out.println(" this->"+setter+"( srcPtr->"+getter+"() );");
}
}
protected void generateToStringBody( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String type = toCppType(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
String getter = property.getGetter().getSimpleName();
if( property.getType().getSimpleName().equals("ByteSequence") ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" stream << \" Value of "+propertyName+"[\" << i" + parameterName+" << \"] = \" << this->"+getter+"()[i"+parameterName+"] << std::endl;" );
out.println(" }" );
} else if( type.equals("unsigned char") ){
out.println(" stream << \" Value of "+propertyName+" = \" << (int)this->"+getter+"() << std::endl;");
} else if( property.getType().isPrimitiveType() ||
type.equals("std::string") ){
out.println(" stream << \" Value of "+propertyName+" = \" << this->"+getter+"() << std::endl;");
} else if( property.getType().isArrayType() &&
!property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" stream << \" Value of "+propertyName+"[\" << i" + parameterName+" << \"] is Below:\" << std::endl;" );
out.println(" if( this->"+getter+"()[i"+parameterName+"] != NULL ) {");
out.println(" stream << this->"+getter+"()[i"+parameterName+"]->toString() << std::endl;");
out.println(" } else {");
out.println(" stream << \" Object is NULL\" << std::endl;");
out.println(" }");
out.println(" }");
} else if( property.getType().isArrayType() &&
property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" stream << \" Value of "+propertyName+"[\" << i"+parameterName+" << \"] = \" << this->"+getter+"()[i"+parameterName+"] << std::endl;");
out.println(" }");
} else {
out.println(" stream << \" Value of "+propertyName+" is Below:\" << std::endl;" );
out.println(" if( this->"+getter+"() != NULL ) {");
out.println(" stream << this->"+getter+"()->toString() << std::endl;");
out.println(" } else {");
out.println(" stream << \" Object is NULL\" << std::endl;");
out.println(" }");
}
}
}
protected void generateEqualsBody( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String type = toCppType(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
String getter = property.getGetter().getSimpleName();
if( property.getType().getSimpleName().equals("ByteSequence") ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" if( this->"+getter+"()[i" + parameterName+"] != valuePtr->"+getter+"()[i"+parameterName+"] ) {" );
out.println(" return false;" );
out.println(" }" );
out.println(" }" );
} else if( property.getType().isPrimitiveType() || type.equals("std::string") ){
out.println(" if( this->"+getter+"() != valuePtr->"+getter+"() ) {");
out.println(" return false;" );
out.println(" }" );
} else if( property.getType().isArrayType() &&
!property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" if( this->"+getter+"()[i"+parameterName+"] != NULL ) {" );
out.println(" if( !this->"+getter+"()[i"+parameterName+"]->equals( valuePtr->"+getter+"()[i"+parameterName+"].get() ) ) {" );
out.println(" return false;");
out.println(" }");
out.println(" } else if( valuePtr->"+getter+"()[i"+parameterName+"] != NULL ) {");
out.println(" return false;");
out.println(" }");
out.println(" }");
} else if( property.getType().isArrayType() &&
property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" for( size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + " ) {");
out.println(" if( this->"+getter+"()[i"+parameterName+"] != valuePtr->"+getter+"()[i"+parameterName+"] ) {");
out.println(" return false;");
out.println(" }");
out.println(" }");
} else {
out.println(" if( this->"+getter+"() != NULL ) {");
out.println(" if( !this->"+getter+"()->equals( valuePtr->"+getter+"().get() ) ) {" );
out.println(" return false;");
out.println(" }");
out.println(" } else if( valuePtr->"+getter+"() != NULL ) {");
out.println(" return false;");
out.println(" }");
}
}
}
protected void generatePropertyAccessors( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String type = toCppType(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
String getter = property.getGetter().getSimpleName();
String setter = property.getSetter().getSimpleName();
String constNess = "";
if( !property.getType().isPrimitiveType() &&
!property.getType().getSimpleName().equals("ByteSequence") &&
!property.getType().getSimpleName().equals("String") &&
!type.startsWith("std::vector") ) {
type = "decaf::lang::Pointer<" + type + ">&";
constNess = "const ";
} else if( property.getType().getSimpleName().equals("String") ||
type.startsWith( "std::vector") ) {
type = type + "&";
constNess = "const ";
}
if( property.getType().isPrimitiveType() ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(type+" "+getClassName()+"::"+getter+"() const {");
out.println(" return "+parameterName+";");
out.println("}");
out.println("");
} else {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("const "+type+" "+getClassName()+"::"+getter+"() const {");
out.println(" return "+parameterName+";");
out.println("}");
out.println("");
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+type+" "+getClassName()+"::"+getter+"() {");
out.println(" return "+parameterName+";");
out.println("}");
out.println("");
}
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("void " + getClassName() + "::" + setter+"( " + constNess + type+ " " + parameterName +" ) {");
out.println(" this->"+parameterName+" = "+parameterName+";");
out.println("}");
out.println("");
}
}
protected void generateCompareToBody( PrintWriter out ) {
for( JProperty property : getProperties() ) {
String type = toCppType(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
if( !property.getType().isPrimitiveType() &&
!property.getType().getSimpleName().equals("ByteSequence") &&
!property.getType().getSimpleName().equals("String") &&
!type.startsWith("std::vector") ) {
out.println(" int "+parameterName+"Comp = this->"+parameterName+"->compareTo( *( value."+parameterName+" ) );");
out.println(" if( "+parameterName+"Comp != 0 ) {");
out.println(" return "+parameterName+"Comp;");
out.println(" }");
out.println("");
} else if( property.getType().getSimpleName().equals("String") ) {
out.println(" int "+parameterName+"Comp = apr_strnatcasecmp( this->"+parameterName+".c_str(), value."+parameterName+".c_str() );");
out.println(" if( "+parameterName+"Comp != 0 ) {");
out.println(" return "+parameterName+"Comp;");
out.println(" }");
out.println("");
} else {
out.println(" if( this->"+parameterName+" > value."+parameterName+" ) {");
out.println(" return 1;");
out.println(" } else if( this->"+parameterName+" < value."+parameterName+" ) {");
out.println(" return -1;");
out.println(" }");
out.println("");
}
}
}
protected void generateAdditionalMethods( PrintWriter out ) {}
}