[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xmlbeans-dev
Subject:    [PATCH 1 of 4] Custom user type support
From:       wleggette () cleversafe ! com
Date:       2009-04-28 16:35:40
Message-ID: 1a589b49b118349cf54e.1240936540 () terrence ! local
[Download RAW message or body]

# HG changeset patch
# User Wesley Leggette <wleggette@cleversafe.com>
# Date 1237102589 18000
# Branch clean
# Node ID 1a589b49b118349cf54ebeee8f036ac32bfbe9dc
# Parent  5471ba2f2541e6cc0dc7808f0f1f86f35297ebdd
Custom user type support.
* * *
Finished user type support for multiple values, applied changes recommended in code \
                review.
* * *
removed isUserType() as it is not needed.
* * *
Fixed changes after code review.

diff -r 5471ba2f2541 -r 1a589b49b118 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 15 02:36:29 2009 -0500
@@ -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 void encodeUuid(UUID obj, SimpleValue target)
+                                public UUID decodeUuid(SimpleValue obj)
+                       </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 -r 1a589b49b118 \
                src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
                
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java	Sun Mar \
                22 15:07:07 2009 -0500
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java	Sun Mar \
15 02:36:29 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;
@@ -29,12 +30,15 @@
 
 import javax.xml.namespace.QName;
 import org.apache.xmlbeans.impl.common.NameUtil;
+import org.apache.xmlbeans.impl.xb.xsdschema.impl.SimpleTypeImpl;
 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;
@@ -323,6 +327,20 @@
         }
         return ret;
     }
+    
+    private String getUserTypeStaticHandlerMethod(boolean encode, SchemaTypeImpl \
stype) +    {
+        String unqualifiedName = stype.getName().getLocalPart();
+        if (unqualifiedName.length() < 2)
+            unqualifiedName = unqualifiedName.toUpperCase();
+        else
+            unqualifiedName = unqualifiedName.substring(0, 1).toUpperCase() + \
unqualifiedName.substring(1); +        
+        if (encode)
+            return stype.getUserTypeHandlerName() + ".encode" + unqualifiedName;
+        else
+            return stype.getUserTypeHandlerName() + ".decode" + unqualifiedName;
+    }
 
 
     public static String indexClassForSystem(SchemaTypeSystem system)
@@ -1017,6 +1035,11 @@
             SchemaType sType = sProp.javaBasedOnType();
             return findJavaType(sType).replace('$', '.');
         }
+        
+        if (sProp.getJavaTypeCode() == SchemaProperty.JAVA_USER)
+        {
+        	return ((SchemaTypeImpl)sProp.getType()).getUserTypeName();
+        }
 
         switch (sProp.getJavaTypeCode())
         {
@@ -1446,7 +1469,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 +1591,19 @@
                 emit("    result[i] = \
((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getObjectValue();");  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] \
= " + getUserTypeStaticHandlerMethod(false, stype) +                        + \
"((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 +1665,83 @@
 
         case SchemaProperty.JAVA_OBJECT:
             emit("return target.getObjectValue();"); break;
+            
+        case SchemaProperty.JAVA_USER:
+            emit("return " + getUserTypeStaticHandlerMethod(false, stype)
+                    + "(target);");
+            break;
+            
+        default:
+            throw new IllegalStateException();
         }
     }
-
-    String jsetMethod(int javaType) throws IOException
-    {
+    void printJSetValue(int javaType, String safeVarName, SchemaTypeImpl stype) \
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(getUserTypeStaticHandlerMethod(true, stype)
+                        + "(" + safeVarName + ", target);");
+                break;
 
             default:
                 throw new IllegalStateException();
@@ -2009,8 +2052,9 @@
             makeMissingValue(javaType);
             endBlock();
 
-
-            printJGetValue(javaType, type);
+            
+            printJGetValue(javaType, type, (SchemaTypeImpl)prop.getType());	
+            
 
             emitImplementationPostamble();
 
@@ -2023,6 +2067,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 +2091,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 +2155,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 +2167,7 @@
             emitImplementationPreamble();
 
             emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, \
                jtargetType);
-            printJGetValue(javaType, type);
+            printJGetValue(javaType, type, (SchemaTypeImpl)prop.getType());
 
             emitImplementationPostamble();
             endBlock();
@@ -2194,7 +2240,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 +2255,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 +2277,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();
             }
