mirror of https://github.com/apache/activemq.git
Refactor of OpenWire code generation together with move to apache package
git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@378480 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e5959da6d7
commit
83ec98be8a
|
@ -0,0 +1,67 @@
|
|||
/**
|
||||
*
|
||||
* Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
|
||||
*
|
||||
* Licensed 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;
|
||||
|
||||
/**
|
||||
* A simple helper class to help auto-generate test data when code generating test cases
|
||||
*
|
||||
* @version $Revision: 1.1 $
|
||||
*/
|
||||
public class TestDataGenerator {
|
||||
private int stringCounter;
|
||||
|
||||
private boolean boolCounter;
|
||||
private byte byteCounter;
|
||||
private char charCounter = 'a';
|
||||
private short shortCounter;
|
||||
private int intCounter;
|
||||
private long longCounter;
|
||||
|
||||
public String createByte() {
|
||||
return "(byte) " + (++byteCounter);
|
||||
}
|
||||
|
||||
public String createChar() {
|
||||
return "'" + (charCounter++) + "'";
|
||||
}
|
||||
|
||||
public String createShort() {
|
||||
return "(short) " + (++shortCounter);
|
||||
}
|
||||
|
||||
public int createInt() {
|
||||
return ++intCounter;
|
||||
}
|
||||
|
||||
public long createLong() {
|
||||
return ++longCounter;
|
||||
}
|
||||
|
||||
public String createString(String property) {
|
||||
return property + ":" + (++stringCounter);
|
||||
}
|
||||
|
||||
public boolean createBool() {
|
||||
boolCounter = !boolCounter;
|
||||
return boolCounter;
|
||||
}
|
||||
|
||||
public String createByteArray(String property) {
|
||||
return "\"" + createString(property) + "\".getBytes()";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
/**
|
||||
*
|
||||
* Copyright 2005-2006 The Apache Software Foundation
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
import org.apache.activemq.openwire.tool.OpenWireScript
|
||||
import org.apache.activemq.openwire.tool.TestDataGenerator
|
||||
|
||||
/**
|
||||
* Generates the Java test code for the Open Wire Format
|
||||
*
|
||||
* @version $Revision: $
|
||||
*/
|
||||
class GenerateJavaTests extends OpenWireScript {
|
||||
|
||||
Object run() {
|
||||
|
||||
def openwireVersion = System.getProperty("openwire.version");
|
||||
|
||||
def destDir = new File("src/test/java/org/apache/activemq/openwire/v${openwireVersion}")
|
||||
println "Generating Java test code to directory ${destDir}"
|
||||
|
||||
def openwireClasses = classes.findAll {
|
||||
it.getAnnotation("openwire:marshaller")!=null
|
||||
}
|
||||
|
||||
def concreteClasses = new ArrayList()
|
||||
def buffer = new StringBuffer()
|
||||
int counter = 0
|
||||
Map map = [:]
|
||||
|
||||
destDir.mkdirs()
|
||||
for (jclass in openwireClasses) {
|
||||
|
||||
println "Processing ${jclass.simpleName}"
|
||||
def abstractText = "abstract "
|
||||
def isAbstract = isAbstract(jclass);
|
||||
if( !isAbstract ) {
|
||||
concreteClasses.add(jclass)
|
||||
abstractText = ""
|
||||
}
|
||||
|
||||
def properties = jclass.declaredProperties.findAll { isValidProperty(it) }
|
||||
|
||||
def file = new File(destDir, jclass.simpleName + "Test.java")
|
||||
|
||||
buffer << """
|
||||
${jclass.simpleName}Test.class
|
||||
"""
|
||||
|
||||
file.withWriter { out |
|
||||
out << """/**
|
||||
*
|
||||
* Copyright 2005-2006 The Apache Software Foundation
|
||||
*
|
||||
* Licensed 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.v${openwireVersion};
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.activemq.openwire.*;
|
||||
import org.apache.activemq.command.*;
|
||||
"""
|
||||
for (pkg in jclass.importedPackages) {
|
||||
for (clazz in pkg.classes) {
|
||||
out << "import "+clazz.qualifiedName+";"
|
||||
}
|
||||
}
|
||||
|
||||
def baseClass = "DataFileGeneratorTestSupport"
|
||||
if( !jclass.superclass.simpleName.equals("Object") ) {
|
||||
baseClass = jclass.superclass.simpleName + "Test";
|
||||
}
|
||||
|
||||
def marshallerAware = isMarshallAware(jclass);
|
||||
|
||||
out << """
|
||||
|
||||
/**
|
||||
* Test case for the OpenWire marshalling for ${jclass.simpleName}
|
||||
*
|
||||
*
|
||||
* NOTE!: This file is auto generated - do not modify!
|
||||
* if you need to make a change, please see the modify the groovy scripts in the
|
||||
* under src/gram/script and then use maven openwire:generate to regenerate
|
||||
* this file.
|
||||
*
|
||||
* @version \$Revision: \$
|
||||
*/
|
||||
public ${abstractText}class ${jclass.simpleName}Test extends $baseClass {
|
||||
"""
|
||||
if (!isAbstract)
|
||||
out << """
|
||||
|
||||
public static ${jclass.simpleName}Test SINGLETON = new ${jclass.simpleName}Test();
|
||||
|
||||
public Object createObject() throws Exception {
|
||||
${jclass.simpleName} info = new ${jclass.simpleName}();
|
||||
populateObject(info);
|
||||
return info;
|
||||
}
|
||||
"""
|
||||
out << """
|
||||
|
||||
protected void populateObject(Object object) throws Exception {
|
||||
super.populateObject(object);
|
||||
${jclass.simpleName} info = (${jclass.simpleName}) object;
|
||||
"""
|
||||
|
||||
def generator = new TestDataGenerator();
|
||||
|
||||
for (property in properties) {
|
||||
def annotation = property.getter.getAnnotation("openwire:property");
|
||||
def size = annotation.getValue("size");
|
||||
def testSize = stringValue(annotation, "testSize");
|
||||
def type = property.type.simpleName
|
||||
def cached = isCachedProperty(property);
|
||||
def propertyName = property.simpleName;
|
||||
|
||||
out << " "
|
||||
switch (type) {
|
||||
case "boolean":
|
||||
out << "info.${property.setter.simpleName}(${generator.createBool()});"; break;
|
||||
case "byte":
|
||||
out << "info.${property.setter.simpleName}(${generator.createByte()});"; break;
|
||||
case "char":
|
||||
out << "info.${property.setter.simpleName}(${generator.createChar()});"; break;
|
||||
case "short":
|
||||
out << "info.${property.setter.simpleName}(${generator.createShort()});"; break;
|
||||
case "int":
|
||||
out << "info.${property.setter.simpleName}(${generator.createInt()});"; break;
|
||||
case "long":
|
||||
out << "info.${property.setter.simpleName}(${generator.createLong()});"; break;
|
||||
case "byte[]":
|
||||
out << """info.${property.setter.simpleName}(${generator.createByteArray(propertyName)});"""; break;
|
||||
case "String":
|
||||
out << """info.${property.setter.simpleName}("${generator.createString(propertyName)}");"""; break;
|
||||
case "ByteSequence":
|
||||
out << """
|
||||
{
|
||||
byte data[] = ${generator.createByteArray(propertyName)};
|
||||
info.${property.setter.simpleName}(new org.activeio.ByteSequence(data,0,data.length));
|
||||
}
|
||||
""";
|
||||
break;
|
||||
case "Throwable":
|
||||
out << """info.${property.setter.simpleName}(createThrowable("${generator.createString(propertyName)}"));"""; break;
|
||||
default:
|
||||
if( property.type.arrayType ) {
|
||||
def arrayType = property.type.arrayComponentType.simpleName;
|
||||
if (size == null)
|
||||
size = 2
|
||||
if (arrayType == jclass.simpleName)
|
||||
size = 0
|
||||
|
||||
out << """
|
||||
{
|
||||
${arrayType} value[] = new ${arrayType}[${size}];
|
||||
for( int i=0; i < ${size}; i++ ) {
|
||||
value[i] = create${arrayType}("${generator.createString(propertyName)}");
|
||||
}
|
||||
info.${property.setter.simpleName}(value);
|
||||
}"""
|
||||
}
|
||||
else {
|
||||
out << """info.${property.setter.simpleName}(create${type}("${generator.createString(propertyName)}"));"""
|
||||
}
|
||||
}
|
||||
out.newLine()
|
||||
}
|
||||
out << """
|
||||
}
|
||||
}
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue