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 */
017package org.apache.activemq.openwire.tool;
018
019import java.io.File;
020import java.io.PrintWriter;
021import java.util.ArrayList;
022import java.util.Collections;
023import java.util.Comparator;
024import java.util.Iterator;
025import java.util.List;
026
027import org.codehaus.jam.JAnnotation;
028import org.codehaus.jam.JAnnotationValue;
029import org.codehaus.jam.JClass;
030import org.codehaus.jam.JProperty;
031
032/**
033 * 
034 */
035public 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}