001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.activemq.openwire.tool;
018
019 import java.io.File;
020 import java.io.PrintWriter;
021 import java.io.StringWriter;
022 import java.util.Iterator;
023 import java.util.List;
024
025 import org.codehaus.jam.JClass;
026 import org.codehaus.jam.JProperty;
027
028 /**
029 * @version $Revision: 383749 $
030 */
031 public class CSharpClassesGenerator extends MultiSourceGenerator {
032
033 protected String targetDir = "./src/main/csharp";
034
035 public Object run() {
036 filePostFix = ".cs";
037 if (destDir == null) {
038 destDir = new File(targetDir + "/ActiveMQ/Commands");
039 }
040 return super.run();
041 }
042
043 public String makeHashCodeBody() throws Exception {
044 if (simpleName.endsWith("Id")) {
045 StringWriter buffer = new StringWriter();
046 PrintWriter out = new PrintWriter(buffer);
047 out.println(" int answer = 0;");
048 Iterator iter = getProperties().iterator();
049 while (iter.hasNext()) {
050 JProperty property = (JProperty)iter.next();
051 out.println(" answer = (answer * 37) + HashCode(" + property.getSimpleName() + ");");
052 }
053 out.println(" return answer;");
054 return buffer.toString();
055 }
056 return null;
057 }
058
059 public String makeEqualsBody() throws Exception {
060 if (simpleName.endsWith("Id")) {
061 StringWriter buffer = new StringWriter();
062 PrintWriter out = new PrintWriter(buffer);
063
064 Iterator iter = getProperties().iterator();
065 while (iter.hasNext()) {
066 JProperty property = (JProperty)iter.next();
067 String name = property.getSimpleName();
068 out.println(" if (! Equals(this." + name + ", that." + name + ")) return false;");
069 }
070 out.println(" return true;");
071 return buffer.toString();
072 }
073 return null;
074 }
075
076 public String makeToStringBody() throws Exception {
077 StringWriter buffer = new StringWriter();
078 PrintWriter out = new PrintWriter(buffer);
079 out.println(" return GetType().Name + \"[\"");
080 Iterator iter = getProperties().iterator();
081 while (iter.hasNext()) {
082 JProperty property = (JProperty)iter.next();
083 String name = property.getSimpleName();
084 out.println(" + \" " + name + "=\" + " + name);
085 }
086 out.println(" + \" ]\";");
087 return buffer.toString();
088 }
089
090 private void generateLicence(PrintWriter out) {
091 out.println("/*");
092 out.println(" * Licensed to the Apache Software Foundation (ASF) under one or more");
093 out.println(" * contributor license agreements. See the NOTICE file distributed with");
094 out.println(" * this work for additional information regarding copyright ownership.");
095 out.println(" * The ASF licenses this file to You under the Apache License, Version 2.0");
096 out.println(" * (the \"License\"); you may not use this file except in compliance with");
097 out.println(" * the License. You may obtain a copy of the License at");
098 out.println(" *");
099 out.println(" * http://www.apache.org/licenses/LICENSE-2.0");
100 out.println(" *");
101 out.println(" * Unless required by applicable law or agreed to in writing, software");
102 out.println(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
103 out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
104 out.println(" * See the License for the specific language governing permissions and");
105 out.println(" * limitations under the License.");
106 out.println(" */");
107 }
108
109 protected void generateFile(PrintWriter out) throws Exception {
110 generateLicence(out);
111
112 out.println("//");
113 out.println("// NOTE!: This file is autogenerated - do not modify!");
114 out.println("// if you need to make a change, please see the Groovy scripts in the");
115 out.println("// activemq-core module");
116 out.println("//");
117 out.println("");
118 out.println("using System;");
119 out.println("using System.Collections;");
120 out.println("");
121 out.println("using ActiveMQ.OpenWire;");
122 out.println("using ActiveMQ.Commands;");
123 out.println("");
124 out.println("namespace ActiveMQ.Commands");
125 out.println("{");
126 out.println(" /// <summary>");
127 out.println(" /// The ActiveMQ " + jclass.getSimpleName() + " Command");
128 out.println(" /// </summary>");
129 out.print(" public class " + jclass.getSimpleName() + " : " + baseClass);
130
131 for (int i = 0; i < jclass.getInterfaces().length; i++) {
132 JClass intf = jclass.getInterfaces()[i];
133 out.print(", " + intf.getSimpleName());
134 }
135
136 out.println("");
137 out.println(" {");
138 out.println(" public const byte ID_" + jclass.getSimpleName() + " = " + getOpenWireOpCode(jclass) + ";");
139 out.println(" ");
140
141 List properties = getProperties();
142 String type;
143 Object name;
144 for (Iterator iter = properties.iterator(); iter.hasNext();) {
145 JProperty property = (JProperty)iter.next();
146 type = toCSharpType(property.getType());
147 name = decapitalize(property.getSimpleName());
148 out.println(" " + type + " " + name + ";");
149 }
150
151 String text = makeHashCodeBody();
152 if (text != null) {
153 out.println("");
154 out.println(" public override int GetHashCode() {");
155 out.println("" + text + "");
156 out.println(" }");
157 }
158
159 text = makeEqualsBody();
160 if (text != null) {
161 out.println("");
162 out.println(" public override bool Equals(object that) {");
163 out.println(" if (that is " + className + ") {");
164 out.println(" return Equals((" + className + ") that);");
165 out.println(" }");
166 out.println(" return false;");
167 out.println(" }");
168 out.println("");
169 out.println(" public virtual bool Equals(" + className + " that) {");
170 out.println("" + text + "");
171 out.println(" }");
172 }
173
174 text = makeToStringBody();
175 if (text != null) {
176 out.println("");
177 out.println(" public override string ToString() {");
178 out.println("" + text + "");
179 out.println(" }");
180 }
181
182 out.println("");
183 out.println(" public override byte GetDataStructureType() {");
184 out.println(" return ID_" + jclass.getSimpleName() + ";");
185 out.println(" }");
186 out.println("");
187 out.println("");
188 out.println(" // Properties");
189
190 for (Iterator iter = properties.iterator(); iter.hasNext();) {
191 JProperty property = (JProperty)iter.next();
192 type = toCSharpType(property.getType());
193 name = decapitalize(property.getSimpleName());
194 String propertyName = property.getSimpleName();
195
196 out.println("");
197 out.println(" public " + type + " " + propertyName + "");
198 out.println(" {");
199 out.println(" get { return " + name + "; }");
200 out.println(" set { this." + name + " = value; } ");
201 out.println(" }");
202 }
203
204 out.println("");
205 out.println(" }");
206 out.println("}");
207 }
208
209 public String getTargetDir() {
210 return targetDir;
211 }
212
213 public void setTargetDir(String targetDir) {
214 this.targetDir = targetDir;
215 }
216 }