/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.openwire.tool; import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.codehaus.jam.JAnnotation; import org.codehaus.jam.JAnnotationValue; import org.codehaus.jam.JClass; import org.codehaus.jam.JProperty; /** * */ public class CSourcesGenerator extends CHeadersGenerator { public Object run() { filePostFix = ".c"; if (destFile == null) { destFile = new File(targetDir + "/ow_commands_v" + getOpenwireVersion() + ".c"); } return super.run(); } protected List<JClass> sort(List<JClass> source) { return source; } protected void generateSetup(PrintWriter out) { generateLicence(out); out.println(""); out.println("/*****************************************************************************************"); out.println(" * "); out.println(" * NOTE!: This file is auto generated - do not modify!"); out.println(" * if you need to make a change, please see the modify the groovy scripts in the"); out.println(" * under src/gram/script and then use maven openwire:generate to regenerate "); out.println(" * this file."); out.println(" * "); out.println(" *****************************************************************************************/"); out.println(""); out.println(""); out.println("#include \"ow_commands_v" + openwireVersion + ".h\""); out.println(""); out.println("#define SUCCESS_CHECK( f ) { apr_status_t rc=f; if(rc!=APR_SUCCESS) return rc; }"); out.println(""); } protected void generateFile(PrintWriter out) throws Exception { ArrayList<JProperty> properties = new ArrayList<JProperty>(); jclass.getDeclaredProperties(); for (int i = 0; i < jclass.getDeclaredProperties().length; i++) { JProperty p = jclass.getDeclaredProperties()[i]; if (isValidProperty(p)) { properties.add(p); } } String name = jclass.getSimpleName(); String type = ("ow_" + name).toUpperCase() + "_TYPE"; String baseName = "DataStructure"; JClass superclass = jclass.getSuperclass(); while (superclass.getSuperclass() != null) { if (sortedClasses.contains(superclass)) { baseName = superclass.getSimpleName(); break; } else { superclass = superclass.getSuperclass(); } } out.println("ow_boolean ow_is_a_" + name + "(ow_DataStructure *object) {"); out.println(" if( object == 0 )"); out.println(" return 0;"); out.println(" "); out.println(" switch(object->structType) {"); for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) { JClass sub = (JClass)iterator.next(); String subtype = "OW_" + sub.getSimpleName().toUpperCase() + "_TYPE"; if (jclass.isAssignableFrom(sub) && !isAbstract(sub)) { out.println(""); out.println(" case " + subtype + ":"); } } out.println(""); out.println(" return 1;"); out.println(" }"); out.println(" return 0;"); out.println("}"); if (!isAbstract(jclass)) { out.println(""); out.println(""); out.println("ow_" + name + " *ow_" + name + "_create(apr_pool_t *pool) "); out.println("{"); out.println(" ow_" + name + " *value = apr_pcalloc(pool,sizeof(ow_" + name + "));"); out.println(" if( value!=0 ) {"); out.println(" ((ow_DataStructure*)value)->structType = " + type + ";"); out.println(" }"); out.println(" return value;"); out.println("}"); } out.println(""); out.println(""); out.println("apr_status_t ow_marshal1_" + name + "(ow_bit_buffer *buffer, ow_" + name + " *object)"); out.println("{"); out.println(" ow_marshal1_" + baseName + "(buffer, (ow_" + baseName + "*)object);"); for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) { JProperty property = iter.next(); String propname = toPropertyCase(property.getSimpleName()); boolean cached = isCachedProperty(property); JAnnotation annotation = property.getGetter().getAnnotation("openwire:property"); JAnnotationValue size = annotation.getValue("size"); type = property.getType().getQualifiedName(); if (type.equals("boolean")) { out.println(" ow_bit_buffer_append(buffer, object->" + propname + ");"); } else if (type.equals("byte")) { } else if (type.equals("char")) { } else if (type.equals("short")) { } else if (type.equals("int")) { } else if (type.equals("long")) { out.println(" ow_marshal1_long(buffer, object->" + propname + ");"); } else if (type.equals("byte[]")) { if (size == null) { out.println(" ow_bit_buffer_append(buffer, object->" + propname + "!=0 );"); } } else if (type.equals("org.apache.activeio.packet.ByteSequence")) { if (size == null) { out.println(" ow_bit_buffer_append(buffer, object->" + propname + "!=0 );"); } } else if (type.equals("java.lang.String")) { out.println(" ow_marshal1_string(buffer, object->" + propname + ");"); } else { if (property.getType().isArrayType()) { if (size != null) { out.println(" SUCCESS_CHECK(ow_marshal1_DataStructure_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal1_DataStructure_array(buffer, object->" + propname + "));"); } } else if (isThrowable(property.getType())) { out.println(" SUCCESS_CHECK(ow_marshal1_throwable(buffer, object->" + propname + "));"); } else { if (cached) { out.println(" SUCCESS_CHECK(ow_marshal1_cached_object(buffer, (ow_DataStructure*)object->" + propname + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal1_nested_object(buffer, (ow_DataStructure*)object->" + propname + "));"); } } } out.println(""); } out.println(" "); out.println(" return APR_SUCCESS;"); out.println("}"); out.println("apr_status_t ow_marshal2_" + name + "(ow_byte_buffer *buffer, ow_bit_buffer *bitbuffer, ow_" + name + " *object)"); out.println("{"); out.println(" ow_marshal2_" + baseName + "(buffer, bitbuffer, (ow_" + baseName + "*)object); "); for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) { JProperty property = iter.next(); JAnnotation annotation = property.getGetter().getAnnotation("openwire:property"); JAnnotationValue size = annotation.getValue("size"); Object propname = toPropertyCase(property.getSimpleName()); boolean cached = isCachedProperty(property); type = property.getType().getQualifiedName(); if (type.equals("boolean")) { out.println(" ow_bit_buffer_read(bitbuffer);"); } else if (type.equals("byte")) { out.println(" SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));"); } else if (type.equals("char")) { out.println(" SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));"); } else if (type.equals("short")) { out.println(" SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));"); } else if (type.equals("int")) { out.println(" SUCCESS_CHECK(ow_byte_buffer_append_" + type + "(buffer, object->" + propname + "));"); } else if (type.equals("long")) { out.println(" SUCCESS_CHECK(ow_marshal2_long(buffer, bitbuffer, object->" + propname + "));"); } else if (type.equals("byte[]")) { if (size != null) { out.println(" SUCCESS_CHECK(ow_marshal2_byte_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal2_byte_array(buffer, bitbuffer, object->" + propname + "));"); } } else if (type.equals("org.apache.activeio.packet.ByteSequence")) { if (size != null) { out.println(" SUCCESS_CHECK(ow_marshal2_byte_array_const_size(buffer, object->" + propname + ", " + size.asInt() + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal2_byte_array(buffer, bitbuffer, object->" + propname + "));"); } } else if (type.equals("java.lang.String")) { out.println(" SUCCESS_CHECK(ow_marshal2_string(buffer, bitbuffer, object->" + propname + "));"); } else { if (property.getType().isArrayType()) { if (size != null) { out.println(" SUCCESS_CHECK(ow_marshal2_DataStructure_array_const_size(buffer, bitbuffer, object->" + propname + ", " + size.asInt() + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal2_DataStructure_array(buffer, bitbuffer, object->" + propname + "));"); } } else if (isThrowable(property.getType())) { out.println(" SUCCESS_CHECK(ow_marshal2_throwable(buffer, bitbuffer, object->" + propname + "));"); } else { if (cached) { out.println(" SUCCESS_CHECK(ow_marshal2_cached_object(buffer, bitbuffer, (ow_DataStructure*)object->" + propname + "));"); } else { out.println(" SUCCESS_CHECK(ow_marshal2_nested_object(buffer, bitbuffer, (ow_DataStructure*)object->" + propname + "));"); } } } out.println(""); } out.println(" "); out.println(" return APR_SUCCESS;"); out.println("}"); out.println(""); out.println("apr_status_t ow_unmarshal_" + name + "(ow_byte_array *buffer, ow_bit_buffer *bitbuffer, ow_" + name + " *object, apr_pool_t *pool)"); out.println("{"); out.println(" ow_unmarshal_" + baseName + "(buffer, bitbuffer, (ow_" + baseName + "*)object, pool); "); for (Iterator<JProperty> iter = properties.iterator(); iter.hasNext();) { JProperty property = iter.next(); JAnnotation annotation = property.getGetter().getAnnotation("openwire:property"); JAnnotationValue size = annotation.getValue("size"); String propname = toPropertyCase(property.getSimpleName()); boolean cached = isCachedProperty(property); type = property.getType().getQualifiedName(); if (type.equals("boolean")) { out.println(" object->" + propname + " = ow_bit_buffer_read(bitbuffer);"); } else if (type.equals("byte")) { out.println(" SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));"); } else if (type.equals("char")) { out.println(" SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));"); } else if (type.equals("short")) { out.println(" SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));"); } else if (type.equals("int")) { out.println(" SUCCESS_CHECK(ow_byte_array_read_" + type + "(buffer, &object->" + propname + "));"); } else if (type.equals("long")) { out.println(" SUCCESS_CHECK(ow_unmarshal_long(buffer, bitbuffer, &object->" + propname + ", pool));"); } else if (type.equals("byte[]")) { if (size != null) { out.println(" SUCCESS_CHECK(ow_unmarshal_byte_array_const_size(buffer, &object->" + propname + ", " + size.asInt() + ", pool));"); } else { out.println(" SUCCESS_CHECK(ow_unmarshal_byte_array(buffer, bitbuffer, &object->" + propname + ", pool));"); } } else if (type.equals("org.apache.activeio.packet.ByteSequence")) { if (size != null) { out.println(" SUCCESS_CHECK(ow_unmarshal_byte_array_const_size(buffer, &object->" + propname + ", " + size.asInt() + ", pool));"); } else { out.println(" SUCCESS_CHECK(ow_unmarshal_byte_array(buffer, bitbuffer, &object->" + propname + ", pool));"); } } else if (type.equals("java.lang.String")) { out.println(" SUCCESS_CHECK(ow_unmarshal_string(buffer, bitbuffer, &object->" + propname + ", pool));"); } else { if (property.getType().isArrayType()) { if (size != null) { out.println(" SUCCESS_CHECK(ow_unmarshal_DataStructure_array_const_size(buffer, bitbuffer, &object->" + propname + ", " + size.asInt() + ", pool));"); } else { out.println(" SUCCESS_CHECK(ow_unmarshal_DataStructure_array(buffer, bitbuffer, &object->" + propname + ", pool));"); } } else if (isThrowable(property.getType())) { out.println(" SUCCESS_CHECK(ow_unmarshal_throwable(buffer, bitbuffer, &object->" + propname + ", pool));"); } else { if (cached) { out.println(" SUCCESS_CHECK(ow_unmarshal_cached_object(buffer, bitbuffer, (ow_DataStructure**)&object->" + propname + ", pool));"); } else { out.println(" SUCCESS_CHECK(ow_unmarshal_nested_object(buffer, bitbuffer, (ow_DataStructure**)&object->" + propname + ", pool));"); } } } out.println(""); } out.println(" "); out.println(" return APR_SUCCESS;"); out.println("}"); } protected void generateTearDown(PrintWriter out) { out.println(""); out.println("ow_DataStructure *ow_create_object(ow_byte type, apr_pool_t *pool)"); out.println("{"); out.println(" switch( type ) {"); for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) { JClass jclass = (JClass)iterator.next(); String name = jclass.getSimpleName(); String type = ("ow_" + name).toUpperCase() + "_TYPE"; if (!isAbstract(jclass)) { out.println(" case " + type + ": return (ow_DataStructure *)ow_" + name + "_create(pool);"); } } out.println(""); out.println(" }"); out.println(" return 0;"); out.println("}"); out.println(""); out.println("apr_status_t ow_marshal1_object(ow_bit_buffer *buffer, ow_DataStructure *object)"); out.println("{"); out.println(" switch( object->structType ) {"); for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) { JClass jclass = (JClass)iterator.next(); String name = jclass.getSimpleName(); String type = ("ow_" + name).toUpperCase() + "_TYPE"; if (!isAbstract(jclass)) { out.println(" case " + type + ": return ow_marshal1_" + name + "(buffer, (ow_" + name + "*)object);"); } } out.println(""); out.println(" }"); out.println(" return APR_EGENERAL;"); out.println("}"); out.println(""); out.println("apr_status_t ow_marshal2_object(ow_byte_buffer *buffer, ow_bit_buffer *bitbuffer, ow_DataStructure *object)"); out.println("{"); out.println(" switch( object->structType ) {"); for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) { JClass jclass = (JClass)iterator.next(); String name = jclass.getSimpleName(); String type = ("ow_" + name).toUpperCase() + "_TYPE"; if (!isAbstract(jclass)) { out.println(" case " + type + ": return ow_marshal2_" + name + "(buffer, bitbuffer, (ow_" + name + "*)object);"); } } out.println(""); out.println(" }"); out.println(" return APR_EGENERAL;"); out.println("}"); out.println(""); out.println("apr_status_t ow_unmarshal_object(ow_byte_array *buffer, ow_bit_buffer *bitbuffer, ow_DataStructure *object, apr_pool_t *pool)"); out.println("{"); out.println(" switch( object->structType ) {"); for (Iterator iterator = sortedClasses.iterator(); iterator.hasNext();) { JClass jclass = (JClass)iterator.next(); String name = jclass.getSimpleName(); String type = ("ow_" + name).toUpperCase() + "_TYPE"; if (!isAbstract(jclass)) { out.println(" case " + type + ": return ow_unmarshal_" + name + "(buffer, bitbuffer, (ow_" + name + "*)object, pool);"); } } out.println(""); out.println(" }"); out.println(" return APR_EGENERAL;"); out.println("}"); } }