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.util.ArrayList;
022 import java.util.Collections;
023 import java.util.Comparator;
024 import java.util.Iterator;
025 import java.util.List;
026
027 import org.codehaus.jam.JAnnotation;
028 import org.codehaus.jam.JAnnotationValue;
029 import org.codehaus.jam.JClass;
030 import org.codehaus.jam.JProperty;
031
032 /**
033 * @version $Revision: 384390 $
034 */
035 public class CSharpMarshallingGenerator extends JavaMarshallingGenerator {
036
037 protected String targetDir = "./src/main/csharp";
038
039 public Object run() {
040 filePostFix = ".cs";
041 if (destDir == null) {
042 destDir = new File(targetDir + "/ActiveMQ/OpenWire/V" + getOpenwireVersion());
043 }
044 return super.run();
045 }
046
047 // ////////////////////////////////////////////////////////////////////////////////////
048 // This section is for the tight wire format encoding generator
049 // ////////////////////////////////////////////////////////////////////////////////////
050
051 protected void generateTightUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
052
053 String propertyName = property.getSimpleName();
054 String type = property.getType().getSimpleName();
055
056 if (type.equals("boolean")) {
057 out.println(" info." + propertyName + " = bs.ReadBoolean();");
058 } else if (type.equals("byte")) {
059 out.println(" info." + propertyName + " = dataIn.ReadByte();");
060 } else if (type.equals("char")) {
061 out.println(" info." + propertyName + " = dataIn.ReadChar();");
062 } else if (type.equals("short")) {
063 out.println(" info." + propertyName + " = dataIn.ReadInt16();");
064 } else if (type.equals("int")) {
065 out.println(" info." + propertyName + " = dataIn.ReadInt32();");
066 } else if (type.equals("long")) {
067 out.println(" info." + propertyName + " = TightUnmarshalLong(wireFormat, dataIn, bs);");
068 } else if (type.equals("String")) {
069 out.println(" info." + propertyName + " = TightUnmarshalString(dataIn, bs);");
070 } else if (type.equals("byte[]") || type.equals("ByteSequence")) {
071 if (size != null) {
072 out.println(" info." + propertyName + " = ReadBytes(dataIn, " + size.asInt() + ");");
073 } else {
074 out.println(" info." + propertyName + " = ReadBytes(dataIn, bs.ReadBoolean());");
075 }
076 } else if (isThrowable(property.getType())) {
077 out.println(" info." + propertyName + " = TightUnmarshalBrokerError(wireFormat, dataIn, bs);");
078 } else if (isCachedProperty(property)) {
079 out.println(" info." + propertyName + " = (" + type + ") TightUnmarshalCachedObject(wireFormat, dataIn, bs);");
080 } else {
081 out.println(" info." + propertyName + " = (" + type + ") TightUnmarshalNestedObject(wireFormat, dataIn, bs);");
082 }
083 }
084
085 protected void generateTightUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
086 JClass propertyType = property.getType();
087 String arrayType = propertyType.getArrayComponentType().getSimpleName();
088 String propertyName = property.getSimpleName();
089 out.println();
090 if (size != null) {
091 out.println(" {");
092 out.println(" " + arrayType + "[] value = new " + arrayType + "[" + size.asInt() + "];");
093 out.println(" " + "for( int i=0; i < " + size.asInt() + "; i++ ) {");
094 out.println(" value[i] = (" + arrayType + ") TightUnmarshalNestedObject(wireFormat,dataIn, bs);");
095 out.println(" }");
096 out.println(" info." + propertyName + " = value;");
097 out.println(" }");
098 } else {
099 out.println(" if (bs.ReadBoolean()) {");
100 out.println(" short size = dataIn.ReadInt16();");
101 out.println(" " + arrayType + "[] value = new " + arrayType + "[size];");
102 out.println(" for( int i=0; i < size; i++ ) {");
103 out.println(" value[i] = (" + arrayType + ") TightUnmarshalNestedObject(wireFormat,dataIn, bs);");
104 out.println(" }");
105 out.println(" info." + propertyName + " = value;");
106 out.println(" }");
107 out.println(" else {");
108 out.println(" info." + propertyName + " = null;");
109 out.println(" }");
110 }
111 }
112
113 protected int generateTightMarshal1Body(PrintWriter out) {
114 List properties = getProperties();
115 int baseSize = 0;
116 for (Iterator iter = properties.iterator(); iter.hasNext();) {
117 JProperty property = (JProperty)iter.next();
118 JAnnotation annotation = property.getAnnotation("openwire:property");
119 JAnnotationValue size = annotation.getValue("size");
120 JClass propertyType = property.getType();
121 String type = propertyType.getSimpleName();
122 String getter = "info." + property.getSimpleName();
123
124 if (type.equals("boolean")) {
125 out.println(" bs.WriteBoolean(" + getter + ");");
126 } else if (type.equals("byte")) {
127 baseSize += 1;
128 } else if (type.equals("char")) {
129 baseSize += 2;
130 } else if (type.equals("short")) {
131 baseSize += 2;
132 } else if (type.equals("int")) {
133 baseSize += 4;
134 } else if (type.equals("long")) {
135 out.println(" rc += TightMarshalLong1(wireFormat, " + getter + ", bs);");
136 } else if (type.equals("String")) {
137 out.print("");
138 out.println(" rc += TightMarshalString1(" + getter + ", bs);");
139 } else if (type.equals("byte[]") || type.equals("ByteSequence")) {
140 if (size == null) {
141 out.println(" bs.WriteBoolean(" + getter + "!=null);");
142 out.println(" rc += " + getter + "==null ? 0 : " + getter + ".Length+4;");
143 } else {
144 baseSize += size.asInt();
145 }
146 } else if (propertyType.isArrayType()) {
147 if (size != null) {
148 out.println(" rc += TightMarshalObjectArrayConstSize1(wireFormat, " + getter + ", bs, " + size.asInt() + ");");
149 } else {
150 out.println(" rc += TightMarshalObjectArray1(wireFormat, " + getter + ", bs);");
151 }
152 } else if (isThrowable(propertyType)) {
153 out.println(" rc += TightMarshalBrokerError1(wireFormat, " + getter + ", bs);");
154 } else {
155 if (isCachedProperty(property)) {
156 out.println(" rc += TightMarshalCachedObject1(wireFormat, (DataStructure)" + getter + ", bs);");
157 } else {
158 out.println(" rc += TightMarshalNestedObject1(wireFormat, (DataStructure)" + getter + ", bs);");
159 }
160 }
161 }
162 return baseSize;
163 }
164
165 protected void generateTightMarshal2Body(PrintWriter out) {
166 List properties = getProperties();
167 for (Iterator iter = properties.iterator(); iter.hasNext();) {
168 JProperty property = (JProperty)iter.next();
169 JAnnotation annotation = property.getAnnotation("openwire:property");
170 JAnnotationValue size = annotation.getValue("size");
171 JClass propertyType = property.getType();
172 String type = propertyType.getSimpleName();
173 String getter = "info." + property.getSimpleName();
174
175 if (type.equals("boolean")) {
176 out.println(" bs.ReadBoolean();");
177 } else if (type.equals("byte")) {
178 out.println(" dataOut.Write(" + getter + ");");
179 } else if (type.equals("char")) {
180 out.println(" dataOut.Write(" + getter + ");");
181 } else if (type.equals("short")) {
182 out.println(" dataOut.Write(" + getter + ");");
183 } else if (type.equals("int")) {
184 out.println(" dataOut.Write(" + getter + ");");
185 } else if (type.equals("long")) {
186 out.println(" TightMarshalLong2(wireFormat, " + getter + ", dataOut, bs);");
187 } else if (type.equals("String")) {
188 out.println(" TightMarshalString2(" + getter + ", dataOut, bs);");
189 } else if (type.equals("byte[]") || type.equals("ByteSequence")) {
190 if (size != null) {
191 out.println(" dataOut.Write(" + getter + ", 0, " + size.asInt() + ");");
192 } else {
193 out.println(" if(bs.ReadBoolean()) {");
194 out.println(" dataOut.Write(" + getter + ".Length);");
195 out.println(" dataOut.Write(" + getter + ");");
196 out.println(" }");
197 }
198 } else if (propertyType.isArrayType()) {
199 if (size != null) {
200 out.println(" TightMarshalObjectArrayConstSize2(wireFormat, " + getter + ", dataOut, bs, " + size.asInt() + ");");
201 } else {
202 out.println(" TightMarshalObjectArray2(wireFormat, " + getter + ", dataOut, bs);");
203 }
204 } else if (isThrowable(propertyType)) {
205 out.println(" TightMarshalBrokerError2(wireFormat, " + getter + ", dataOut, bs);");
206 } else {
207 if (isCachedProperty(property)) {
208 out.println(" TightMarshalCachedObject2(wireFormat, (DataStructure)" + getter + ", dataOut, bs);");
209 } else {
210 out.println(" TightMarshalNestedObject2(wireFormat, (DataStructure)" + getter + ", dataOut, bs);");
211 }
212 }
213 }
214 }
215
216 // ////////////////////////////////////////////////////////////////////////////////////
217 // This section is for the loose wire format encoding generator
218 // ////////////////////////////////////////////////////////////////////////////////////
219
220 protected void generateLooseUnmarshalBodyForProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
221
222 String propertyName = property.getSimpleName();
223 String type = property.getType().getSimpleName();
224
225 if (type.equals("boolean")) {
226 out.println(" info." + propertyName + " = dataIn.ReadBoolean();");
227 } else if (type.equals("byte")) {
228 out.println(" info." + propertyName + " = dataIn.ReadByte();");
229 } else if (type.equals("char")) {
230 out.println(" info." + propertyName + " = dataIn.ReadChar();");
231 } else if (type.equals("short")) {
232 out.println(" info." + propertyName + " = dataIn.ReadInt16();");
233 } else if (type.equals("int")) {
234 out.println(" info." + propertyName + " = dataIn.ReadInt32();");
235 } else if (type.equals("long")) {
236 out.println(" info." + propertyName + " = LooseUnmarshalLong(wireFormat, dataIn);");
237 } else if (type.equals("String")) {
238 out.println(" info." + propertyName + " = LooseUnmarshalString(dataIn);");
239 } else if (type.equals("byte[]") || type.equals("ByteSequence")) {
240 if (size != null) {
241 out.println(" info." + propertyName + " = ReadBytes(dataIn, " + size.asInt() + ");");
242 } else {
243 out.println(" info." + propertyName + " = ReadBytes(dataIn, dataIn.ReadBoolean());");
244 }
245 } else if (isThrowable(property.getType())) {
246 out.println(" info." + propertyName + " = LooseUnmarshalBrokerError(wireFormat, dataIn);");
247 } else if (isCachedProperty(property)) {
248 out.println(" info." + propertyName + " = (" + type + ") LooseUnmarshalCachedObject(wireFormat, dataIn);");
249 } else {
250 out.println(" info." + propertyName + " = (" + type + ") LooseUnmarshalNestedObject(wireFormat, dataIn);");
251 }
252 }
253
254 protected void generateLooseUnmarshalBodyForArrayProperty(PrintWriter out, JProperty property, JAnnotationValue size) {
255 JClass propertyType = property.getType();
256 String arrayType = propertyType.getArrayComponentType().getSimpleName();
257 String propertyName = property.getSimpleName();
258 out.println();
259 if (size != null) {
260 out.println(" {");
261 out.println(" " + arrayType + "[] value = new " + arrayType + "[" + size.asInt() + "];");
262 out.println(" " + "for( int i=0; i < " + size.asInt() + "; i++ ) {");
263 out.println(" value[i] = (" + arrayType + ") LooseUnmarshalNestedObject(wireFormat,dataIn);");
264 out.println(" }");
265 out.println(" info." + propertyName + " = value;");
266 out.println(" }");
267 } else {
268 out.println(" if (dataIn.ReadBoolean()) {");
269 out.println(" short size = dataIn.ReadInt16();");
270 out.println(" " + arrayType + "[] value = new " + arrayType + "[size];");
271 out.println(" for( int i=0; i < size; i++ ) {");
272 out.println(" value[i] = (" + arrayType + ") LooseUnmarshalNestedObject(wireFormat,dataIn);");
273 out.println(" }");
274 out.println(" info." + propertyName + " = value;");
275 out.println(" }");
276 out.println(" else {");
277 out.println(" info." + propertyName + " = null;");
278 out.println(" }");
279 }
280 }
281
282 protected void generateLooseMarshalBody(PrintWriter out) {
283 List properties = getProperties();
284 for (Iterator iter = properties.iterator(); iter.hasNext();) {
285 JProperty property = (JProperty)iter.next();
286 JAnnotation annotation = property.getAnnotation("openwire:property");
287 JAnnotationValue size = annotation.getValue("size");
288 JClass propertyType = property.getType();
289 String type = propertyType.getSimpleName();
290 String getter = "info." + property.getSimpleName();
291
292 if (type.equals("boolean")) {
293 out.println(" dataOut.Write(" + getter + ");");
294 } else if (type.equals("byte")) {
295 out.println(" dataOut.Write(" + getter + ");");
296 } else if (type.equals("char")) {
297 out.println(" dataOut.Write(" + getter + ");");
298 } else if (type.equals("short")) {
299 out.println(" dataOut.Write(" + getter + ");");
300 } else if (type.equals("int")) {
301 out.println(" dataOut.Write(" + getter + ");");
302 } else if (type.equals("long")) {
303 out.println(" LooseMarshalLong(wireFormat, " + getter + ", dataOut);");
304 } else if (type.equals("String")) {
305 out.println(" LooseMarshalString(" + getter + ", dataOut);");
306 } else if (type.equals("byte[]") || type.equals("ByteSequence")) {
307 if (size != null) {
308 out.println(" dataOut.Write(" + getter + ", 0, " + size.asInt() + ");");
309 } else {
310 out.println(" dataOut.Write(" + getter + "!=null);");
311 out.println(" if(" + getter + "!=null) {");
312 out.println(" dataOut.Write(" + getter + ".Length);");
313 out.println(" dataOut.Write(" + getter + ");");
314 out.println(" }");
315 }
316 } else if (propertyType.isArrayType()) {
317 if (size != null) {
318 out.println(" LooseMarshalObjectArrayConstSize(wireFormat, " + getter + ", dataOut, " + size.asInt() + ");");
319 } else {
320 out.println(" LooseMarshalObjectArray(wireFormat, " + getter + ", dataOut);");
321 }
322 } else if (isThrowable(propertyType)) {
323 out.println(" LooseMarshalBrokerError(wireFormat, " + getter + ", dataOut);");
324 } else {
325 if (isCachedProperty(property)) {
326 out.println(" LooseMarshalCachedObject(wireFormat, (DataStructure)" + getter + ", dataOut);");
327 } else {
328 out.println(" LooseMarshalNestedObject(wireFormat, (DataStructure)" + getter + ", dataOut);");
329 }
330 }
331 }
332 }
333
334 public String getTargetDir() {
335 return targetDir;
336 }
337
338 public void setTargetDir(String targetDir) {
339 this.targetDir = targetDir;
340 }
341
342 private void generateLicence(PrintWriter out) {
343 out.println("/**");
344 out.println(" * Licensed to the Apache Software Foundation (ASF) under one or more");
345 out.println(" * contributor license agreements. See the NOTICE file distributed with");
346 out.println(" * this work for additional information regarding copyright ownership.");
347 out.println(" * The ASF licenses this file to You under the Apache License, Version 2.0");
348 out.println(" * (the \"License\"); you may not use this file except in compliance with");
349 out.println(" * the License. You may obtain a copy of the License at");
350 out.println(" *");
351 out.println(" * http://www.apache.org/licenses/LICENSE-2.0");
352 out.println(" *");
353 out.println(" * Unless required by applicable law or agreed to in writing, software");
354 out.println(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
355 out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
356 out.println(" * See the License for the specific language governing permissions and");
357 out.println(" * limitations under the License.");
358 out.println(" */");
359 }
360
361 protected void generateFile(PrintWriter out) throws Exception {
362 generateLicence(out);
363 out.println("");
364 out.println("//");
365 out.println("// NOTE!: This file is autogenerated - do not modify!");
366 out.println("// if you need to make a change, please see the Groovy scripts in the");
367 out.println("// activemq-core module");
368 out.println("//");
369 out.println("");
370 out.println("using System;");
371 out.println("using System.Collections;");
372 out.println("using System.IO;");
373 out.println("");
374 out.println("using ActiveMQ.Commands;");
375 out.println("using ActiveMQ.OpenWire;");
376 out.println("using ActiveMQ.OpenWire.V" + getOpenwireVersion() + ";");
377 out.println("");
378 out.println("namespace ActiveMQ.OpenWire.V" + getOpenwireVersion() + "");
379 out.println("{");
380 out.println(" /// <summary>");
381 out.println(" /// Marshalling code for Open Wire Format for " + jclass.getSimpleName() + "");
382 out.println(" /// </summary>");
383 out.println(" " + getAbstractClassText() + "class " + getClassName() + " : " + getBaseClass() + "");
384 out.println(" {");
385
386 if (!isAbstractClass()) {
387 out.println("");
388 out.println("");
389 out.println(" public override DataStructure CreateObject() ");
390 out.println(" {");
391 out.println(" return new " + jclass.getSimpleName() + "();");
392 out.println(" }");
393 out.println("");
394 out.println(" public override byte GetDataStructureType() ");
395 out.println(" {");
396 out.println(" return " + jclass.getSimpleName() + ".ID_" + jclass.getSimpleName() + ";");
397 out.println(" }");
398 }
399
400 /*
401 * Generate the tight encoding marshallers
402 */
403 out.println("");
404 out.println(" // ");
405 out.println(" // Un-marshal an object instance from the data input stream");
406 out.println(" // ");
407 out.println(" public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) ");
408 out.println(" {");
409 out.println(" base.TightUnmarshal(wireFormat, o, dataIn, bs);");
410
411 if (!getProperties().isEmpty() || isMarshallerAware()) {
412 out.println("");
413 out.println(" " + jclass.getSimpleName() + " info = (" + jclass.getSimpleName() + ")o;");
414 }
415
416 if (isMarshallerAware()) {
417 out.println("");
418 out.println(" info.BeforeUnmarshall(wireFormat);");
419 out.println("");
420 }
421
422 generateTightUnmarshalBody(out);
423
424 if (isMarshallerAware()) {
425 out.println("");
426 out.println(" info.AfterUnmarshall(wireFormat);");
427 }
428
429 out.println("");
430 out.println(" }");
431 out.println("");
432 out.println(" //");
433 out.println(" // Write the booleans that this object uses to a BooleanStream");
434 out.println(" //");
435 out.println(" public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs) {");
436 out.println(" " + jclass.getSimpleName() + " info = (" + jclass.getSimpleName() + ")o;");
437
438 if (isMarshallerAware()) {
439 out.println("");
440 out.println(" info.BeforeMarshall(wireFormat);");
441 }
442
443 out.println("");
444 out.println(" int rc = base.TightMarshal1(wireFormat, info, bs);");
445
446 int baseSize = generateTightMarshal1Body(out);
447
448 out.println("");
449 out.println(" return rc + " + baseSize + ";");
450 out.println(" }");
451 out.println("");
452 out.println(" // ");
453 out.println(" // Write a object instance to data output stream");
454 out.println(" //");
455 out.println(" public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs) {");
456 out.println(" base.TightMarshal2(wireFormat, o, dataOut, bs);");
457
458 if (!getProperties().isEmpty() || isMarshallerAware()) {
459 out.println("");
460 out.println(" " + jclass.getSimpleName() + " info = (" + jclass.getSimpleName() + ")o;");
461 }
462
463 generateTightMarshal2Body(out);
464
465 if (isMarshallerAware()) {
466 out.println("");
467 out.println(" info.AfterMarshall(wireFormat);");
468 }
469
470 out.println("");
471 out.println(" }");
472
473 out.println("");
474 out.println(" // ");
475 out.println(" // Un-marshal an object instance from the data input stream");
476 out.println(" // ");
477 out.println(" public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) ");
478 out.println(" {");
479 out.println(" base.LooseUnmarshal(wireFormat, o, dataIn);");
480
481 if (!getProperties().isEmpty() || isMarshallerAware()) {
482 out.println("");
483 out.println(" " + jclass.getSimpleName() + " info = (" + jclass.getSimpleName() + ")o;");
484 }
485
486 if (isMarshallerAware()) {
487 out.println("");
488 out.println(" info.BeforeUnmarshall(wireFormat);");
489 out.println("");
490 }
491
492 generateLooseUnmarshalBody(out);
493
494 if (isMarshallerAware()) {
495 out.println("");
496 out.println(" info.AfterUnmarshall(wireFormat);");
497 }
498
499 out.println("");
500 out.println(" }");
501 out.println("");
502 out.println(" // ");
503 out.println(" // Write a object instance to data output stream");
504 out.println(" //");
505 out.println(" public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut) {");
506
507 if (!getProperties().isEmpty() || isMarshallerAware()) {
508 out.println("");
509 out.println(" " + jclass.getSimpleName() + " info = (" + jclass.getSimpleName() + ")o;");
510 }
511
512 if (isMarshallerAware()) {
513 out.println("");
514 out.println(" info.BeforeMarshall(wireFormat);");
515 }
516
517 out.println("");
518 out.println(" base.LooseMarshal(wireFormat, o, dataOut);");
519
520 generateLooseMarshalBody(out);
521
522 if (isMarshallerAware()) {
523 out.println("");
524 out.println(" info.AfterMarshall(wireFormat);");
525 }
526 out.println("");
527 out.println(" }");
528 out.println(" }");
529 out.println("}");
530
531 }
532
533 public void generateFactory(PrintWriter out) {
534 generateLicence(out);
535 out.println("");
536 out.println("//");
537 out.println("// NOTE!: This file is autogenerated - do not modify!");
538 out.println("// if you need to make a change, please see the Groovy scripts in the");
539 out.println("// activemq-core module");
540 out.println("//");
541 out.println("");
542 out.println("using System;");
543 out.println("using System.Collections;");
544 out.println("using System.IO;");
545 out.println("");
546 out.println("using ActiveMQ.Commands;");
547 out.println("using ActiveMQ.OpenWire;");
548 out.println("using ActiveMQ.OpenWire.V" + getOpenwireVersion() + ";");
549 out.println("");
550 out.println("namespace ActiveMQ.OpenWire.V" + getOpenwireVersion() + "");
551 out.println("{");
552 out.println(" /// <summary>");
553 out.println(" /// Used to create marshallers for a specific version of the wire protocol");
554 out.println(" /// </summary>");
555 out.println(" public class MarshallerFactory : IMarshallerFactory");
556 out.println(" {");
557 out.println(" public void configure(OpenWireFormat format) ");
558 out.println(" {");
559 out.println(" format.clearMarshallers();");
560
561 List list = new ArrayList(getConcreteClasses());
562 Collections.sort(list, new Comparator() {
563 public int compare(Object o1, Object o2) {
564 JClass c1 = (JClass)o1;
565 JClass c2 = (JClass)o2;
566 return c1.getSimpleName().compareTo(c2.getSimpleName());
567 }
568 });
569
570 for (Iterator iter = list.iterator(); iter.hasNext();) {
571 JClass jclass = (JClass)iter.next();
572 out.println(" format.addMarshaller(new " + jclass.getSimpleName() + "Marshaller());");
573 }
574
575 out.println("");
576 out.println(" }");
577 out.println(" }");
578 out.println("}");
579
580 }
581 }