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     * 
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    }