private JSourceCode createOneToManyFieldInfoPart(final FieldInfo fInfo, final JSourceCode jsc) {
//JDOFieldInfoNature fNature = new JDOFieldInfoNature(fInfo);
JDOClassInfoNature cNature = new JDOClassInfoNature(fInfo.getDeclaringClassInfo());
JDOOneToManyNature manyNature = new JDOOneToManyNature(fInfo);
XMLInfoNature xmlNature = new XMLInfoNature(fInfo);
//-- set name
String name = xmlNature.getNodeName();
jsc.add("");
jsc.add("//" + name + " field");
jsc.add("String " + name + "FieldName = \"" + name + "\";");
String sqlName = manyNature.getForeignKeys().get(0).toString();
jsc.add("String " + name + "SqlName = \"" + sqlName + "\";");
//-- initialize objects
jsc.add("FieldDescriptorImpl " + name + "FieldDescr;");
jsc.add("FieldMapping " + name + "FM = new FieldMapping();");
//-- set typeInfo
String type = null;
XSList schemaType;
schemaType = (XSList) xmlNature.getSchemaType();
JType javaType = schemaType.getContentType().getJType();
type = javaType.toString();
String wrapperType = null;
if (javaType instanceof JPrimitiveType) {
wrapperType = ((JPrimitiveType) javaType).getWrapperName();
} else {
wrapperType = type;
}
// TODO IS THERE A NEED TO CHECK THIS?!
if ((type != null) && (type.length() > 0)) {
jsc.add("TypeInfo " + name
+ "Type = new TypeInfo(" + type + ".class);");
}
jsc.add("// Set columns required (= not null)");
jsc.add(name + "Type.setRequired("
+ Boolean.toString(xmlNature.isRequired()) + ");");
jsc.add("");
jsc.add("FieldHandler " + name + "Handler;");
jsc.add("try {");
//-- get/set methods
jsc.indent();
// TODO HOW ABOUT GETTING THE NAME FROM NATURE?
String className = fInfo.getDeclaringClassInfo().getJClass().getLocalName();
// TODO IS THERE A NEED TO CHECK THIS?!
if ((className != null) && (className.length() > 0)) {
jsc.add("Method " + name + "GetMethod = "
+ className + ".class.getMethod(\"get"
+ toUpperCaseFirstLetter(name) + "\", null);");
jsc.add("Method " + name + "SetMethod = "
+ className + ".class.getMethod(\"set"
+ toUpperCaseFirstLetter(name) + "\", new Class[]{");
}
// TODO IS THERE A NEED TO CHECK THIS?!
if ((type != null) && (type.length() > 0)) {
jsc.addIndented(type + "[].class});");
}
jsc.add("");
jsc.add(name + "Handler = new FieldHandlerImpl(" + name + "FieldName, ");
jsc.append("null, null,");
jsc.addIndented(name + "GetMethod, " + name + "SetMethod, " + name + "Type);");
jsc.unindent();
jsc.add("");
//-- Catch of exceptions
jsc.add("} catch (SecurityException e1) {");
jsc.indent();
jsc.add("throw new RuntimeException(e1.getMessage());");
jsc.unindent();
jsc.add("} catch (MappingException e1) {");
jsc.indent();
jsc.add("throw new RuntimeException(e1.getMessage());");
jsc.unindent();
jsc.add("} catch (NoSuchMethodException e1) {");
jsc.indent();
jsc.add("throw new RuntimeException(e1.getMessage());");
jsc.unindent();
jsc.add("}");
// //-- JDOFieldDescriptorImpl constructor
// jsc.add("// Instantiate " + name + " field descriptor");
// jsc.add(name + "FieldDescr = new JDOFieldDescriptorImpl(");
// jsc.append(name + "FieldName, " + name + "Type,");
// jsc.indent();
// jsc.add(name + "Handler, ");
// jsc.append(Boolean.toString(fInfo.isTransient()) + ", ");
// jsc.append("new String[] { },");
// jsc.add("new int[] {SQLTypeInfos");
// jsc.indent();
// jsc.add(".javaType2sqlTypeNum(");
//
// // TODO IS THERE NEED TO CHECK THIS?!
// if ((type != null) && (type.length() > 0)) {
// jsc.append(wrapperType + ".class) },");
// }
//
// jsc.unindent();
// jsc.add("null, new String[] { " + name + "SqlName }, ");
// jsc.append(Boolean.toString(manyNature.isDirty()) + ", ");
// jsc.append(Boolean.toString(manyNature.isReadOnly()) + ");");
// jsc.unindent();
//-- invoke FieldDescriptorImpl constructor
jsc.add("// Instantiate " + name + " field descriptor");
jsc.add(name + "FieldDescr = new FieldDescriptorImpl(");
jsc.append(name + "FieldName, " + name + "Type,");
jsc.append(name + "Handler, ");
jsc.append(Boolean.toString(fInfo.isTransient()) + ");");
jsc.add(name + "FieldDescr.addNature(FieldDescriptorJDONature.class.getName());");
jsc.add("FieldDescriptorJDONature " + name + "FieldJdoNature = new FieldDescriptorJDONature("
+ name + "FieldDescr);");
jsc.add(name + "FieldJdoNature.setSQLName(null);");
jsc.add(name + "FieldJdoNature.setSQLType(new int[] {SQLTypeInfos");
jsc.append(".javaType2sqlTypeNum(");
// TODO IS THERE NEED TO CHECK THIS?!
if ((type != null) && (type.length() > 0)) {
jsc.append(wrapperType + ".class) });");
}
jsc.add(name + "FieldJdoNature.setManyKey(new String[] { " + name + "SqlName });");
jsc.add(name + "FieldJdoNature.setDirtyCheck(" + Boolean.toString(manyNature.isDirty()) + ");");
jsc.add(name + "FieldJdoNature.setReadOnly(" + Boolean.toString(manyNature.isReadOnly()) + ");");
jsc.add("");
//-- parent class descriptor
jsc.add(name + "FieldDescr.setContainingClassDescriptor(this);");
jsc.add(name + "FieldDescr.setClassDescriptor(new " + getLocalName(type)
+ "JDODescriptor());");
jsc.add(name + "FieldDescr.setMultivalued(true);");
boolean isPrimaryKey = false;
if (cNature.getPrimaryKeys() != null) {
isPrimaryKey = (cNature.getPrimaryKeys().contains(xmlNature.getNodeName()));
}
//-- fieldmapping
jsc.add(name + "FM.setIdentity(" + Boolean.toString(isPrimaryKey) + ");");
jsc.add(name + "FM.setDirect(false);");
jsc.add(name + "FM.setName(\"" + name + "\");");
jsc.add(name + "FM.setRequired(" + xmlNature.isRequired() + ");");
// TODO support of other collection types
jsc.add(name + "FM.setCollection(FieldMappingCollectionType.ARRAY);");
//-- sql part
jsc.add("Sql " + name + "Sql = new Sql();");