blob: 7f5bd70291ca06321db1f6cdd881a667c1af9f35 [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
<<<<<<< Updated upstream
*
* 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
=======
*
* https://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
>>>>>>> Stashed changes
* limitations under the License.
*/
package org.apache.jdo.tck.util;
import java.io.FileOutputStream;
import java.io.PrintWriter;
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 final boolean[] isFinal = new boolean[4000];
void generate() throws Exception {
final String twoSpaces = " ";
final String space = " ";
for (String fieldType : fieldTypes) {
String classFile = (isPrimitive(fieldType) ? "FieldsOfPrimitive" : "FieldsOf") + fieldType;
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 (String accessSpecifier : accessSpecifiers) {
for (String fieldModifier : fieldModifiers) {
for (String xmlPersistenceModifier : xmlPersistenceModifiers) {
// do not generate persistence modifiers (persistent or transactional or none)
// for fields that cannot be persisted
if ((fieldModifier.indexOf("static") >= 0 || fieldModifier.indexOf("final") >= 0)
&& !xmlPersistenceModifier.equals("")) continue;
/* original code
if(!isPersistenceCapable(fieldModifiers[k])
&& !xmlPersistenceModifiers[l].equals(""))
continue;
*/
for (String xmlEmbeddedModifier : xmlEmbeddedModifiers) {
// generate persistence modifiers (persistent or transactional or none)
// only for fields that can be persisted
// generate embedded modifiers only for persistent fields
boolean fieldIsPersistent =
!(fieldModifier.indexOf("static") >= 0
|| fieldModifier.indexOf("final") >= 0
|| xmlPersistenceModifier.indexOf("none") >= 0
|| xmlPersistenceModifier.indexOf("transactional") >= 0
|| (fieldModifier.indexOf("transient") >= 0
&& xmlPersistenceModifier.indexOf("persistent") == -1));
if (!xmlEmbeddedModifier.equals("") && !fieldIsPersistent) continue;
StringBuffer sb = new StringBuffer();
sb.append(twoSpaces);
sb.append(accessSpecifier);
sb.append(fieldModifier);
sb.append(fieldType);
sb.append(space);
String fieldName = (fieldType + fieldCounter++);
// temporary fix to get around the bug in the enhancer code
if (!(xmlEmbeddedModifier.equals("") && xmlPersistenceModifier.equals(""))) {
printXmlField(
xmlPw,
"name=\""
+ fieldName
+ "\" "
+ xmlPersistenceModifier
+ " "
+ xmlEmbeddedModifier);
printXmlField(
xmlPw1,
"name=\""
+ fieldName
+ "\" "
+ xmlPersistenceModifier
+ " "
+ xmlEmbeddedModifier);
printXmlField(
xmlPw2,
"name=\""
+ fieldName
+ "\" "
+ xmlPersistenceModifier
+ " "
+ xmlEmbeddedModifier);
} // end temporary fix
sb.append(fieldName);
buildisPersistentArray(fieldIsPersistent); // add to isPersistentArray
buildisStaticArray(isStatic(fieldModifier)); // add to isStaticArray
buildFieldSpecs(
xmlPersistenceModifier.replace('"', ' ')
+ " "
+ xmlEmbeddedModifier.replace('"', ' ')
+ sb); // add to the field specs array
isFinal[fieldCounter - 1] = fieldModifier.indexOf("final") >= 0;
if (isFinal[fieldCounter - 1]) sb.append(getInitializerForFinalTypes(fieldType));
buildisFinalArray(isFinal[fieldCounter - 1]);
sb.append(";");
pw.println(sb);
}
}
}
}
writeisPersistentArray(pw);
writeisStaticArray(pw);
writeisFinalArray(pw);
writeFieldSpecs(pw);
writeMethodGetLength(pw);
writeMethodGet(pw, fieldType, fieldCounter);
writeMethodSet(pw, fieldType, 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 " = Byte.valueOf((byte)5)";
else if (fieldType.equals("Boolean")) return " = Boolean.FALSE";
else if (fieldType.equals("Character")) return " = Character.valueOf('a')";
else if (fieldType.equals("Short")) return " = Short.valueOf((short)5)";
else if (fieldType.equals("Integer")) return " = Integer.valueOf((int)5)";
else if (fieldType.equals("Long")) return " = Long.valueOf((long)5)";
else if (fieldType.equals("Float")) return " = Float.valueOf((float)5)";
else if (fieldType.equals("Double")) return " = Double.valueOf((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 (char c : charArray) {
pw.print(c);
if (c == ',') {
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 (char c : charArray) {
pw.print(c);
if (c == ',') {
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 (char c : charArray) {
pw.print(c);
if (c == ',') {
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 (char c : charArray) {
pw.print(c);
if (c == ',') {
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 (String collectionType : collectionTypes) {
// Map has a lot of combinations, generate it separately
if (collectionType.indexOf("Map") >= 0 || collectionType.equals("Hashtable")) {
generateMapCollection(collectionType);
} else // Array and the other collections
{
String classFile = collectionType + "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") && collectionType.equals("TreeSet")) continue;
for (int k = 0; k < embeddedElements.length; k++) {
if (collectionType.equals("Array")) {
if (!embeddedElements[k].equals("")) {
fieldNames[fieldCounter] = collectionType + "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] = collectionType + "Of" + elementTypes[j] + fieldCounter;
pw.println(" public " + collectionType + " " + 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 "
+ collectionType
+ " "
+ fieldNames[fieldCounter]); // add to the field specs array*/
fieldCounter++;
}
}
}
writeFieldSpecs(pw);
writeMethodGetLength(pw);
writeMethodGet(
pw,
collectionType.equals("Array") ? "Object [] " : collectionType,
fieldNames,
fieldCounter);
if (collectionType.equals("Array"))
writeMethodSetForArray(pw, "Object [] ", fieldNames, fieldCounter);
else writeMethodSet(pw, collectionType, 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 (String keyType : keyTypes) {
for (int j = 0; j < embeddedKeys.length; j++) {
for (String valueType : valueTypes) {
for (int l = 0; l < embeddedValues.length; l++) {
if (keyType.equals("")
&& embeddedKeys[j].equals("")
&& valueType.equals("")
&& embeddedValues[l].equals("")) continue;
fieldNames[fieldCounter] = mapName + "Of" + keyType + "_" + valueType + fieldCounter;
pw.println(" public " + mapName + " " + fieldNames[fieldCounter] + ";");
printXmlMapField(
xmlPw,
fieldNames[fieldCounter],
keyType,
embeddedKeys[j],
valueType,
embeddedValues[l]);
printXmlMapField(
xmlPw1,
fieldNames[fieldCounter],
keyType,
embeddedKeys[j],
valueType,
embeddedValues[l]);
printXmlMapField(
xmlPw2,
fieldNames[fieldCounter],
keyType,
embeddedKeys[j],
valueType,
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();
}
}
}