Index: src/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java =================================================================== --- src/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java (revision 3675) +++ src/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java (working copy) @@ -9,41 +9,71 @@ * * Contributors: * Oracle - initial API and implementation from Oracle TopLink + * bdoughan - Mar 18/2009 - 2.0 - Dynamically generated impl classes now + * implement correct interface. ******************************************************************************/ package org.eclipse.persistence.sdo.helper; import java.io.ObjectStreamException; import java.io.Serializable; +import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.List; import org.eclipse.persistence.sdo.SDOConstants; import org.eclipse.persistence.sdo.SDODataObject; +import org.eclipse.persistence.sdo.SDOProperty; import org.eclipse.persistence.sdo.SDOType; +import org.eclipse.persistence.sdo.helper.extension.SDOUtil; import org.eclipse.persistence.internal.libraries.asm.ClassWriter; import org.eclipse.persistence.internal.libraries.asm.CodeVisitor; import org.eclipse.persistence.internal.libraries.asm.Constants; import org.eclipse.persistence.internal.libraries.asm.Type; +import org.eclipse.persistence.internal.security.PrivilegedAccessHelper; + import commonj.sdo.helper.HelperContext; -/** - *

Purpose: Dynamically create a class for the given name as a subclass of the generic - * superclass. This dynamically created subclass should only provide constructors - * and a writeReplace() method. +/* + * Dynamically generate the implementation class for the SDO type. If the type has an instance + * (interface) class then the dynamically generated impl class must fully implement it. Additionally + * a constructor and a writeReplace() method are added. */ public class DynamicClassWriter { + private static final String START_PROPERTY_INDEX = "START_PROPERTY_INDEX"; + private static final String END_PROPERTY_INDEX = "END_PROPERTY_INDEX"; + private static final String GET = "get"; + private static final String SET = "set"; + private static final String LIST = "List"; + private static final String WRITE_REPLACE = "writeReplace"; + private Class parentClass; - private String className; + private String typeImplClassDescriptor; private SDOType type; + private Integer startPropertyIndex; // hold the context containing all helpers so that we can preserve inter-helper relationships private HelperContext aHelperContext; public DynamicClassWriter(String className, SDOType type, HelperContext aContext) { - aHelperContext = aContext; + this.aHelperContext = aContext; this.parentClass = SDODataObject.class; - this.className = className; + this.typeImplClassDescriptor = className.replace('.', '/'); this.type = type; initializeParentClass(); + + if(type.isSubType()) { + try { + Field parentEndPropertyIndexField = PrivilegedAccessHelper.getField(parentClass, END_PROPERTY_INDEX, true); + Integer parentEndPropertyIndex = (Integer) PrivilegedAccessHelper.getValueFromField(parentEndPropertyIndexField, parentClass); + startPropertyIndex = parentEndPropertyIndex + 1; + } catch(NoSuchFieldException e) { + startPropertyIndex = new Integer(0); + } catch(IllegalAccessException e) { + startPropertyIndex = new Integer(0); + } + } else { + startPropertyIndex = new Integer(0); + } } private void initializeParentClass() { @@ -67,10 +97,6 @@ return this.parentClass; } - public String getClassName() { - return this.className; - } - /** * This is where the byte codes for the generic subclass are defined and the * class is created dynamically from them. @@ -78,7 +104,19 @@ public byte[] createClass() { ClassWriter cw = new ClassWriter(false); - cw.visit(Constants.V1_5, Constants.ACC_PUBLIC + Constants.ACC_SUPER, className.replace('.', '/'), Type.getType(parentClass).getInternalName(), null, null); + if(null == type.getInstanceClass()) { + cw.visit(Constants.V1_5, Constants.ACC_PUBLIC + Constants.ACC_SUPER, typeImplClassDescriptor, Type.getType(parentClass).getInternalName(), null, null); + } else { + String[] interfaces = new String[1]; + interfaces[0] = type.getInstanceClassName().replace('.', '/'); + cw.visit(Constants.V1_5, Constants.ACC_PUBLIC + Constants.ACC_SUPER, typeImplClassDescriptor, Type.getType(parentClass).getInternalName(), interfaces, null); + addPropertyIndices(cw); + for(Object object: type.getDeclaredProperties()) { + SDOProperty sdoProperty = (SDOProperty) object; + addPropertyGetMethod(cw, sdoProperty); + addPropertySetMethod(cw, sdoProperty); + } + } addConstructors(cw); addWriteReplace(cw); @@ -87,7 +125,20 @@ return cw.toByteArray(); } - private void addConstructors(ClassWriter cw) { + private void addPropertyIndices(ClassWriter cw) { + cw.visitField(Constants.ACC_PUBLIC + Constants.ACC_FINAL + Constants.ACC_STATIC, START_PROPERTY_INDEX, "I", startPropertyIndex, null); + int declaredPropsSize = type.getDeclaredProperties().size(); + + Integer endPropertyIndex; + if(declaredPropsSize > 0) { + endPropertyIndex = startPropertyIndex + declaredPropsSize - 2; + } else { + endPropertyIndex = startPropertyIndex - 1; + } + cw.visitField(Constants.ACC_PUBLIC + Constants.ACC_FINAL + Constants.ACC_STATIC, END_PROPERTY_INDEX, "I", endPropertyIndex, null); + } + + private void addConstructors(ClassWriter cw) { CodeVisitor mv = cw.visitMethod(Constants.ACC_PUBLIC, "", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[0]), new String[] { Type.getInternalName(Serializable.class) }, null); mv.visitVarInsn(Constants.ALOAD, 0); mv.visitMethodInsn(Constants.INVOKESPECIAL, Type.getType(parentClass).getInternalName(), "", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[0])); @@ -95,10 +146,88 @@ mv.visitMaxs(1, 1); } + private void addPropertyGetMethod(ClassWriter cw, SDOProperty property) { + String returnType = SDOUtil.getJavaTypeForProperty(property); + String outerGetMethodName = SDOUtil.getMethodName(property.getName(), returnType); + + CodeVisitor mv; + String propertyInstanceClassDescriptor; + if(property.isMany()) { + propertyInstanceClassDescriptor = Type.getDescriptor(List.class); + } else if(property.getType().isDataType()) { + propertyInstanceClassDescriptor = Type.getDescriptor(property.getType().getInstanceClass()); + } else { + propertyInstanceClassDescriptor = "L" + returnType.replace('.', '/') + ";"; + } + mv = cw.visitMethod(Constants.ACC_PUBLIC, outerGetMethodName, "()" + propertyInstanceClassDescriptor, null, null); + + mv.visitVarInsn(Constants.ALOAD, 0); + mv.visitIntInsn(Constants.BIPUSH, startPropertyIndex + property.getIndexInType()); + + String builtIn = SDOUtil.getBuiltInType(returnType); + if(null != builtIn) { + if(property.getType().isDataType() && !builtIn.equals(LIST)) { + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, GET + builtIn, "(I)" + propertyInstanceClassDescriptor); + int iReturnOpcode = Type.getType(property.getType().getInstanceClass()).getOpcode(Constants.IRETURN); + mv.visitInsn(iReturnOpcode); + } else { + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, GET, "(I)Ljava/lang/Object;"); + mv.visitInsn(Constants.ARETURN); + } + } else { + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, GET, "(I)Ljava/lang/Object;"); + mv.visitInsn(Constants.ARETURN); + } + mv.visitMaxs(2, 1); + } + + private void addPropertySetMethod(ClassWriter cw, SDOProperty property) { + String returnType = SDOUtil.getJavaTypeForProperty(property); + String outerSetMethodName = SDOUtil.setMethodName(property.getName()); + + CodeVisitor mv; + String propertyInstanceClassDescriptor; + + if(property.isMany()) { + propertyInstanceClassDescriptor = Type.getDescriptor(List.class); + } else if(property.getType().isDataType()) { + propertyInstanceClassDescriptor = Type.getDescriptor(property.getType().getInstanceClass()); + } else { + propertyInstanceClassDescriptor = "L" + returnType.replace('.', '/') + ";"; + } + mv = cw.visitMethod(Constants.ACC_PUBLIC, outerSetMethodName, "(" + propertyInstanceClassDescriptor + ")V", null, null); + + mv.visitVarInsn(Constants.ALOAD, 0); + mv.visitIntInsn(Constants.BIPUSH, startPropertyIndex + property.getIndexInType()); + + String builtIn = SDOUtil.getBuiltInType(returnType); + int iLoadOpcode = Constants.ALOAD; + if(null != builtIn) { + if(property.getType().isDataType() && !builtIn.equals(LIST)) { + iLoadOpcode = Type.getType(property.getType().getInstanceClass()).getOpcode(Constants.ILOAD); + mv.visitVarInsn(iLoadOpcode, 1); + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, SET + builtIn, "(I" + propertyInstanceClassDescriptor + ")V"); + } else { + mv.visitVarInsn(iLoadOpcode, 1); + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, SET, "(ILjava/lang/Object;)V"); + } + } else { + mv.visitVarInsn(iLoadOpcode, 1); + mv.visitMethodInsn(Constants.INVOKEVIRTUAL, typeImplClassDescriptor, SET, "(ILjava/lang/Object;)V"); + } + + mv.visitInsn(Constants.RETURN); + if(iLoadOpcode == Constants.DLOAD || iLoadOpcode == Constants.LLOAD) { + mv.visitMaxs(4, 3); + } else { + mv.visitMaxs(3, 2); + } + } + private void addWriteReplace(ClassWriter cw) { Method method; try { - method = parentClass.getDeclaredMethod("writeReplace", new Class[0]); + method = parentClass.getDeclaredMethod(WRITE_REPLACE, new Class[0]); } catch (NoSuchMethodException e) { return; } @@ -110,4 +239,5 @@ mv.visitInsn(Constants.ARETURN); mv.visitMaxs(1, 1); } + } \ No newline at end of file Index: src/org/eclipse/persistence/sdo/helper/extension/SDOUtil.java =================================================================== --- src/org/eclipse/persistence/sdo/helper/extension/SDOUtil.java (revision 3675) +++ src/org/eclipse/persistence/sdo/helper/extension/SDOUtil.java (working copy) @@ -18,6 +18,8 @@ import java.util.StringTokenizer; import org.eclipse.persistence.sdo.SDOConstants; +import org.eclipse.persistence.sdo.SDOProperty; +import org.eclipse.persistence.sdo.SDOType; import org.eclipse.persistence.internal.helper.ClassConstants; import org.eclipse.persistence.logging.AbstractSessionLog; @@ -467,19 +469,6 @@ /** * INTERNAL: - * Return a valid Java get method name for a given string - * @param s - * @return - */ - public static String getMethodName(String s) { - StringBuffer stringbuffer = new StringBuffer(); - // only log the setMethodName call so we do not get double logs - stringbuffer.append(GET).append(className(s, true, false, false)); - return stringbuffer.toString(); - } - - /** - * INTERNAL: * Return a valid Java get method name for a given string. This method will check * the returnType to see if it is a boolean/Boolean: if so, 'is' will be used in * the method name instead of 'get'. @@ -489,13 +478,14 @@ * @return */ public static String getMethodName(String s, String returnType) { + StringBuffer stringBuffer = new StringBuffer(); if (returnType.equals(ClassConstants.PBOOLEAN.getName()) || returnType.equals(ClassConstants.BOOLEAN.getName())) { - StringBuffer stringbuffer = new StringBuffer(); - // only log the setMethodName call so we do not get double logs - stringbuffer.append(IS).append(SDOUtil.className(s, true, false, false)); - return stringbuffer.toString(); + stringBuffer.append(IS); + } else { + stringBuffer.append(GET); } - return getMethodName(s); + stringBuffer.append(SDOUtil.className(s, true, false, false)); + return stringBuffer.toString(); } /** @@ -651,5 +641,54 @@ stringbuffer.replace(j, 6, s); return stringbuffer.toString(); - } + } + + public static String getJavaTypeForProperty(SDOProperty property) { + if (property.isMany() || ((SDOType)property.getType()).isXsdList()) { + return "java.util.List"; + } else { + SDOType propertyType = property.getType(); + Class instanceClass = propertyType.getInstanceClass(); + if (ClassConstants.ABYTE.equals(instanceClass)) { + return "Byte[]"; + } else if (ClassConstants.APBYTE.equals(instanceClass)) { + return "byte[]"; + } + return propertyType.getInstanceClassName(); + } + } + + public static String getBuiltInType(String typeName) { + if ((typeName.equals(ClassConstants.PBOOLEAN.getName())) || (typeName.equals(ClassConstants.BOOLEAN.getName()))) { + return "Boolean"; + } else if ((typeName.equals(ClassConstants.PBYTE.getName())) || (typeName.equals(ClassConstants.BYTE.getName()))) { + return "Byte"; + } else if (typeName.equals("byte[]") || typeName.equals("Byte[]") || (typeName.equals(ClassConstants.APBYTE.getName())) || (typeName.equals(ClassConstants.ABYTE.getName()))) { + return "Bytes"; + } else if ((typeName.equals(ClassConstants.PCHAR.getName())) || (typeName.equals(ClassConstants.CHAR.getName()))) { + return "Char"; + } else if ((typeName.equals(ClassConstants.PDOUBLE.getName())) || (typeName.equals(ClassConstants.DOUBLE.getName()))) { + return "Double"; + } else if ((typeName.equals(ClassConstants.PFLOAT.getName())) || (typeName.equals(ClassConstants.FLOAT.getName()))) { + return "Float"; + } else if ((typeName.equals(ClassConstants.PLONG.getName())) || (typeName.equals(ClassConstants.LONG.getName()))) { + return "Long"; + } else if ((typeName.equals(ClassConstants.PSHORT.getName())) || (typeName.equals(ClassConstants.SHORT.getName()))) { + return "Short"; + } else if ((typeName.equals(ClassConstants.PINT.getName())) || (typeName.equals(ClassConstants.INTEGER.getName()))) { + return "Int"; + } else if (typeName.equals(ClassConstants.STRING.getName())) { + return "String"; + } else if (typeName.equals(ClassConstants.BIGINTEGER.getName())) { + return "BigInteger"; + } else if (typeName.equals(ClassConstants.BIGDECIMAL.getName())) { + return "BigDecimal"; + } else if (typeName.equals(ClassConstants.UTILDATE.getName())) { + return "Date"; + } else if (typeName.equals("java.util.List")) { + return "List"; + } + return null; + } + } Index: src/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java =================================================================== --- src/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java (revision 3675) +++ src/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java (working copy) @@ -12,9 +12,7 @@ ******************************************************************************/ package org.eclipse.persistence.sdo.helper; -import commonj.sdo.Property; import commonj.sdo.helper.HelperContext; - import java.io.FileReader; import java.io.IOException; import java.io.Reader; @@ -46,7 +44,8 @@ private static final String lsep2 = lsep + lsep; private static final String START_PROPERTY_INDEX = "START_PROPERTY_INDEX"; private Map generatedBuffers; - private boolean generateInterfaces = true; + private boolean interfaceGenerator = true; + private boolean implGenerator = true; private CodeWriter codeWriter; private SDOClassGeneratorListener sdoClassGeneratorListener; @@ -62,6 +61,14 @@ generatedBuffers = new HashMap(); } + public void setInterfaceGenerator(boolean genIterfaces) { + interfaceGenerator = genIterfaces; + } + + public void setImplGenerator(boolean genImpls) { + implGenerator = genImpls; + } + public static void main(String[] args) { // default to dynamic context SDOClassGenerator generator = new SDOClassGenerator(new SDOHelperContext()); @@ -76,27 +83,27 @@ if (args[i].equals("-help")) { generator.printUsage(null); System.exit(0); - } - if (args[i].equals("-sourceFile")) { + } else if (args[i].equals("-sourceFile")) { if (i == (argsLength - 1)) { generator.printUsage("sdo_classgenerator_usage_missing_sourcefile_value"); System.exit(0); } sourceFile = args[++i]; - } - if (args[i].equals("-targetDirectory")) { + } else if (args[i].equals("-targetDirectory")) { if (i == (argsLength - 1)) { generator.printUsage("sdo_classgenerator_usage_missing_targetdir"); System.exit(0); } sourceDir = args[++i]; - } - - // log level is optional and will default to INFO - if (args[i].equals("-logLevel")) { + } else if (args[i].equals("-logLevel")) { + // log level is optional and will default to INFO if (i != (argsLength - 1)) { AbstractSessionLog.getLog().setLevel(Integer.parseInt(args[++i])); } + } else if (args[i].equals("-noInterfaces")) { + generator.setInterfaceGenerator(false); + } else if (args[i].equals("-noImpls")) { + generator.setImplGenerator(false); } } if (null == sourceFile) { @@ -130,19 +137,23 @@ // Because we can no longer use Helper.cr() inside of message bundles, we must break // up the message into separate lines and use Helper.cr() here instead. (bug6470503) - String messageString = ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_1of6", new Object[] { Helper.getShortClassName(getClass()) }); - messageString += Helper.cr() + Helper.cr(); - messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_2of6"); - messageString += Helper.cr(); - messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_3of6"); - messageString += Helper.cr(); - messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_4of6"); - messageString += Helper.cr(); - messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_5of6"); - messageString += Helper.cr(); - messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_6of6"); - messageString += Helper.cr(); - + String messageString = ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_1of8", new Object[] { Helper.getShortClassName(getClass()) }); + messageString += Helper.cr() + Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_2of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_3of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_4of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_5of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_6of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_7of8"); + messageString += Helper.cr(); + messageString += ToStringLocalization.buildMessage("sdo_classgenerator_usage_help_8of8"); + messageString += Helper.cr(); + System.out.println(messageString); } @@ -212,7 +223,6 @@ public Map generate(CodeWriter aCodeWriter, java.util.List types) { generatedBuffers = new HashMap(); - generateInterfaces = true; codeWriter = aCodeWriter; for (int i = 0; i < types.size(); i++) { @@ -224,8 +234,12 @@ String packageDir = nextBuffer.getPackageName(); packageDir = packageDir.replace('.', '/'); - getCodeWriter().writeInterface(packageDir, nextBuffer.getInterfaceName() + ".java", nextBuffer.getInterfaceBuffer()); - getCodeWriter().writeImpl(packageDir, nextBuffer.getClassName() + ".java", nextBuffer.getClassBuffer()); + if(interfaceGenerator) { + getCodeWriter().writeInterface(packageDir, nextBuffer.getInterfaceName() + ".java", nextBuffer.getInterfaceBuffer()); + } + if(implGenerator) { + getCodeWriter().writeImpl(packageDir, nextBuffer.getClassName() + ".java", nextBuffer.getClassBuffer()); + } } } return generatedBuffers; @@ -235,7 +249,7 @@ private ClassBuffer buildClassForType(SDOType sdoType) { ClassBuffer classBuffer = new ClassBuffer(sdoClassGeneratorListener); classBuffer.setSdoType(sdoType); - classBuffer.setGenerateInterface(generateInterfaces); + classBuffer.setGenerateInterface(interfaceGenerator); classBuffer.setSdoTypeName(sdoType.getName()); StringBuffer currentClassBuffer = new StringBuffer(); if (sdoClassGeneratorListener != null) { @@ -299,7 +313,7 @@ } currentClassBuffer.append("extends ").append(implExtends); - if (generateInterfaces) { + if (interfaceGenerator) { currentClassBuffer.append(" implements ")// .append(interfaceName); } @@ -308,7 +322,7 @@ classBuffer.getMethodBuffer().append(buildNoArgCtor(fullClassName)); currentClassBuffer.append(indent).append(" {").append(lsep2); - if (generateInterfaces) { + if (interfaceGenerator) { StringBuffer currentInterfaceBuffer = new StringBuffer(); if (sdoClassGeneratorListener != null) { sdoClassGeneratorListener.preInterfacePackage(currentInterfaceBuffer); @@ -468,7 +482,7 @@ * @param className */ private void buildGetMethodBuffer(ClassBuffer classBuffer, SDOProperty property, java.util.List documentation) { - String returnType = getJavaTypeForProperty(property); + String returnType = SDOUtil.getJavaTypeForProperty(property); String methodName = SDOUtil.getMethodName(property.getName(), returnType); if (!(property.getType().isChangeSummaryType() && methodName.equals("getChangeSummary"))) { @@ -484,7 +498,7 @@ pushIndent(); classBuffer.getMethodBuffer().append(indent).append("return "); //cast return value - String builtIn = getBuiltInType(returnType); + String builtIn = SDOUtil.getBuiltInType(returnType); if (builtIn != null) { String wrapperCall = getWrapperCall(returnType); @@ -513,7 +527,7 @@ popIndent(); classBuffer.getMethodBuffer().append(indent).append("}").append(lsep2); } - if (generateInterfaces) { + if (interfaceGenerator) { classBuffer.getInterfaceBuffer().append(indent); classBuffer.getInterfaceBuffer().append("public "); classBuffer.getInterfaceBuffer().append(returnType).append(" "); @@ -546,7 +560,7 @@ classBuffer.getMethodBuffer().append(methodName); classBuffer.getMethodBuffer().append("("); - String paramType = getJavaTypeForProperty(property); + String paramType = SDOUtil.getJavaTypeForProperty(property); classBuffer.getMethodBuffer().append(paramType).append(" value"); @@ -563,7 +577,7 @@ classBuffer.getMethodBuffer().append(indent).append("}"); classBuffer.getMethodBuffer().append(lsep2); - if (generateInterfaces) { + if (interfaceGenerator) { classBuffer.getInterfaceBuffer().append(indent); classBuffer.getInterfaceBuffer().append("public void "); classBuffer.getInterfaceBuffer().append(methodName); @@ -590,46 +604,6 @@ indent = buf.toString(); } - /** - * INTERNAL: - * @param qualifiedName - * @param targetNamespace - * @return - */ - private String getBuiltInType(String typeName) { - if ((typeName.equals(ClassConstants.PBOOLEAN.getName())) || (typeName.equals(ClassConstants.BOOLEAN.getName()))) { - return "Boolean"; - } else if ((typeName.equals(ClassConstants.PBYTE.getName())) || (typeName.equals(ClassConstants.BYTE.getName()))) { - return "Byte"; - } else if ((typeName.equals(ClassConstants.APBYTE.getName())) || (typeName.equals(ClassConstants.ABYTE.getName()))) { - return "Bytes"; - } else if ((typeName.equals(ClassConstants.PCHAR.getName())) || (typeName.equals(ClassConstants.CHAR.getName()))) { - return "Char"; - } else if ((typeName.equals(ClassConstants.PDOUBLE.getName())) || (typeName.equals(ClassConstants.DOUBLE.getName()))) { - return "Double"; - } else if ((typeName.equals(ClassConstants.PFLOAT.getName())) || (typeName.equals(ClassConstants.FLOAT.getName()))) { - return "Float"; - } else if ((typeName.equals(ClassConstants.PLONG.getName())) || (typeName.equals(ClassConstants.LONG.getName()))) { - return "Long"; - } else if ((typeName.equals(ClassConstants.PSHORT.getName())) || (typeName.equals(ClassConstants.SHORT.getName()))) { - return "Short"; - } else if ((typeName.equals(ClassConstants.PINT.getName())) || (typeName.equals(ClassConstants.INTEGER.getName()))) { - return "Int"; - } else if (typeName.equals(ClassConstants.STRING.getName())) { - return "String"; - } else if (typeName.equals(ClassConstants.BIGINTEGER.getName())) { - return "BigInteger"; - } else if (typeName.equals(ClassConstants.BIGDECIMAL.getName())) { - return "BigDecimal"; - } else if (typeName.equals(ClassConstants.UTILDATE.getName())) { - return "Date"; - } else if (typeName.equals("java.util.List")) { - return "List"; - } - - return null; - } - public void setGeneratedBuffers(Map generatedBuffersMap) { generatedBuffers = generatedBuffersMap; } @@ -655,21 +629,6 @@ return null; } - private String getJavaTypeForProperty(SDOProperty property) { - if (property.isMany() || ((SDOType)property.getType()).isXsdList()) { - return "java.util.List"; - } else { - SDOType propertyType = property.getType(); - Class instanceClass = propertyType.getInstanceClass(); - if (ClassConstants.ABYTE.equals(instanceClass)) { - return "Byte[]"; - } else if (ClassConstants.APBYTE.equals(instanceClass)) { - return "byte[]"; - } - return propertyType.getInstanceClassName(); - } - } - public void setCodeWriter(CodeWriter theCodeWriter) { codeWriter = theCodeWriter; } Index: src/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java =================================================================== --- src/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java (revision 3675) +++ src/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java (working copy) @@ -2432,6 +2432,7 @@ if(sdoType == null) { sdoType = new SDOType(typeURI, typeName, sdoTypeHelper); sdoType.setXsdLocalName(complexType.getName()); + sdoType.preInitialize(packageName, namespaceResolvers); } sdoType.setXsd(true); if(!sdoType.getQName().equals(sdoType.getXsdType())) { Index: src/org/eclipse/persistence/sdo/SDOType.java =================================================================== --- src/org/eclipse/persistence/sdo/SDOType.java (revision 3675) +++ src/org/eclipse/persistence/sdo/SDOType.java (working copy) @@ -758,7 +758,6 @@ getXmlDescriptor().setJavaClassName(getImplClassName()); // load classes by classloader by getting the current instance class getInstanceClass(); - getImplClass(); // See SDOResolvable enhancement String schemaContext = getName(); @@ -807,6 +806,9 @@ sdoRefMapping.setField(xmlField); xmlDescriptor.addMapping(sdoRefMapping); } + if(!isDataType()) { + getImplClass(); + } } /** Index: src/org/eclipse/persistence/sdo/types/SDODataType.java =================================================================== --- src/org/eclipse/persistence/sdo/types/SDODataType.java (revision 3675) +++ src/org/eclipse/persistence/sdo/types/SDODataType.java (working copy) @@ -23,12 +23,12 @@ public SDODataType(String aUri, String aName, SDOTypeHelper sdoTypeHelper) { super(aUri, aName, sdoTypeHelper); + isDataType = true; } public SDODataType(String aUri, String aName, Class aClass, SDOTypeHelper sdoTypeHelper) { this(aUri, aName, sdoTypeHelper); setInstanceClass(aClass); - isDataType = true; xmlDescriptor = null; }