blob: a5960848219138457d9bf4387d8a628c61bac371 [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;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;
import org.codehaus.jam.JClass;
import org.codehaus.jam.JProperty;
/**
*
*/
public class CSharpClassesGenerator extends MultiSourceGenerator {
protected String targetDir = "./src/main/csharp";
public Object run() {
filePostFix = ".cs";
if (destDir == null) {
destDir = new File(targetDir + "/ActiveMQ/Commands");
}
return super.run();
}
public String makeHashCodeBody() throws Exception {
if (simpleName.endsWith("Id")) {
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
out.println(" int answer = 0;");
Iterator iter = getProperties().iterator();
while (iter.hasNext()) {
JProperty property = (JProperty)iter.next();
out.println(" answer = (answer * 37) + HashCode(" + property.getSimpleName() + ");");
}
out.println(" return answer;");
return buffer.toString();
}
return null;
}
public String makeEqualsBody() throws Exception {
if (simpleName.endsWith("Id")) {
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
Iterator iter = getProperties().iterator();
while (iter.hasNext()) {
JProperty property = (JProperty)iter.next();
String name = property.getSimpleName();
out.println(" if (! Equals(this." + name + ", that." + name + ")) return false;");
}
out.println(" return true;");
return buffer.toString();
}
return null;
}
public String makeToStringBody() throws Exception {
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
out.println(" return GetType().Name + \"[\"");
Iterator iter = getProperties().iterator();
while (iter.hasNext()) {
JProperty property = (JProperty)iter.next();
String name = property.getSimpleName();
out.println(" + \" " + name + "=\" + " + name);
}
out.println(" + \" ]\";");
return buffer.toString();
}
private void generateLicence(PrintWriter out) {
out.println("/*");
out.println(" * Licensed to the Apache Software Foundation (ASF) under one or more");
out.println(" * contributor license agreements. See the NOTICE file distributed with");
out.println(" * this work for additional information regarding copyright ownership.");
out.println(" * The ASF licenses this file to You under the Apache License, Version 2.0");
out.println(" * (the \"License\"); you may not use this file except in compliance with");
out.println(" * the License. You may obtain a copy of the License at");
out.println(" *");
out.println(" * http://www.apache.org/licenses/LICENSE-2.0");
out.println(" *");
out.println(" * Unless required by applicable law or agreed to in writing, software");
out.println(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
out.println(" * See the License for the specific language governing permissions and");
out.println(" * limitations under the License.");
out.println(" */");
}
protected void generateFile(PrintWriter out) throws Exception {
generateLicence(out);
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("using System;");
out.println("using System.Collections;");
out.println("");
out.println("using ActiveMQ.OpenWire;");
out.println("using ActiveMQ.Commands;");
out.println("");
out.println("namespace ActiveMQ.Commands");
out.println("{");
out.println(" /// <summary>");
out.println(" /// The ActiveMQ " + jclass.getSimpleName() + " Command");
out.println(" /// </summary>");
out.print(" public class " + jclass.getSimpleName() + " : " + baseClass);
for (int i = 0; i < jclass.getInterfaces().length; i++) {
JClass intf = jclass.getInterfaces()[i];
out.print(", " + intf.getSimpleName());
}
out.println("");
out.println(" {");
out.println(" public const byte ID_" + jclass.getSimpleName() + " = " + getOpenWireOpCode(jclass) + ";");
out.println(" ");
List properties = getProperties();
String type;
Object name;
for (Iterator iter = properties.iterator(); iter.hasNext();) {
JProperty property = (JProperty)iter.next();
type = toCSharpType(property.getType());
name = decapitalize(property.getSimpleName());
out.println(" " + type + " " + name + ";");
}
String text = makeHashCodeBody();
if (text != null) {
out.println("");
out.println(" public override int GetHashCode() {");
out.println("" + text + "");
out.println(" }");
}
text = makeEqualsBody();
if (text != null) {
out.println("");
out.println(" public override bool Equals(object that) {");
out.println(" if (that is " + className + ") {");
out.println(" return Equals((" + className + ") that);");
out.println(" }");
out.println(" return false;");
out.println(" }");
out.println("");
out.println(" public virtual bool Equals(" + className + " that) {");
out.println("" + text + "");
out.println(" }");
}
text = makeToStringBody();
if (text != null) {
out.println("");
out.println(" public override string ToString() {");
out.println("" + text + "");
out.println(" }");
}
out.println("");
out.println(" public override byte GetDataStructureType() {");
out.println(" return ID_" + jclass.getSimpleName() + ";");
out.println(" }");
out.println("");
out.println("");
out.println(" // Properties");
for (Iterator iter = properties.iterator(); iter.hasNext();) {
JProperty property = (JProperty)iter.next();
type = toCSharpType(property.getType());
name = decapitalize(property.getSimpleName());
String propertyName = property.getSimpleName();
out.println("");
out.println(" public " + type + " " + propertyName + "");
out.println(" {");
out.println(" get { return " + name + "; }");
out.println(" set { this." + name + " = value; } ");
out.println(" }");
}
out.println("");
out.println(" }");
out.println("}");
}
public String getTargetDir() {
return targetDir;
}
public void setTargetDir(String targetDir) {
this.targetDir = targetDir;
}
}