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.Iterator; 023 import java.util.List; 024 025 import org.codehaus.jam.JAnnotation; 026 import org.codehaus.jam.JAnnotationValue; 027 import org.codehaus.jam.JClass; 028 import org.codehaus.jam.JProperty; 029 030 /** 031 * @version $Revision: 383749 $ 032 */ 033 public 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 }