blob: 2aec094b203423dedaacc485b7fcf6dbf75d75cf [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.Iterator;
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);
populateBaseClassesSet();
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;");
if( isComparable() ) {
out.println("using namespace decaf::internal::util;");
}
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()+"() :" );
out.println(" " + generateInitializerList() + " {");
out.println("");
generateDefaultConstructorBody(out);
out.println("}");
out.println("");
if( isAssignable() ) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println(""+getClassName()+"::"+getClassName()+"(const "+getClassName()+"& other) :");
out.println(" " + generateInitializerList() + " {");
out.println("");
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("");
generateToStringBody(out);
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((const DataStructure*)&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 (isHashable()) {
out.println("////////////////////////////////////////////////////////////////////////////////");
out.println("int " + getClassName() + "::getHashCode() const {");
out.println(" return decaf::util::HashCode<std::string>()(this->toString());");
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(" 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( isHashable() ) {
includes.add("<decaf/util/HashCode.h>");
}
if( isComparable() ) {
includes.add("<decaf/internal/util/StringUtils.h>");
}
}
protected void populateBaseClassesSet() {
Set<String> classes = getBaseClasses();
classes.add(getBaseClassName());
}
protected void generateDefaultConstructorBody( PrintWriter out ) {
}
protected String generateInitializerList() {
StringBuilder result = new StringBuilder();
Iterator<String> iter = getBaseClasses().iterator();
while(iter.hasNext()) {
result.append(iter.next());
result.append("()");
if(iter.hasNext()) {
result.append(", ");
}
}
int lastLineEnds = 0;
for( JProperty property : getProperties() ) {
String value = toCppDefaultValue(property.getType());
String propertyName = property.getSimpleName();
String parameterName = decapitalize(propertyName);
result.append(", ");
int currentLength = result.toString().length();
if( ( currentLength - lastLineEnds ) >= 120 ) {
lastLineEnds = currentLength;
result.append("\n");
result.append(" ");
}
result.append(parameterName + "(" + value + ")" );
}
return result.toString();
}
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 ) {
out.println(" ostringstream stream;" );
out.println("");
if( getBaseClassName().equals( "BaseCommand" ) ) {
out.println(" stream << \""+getClassName()+" { \"" );
out.println(" << \"commandId = \" << this->getCommandId() << \", \"");
out.println(" << \"responseRequired = \" << boolalpha << this->isResponseRequired();");
if( getProperties().size() > 0 ) {
out.println(" stream << \", \";");
}
} else {
out.println(" stream << \""+getClassName()+" { \";" );
}
int length = getProperties().size();
int count = 0;
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(" stream << \""+propertyName+" = \";");
out.println(" if (this->"+getter+"().size() > 0) {");
out.println(" stream << \"[size=\" << this->" + getter + "().size() << \"]\";");
out.println(" } else {");
out.println(" stream << \"NULL\";");
out.println(" }");
} else if( type.equals("unsigned char") ){
out.println(" stream << \""+propertyName+" = \" << (int)this->"+getter+"();");
} else if( property.getType().isPrimitiveType() || type.equals("std::string") ){
out.println(" stream << \""+propertyName+" = \" << this->"+getter+"();");
} else if( property.getType().isArrayType() &&
!property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" stream << \""+propertyName+" = \";");
out.println(" if (this->"+getter+"().size() > 0) {");
out.println(" stream << \"[\";");
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(" stream << this->"+getter+"()[i"+parameterName+"]->toString() << \", \";");
out.println(" } else {");
out.println(" stream << \"NULL\" << \", \";");
out.println(" }");
out.println(" }");
out.println(" stream << \"]\";");
out.println(" } else {");
out.println(" stream << \"NULL\";");
out.println(" }");
} else if( property.getType().isArrayType() &&
property.getType().getArrayComponentType().isPrimitiveType() ) {
out.println(" stream << \""+propertyName+" = \";");
out.println(" if (this->"+getter+"().size() > 0) {");
out.println(" stream << \"[\";");
out.println(" for (size_t i" + parameterName + " = 0; i" + parameterName + " < this->"+getter+"().size(); ++i" + parameterName + ") {");
out.println(" stream << this->"+getter+"()[i"+parameterName+"] << \",\";");
out.println(" }");
out.println(" stream << \"]\";");
out.println(" } else {");
out.println(" stream << \"NULL\";");
out.println(" }");
} else {
out.println(" stream << \""+propertyName+" = \";" );
out.println(" if (this->"+getter+"() != NULL) {");
out.println(" stream << this->"+getter+"()->toString();");
out.println(" } else {");
out.println(" stream << \"NULL\";");
out.println(" }");
}
if( ++count < length ) {
out.println(" stream << \", \";");
}
}
out.println(" stream << \" }\";" );
out.println("");
out.println(" return stream.str();");
}
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 = StringUtils::compareIgnoreCase(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 ) {}
}