blob: 359ba0ada25fc2ea6ce73fcf0e62905986ccd062 [file] [log] [blame]
/*
* 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.jdo.tck.util;
import java.io.*;
public class ClassGenerator {
private final String [] fieldTypes = {"boolean", "byte", "short", "int", "long",
"char", "float", "double",
"Boolean", "Character", "Byte", "Short", "Integer",
"Long", "Float", "Double", "String",
"Locale", "Date", "BigDecimal", "BigInteger",
"Object", "SimpleClass", "SimpleInterface"
};
//includes a place holder for default package access
private final String [] accessSpecifiers = {"private ", "public ", "protected ", "" };
private final String [] fieldModifiers = {"", "static ", "transient ", "final ", "volatile ",
"static transient ", "static final ", "static volatile ",
"transient final ", "transient volatile ",
"static transient final ", "static transient volatile " };
private final String [] xmlPersistenceModifiers = {"", "persistence-modifier=\"none\"",
"persistence-modifier=\"persistent\"",
"persistence-modifier=\"transactional\""};
private final String [] xmlEmbeddedModifiers = {"", "embedded=\"true\"", "embedded=\"false\""};
private final String [] collectionTypes = {"Collection", "Map", "Set", "List",
"HashSet", "ArrayList", "HashMap", "Hashtable",
"LinkedList", "TreeMap", "TreeSet", "Vector", "Array"};
//Note: Any updates to elementtypes should include an update to elementsWithPackageInfo
private final String [] elementTypes = {"Object", "SimpleClass", "SimpleInterface", "String",
"Date", "Locale", "BigDecimal", "BigInteger",
"Byte", "Double", "Float", "Integer", "Long",
"Short"};
private final String [] elementsWithPackageInfo = {"java.lang.Object",
"org.apache.jdo.tck.pc.fieldtypes.SimpleClass",
"org.apache.jdo.tck.pc.fieldtypes.SimpleInterface",
"java.lang.String", "java.util.Date",
"java.util.Locale", "java.math.BigDecimal",
"java.math.BigInteger", "java.lang.Byte",
"java.lang.Double", "java.lang.Float",
"java.lang.Integer","java.lang.Long",
"java.lang.Short"};
private StringBuffer fieldSpecs = new StringBuffer(2000);
private StringBuffer isPersistent = new StringBuffer(200);
private StringBuffer isStatic = new StringBuffer(200);
private StringBuffer isFinalArray = new StringBuffer(2000);
// can accomodate only 4000 fields, have to increase the capacity if the fields exceed 4000
private static boolean [] isFinal = new boolean[4000];
void generate() throws Exception
{
final String twoSpaces = " ";
final String space = " ";
for (int i=0; i < fieldTypes.length; i++)
{
String classFile = (isPrimitive(fieldTypes[i]) ? "FieldsOfPrimitive" : "FieldsOf") + fieldTypes[i];
FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
PrintWriter xmlPw = new PrintWriter(xmlFout);
FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
startXmlMetaData(xmlPw);
startXmlMetaData(xmlPw1);
startXmlMetaData(xmlPw2);
startXmlClass(xmlPw, classFile, 0);
startXmlClass(xmlPw1, classFile, 1);
startXmlClass(xmlPw2, classFile, 2);
FileOutputStream fout = new FileOutputStream(classFile + ".java");
PrintWriter pw = new PrintWriter(fout);
startClass(pw, classFile);
int fieldCounter = 0;
for(int j=0; j < accessSpecifiers.length; j++)
{
for (int k=0; k < fieldModifiers.length; k++)
{
for(int l = 0; l < xmlPersistenceModifiers.length; l++)
{
// do not generate persistence modifiers (persistent or transactional or none)
// for fields that cannot be persisted
if( (fieldModifiers[k].indexOf("static") >= 0 || fieldModifiers[k].indexOf("final") >= 0 ) &&
!xmlPersistenceModifiers[l].equals(""))
continue;
/* original code
if(!isPersistenceCapable(fieldModifiers[k])
&& !xmlPersistenceModifiers[l].equals(""))
continue;
*/
for(int m=0; m < xmlEmbeddedModifiers.length; m++) {
// generate persistence modifiers (persistent or transactional or none)
// only for fields that can be persisted
// generate embedded modifiers only for persistent fields
boolean fieldIsPersistent = !( fieldModifiers[k].indexOf("static") >= 0 ||
fieldModifiers[k].indexOf("final") >= 0 ||
xmlPersistenceModifiers[l].indexOf("none") >= 0 ||
xmlPersistenceModifiers[l].indexOf("transactional") >= 0 ||
(fieldModifiers[k].indexOf("transient") >= 0 && xmlPersistenceModifiers[l].indexOf("persistent") == -1)
);
if(!xmlEmbeddedModifiers[m].equals("") && !fieldIsPersistent )
continue;
StringBuffer sb = new StringBuffer();
sb.append(twoSpaces);
sb.append(accessSpecifiers[j]);
sb.append(fieldModifiers[k]);
sb.append(fieldTypes[i]);
sb.append(space);
String fieldName = (fieldTypes[i] + fieldCounter++);
//temporary fix to get around the bug in the enhancer code
if(!(xmlEmbeddedModifiers[m].equals("") && xmlPersistenceModifiers[l].equals("")))
{
printXmlField(xmlPw, "name=\"" + fieldName + "\" "
+ xmlPersistenceModifiers[l]+ " "
+ xmlEmbeddedModifiers[m]);
printXmlField(xmlPw1, "name=\"" + fieldName + "\" "
+ xmlPersistenceModifiers[l]+ " "
+ xmlEmbeddedModifiers[m]);
printXmlField(xmlPw2, "name=\"" + fieldName + "\" "
+ xmlPersistenceModifiers[l]+ " "
+ xmlEmbeddedModifiers[m]);
}//end temporary fix
sb.append(fieldName);
buildisPersistentArray(fieldIsPersistent); // add to isPersistentArray
buildisStaticArray(isStatic(fieldModifiers[k])); // add to isStaticArray
buildFieldSpecs(xmlPersistenceModifiers[l].replace('"',' ') + " " +
xmlEmbeddedModifiers[m].replace('"',' ') +
sb.toString()); // add to the field specs array
isFinal[fieldCounter-1] = fieldModifiers[k].indexOf("final") >= 0;
if(isFinal[fieldCounter-1])
sb.append(getInitializerForFinalTypes(fieldTypes[i]));
buildisFinalArray(isFinal[fieldCounter-1]);
sb.append(";");
pw.println(sb.toString());
}
}
}
}
writeisPersistentArray(pw);
writeisStaticArray(pw);
writeisFinalArray(pw);
writeFieldSpecs(pw);
writeMethodGetLength(pw);
writeMethodGet(pw, fieldTypes[i], fieldCounter);
writeMethodSet(pw, fieldTypes[i], fieldCounter);
endClass(pw);
pw.close();
fout.close();
endXmlClass(xmlPw);
endXmlClass(xmlPw1);
endXmlClass(xmlPw2);
endXmlMetaDeta(xmlPw);
endXmlMetaDeta(xmlPw1);
endXmlMetaDeta(xmlPw2);
xmlPw.close();
xmlFout.close();
xmlPw1.close();
xmlFout1.close();
xmlPw2.close();
xmlFout2.close();
}
}
private void startClass(PrintWriter pw, String className)
{
pw.println("package org.apache.jdo.tck.pc.fieldtypes;");
pw.println("");
pw.println(getImportStatements(className));
pw.println("public class " + className + " { " );
pw.println(" public int identifier;");
}
private void endClass(PrintWriter pw)
{
pw.println("");
pw.println("}");
}
private void startXmlMetaData(PrintWriter pw)
{
pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
pw.println("<!DOCTYPE jdo SYSTEM \"jdo.dtd\">");
pw.println("<jdo>");
pw.println("<package name=\"org.apache.jdo.tck.pc.fieldtypes\">");
}
private void endXmlMetaDeta(PrintWriter pw)
{
pw.println("</package>");
pw.println("</jdo>");
}
private void startXmlClass(PrintWriter pw, String className, int type)
{
switch(type)
{
case(0):
pw.println("<class name=\"" + className + "\">");
break;
case(1):
pw.println("<class name=\"" + className + "\" identity-type=\"application\">");
break;
case(2):
pw.println("<class name=\"" + className + "\" identity-type=\"datastore\">");
break;
default:
System.out.println("Unsupported Type");
}
}
private void endXmlClass(PrintWriter pw)
{
pw.println("</class>");
}
// need to check if we should support extents
// fieldName includes modifiers
private void printXmlField(PrintWriter pw, String fieldName)
{
pw.println("<field " + fieldName + ">");
pw.println("</field>");
}
// fieldname does not include any modifiers.
// element type includes package informaiton.
private void printXmlCollectionFieldWithEmbeddedElement(PrintWriter pw, String fieldName,
String elementType, String embeddedValue)
{
pw.println("<field name=\"" + fieldName + "\" " + ">");
pw.print("<collection element-type=" + "\"" + elementType + "\"");
if(!embeddedValue.equals(""))
pw.print(" embedded-element=" + "\"" + embeddedValue + "\"");
pw.println(">");
pw.println("</collection>");
pw.println("</field>");
}
private void printXmlArrayFieldWithEmbeddedElement(PrintWriter pw, String fieldName,
String embeddedValue)
{
pw.println("<field name=\"" + fieldName + "\" " + ">");
pw.println("<array embedded-element=" + "\"" + embeddedValue + "\"" + ">");
pw.println("</array>");
pw.println("</field>");
}
private void printXmlMapField(PrintWriter pw, String fieldName, String keyType,
String embeddedKey, String valueType, String embeddedValue)
{
pw.println("<field name=\"" + fieldName + "\" " + ">");
pw.print("<map ");
if(!keyType.equals(""))
pw.print(" key-type=" + "\"" + keyType + "\"");
if(!embeddedKey.equals(""))
pw.print(" embedded-key=" + "\"" + embeddedKey + "\"");
if(!valueType.equals(""))
pw.print(" value-type=" + "\"" + valueType + "\"");
if(!embeddedValue.equals(""))
pw.print(" embedded-value=" + "\"" + embeddedValue + "\"");
pw.println(">");
pw.println("</map>");
pw.println("</field>");
}
private String getInitializerForFinalTypes(String fieldType) throws Exception
{
if (fieldType.equals("char"))
return " = 'a'"; //primitive character, return 'a';
else if (fieldType.equals("boolean"))
return " = false"; //primitive boolean, return 'a';
else if (Character.isLowerCase(fieldType.charAt(0)))
return " = 5"; // return 0 for all other primitive types
else if (fieldType.equals("Byte"))
return " = new Byte((byte)5)";
else if (fieldType.equals("Boolean"))
return " = new Boolean(false)";
else if (fieldType.equals("Character"))
return " = new Character('a')";
else if (fieldType.equals("Short"))
return " = new Short((short)5)";
else if (fieldType.equals("Integer"))
return " = new Integer((int)5)";
else if (fieldType.equals("Long"))
return " = new Long((long)5)";
else if (fieldType.equals("Float"))
return " = new Float((float)5)";
else if (fieldType.equals("Double"))
return " = new Double((double)5)";
else if (fieldType.equals("String"))
return " = new String(\"JDO TCK\")";
else if (fieldType.equals("Locale"))
return " = Locale.US";
else if (fieldType.equals("BigDecimal"))
return " = new BigDecimal(100.15)";
else if (fieldType.equals("BigInteger"))
return " = new BigInteger(\"100\")";
else if (fieldType.equals("Collection"))
return " = new HashSet()";
else if (fieldType.equals("Set"))
return " = new HashSet()";
else if (fieldType.equals("HashSet"))
return " = new HashSet()";
else if (fieldType.equals("Object"))
return " = new Object()";
else if (fieldType.equals("SimpleClass"))
return " = new SimpleClass()";
else if (fieldType.equals("SimpleInterface"))
return " = new SimpleClass()";
else if (fieldType.equals("Date"))
return " = new Date()";
else
throw new Exception("Unsupported FieldType " + fieldType);
}
private String getImportStatements(String fieldType)
{
if (fieldType.equals("FieldsOfLocale"))
return "import java.util.*;";
if (fieldType.equals("FieldsOfDate"))
return "import java.util.*;";
else if (fieldType.equals("FieldsOfBigDecimal"))
return "import java.math.*;";
else if (fieldType.equals("FieldsOfBigInteger"))
return "import java.math.*;";
else if (fieldType.equals("FieldsOfCollection"))
return "import java.util.*;";
else if (fieldType.equals("FieldsOfSet"))
return "import java.util.*;";
else if (fieldType.equals("FieldsOfHashSet"))
return "import java.util.*;";
else if (fieldType.indexOf("Collections") >=0)
return "import java.util.*;\r\nimport java.math.*;";
else
return "";
}
private boolean isPrimitive(String fieldType)
{
if (Character.isUpperCase(fieldType.charAt(0)))
return false;
else
return true;
}
private boolean isPersistenceCapable(String fieldModifier)
{
if (fieldModifier.indexOf("static") >= 0
|| fieldModifier.indexOf("final") >= 0
|| fieldModifier.indexOf("transient") >= 0)
return false;
else
return true;
}
private boolean isStatic(String fieldModifier)
{
if (fieldModifier.indexOf("static") >= 0)
return true;
else
return false;
}
private boolean isFinal(String fieldModifier)
{
return fieldModifier.indexOf("final") >= 0;
}
private void buildisPersistentArray(boolean value)
{
if(isPersistent.length() != 0)
isPersistent.append(",");
if(value)
isPersistent.append("true");
else
isPersistent.append("false");
}
private void buildisStaticArray(boolean value)
{
if(isStatic.length() != 0)
isStatic.append(",");
if(value)
isStatic.append("true");
else
isStatic.append("false");
}
private void buildisFinalArray(boolean value)
{
if(isFinalArray.length() != 0)
isFinalArray.append(",");
if(value)
isFinalArray.append("true");
else
isFinalArray.append("false");
}
private void writeisPersistentArray(PrintWriter pw)
{
// have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
// 1024 characters
char [] charArray = new char[isPersistent.length()];
isPersistent.getChars(0,isPersistent.length(),charArray,0);
pw.println("");
pw.println("public static final boolean [] isPersistent = { ");
int fieldCounter=0;
for(int i = 0; i < charArray.length; i++)
{
pw.print(charArray[i]);
if(charArray[i] == ',')
{
fieldCounter++;
if(fieldCounter == 10)
{
pw.println("");
pw.flush();
fieldCounter = 0;
}
}
}
pw.println("");
pw.println(" };");
isPersistent = new StringBuffer(2000);
}
private void writeisStaticArray(PrintWriter pw)
{
// have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
// 1024 characters
char [] charArray = new char[isStatic.length()];
isStatic.getChars(0,isStatic.length(),charArray,0);
pw.println("");
pw.println("public static final boolean [] isStatic = { ");
int fieldCounter=0;
for(int i = 0; i < charArray.length; i++)
{
pw.print(charArray[i]);
if(charArray[i] == ',')
{
fieldCounter++;
if(fieldCounter == 10)
{
pw.println("");
pw.flush();
fieldCounter = 0;
}
}
}
pw.println("");
pw.println(" };");
isStatic = new StringBuffer(2000);
}
private void writeisFinalArray(PrintWriter pw)
{
// have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
// 1024 characters
char [] charArray = new char[isFinalArray.length()];
isFinalArray.getChars(0,isFinalArray.length(),charArray,0);
pw.println("");
pw.println("public static final boolean [] isFinal = { ");
int fieldCounter=0;
for(int i = 0; i < charArray.length; i++)
{
pw.print(charArray[i]);
if(charArray[i] == ',')
{
fieldCounter++;
if(fieldCounter == 10)
{
pw.println("");
pw.flush();
fieldCounter = 0;
}
}
}
pw.println("");
pw.println(" };");
isFinalArray = new StringBuffer(2000);
}
private void buildFieldSpecs(String field)
{
if(fieldSpecs.length() != 0)
fieldSpecs.append(",");
fieldSpecs.append("\"");
fieldSpecs.append(field.trim());
fieldSpecs.append("\"");
}
private void writeFieldSpecs(PrintWriter pw)
{
// have to go through this hoopla because pw.println(fieldSpecs.toString()); outputs only
// 1024 characters
char [] charArray = new char[fieldSpecs.length()];
fieldSpecs.getChars(0,fieldSpecs.length(),charArray,0);
pw.println("");
pw.println(" public static final String [] fieldSpecs = { ");
pw.print(" ");
for(int i = 0; i < charArray.length; i++)
{
pw.print(charArray[i]);
if(charArray[i] == ',')
{
pw.println("");
pw.print(" ");
pw.flush();
}
}
pw.println("");
pw.println(" };");
fieldSpecs = new StringBuffer(2000);
}
private void writeMethodGetLength(PrintWriter pw)
{
pw.println(" public int getLength()");
pw.println(" {");
pw.println(" return fieldSpecs.length;");
pw.println(" }");
}
private void writeMethodGet(PrintWriter pw, String fieldType, int numberOfFields)
{
pw.println(" public " +fieldType+ " get(int index)");
pw.println(" {");
pw.println(" switch (index)");
pw.println(" {");
for(int i = 0; i < numberOfFields; i++)
{
pw.println(" case(" + i + "):");
pw.println(" return " + fieldType + i +";");
}
pw.println(" default:");
pw.println(" throw new IndexOutOfBoundsException();");
pw.println(" }");
pw.println(" }");
}
private void writeMethodGet(PrintWriter pw, String fieldType, String[] fieldNames, int numFields)
{
pw.println(" public " +fieldType+ " get(int index)");
pw.println(" {");
pw.println(" switch (index)");
pw.println(" {");
for(int i = 0; i < numFields; i++)
{
pw.println(" case(" + i + "):");
pw.println(" return " + fieldNames[i] +";");
}
pw.println(" default:");
pw.println(" throw new IndexOutOfBoundsException();");
pw.println(" }");
pw.println(" }");
}
private void writeMethodSet(PrintWriter pw, String fieldType, int numberOfFields)
{
pw.println(" public boolean set(int index," + fieldType + " value"+ ")");
pw.println(" {");
pw.println(" if(fieldSpecs[index].indexOf(\"final\") != -1)");
pw.println(" return false;");
pw.println(" switch (index)");
pw.println(" {");
for(int i = 0; i < numberOfFields; i++)
{
if(!isFinal[i])
{
pw.println(" case(" + i + "):");
pw.println(" " + fieldType + i + "= value" + ";");
pw.println(" break;" );
}
}
pw.println(" default:");
pw.println(" throw new IndexOutOfBoundsException();");
pw.println(" }");
pw.println(" return true;");
pw.println(" }");
}
private void writeMethodSet(PrintWriter pw, String fieldType, String [] fieldNames, int numFields)
{
pw.println(" public boolean set(int index," + fieldType + " value"+ ")");
pw.println(" {");
pw.println(" if(fieldSpecs[index].indexOf(\"final\") != -1)");
pw.println(" return false;");
pw.println(" switch (index)");
pw.println(" {");
for(int i = 0; i < numFields; i++)
{
// if(!isFinal[i]) {
pw.println(" case(" + i + "):");
pw.println(" " + fieldNames[i] + "= value" + ";");
pw.println(" break;" );
// }
}
pw.println(" default:");
pw.println(" throw new IndexOutOfBoundsException();");
pw.println(" }");
pw.println(" return true;");
pw.println(" }");
}
private void writeMethodSetForArray(PrintWriter pw, String fieldType, String [] fieldNames, int numFields)
{
pw.println(" public boolean set(int index," + fieldType + " value"+ ")");
pw.println(" {");
pw.println(" if(fieldSpecs[index].indexOf(\"final\") != -1)");
pw.println(" return false;");
pw.println(" switch (index)");
pw.println(" {");
for(int i = 0; i < numFields; i++)
{
// if(!isFinal[i]) {
String fieldName = fieldNames[i];
String valueType;
pw.println(" case(" + i + "):");
int indexOfValueType = fieldName.indexOf("Of") + 2;
String valueTypeWithNumber = fieldName.substring(indexOfValueType);
int lastIndexOfValueType = 0;
for (int j=valueTypeWithNumber.length() -1; j>=0; j--)
{
if (Character.isDigit(valueTypeWithNumber.charAt(j)))
{
continue;
}else {
lastIndexOfValueType = j;
break;
}
}
valueType = valueTypeWithNumber.substring(0, lastIndexOfValueType+1);
pw.println(" " + fieldNames[i] + "= (" +valueType + " []) value ;");
pw.println(" break;" );
// }
}
pw.println(" default:");
pw.println(" throw new IndexOutOfBoundsException();");
pw.println(" }");
pw.println(" return true;");
pw.println(" }");
}
// generates Collection files for the different collectionTypes
// also, updates the corresponding xml files
// called by generate, after it is done dealing with the generic field types
void generateCollections() throws Exception
{
final String [] embeddedElements = {"", "true", "false"};
final String [] embeddedElementsForFieldSpec = {"", "embedded-element=true", "embedded-element=false"};
for(int i=0; i < collectionTypes.length; i++)
{
// Map has a lot of combinations, generate it separately
if(collectionTypes[i].indexOf("Map") >= 0 || collectionTypes[i].equals("Hashtable"))
{
generateMapCollection(collectionTypes[i]);
}
else // Array and the other collections
{
String classFile = collectionTypes[i] + "Collections";
FileOutputStream fout = new FileOutputStream(classFile + ".java");
PrintWriter pw = new PrintWriter(fout);
FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
PrintWriter xmlPw = new PrintWriter(xmlFout);
FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
startClass(pw, classFile);
startXmlMetaData(xmlPw);
startXmlMetaData(xmlPw1);
startXmlMetaData(xmlPw2);
startXmlClass(xmlPw, classFile, 0);
startXmlClass(xmlPw1, classFile, 1);
startXmlClass(xmlPw2, classFile, 2);
int fieldCounter=0;
String fieldNames [] = new String [elementTypes.length * embeddedElements.length];
for(int j=0; j < elementTypes.length; j++)
{
if( elementTypes[j].equals("Locale") && collectionTypes[i].equals("TreeSet") )
continue;
for(int k=0; k < embeddedElements.length; k++)
{
if(collectionTypes[i].equals("Array"))
{
if(!embeddedElements[k].equals(""))
{
fieldNames[fieldCounter] = collectionTypes[i] + "Of" + elementTypes[j] + fieldCounter;
// pw.println(" public " + "Object [] "+ fieldNames[fieldCounter] +";");
pw.println(" public " + elementTypes[j] +" [] " + fieldNames[fieldCounter] +";");
printXmlArrayFieldWithEmbeddedElement(xmlPw, fieldNames[fieldCounter], embeddedElements[k]);
printXmlArrayFieldWithEmbeddedElement(xmlPw1, fieldNames[fieldCounter], embeddedElements[k]);
printXmlArrayFieldWithEmbeddedElement(xmlPw2, fieldNames[fieldCounter], embeddedElements[k]);
buildFieldSpecs(embeddedElementsForFieldSpec[k] + " " +
"public " + elementTypes[j] +" [] " + fieldNames[fieldCounter]); // add to the field specs array*/
fieldCounter++;
}
}
else // Collection
{
fieldNames[fieldCounter] = collectionTypes[i] + "Of" + elementTypes[j] + fieldCounter;
pw.println(" public " + collectionTypes[i] +" "+ fieldNames[fieldCounter] +";");
printXmlCollectionFieldWithEmbeddedElement(xmlPw, fieldNames[fieldCounter], elementsWithPackageInfo[j],
embeddedElements[k]);
printXmlCollectionFieldWithEmbeddedElement(xmlPw1, fieldNames[fieldCounter], elementsWithPackageInfo[j],
embeddedElements[k]);
printXmlCollectionFieldWithEmbeddedElement(xmlPw2, fieldNames[fieldCounter], elementsWithPackageInfo[j],
embeddedElements[k]);
buildFieldSpecs(embeddedElementsForFieldSpec[k] + " " +
"public " + collectionTypes[i] +" "+ fieldNames[fieldCounter]); // add to the field specs array*/
fieldCounter++;
}
}
}
writeFieldSpecs(pw);
writeMethodGetLength(pw);
writeMethodGet(pw, collectionTypes[i].equals("Array")? "Object [] " : collectionTypes[i], fieldNames, fieldCounter);
if(collectionTypes[i].equals("Array"))
writeMethodSetForArray(pw, "Object [] ", fieldNames, fieldCounter);
else
writeMethodSet(pw, collectionTypes[i], fieldNames, fieldCounter);
endClass(pw);
pw.close();
fout.close();
endXmlClass(xmlPw);
endXmlClass(xmlPw1);
endXmlClass(xmlPw2);
endXmlMetaDeta(xmlPw);
endXmlMetaDeta(xmlPw1);
endXmlMetaDeta(xmlPw2);
xmlPw.close();
xmlFout.close();
xmlPw1.close();
xmlFout1.close();
xmlPw2.close();
xmlFout2.close();
}
}
}
private void generateMapCollection(String mapName) throws Exception
{
final String [] keyTypes1 = {"String"};
final String [] valueTypes1 = {"Object", "SimpleClass", "SimpleInterface", "String",
"Date", "Locale", "BigDecimal", "BigInteger",
"Byte", "Double", "Float", "Integer", "Long",
"Short"};
final String [] keyTypes2 = {"Object", "SimpleClass", "SimpleInterface", "String",
"Date", "BigDecimal", "BigInteger",
"Byte", "Double", "Float", "Integer", "Long",
"Short"};
final String [] valueTypes2 = {"String"};
final String [][] keyTypes = {keyTypes1, keyTypes2};
final String [][] valueTypes = {valueTypes1, valueTypes2};
String [] classNameArray = {mapName + "StringKey" + "Collections",
mapName + "StringValue" + "Collections"};
for(int i=0; i < classNameArray.length; i++)
{
String classFile = classNameArray[i];
FileOutputStream fout = new FileOutputStream(classFile + ".java");
PrintWriter pw = new PrintWriter(fout);
FileOutputStream xmlFout = new FileOutputStream(classFile + ".jdo.n");
PrintWriter xmlPw = new PrintWriter(xmlFout);
FileOutputStream xmlFout1 = new FileOutputStream(classFile + ".jdo.a");
PrintWriter xmlPw1 = new PrintWriter(xmlFout1);
FileOutputStream xmlFout2 = new FileOutputStream(classFile + ".jdo.d");
PrintWriter xmlPw2 = new PrintWriter(xmlFout2);
startClass(pw, classFile);
startXmlMetaData(xmlPw);
startXmlMetaData(xmlPw1);
startXmlMetaData(xmlPw2);
startXmlClass(xmlPw, classFile, 0);
startXmlClass(xmlPw1, classFile, 1);
startXmlClass(xmlPw2, classFile, 2);
fillMapCollection(keyTypes[i], valueTypes[i],mapName, pw, xmlPw, xmlPw1, xmlPw2);
endClass(pw);
pw.close();
fout.close();
endXmlClass(xmlPw);
endXmlClass(xmlPw1);
endXmlClass(xmlPw2);
endXmlMetaDeta(xmlPw);
endXmlMetaDeta(xmlPw1);
endXmlMetaDeta(xmlPw2);
xmlPw.close();
xmlFout.close();
xmlPw1.close();
xmlFout1.close();
xmlPw2.close();
xmlFout2.close();
}
}
private void fillMapCollection(String [] keyTypes, String [] valueTypes,
String mapName, PrintWriter pw, PrintWriter xmlPw,
PrintWriter xmlPw1, PrintWriter xmlPw2)
{
final String [] embeddedKeys = {"", "true", "false"};
final String [] embeddedValues = embeddedKeys;
final String [] embeddedKeyForFieldSpec = {"", "embedded-key=true", "embedded-key=false"};
final String [] embeddedValueForFieldSpec = {"", "embedded-value=true", "embedded-value=false"};
int fieldCounter=0;
String fieldNames [] = new String [keyTypes.length * embeddedKeys.length
* valueTypes.length * embeddedValues.length];
for(int i = 0; i < keyTypes.length; i++)
{
for(int j = 0; j < embeddedKeys.length; j++)
{
for(int k = 0; k < valueTypes.length; k++)
{
for(int l = 0; l < embeddedValues.length; l++)
{
if( keyTypes[i].equals("") && embeddedKeys[j].equals("")
&& valueTypes[k].equals("") && embeddedValues[l].equals(""))
continue;
fieldNames[fieldCounter] = mapName+ "Of" + keyTypes[i] +"_"+valueTypes[k] + fieldCounter;
pw.println(" public " + mapName +" " + fieldNames[fieldCounter] +";");
printXmlMapField(xmlPw, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
valueTypes[k], embeddedValues[l]);
printXmlMapField(xmlPw1, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
valueTypes[k], embeddedValues[l]);
printXmlMapField(xmlPw2, fieldNames[fieldCounter], keyTypes[i], embeddedKeys[j],
valueTypes[k], embeddedValues[l]);
buildFieldSpecs(embeddedKeyForFieldSpec[j] + " " +
embeddedValueForFieldSpec[l] + " " +
"public " + mapName +" "+ fieldNames[fieldCounter]); // add to the field specs array*/
fieldCounter++;
}
}
}
}
writeFieldSpecs(pw);
writeMethodGetLength(pw);
writeMethodGet(pw, mapName, fieldNames, fieldCounter);
writeMethodSet(pw, mapName, fieldNames, fieldCounter);
}
public static void main(String[] args)
{
ClassGenerator classGenerator = new ClassGenerator();
try
{
classGenerator.generate();
classGenerator.generateCollections();
}
catch (Exception e)
{
System.out.println(e);
e.printStackTrace();
}
}
}