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.Iterator;
023import java.util.List;
024
025import org.codehaus.jam.JAnnotation;
026import org.codehaus.jam.JAnnotationValue;
027import org.codehaus.jam.JClass;
028import org.codehaus.jam.JProperty;
029
030/**
031 * 
032 */
033public class CSourcesGenerator extends CHeadersGenerator {
034
035    public Object run() {
036        filePostFix = ".c";
037        if (destFile == null) {
038            destFile = new File(targetDir + "/ow_commands_v" + getOpenwireVersion() + ".c");
039        }
040        return super.run();
041    }
042
043    protected List sort(List source) {
044        return source;
045    }
046
047    protected void generateSetup(PrintWriter out) {
048        generateLicence(out);
049        out.println("");
050        out.println("/*****************************************************************************************");
051        out.println(" *  ");
052        out.println(" * NOTE!: This file is auto generated - do not modify!");
053        out.println(" *        if you need to make a change, please see the modify the groovy scripts in the");
054        out.println(" *        under src/gram/script and then use maven openwire:generate to regenerate ");
055        out.println(" *        this file.");
056        out.println(" *  ");
057        out.println(" *****************************************************************************************/");
058        out.println("");
059        out.println("");
060        out.println("#include \"ow_commands_v" + openwireVersion + ".h\"");
061        out.println("");
062        out.println("#define SUCCESS_CHECK( f ) { apr_status_t rc=f; if(rc!=APR_SUCCESS) return rc; }");
063        out.println("");
064    }
065
066    protected void generateFile(PrintWriter out) throws Exception {
067
068        ArrayList<JProperty> properties = new ArrayList<JProperty>();
069        jclass.getDeclaredProperties();
070        for (int i = 0; i < jclass.getDeclaredProperties().length; i++) {
071            JProperty p = jclass.getDeclaredProperties()[i];
072            if (isValidProperty(p)) {
073                properties.add(p);
074            }
075        }
076
077        String name = jclass.getSimpleName();
078        String type = ("ow_" + name).toUpperCase() + "_TYPE";
079        String baseName = "DataStructure";
080        JClass superclass = jclass.getSuperclass();
081        while (superclass.getSuperclass() != null) {
082            if (sortedClasses.contains(superclass)) {
083                baseName = superclass.getSimpleName();
084                break;
085            } else {
086                superclass = superclass.getSuperclass();
087            }
088        }
089
090        out.println("ow_boolean ow_is_a_" + name + "(ow_DataStructure *object) {");
091        out.println("   if( object == 0 )");
092        out.println("      return 0;");
093        out.println("      ");
094        out.println("   switch(object->structType) {");
095
096        for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) {
097            JClass sub = (JClass)iterator.next();
098            String subtype = "OW_" + sub.getSimpleName().toUpperCase() + "_TYPE";
099            if (jclass.isAssignableFrom(sub) && !isAbstract(sub)) {
100                out.println("");
101                out.println("   case " + subtype + ":");
102            }
103        }
104        out.println("");
105        out.println("      return 1;");
106        out.println("   }");
107        out.println("   return 0;");
108        out.println("}");
109
110        if (!isAbstract(jclass)) {
111            out.println("");
112            out.println("");
113            out.println("ow_" + name + " *ow_" + name + "_create(apr_pool_t *pool) ");
114            out.println("{");
115            out.println("   ow_" + name + " *value = apr_pcalloc(pool,sizeof(ow_" + name + "));");
116            out.println("   if( value!=0 ) {");
117            out.println("      ((ow_DataStructure*)value)->structType = " + type + ";");
118            out.println("   }");
119            out.println("   return value;");
120            out.println("}");
121        }
122
123        out.println("");
124        out.println("");
125        out.println("apr_status_t ow_marshal1_" + name + "(ow_bit_buffer *buffer, ow_" + name + " *object)");
126        out.println("{");
127        out.println("   ow_marshal1_" + baseName + "(buffer, (ow_" + baseName + "*)object);");
128
129        for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) {
130            JProperty property = iter.next();
131            String propname = toPropertyCase(property.getSimpleName());
132            boolean cached = isCachedProperty(property);
133            JAnnotation annotation = property.getGetter().getAnnotation("openwire:property");
134            JAnnotationValue size = annotation.getValue("size");
135
136            type = property.getType().getQualifiedName();
137            if (type.equals("boolean")) {
138                out.println("   ow_bit_buffer_append(buffer, object->" + propname + ");");
139            } else if (type.equals("byte")) {
140            } else if (type.equals("char")) {
141            } else if (type.equals("short")) {
142            } else if (type.equals("int")) {
143            } else if (type.equals("long")) {
144                out.println("   ow_marshal1_long(buffer, object->" + propname + ");");
145            } else if (type.equals("byte[]")) {
146                if (size == null) {
147                    out.println("   ow_bit_buffer_append(buffer,  object->" + propname + "!=0 );");
148                }
149            } else if (type.equals("org.apache.activeio.packet.ByteSequence")) {
150                if (size == null) {
151                    out.println("   ow_bit_buffer_append(buffer,  object->" + propname + "!=0 );");
152                }
153            } else if (type.equals("java.lang.String")) {
154                out.println("   ow_marshal1_string(buffer, object->" + propname + ");");
155            } else {
156                if (property.getType().isArrayType()) {
157                    if (size != null) {
158                        out.println("   SUCCESS_CHECK(ow_marshal1_DataStructure_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));");
159                    } else {
160                        out.println("   SUCCESS_CHECK(ow_marshal1_DataStructure_array(buffer, object->" + propname + "));");
161                    }
162                } else if (isThrowable(property.getType())) {
163                    out.println("   SUCCESS_CHECK(ow_marshal1_throwable(buffer, object->" + propname + "));");
164                } else {
165                    if (cached) {
166                        out.println("   SUCCESS_CHECK(ow_marshal1_cached_object(buffer, (ow_DataStructure*)object->" + propname + "));");
167                    } else {
168                        out.println("   SUCCESS_CHECK(ow_marshal1_nested_object(buffer, (ow_DataStructure*)object->" + propname + "));");
169                    }
170                }
171            }
172            out.println("");
173        }
174
175        out.println("   ");
176        out.println("   return APR_SUCCESS;");
177        out.println("}");
178        out.println("apr_status_t ow_marshal2_" + name + "(ow_byte_buffer *buffer, ow_bit_buffer *bitbuffer, ow_" + name + " *object)");
179        out.println("{");
180        out.println("   ow_marshal2_" + baseName + "(buffer, bitbuffer, (ow_" + baseName + "*)object);   ");
181
182        for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) {
183            JProperty property = iter.next();
184            JAnnotation annotation = property.getGetter().getAnnotation("openwire:property");
185            JAnnotationValue size = annotation.getValue("size");
186            Object propname = toPropertyCase(property.getSimpleName());
187            boolean cached = isCachedProperty(property);
188
189            type = property.getType().getQualifiedName();
190            if (type.equals("boolean")) {
191                out.println("   ow_bit_buffer_read(bitbuffer);");
192            } else if (type.equals("byte")) {
193                out.println("   SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));");
194            } else if (type.equals("char")) {
195                out.println("   SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));");
196            } else if (type.equals("short")) {
197                out.println("   SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));");
198            } else if (type.equals("int")) {
199                out.println("   SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));");
200            } else if (type.equals("long")) {
201                out.println("   SUCCESS_CHECK(ow_marshal2_long(buffer, bitbuffer, object->" + propname + "));");
202            } else if (type.equals("byte[]")) {
203                if (size != null) {
204                    out.println("   SUCCESS_CHECK(ow_marshal2_byte_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));");
205                } else {
206                    out.println("   SUCCESS_CHECK(ow_marshal2_byte_array(buffer, bitbuffer, object->" + propname + "));");
207                }
208            } else if (type.equals("org.apache.activeio.packet.ByteSequence")) {
209                if (size != null) {
210                    out.println("   SUCCESS_CHECK(ow_marshal2_byte_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));");
211                } else {
212                    out.println("   SUCCESS_CHECK(ow_marshal2_byte_array(buffer, bitbuffer, object->" + propname + "));");
213                }
214            } else if (type.equals("java.lang.String")) {
215                out.println("   SUCCESS_CHECK(ow_marshal2_string(buffer, bitbuffer, object->" + propname + "));");
216            } else {
217                if (property.getType().isArrayType()) {
218                    if (size != null) {
219                        out.println("   SUCCESS_CHECK(ow_marshal2_DataStructure_array_const_size(buffer, bitbuffer, object->" + propname + ", " + size.asInt() + "));");
220                    } else {
221                        out.println("   SUCCESS_CHECK(ow_marshal2_DataStructure_array(buffer, bitbuffer, object->" + propname + "));");
222                    }
223                } else if (isThrowable(property.getType())) {
224                    out.println("   SUCCESS_CHECK(ow_marshal2_throwable(buffer, bitbuffer, object->" + propname + "));");
225                } else {
226                    if (cached) {
227                        out.println("   SUCCESS_CHECK(ow_marshal2_cached_object(buffer, bitbuffer, (ow_DataStructure*)object->" + propname + "));");
228                    } else {
229                        out.println("   SUCCESS_CHECK(ow_marshal2_nested_object(buffer, bitbuffer, (ow_DataStructure*)object->" + propname + "));");
230                    }
231                }
232            }
233            out.println("");
234        }
235
236        out.println("   ");
237        out.println("   return APR_SUCCESS;");
238        out.println("}");
239        out.println("");
240        out.println("apr_status_t ow_unmarshal_" + name + "(ow_byte_array *buffer, ow_bit_buffer *bitbuffer, ow_" + name + " *object, apr_pool_t *pool)");
241        out.println("{");
242        out.println("   ow_unmarshal_" + baseName + "(buffer, bitbuffer, (ow_" + baseName + "*)object, pool);   ");
243
244        for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) {
245            JProperty property = iter.next();
246            JAnnotation annotation = property.getGetter().getAnnotation("openwire:property");
247            JAnnotationValue size = annotation.getValue("size");
248            String propname = toPropertyCase(property.getSimpleName());
249            boolean cached = isCachedProperty(property);
250
251            type = property.getType().getQualifiedName();
252
253            if (type.equals("boolean")) {
254                out.println("   object->" + propname + " = ow_bit_buffer_read(bitbuffer);");
255            } else if (type.equals("byte")) {
256                out.println("   SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));");
257            } else if (type.equals("char")) {
258                out.println("   SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));");
259            } else if (type.equals("short")) {
260                out.println("   SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));");
261            } else if (type.equals("int")) {
262                out.println("   SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));");
263            } else if (type.equals("long")) {
264                out.println("   SUCCESS_CHECK(ow_unmarshal_long(buffer, bitbuffer, &object->" + propname + ", pool));");
265            } else if (type.equals("byte[]")) {
266                if (size != null) {
267                    out.println("   SUCCESS_CHECK(ow_unmarshal_byte_array_const_size(buffer, &object->" + propname + ", " + size.asInt() + ", pool));");
268                } else {
269                    out.println("   SUCCESS_CHECK(ow_unmarshal_byte_array(buffer, bitbuffer, &object->" + propname + ", pool));");
270                }
271            } else if (type.equals("org.apache.activeio.packet.ByteSequence")) {
272                if (size != null) {
273                    out.println("   SUCCESS_CHECK(ow_unmarshal_byte_array_const_size(buffer, &object->" + propname + ", " + size.asInt() + ", pool));");
274                } else {
275                    out.println("   SUCCESS_CHECK(ow_unmarshal_byte_array(buffer, bitbuffer, &object->" + propname + ", pool));");
276                }
277            } else if (type.equals("java.lang.String")) {
278                out.println("   SUCCESS_CHECK(ow_unmarshal_string(buffer, bitbuffer, &object->" + propname + ", pool));");
279            } else {
280                if (property.getType().isArrayType()) {
281                    if (size != null) {
282                        out.println("   SUCCESS_CHECK(ow_unmarshal_DataStructure_array_const_size(buffer, bitbuffer, &object->" + propname + ", " + size.asInt() + ", pool));");
283                    } else {
284                        out.println("   SUCCESS_CHECK(ow_unmarshal_DataStructure_array(buffer, bitbuffer, &object->" + propname + ", pool));");
285                    }
286                } else if (isThrowable(property.getType())) {
287                    out.println("   SUCCESS_CHECK(ow_unmarshal_throwable(buffer, bitbuffer, &object->" + propname + ", pool));");
288                } else {
289                    if (cached) {
290                        out.println("   SUCCESS_CHECK(ow_unmarshal_cached_object(buffer, bitbuffer, (ow_DataStructure**)&object->" + propname + ", pool));");
291                    } else {
292                        out.println("   SUCCESS_CHECK(ow_unmarshal_nested_object(buffer, bitbuffer, (ow_DataStructure**)&object->" + propname + ", pool));");
293                    }
294                }
295            }
296            out.println("");
297        }
298
299        out.println("   ");
300        out.println("   return APR_SUCCESS;");
301        out.println("}");
302    }
303
304    protected void generateTearDown(PrintWriter out) {
305        out.println("");
306        out.println("ow_DataStructure *ow_create_object(ow_byte type, apr_pool_t *pool)");
307        out.println("{");
308        out.println("   switch( type ) {");
309        for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) {
310            JClass jclass = (JClass)iterator.next();
311            String name = jclass.getSimpleName();
312            String type = ("ow_" + name).toUpperCase() + "_TYPE";
313            if (!isAbstract(jclass)) {
314                out.println("      case " + type + ": return (ow_DataStructure *)ow_" + name + "_create(pool);");
315            }
316        }
317
318        out.println("");
319        out.println("   }");
320        out.println("   return 0;");
321        out.println("}");
322        out.println("");
323        out.println("apr_status_t ow_marshal1_object(ow_bit_buffer *buffer, ow_DataStructure *object)");
324        out.println("{");
325        out.println("   switch( object->structType ) {");
326
327        for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) {
328            JClass jclass = (JClass)iterator.next();
329            String name = jclass.getSimpleName();
330            String type = ("ow_" + name).toUpperCase() + "_TYPE";
331            if (!isAbstract(jclass)) {
332                out.println("      case " + type + ": return ow_marshal1_" + name + "(buffer, (ow_" + name + "*)object);");
333            }
334        }
335
336        out.println("");
337        out.println("   }");
338        out.println("   return APR_EGENERAL;");
339        out.println("}");
340        out.println("");
341        out.println("apr_status_t ow_marshal2_object(ow_byte_buffer *buffer, ow_bit_buffer *bitbuffer, ow_DataStructure *object)");
342        out.println("{");
343        out.println("   switch( object->structType ) {");
344
345        for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) {
346            JClass jclass = (JClass)iterator.next();
347            String name = jclass.getSimpleName();
348            String type = ("ow_" + name).toUpperCase() + "_TYPE";
349            if (!isAbstract(jclass)) {
350                out.println("      case " + type + ": return ow_marshal2_" + name + "(buffer, bitbuffer, (ow_" + name + "*)object);");
351            }
352        }
353
354        out.println("");
355        out.println("   }");
356        out.println("   return APR_EGENERAL;");
357        out.println("}");
358        out.println("");
359        out.println("apr_status_t ow_unmarshal_object(ow_byte_array *buffer, ow_bit_buffer *bitbuffer, ow_DataStructure *object, apr_pool_t *pool)");
360        out.println("{");
361        out.println("   switch( object->structType ) {");
362
363        for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) {
364            JClass jclass = (JClass)iterator.next();
365            String name = jclass.getSimpleName();
366            String type = ("ow_" + name).toUpperCase() + "_TYPE";
367            if (!isAbstract(jclass)) {
368                out.println("      case " + type + ": return ow_unmarshal_" + name + "(buffer, bitbuffer, (ow_" + name + "*)object, pool);");
369            }
370        }
371
372        out.println("");
373        out.println("   }");
374        out.println("   return APR_EGENERAL;");
375        out.println("}");
376
377    }
378}