Hi Wesley, Did you look at my previouso comments? I don't really see those incorporated in this second patch.
Radu > -----Original Message----- > From: Wesley Leggette [mailto:wlegge...@cleversafe.com] > Sent: Monday, March 23, 2009 5:12 PM > To: dev@xmlbeans.apache.org > Subject: [PATCH] User static types try #2 > > > This patch now supports mutiple value properties, which I > think I did correctly. > > I also decided to eliminate the whole reflection thing. It > was (1) too difficult to debug, (2) somewhat arbitrary anyway > since the custom type itself can't be done by reflection. > > > ----------------- > > Added custom user type support. > > diff -r 5471ba2f2541 src/configschema/schema/xmlconfig.xsd > --- a/src/configschema/schema/xmlconfig.xsd Sun Mar 22 > 15:07:07 2009 > -0500 > +++ b/src/configschema/schema/xmlconfig.xsd Sun Mar 22 > 15:24:27 2009 > -0500 > @@ -13,8 +13,8 @@ > limitations under the License. --> <xs:schema > xmlns:xs="http://www.w3.org/2001/XMLSchema" > - xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config" > - > targetNamespace="http://xml.apache.org/xmlbeans/2004/02/xbean/config" > + xmlns:xb="http://xml.apache.org/xmlbeans/2009/03/xbean/config" > + > targetNamespace="http://xml.apache.org/xmlbeans/2009/03/xbean/config" > elementFormDefault="qualified"> > > <xs:import namespace="http://www.w3.org/2001/XMLSchema"/> > @@ -58,6 +58,15 @@ > </xs:annotation> > </xs:element> > > + <xs:element name="usertype" type="xb:usertypeconfig"> > + <xs:annotation> > + <xs:documentation> > + Specifies a custom java type mapping for a derived > + simple > type. > + A static handler must be specified that converts > + between > the > + custom java type and the built-in simple type it > + derives > from. > + </xs:documentation> > + </xs:annotation> > + </xs:element> > </xs:choice> > </xs:complexType> > </xs:element> > @@ -172,6 +181,30 @@ > </xs:union> > </xs:simpleType> > > + <xs:complexType name="usertypeconfig"> > + <xs:sequence> > + <xs:choice> > + <xs:element name="staticHandler" type="xs:string"> > + <xs:annotation> > + <xs:documentation> > + The name of the handler class for > this user > type. > + The handler must contain public static > + methods > for > + translating the user type to and from the > derived simple type. > + Example: > + - qname example:uuid restricts xs:string > + - javaname is java.util.UUID > + - handler interface must have signatures: > + public String encodeUuid(UUID obj) > + public UUID decodeUuid(String enc) > + </xs:documentation> > + </xs:annotation> > + </xs:element> > + </xs:choice> > + </xs:sequence> > + <xs:attribute name="name" type="xs:QName"/> > + <xs:attribute name="javaname" type="xs:string"/> > + </xs:complexType> > + > <xs:complexType name="extensionconfig"> > <xs:sequence> > <xs:element name="interface" minOccurs="0" > maxOccurs="unbounded" > > > diff -r 5471ba2f2541 src/configschema/schema/xmlconfig.xsdconfig > --- a/src/configschema/schema/xmlconfig.xsdconfig Sun Mar > 22 15:07:07 > 2009 -0500 > +++ b/src/configschema/schema/xmlconfig.xsdconfig Sun Mar > 22 15:24:27 > 2009 -0500 > @@ -10,7 +10,7 @@ > limitations under the License. --> > > <xb:config > xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"> > > > > - <xb:namespace > uri="http://xml.apache.org/xmlbeans/2004/02/xbean/config"> > > + <xb:namespace > + uri="http://xml.apache.org/xmlbeans/2009/03/xbean/config"> > > <xb:package>org.apache.xmlbeans.impl.xb.xmlconfig</xb:package> > > </xb:namespace> > > > > diff -r 5471ba2f2541 > src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePri > nter.java > --- > a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodeP > rinter.java > Sun Mar 22 15:07:07 2009 -0500 > +++ > b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodeP > rinter.java > Sun Mar 22 15:24:27 2009 -0500 > @@ -17,6 +17,7 @@ > > import java.io.Writer; > import java.io.IOException; > +import java.lang.reflect.InvocationTargetException; > import java.nio.charset.CharacterCodingException; > import java.nio.charset.Charset; > import java.nio.charset.CharsetEncoder; @@ -31,10 +32,12 @@ > import org.apache.xmlbeans.impl.common.NameUtil; > import org.apache.xmlbeans.PrePostExtension; > import org.apache.xmlbeans.InterfaceExtension; > +import org.apache.xmlbeans.QNameSet; > import org.apache.xmlbeans.SchemaType; > import org.apache.xmlbeans.SchemaTypeSystem; > import org.apache.xmlbeans.SchemaProperty; > import org.apache.xmlbeans.SchemaStringEnumEntry; > +import org.apache.xmlbeans.SimpleValue; > import org.apache.xmlbeans.SystemProperties; > import org.apache.xmlbeans.XmlObject; > import org.apache.xmlbeans.XmlOptions; > @@ -1011,12 +1014,19 @@ > > String javaTypeForProperty(SchemaProperty sProp) > { > + // TODO: This is where to insert handler-specific type > + > // The type to use is the XML object.... > if (sProp.getJavaTypeCode() == SchemaProperty.XML_OBJECT) > { > SchemaType sType = sProp.javaBasedOnType(); > return findJavaType(sType).replace('$', '.'); > } > + > + if (sProp.getJavaTypeCode() == SchemaProperty.JAVA_USER) > + { > + return > ((SchemaTypeImpl)sProp.getType()).getUserTypeName(); > + } > > switch (sProp.getJavaTypeCode()) > { > @@ -1446,7 +1456,7 @@ > } > } > > - void printJGetArrayValue(int javaType, String type) > throws IOException > { > + void printJGetArrayValue(int javaType, String type, > SchemaTypeImpl > stype) throws IOException { > switch (javaType) > { > case SchemaProperty.XML_OBJECT: > @@ -1568,10 +1578,19 @@ > emit(" result[i] = > ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getObject > Value();"); > break; > > + case SchemaProperty.JAVA_USER: > + emit(stype.getUserTypeName() + "[] result = new " + > stype.getUserTypeName() + "[targetList.size()];"); > + emit("for (int i = 0, len = > targetList.size() ; i < len > + ; > i++)"); > + emit(" result[i] = " + > stype.getUserTypeHandlerName() + > ".decode" + stype.getShortJavaName() > + + > "((org.apache.xmlbeans.SimpleValue)targetList.get(i));"); > + break; > + > + default: > + throw new IllegalStateException(); > } > emit("return result;"); > } > - void printJGetValue(int javaType, String type) throws > IOException { > + void printJGetValue(int javaType, String type, SchemaTypeImpl > + stype) > throws IOException { > switch (javaType) > { > case SchemaProperty.XML_OBJECT: > @@ -1633,72 +1652,83 @@ > > case SchemaProperty.JAVA_OBJECT: > emit("return target.getObjectValue();"); break; > + > + case SchemaProperty.JAVA_USER: > + emit("return " + stype.getUserTypeHandlerName() > + ".decode" > + + > stype.getShortJavaName() > + + "(target);"); > + break; > + > + default: > + throw new IllegalStateException(); > } > } > - > - String jsetMethod(int javaType) throws IOException > - { > + void printJSetValue(int javaType, String safeVarName, SchemaType > + type) > throws IOException { > switch (javaType) > { > case SchemaProperty.XML_OBJECT: > - return "target.set"; > + emit("target.set(" + safeVarName + ");"); break; > > case SchemaProperty.JAVA_BOOLEAN: > - return "target.setBooleanValue"; > + emit("target.setBooleanValue(" + safeVarName + ");"); > break; > > case SchemaProperty.JAVA_FLOAT: > - return "target.setFloatValue"; > + emit("target.setFloatValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_DOUBLE: > - return "target.setDoubleValue"; > + emit("target.setDoubleValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_BYTE: > - return "target.setByteValue"; > + emit("target.setByteValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_SHORT: > - return "target.setShortValue"; > + emit("target.setShortValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_INT: > - return "target.setIntValue"; > + emit("target.setIntValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_LONG: > - return "target.setLongValue"; > + emit("target.setLongValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_BIG_DECIMAL: > - return "target.setBigDecimalValue"; > + emit("target.setBigDecimalValue(" + safeVarName + > + ");"); > break; > > case SchemaProperty.JAVA_BIG_INTEGER: > - return "target.setBigIntegerValue"; > + emit("target.setBigIntegerValue(" + safeVarName + > + ");"); > break; > > case SchemaProperty.JAVA_STRING: > - return "target.setStringValue"; > + emit("target.setStringValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_BYTE_ARRAY: > - return "target.setByteArrayValue"; > + emit("target.setByteArrayValue(" + > safeVarName + ");"); > break; > > case SchemaProperty.JAVA_GDATE: > - return "target.setGDateValue"; > + emit("target.setGDateValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_GDURATION: > - return "target.setGDurationValue"; > + emit("target.setGDurationValue(" + > safeVarName + ");"); > break; > > case SchemaProperty.JAVA_CALENDAR: > - return "target.setCalendarValue"; > + emit("target.setCalendarValue(" + > safeVarName + ");"); > break; > > case SchemaProperty.JAVA_DATE: > - return "target.setDateValue"; > + emit("target.setDateValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_QNAME: > - return "target.setQNameValue"; > + emit("target.setQNameValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_LIST: > - return "target.setListValue"; > + emit("target.setListValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_ENUM: > - return "target.setEnumValue"; > + emit("target.setEnumValue(" + safeVarName + ");"); > + break; > > case SchemaProperty.JAVA_OBJECT: > - return "target.setObjectValue"; > + emit("target.setObjectValue(" + safeVarName + ");"); > + break; > + > + case SchemaProperty.JAVA_USER: > + > emit(((SchemaTypeImpl)type).getUserTypeHandlerName() + > ".encode" + type.getShortJavaName() > + + "(" + safeVarName + ", target);"); > + break; > > default: > throw new IllegalStateException(); @@ > -1868,6 +1898,8 @@ > String xtype) > throws IOException > { > + // TODO: THIS IS WHERE TO PUT EXTERNAL GET TARGET HANDLER > + > assert setIdentifier != null && identifier != null; > > emit(xtype + " target = null;"); @@ -1986,6 +2018,8 @@ > boolean xmltype = (javaType == SchemaProperty.XML_OBJECT); > String jtargetType = (isunion || !xmltype) ? > "org.apache.xmlbeans.SimpleValue" : xtype; > > + // TODO: there is if(singleton), if(optional), etc. Maybe a > if(external_handler)? > + > if (singleton) > { > // Value getProp() > @@ -2009,8 +2043,9 @@ > makeMissingValue(javaType); > endBlock(); > > - > - printJGetValue(javaType, type); > + > + printJGetValue(javaType, type, > + (SchemaTypeImpl)prop.getType()); > + > > emitImplementationPostamble(); > > @@ -2023,6 +2058,7 @@ > emit("public " + xtype + " xget" + > propertyName + "()"); > startBlock(); > emitImplementationPreamble(); > + // TODO: This is where we could choose to emit a get > handler target instead > emitGetTarget(setIdentifier, identifier, > isAttr, "0", NOTHING, xtype); > > if (isAttr && (prop.hasDefault() == > SchemaProperty.CONSISTENTLY || @@ -2046,6 +2082,7 @@ > emit("public boolean isNil" + propertyName + "()"); > startBlock(); > emitImplementationPreamble(); > + // TODO: This is where we could choose to emit a get > handler target instead > emitGetTarget(setIdentifier, identifier, > isAttr, "0", NOTHING, xtype); > > emit("if (target == null) return false;"); > @@ -2109,7 +2146,7 @@ > emit("java.util.List targetList = new > java.util.ArrayList();"); > emit("get_store().find_all_element_users(" + > setIdentifier + ", targetList);"); > > - printJGetArrayValue(javaType, type); > + printJGetArrayValue(javaType, type, > (SchemaTypeImpl)prop.getType()); > > emitImplementationPostamble(); > endBlock(); > @@ -2121,7 +2158,7 @@ > emitImplementationPreamble(); > > emitGetTarget(setIdentifier, identifier, isAttr, > "i", THROW_EXCEPTION, jtargetType); > - printJGetValue(javaType, type); > + printJGetValue(javaType, type, > + (SchemaTypeImpl)prop.getType()); > > emitImplementationPostamble(); > endBlock(); > @@ -2194,7 +2231,7 @@ > } > } > > - void printSetterImpls(QName qName, boolean isAttr, > + void printSetterImpls(QName qName, SchemaProperty prop, boolean > + isAttr, > String propertyName, int javaType, > String type, String xtype, > boolean nillable, boolean optional, > boolean several, boolean singleton, > boolean isunion, String identifier, > String setIdentifier, SchemaType sType) @@ -2209,7 +2246,6 @@ > boolean xmltype = (javaType == SchemaProperty.XML_OBJECT); > boolean isobj = (javaType == SchemaProperty.JAVA_OBJECT); > boolean isSubstGroup = identifier != setIdentifier; > - String jSet = jsetMethod(javaType); > String jtargetType = (isunion || !xmltype) ? > "org.apache.xmlbeans.SimpleValue" : xtype; > > String propdesc = "\"" + qName.getLocalPart() + "\"" > + (isAttr ? " > attribute" : " element"); > @@ -2232,7 +2268,7 @@ > emitImplementationPreamble(); > emitPre(sType, > PrePostExtension.OPERATION_SET, identifier, isAttr, several ? > "0" : "-1"); > emitGetTarget(setIdentifier, identifier, > isAttr, "0", ADD_NEW_VALUE, jtargetType); > - emit(jSet + "(" + safeVarName + ");"); > + printJSetValue(javaType, safeVarName, > (SchemaTypeImpl)prop.getType()); > emitPost(sType, > PrePostExtension.OPERATION_SET, identifier, isAttr, several ? > "0" : "-1"); > emitImplementationPostamble(); > } > @@ -2322,6 +2358,25 @@ > else > emit("unionArraySetterHelper(" + > safeVarName + "Array" + ", " + identifier + ", " + > setIdentifier + ");" ); > } > + else if (prop.getJavaTypeCode() == > SchemaProperty.JAVA_USER) > + { > + if (!isSubstGroup) > + { > + > emit("org.apache.xmlbeans.SimpleValue[] dests = > arraySetterHelper(" + safeVarName + "Array.length, " + > identifier + ");" ); > + emit("for ( int i = 0 ; i < > dests.length ; i++ > + ) > {"); > + emit(" " + > ((SchemaTypeImpl)prop.getType()).getUserTypeHandlerName() + > ".encode" + > prop.getType().getShortJavaName() > + + "(" + safeVarName + "Array[i], > dests[i]);"); > + emit("}"); > + } > + else > + { > + > emit("org.apache.xmlbeans.SimpleValue[] dests = > arraySetterHelper(" + safeVarName + "Array.length" + ", " + > setIdentifier + ");" ); > + emit("for ( int i = 0 ; i < > dests.length ; i++ > + ) > {"); > + emit(" " + > ((SchemaTypeImpl)prop.getType()).getUserTypeHandlerName() + > ".encode" + > prop.getType().getShortJavaName() > + + "(" + safeVarName + "Array[i], > dests[i]);"); > + emit("}"); > + } > + } > else > { > if (!isSubstGroup) > @@ -2349,6 +2404,25 @@ > else > emit("unionArraySetterHelper(" + > safeVarName + "Array" + ", " + identifier + ", " + > setIdentifier + ");" ); > } > + else if (prop.getJavaTypeCode() == > SchemaProperty.JAVA_USER) > + { > + if (!isSubstGroup) > + { > + > emit("org.apache.xmlbeans.SimpleValue[] dests = > arraySetterHelper(" + safeVarName + "Array.length, " + > identifier + ");" ); > + emit("for ( int i = 0 ; i < > dests.length ; i++ > + ) > {"); > + emit(" " + > ((SchemaTypeImpl)prop.getType()).getUserTypeHandlerName() + > ".encode" + > prop.getType().getShortJavaName() > + + "(" + safeVarName + "Array[i], > dests[i]);"); > + emit("}"); > + } > + else > + { > + > emit("org.apache.xmlbeans.SimpleValue[] dests = > arraySetterHelper(" + safeVarName + "Array.length" + ", " + > setIdentifier + ");" ); > + emit("for ( int i = 0 ; i < > dests.length ; i++ > + ) > {"); > + emit(" " + > ((SchemaTypeImpl)prop.getType()).getUserTypeHandlerName() + > ".encode" + > prop.getType().getShortJavaName() > + + "(" + safeVarName + "Array[i], > dests[i]);"); > + emit("}"); > + } > + } > else > { > if (!isSubstGroup) > @@ -2372,12 +2446,21 @@ > > "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELP > ER_ARRAYITEM); > "); > emitPost(sType, > PrePostExtension.OPERATION_SET, identifier, isAttr, "i"); > } > + else if (prop.getJavaTypeCode() == > SchemaProperty.JAVA_USER) > + { > + emitImplementationPreamble(); > + emitPre(sType, PrePostExtension.OPERATION_SET, > + identifier, > isAttr, "i"); > + emitGetTarget(setIdentifier, identifier, isAttr, "i", > THROW_EXCEPTION, jtargetType); > + printJSetValue(javaType, safeVarName, > (SchemaTypeImpl)prop.getType()); > + emitPost(sType, PrePostExtension.OPERATION_SET, > + identifier, > isAttr, "i"); > + emitImplementationPostamble(); > + } > else > { > emitImplementationPreamble(); > emitPre(sType, > PrePostExtension.OPERATION_SET, identifier, isAttr, "i"); > emitGetTarget(setIdentifier, identifier, > isAttr, "i", THROW_EXCEPTION, jtargetType); > - emit(jSet + "(" + safeVarName + ");"); > + printJSetValue(javaType, safeVarName, > (SchemaTypeImpl)prop.getType()); > emitPost(sType, > PrePostExtension.OPERATION_SET, identifier, isAttr, "i"); > emitImplementationPostamble(); > } > @@ -2436,7 +2519,7 @@ > emit ("(" + jtargetType > +")get_store().insert_element_user(" + setIdentifier + ", " + > identifier + ", i);"); > outdent(); > - emit(jSet + "(" + safeVarName + ");"); > + printJSetValue(javaType, safeVarName, > (SchemaTypeImpl)prop.getType()); > emitPost(sType, PrePostExtension.OPERATION_INSERT, > identifier, isAttr, "i"); > emitImplementationPostamble(); > endBlock(); > @@ -2448,7 +2531,7 @@ > emitDeclareTarget(true, jtargetType); > emitPre(sType, PrePostExtension.OPERATION_INSERT, > identifier, isAttr); > emitAddTarget(identifier, isAttr, true, jtargetType); > - emit(jSet + "(" + safeVarName + ");"); > + printJSetValue(javaType, safeVarName, > (SchemaTypeImpl)prop.getType()); > emitPost(sType, PrePostExtension.OPERATION_INSERT, > identifier, isAttr); > emitImplementationPostamble(); > endBlock(); > @@ -2602,6 +2685,7 @@ > { > printSetterImpls( > name, > + prop, > prop.isAttribute(), > prop.getJavaPropertyName(), > prop.getJavaTypeCode(), diff -r > 5471ba2f2541 > src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java > --- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java > Sun Mar 22 15:07:07 2009 -0500 > +++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java > Sun Mar 22 15:24:27 2009 -0500 > @@ -100,6 +100,8 @@ > private volatile Constructor _javaImplConstructor; > private volatile Constructor _javaImplConstructor2; > private volatile boolean _implNotAvailable; > + private volatile Class _userTypeClass; > + private volatile Class _userTypeHandlerClass; > > // user data objects not persisted > private volatile Object _userData; > @@ -140,6 +142,10 @@ > private int _baseDepth; // how many inheritance steps to AnyType > private int _derivationType; > > + // user type support > + private String _userTypeName; > + private String _userTypeHandler; > + > // for complex types with simple content > private SchemaType.Ref _contentBasedOnTyperef; > > @@ -577,7 +583,29 @@ > public String getFullJavaImplName() { return _fullJavaImplName;} > public String getShortJavaImplName() { return > _shortJavaImplName;} > > - public void setInterfaceExtensions(InterfaceExtension[] > interfaces) > + public String getUserTypeName() > + { > + return _userTypeName; > + } > + > + public void setUserTypeName(String userTypeName) > + { > + _userTypeName = userTypeName; > + } > + > + public String getUserTypeHandlerName() > + { > + return _userTypeHandler; > + } > + > + public void setUserTypeHandlerName(String typeHandler) > + { > + _userTypeHandler = typeHandler; > + } > + > + > + > + public void setInterfaceExtensions(InterfaceExtension[] > interfaces) > { > assertResolved(); > _interfaces = interfaces; > @@ -1717,6 +1745,46 @@ > > return _javaImplClass; > } > + > + public Class getUserTypeClass() > + { > + // This field is declared volatile and Class is immutable so > + this > is > + // allowed. > + if (_userTypeClass == null && getUserTypeName() != null) > + { > + try > + { > + _userTypeClass = Class.forName(_userTypeName, false, > + getTypeSystem().getClassLoader()); > + } > + catch (ClassNotFoundException e) > + { > + _userTypeClass = null; > + } > + } > + > + return _userTypeClass; > + } > + > + public Class getUserTypeHandlerClass() > + { > + // This field is declared volatile and Class is immutable so > + this > is > + // allowed. > + if (_userTypeHandlerClass == null && > getUserTypeHandlerName() > + != > null) > + { > + try > + { > + _userTypeHandlerClass = > Class.forName(_userTypeHandler, > false, > + getTypeSystem().getClassLoader()); > + } > + catch (ClassNotFoundException e) > + { > + _userTypeHandlerClass = null; > + } > + } > + > + return _userTypeHandlerClass; > + } > > public Constructor getJavaImplConstructor() > { > diff -r 5471ba2f2541 > src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java > --- > a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.ja > va Sun > Mar 22 15:07:07 2009 -0500 > +++ > b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.ja > va Sun > Mar 22 15:24:27 2009 -0500 > @@ -22,6 +22,7 @@ > import org.apache.xmlbeans.SchemaParticle; > import org.apache.xmlbeans.SchemaProperty; > import org.apache.xmlbeans.QNameSet; > +import org.apache.xmlbeans.UserType; > import org.apache.xmlbeans.XmlAnySimpleType; > import org.apache.xmlbeans.SchemaStringEnumEntry; > import org.apache.xmlbeans.XmlByte; > @@ -98,6 +99,15 @@ > { > > sImpl.setFullJavaName(pickFullJavaClassName(usedNames, > findTopName(sImpl), pickedName, sImpl.isDocumentType(), > sImpl.isAttributeType())); > > sImpl.setFullJavaImplName(pickFullJavaImplName(usedNames, > sImpl.getFullJavaName())); > + > + UserType utype = > StscState.get().getBindingConfig().lookupUserTypeForQName(sImp > l.getName()); > + if (utype != null) > + { > + sImpl.setUserType(true); > + sImpl.setUserTypeName(utype.getJavaName()); > + > sImpl.setUserTypeHandlerName(utype.getStaticHandler()); > + } > + > setExtensions(sImpl, state); > } > } > @@ -531,6 +541,9 @@ > if (!sType.isSimpleType()) > return SchemaProperty.XML_OBJECT; > > + if (((SchemaTypeImpl)sType).getUserTypeHandlerName() != null) > + return SchemaProperty.JAVA_USER; > + > if (sType.getSimpleVariety() == SchemaType.UNION) > { > // see if we can find an interesting common base > type, e.g., for string enums diff -r 5471ba2f2541 > src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexContent > Impl.java > --- > a/src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexConte > ntImpl.java > Sun Mar 22 15:07:07 2009 -0500 > +++ > b/src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexConte > ntImpl.java > Sun Mar 22 15:24:27 2009 -0500 > @@ -160,7 +160,59 @@ > ((XmlObjectBase) user).objectSet( sources[ i ] ); > } > } > + > + protected SimpleValue[] arraySetterHelper ( int sourcesLength, > + QName > elemName ) > + { > + SimpleValue[] dests = new SimpleValue[sourcesLength]; > > + TypeStore store = get_store(); > + > + int m = store.count_elements( elemName ); > + > + for ( ; m > sourcesLength ; m-- ) > + store.remove_element( elemName, m - 1 ); > + > + for ( int i = 0 ; i < sourcesLength ; i++ ) > + { > + TypeStoreUser user; > + > + if (i >= m) > + user = store.add_element_user( elemName ); > + else > + user = store.find_element_user( elemName, i ); > + > + dests[i] = (SimpleValue) user; > + } > + > + return dests; > + } > + > + protected SimpleValue[] arraySetterHelper ( int sourcesLength, > + QName > elemName, QNameSet set ) > + { > + SimpleValue[] dests = new SimpleValue[sourcesLength]; > + > + TypeStore store = get_store(); > + > + int m = store.count_elements( set ); > + > + for ( ; m > sourcesLength ; m-- ) > + store.remove_element( set, m - 1 ); > + > + for ( int i = 0 ; i < sourcesLength ; i++ ) > + { > + TypeStoreUser user; > + > + if (i >= m) > + user = store.add_element_user( elemName ); > + else > + user = store.find_element_user( set, i ); > + > + dests[i] = (SimpleValue) user; > + } > + > + return dests; > + } > + > protected void arraySetterHelper ( boolean[] sources, > QName elemName ) > { > int n = sources == null ? 0 : sources.length; diff > -r 5471ba2f2541 > src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java > --- > a/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java Sun > Mar 22 15:07:07 2009 -0500 > +++ > b/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java Sun > Mar 22 15:24:27 2009 -0500 > @@ -1258,12 +1258,14 @@ > return false; > } > > - private static final String CONFIG_URI = > "http://xml.apache.org/xmlbeans/2004/02/xbean/config"; > - private static final String COMPATIBILITY_CONFIG_URI = > "http://www.bea.com/2002/09/xbean/config"; > + private static final String CONFIG_URI = > "http://xml.apache.org/xmlbeans/2009/03/xbean/config"; > + private static final String COMPATIBILITY_CONFIG_URI = > "http://xml.apache.org/xmlbeans/2004/02/xbean/config"; > + private static final String COMPATIBILITY_CONFIG_URI2 = > "http://www.bea.com/2002/09/xbean/config"; > private static final Map MAP_COMPATIBILITY_CONFIG_URIS; > static > { > MAP_COMPATIBILITY_CONFIG_URIS = new HashMap(); > MAP_COMPATIBILITY_CONFIG_URIS.put(COMPATIBILITY_CONFIG_URI, > CONFIG_URI); > + MAP_COMPATIBILITY_CONFIG_URIS.put(COMPATIBILITY_CONFIG_URI2, > CONFIG_URI); > } > } > diff -r 5471ba2f2541 > src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java > --- > a/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java > Sun Mar 22 15:07:07 2009 -0500 > +++ > b/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.ja > +++ va > Sun Mar 22 15:24:27 2009 -0500 > @@ -20,7 +20,9 @@ > import org.apache.xmlbeans.impl.xb.xmlconfig.Nsconfig; > import org.apache.xmlbeans.impl.xb.xmlconfig.Qnameconfig; > import org.apache.xmlbeans.impl.xb.xmlconfig.Qnametargetenum; > +import org.apache.xmlbeans.impl.xb.xmlconfig.Usertypeconfig; > import org.apache.xmlbeans.BindingConfig; > +import org.apache.xmlbeans.UserType; > import org.apache.xmlbeans.XmlObject; > import org.apache.xmlbeans.XmlError; > import org.apache.xmlbeans.InterfaceExtension; > @@ -54,6 +56,7 @@ > > private List _interfaceExtensions; > private List _prePostExtensions; > + private List _userTypes; > > private BindingConfigImpl() > { > @@ -69,6 +72,7 @@ > _qnameAttMap = Collections.EMPTY_MAP; > _interfaceExtensions = new ArrayList(); > _prePostExtensions = new ArrayList(); > + _userTypes = new ArrayList(); > } > > public static BindingConfig forConfigDocuments(Config[] > configs, File[] javaFiles, File[] classpath) @@ -90,6 +94,7 @@ > _qnameAttMap = new LinkedHashMap(); > _interfaceExtensions = new ArrayList(); > _prePostExtensions = new ArrayList(); > + _userTypes = new ArrayList(); > > for (int i = 0; i < configs.length; i++) > { > @@ -137,6 +142,13 @@ > { > recordExtensionSetting(javaFiles, classpath, ext[j]); > } > + > + Usertypeconfig[] utypes = config.getUsertypeArray(); > + for (int j = 0; j < utypes.length; j++) > + { > + JamClassLoader jamLoader = getJamLoader(javaFiles, > classpath); > + _userTypes.add(UserTypeImpl.newInstance(jamLoader, > utypes[j])); > + } > } > > secondPhaseValidation(); > @@ -354,6 +366,7 @@ > > public String lookupJavanameForQName(QName qname, int kind) > { > + // TODO: Want to return user type java name if applicable > switch (kind) > { > case QNAME_TYPE: > @@ -367,6 +380,28 @@ > } > return null; > } > + > + > + public UserType lookupUserTypeForQName(QName qname) > + { > + if (qname == null) > + return null; > + > + for (Iterator i = _userTypes.iterator(); i.hasNext();) > + { > + UserType utype = (UserType) i.next(); > + if (qname.equals(utype.getName())) > + return utype; > + } > + > + return null; > + } > + > + public UserType[] getUserTypes() > + { > + return (UserType[]) _interfaceExtensions > + .toArray(new UserType[_interfaceExtensions.size()]); > + } > > public InterfaceExtension[] getInterfaceExtensions() > { > diff -r 5471ba2f2541 > src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.java > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ > b/src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.j > ava Sun > Mar 22 15:24:27 2009 -0500 > @@ -0,0 +1,46 @@ > +package org.apache.xmlbeans.impl.config; > + > +import javax.xml.namespace.QName; > + > +import org.apache.xmlbeans.UserType; > +import org.apache.xmlbeans.impl.jam.JamClassLoader; > +import org.apache.xmlbeans.impl.xb.xmlconfig.Usertypeconfig; > + > +public class UserTypeImpl implements UserType { > + > + private QName _name; > + private String _javaName; > + private String _staticHandler; > + > + > + static UserTypeImpl newInstance(JamClassLoader loader, > + Usertypeconfig > cfgXO) > + { > + UserTypeImpl result = new UserTypeImpl(); > + > + result._name = cfgXO.getName(); > + result._javaName = cfgXO.getJavaname(); > + result._staticHandler = cfgXO.getStaticHandler(); > + > + // We don't validate here because we're just using > reflection in > + // the implementation. However, in the future we > might want to add > + // the option of directly using the static handler > in generated > code > + > + return result; > + } > + > + > + public String getJavaName() > + { > + return _javaName; > + } > + > + public QName getName() { > + return _name; > + } > + > + public String getStaticHandler() { > + return _staticHandler; > + } > + > + > +} > diff -r 5471ba2f2541 > src/xmlpublic/org/apache/xmlbeans/BindingConfig.java > --- a/src/xmlpublic/org/apache/xmlbeans/BindingConfig.java > Sun Mar 22 > 15:07:07 2009 -0500 > +++ b/src/xmlpublic/org/apache/xmlbeans/BindingConfig.java > Sun Mar 22 > 15:24:27 2009 -0500 > @@ -27,6 +27,7 @@ > { > private static final InterfaceExtension[] > EMPTY_INTERFACE_EXT_ARRAY = new InterfaceExtension[0]; > private static final PrePostExtension[] > EMPTY_PREPOST_EXT_ARRAY = new PrePostExtension[0]; > + private static final UserType[] EMPTY_USER_TYPE_ARRY = new > + UserType[0]; > > public static final int QNAME_TYPE = 1; > public static final int QNAME_DOCUMENT_TYPE = 2; @@ > -84,5 +85,16 @@ > * type generated from schema compilation or null. > */ > public PrePostExtension getPrePostExtension(String > fullJavaName) { return null; } > + > + /** > + * Returns all defined user types. > + */ > + public UserType[] getUserTypes() { return EMPTY_USER_TYPE_ARRY; } > + > + /** > + * Returns a user defined Java type for a given QName. > + */ > + public UserType lookupUserTypeForQName(QName qname) { > return null; > + } > + > > } > diff -r 5471ba2f2541 > src/xmlpublic/org/apache/xmlbeans/SchemaProperty.java > --- a/src/xmlpublic/org/apache/xmlbeans/SchemaProperty.java > Sun Mar 22 > 15:07:07 2009 -0500 > +++ b/src/xmlpublic/org/apache/xmlbeans/SchemaProperty.java > Sun Mar 22 > 15:24:27 2009 -0500 > @@ -210,6 +210,9 @@ > static final int JAVA_ENUM = 18; > /** A {...@link java.lang.Object}, used for some simple > type unions. See {...@link #getJavaTypeCode}. */ > static final int JAVA_OBJECT = 19; // for some unions > + > + /** A user specified type. */ > + static final int JAVA_USER = 20; > > /** > * Returns the default or fixed value, diff -r > 5471ba2f2541 src/xmlpublic/org/apache/xmlbeans/UserType.java > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/src/xmlpublic/org/apache/xmlbeans/UserType.java Sun > Mar 22 15:24:27 > 2009 -0500 > @@ -0,0 +1,13 @@ > +package org.apache.xmlbeans; > + > +import javax.xml.namespace.QName; > + > +public interface UserType { > + > + QName getName(); > + > + String getJavaName(); > + > + String getStaticHandler(); > + > +} > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@xmlbeans.apache.org > For additional commands, e-mail: dev-h...@xmlbeans.apache.org > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@xmlbeans.apache.org For additional commands, e-mail: dev-h...@xmlbeans.apache.org