@@ -2349,6 +2394,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(" \
" + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl)prop.getType()) +            \
+ "(" + safeVarName + "Array[i], dests[i]);"); +                        emit("}");
+                    }
+                    else
+                    {
+                        emit("org.apache.xmlbeans.SimpleValue[] dests = \
arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ", " + \
setIdentifier + ");" ); +                        emit("for ( int i = 0 ; i < \
dests.length ; i++ ) {"); +                        emit("    " + \
getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl)prop.getType()) +                \
+ "(" + safeVarName + "Array[i], dests[i]);"); +                        emit("}");
+                    }
+                }
                 else
                 {
                     if (!isSubstGroup)
@@ -2372,12 +2436,21 @@
                         \
                "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_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 +2509,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 +2521,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 +2675,7 @@
                 {
                     printSetterImpls(
                         name,
+                        prop,
                         prop.isAttribute(),
                         prop.getJavaPropertyName(),
                         prop.getJavaTypeCode(),
diff -r 5471ba2f2541 -r 1a589b49b118 \
                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 15 \
02:36:29 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 -r 1a589b49b118 \
                src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java	Sun Mar 22 \
                15:07:07 2009 -0500
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscJavaizer.java	Sun Mar 15 \
02:36:29 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,14 @@
             {
                 sImpl.setFullJavaName(pickFullJavaClassName(usedNames, \
                findTopName(sImpl), pickedName, sImpl.isDocumentType(), \
                sImpl.isAttributeType()));
                 sImpl.setFullJavaImplName(pickFullJavaImplName(usedNames, \
sImpl.getFullJavaName())); +
+                UserType utype = \
StscState.get().getBindingConfig().lookupUserTypeForQName(sImpl.getName()); +         \
if (utype != null) +                {
+                    sImpl.setUserTypeName(utype.getJavaName());
+                    sImpl.setUserTypeHandlerName(utype.getStaticHandler());
+                }
+
                 setExtensions(sImpl, state);
             }
         }
@@ -531,6 +540,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 -r 1a589b49b118 \
                src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java
                
--- a/src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java	Sun Mar \
                22 15:07:07 2009 -0500
+++ b/src/typeimpl/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java	Sun Mar \
15 02:36:29 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 -r 1a589b49b118 \
                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 15 \
02:36:29 2009 -0500 @@ -1259,7 +1259,7 @@
     }
 
     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 \
COMPATIBILITY_CONFIG_URI = "http://xml.apache.org/xmlbeans/2004/02/xbean/config";  \
private static final Map MAP_COMPATIBILITY_CONFIG_URIS;  static
     {
diff -r 5471ba2f2541 -r 1a589b49b118 \
                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.java	Sun Mar 15 \
02:36:29 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 Map _userTypes;
 
     private BindingConfigImpl()
     {
@@ -69,6 +72,7 @@
         _qnameAttMap = Collections.EMPTY_MAP;
         _interfaceExtensions = new ArrayList();
         _prePostExtensions = new ArrayList();
+        _userTypes = Collections.EMPTY_MAP;
     }
 
     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 LinkedHashMap();
 
         for (int i = 0; i < configs.length; i++)
         {
@@ -137,6 +142,12 @@
             {
                 recordExtensionSetting(javaFiles, classpath, ext[j]);
             }
+            
+            Usertypeconfig[] utypes = config.getUsertypeArray();
+            for (int j = 0; j < utypes.length; j++)
+            {
+                recordUserTypeSetting(javaFiles, classpath, utypes[j]);
+            }
         }
 
         secondPhaseValidation();
@@ -273,6 +284,14 @@
             addPrePostExtension(PrePostExtensionImpl.newInstance(jamLoader, \
xbeanSet, ppXO));  }
     }
+    
+    private void recordUserTypeSetting(File[] javaFiles, File[] classpath,
+            Usertypeconfig usertypeconfig)
+    {
+        JamClassLoader jamLoader = getJamLoader(javaFiles, classpath);
+        UserTypeImpl userType = UserTypeImpl.newInstance(jamLoader, usertypeconfig);
+        _userTypes.put(userType.getName(), userType);
+    }
 
 
     private String lookup(Map map, Map mapByUriPrefix, String uri)
@@ -354,6 +373,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 +387,15 @@
         }
         return null;
     }
+    
+
+    public UserType lookupUserTypeForQName(QName qname)
+    {
+        if (qname == null)
+            return null;
+
+        return (UserType) _userTypes.get(qname);
+    }
 
     public InterfaceExtension[] getInterfaceExtensions()
     {
diff -r 5471ba2f2541 -r 1a589b49b118 \
                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.java	Sun Mar 15 \
02:36:29 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 -r 1a589b49b118 \
                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 15 02:36:29 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 -r 1a589b49b118 \
                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 15 02:36:29 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 -r 1a589b49b118 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 15 02:36:29 2009 -0500
@@ -0,0 +1,28 @@
+package org.apache.xmlbeans;
+
+import javax.xml.namespace.QName;
+
+/**
+ * The UserType class represents a mapping between an XML Schema QName and
+ * a custom Java class type. It is used during code generation to determine
+ * how to convert user-defined simple types to user defined Java classes.
+ */
+public interface UserType {
+
+    /**
+     * The QName of the simple value that will be converted to a Java class.
+     */
+	QName getName();
+
+	/**
+	 * The class name the simple value will be converted to.
+	 */
+	String getJavaName();
+	
+	/**
+	 * A class which provides public static methods to convert {@link SimpleValue}
+	 * objects to and from the Java type specified by {@link #getJavaName()}.
+	 */
+	String getStaticHandler();
+	
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: dev-help@xmlbeans.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic