Author: aadamchik
Date: Sat Sep  2 12:11:47 2006
New Revision: 439637

URL: http://svn.apache.org/viewvc?rev=439637&view=rev
Log:
CAY-650 - adding support for java.lang.Character

Added:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/CharacterEntity.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/auto/_CharacterEntity.java
Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/MiscTypesTst.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/resources/testmap.map.xml

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java?rev=439637&r1=439636&r2=439637&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java
 Sat Sep  2 12:11:47 2006
@@ -19,8 +19,8 @@
 package org.apache.cayenne.access.types;
 
 /**
- * A factory that dynamically creates ExtendedTypes for Character[], Byte[] 
and char[]
- * based on adapter configured types for String and byte[].
+ * A factory that dynamically creates ExtendedTypes for Character, 
Character[], Byte[] and
+ * char[] based on adapter configured types for String and byte[].
  * 
  * @since 3.0
  * @author Andrus Adamchik
@@ -40,52 +40,60 @@
             Class elementType = objectClass.getComponentType();
 
             if (Character.class.isAssignableFrom(elementType)) {
-                // note - can't use "getRegisteredType" as it causes infinite 
recursion
+                // can't use "getRegisteredType" as it causes infinite 
recursion
                 ExtendedType stringType = map
                         .getExplictlyRegisteredType("java.lang.String");
 
-                // not sure if this type of recursion can occur, still worth 
checking
-                if (stringType instanceof CharacterArrayType) {
-                    throw new IllegalStateException(
-                            "Can't create CharacterArrayType for "
-                                    + objectClass.getName()
-                                    + ": no ExtendedType exists for String");
-                }
-
                 return new CharacterArrayType(stringType);
             }
             else if (Character.TYPE.isAssignableFrom(elementType)) {
 
-                // note - can't use "getRegisteredType" as it causes infinite 
recursion
+                // can't use "getRegisteredType" as it causes infinite 
recursion
                 ExtendedType stringType = map
                         .getExplictlyRegisteredType("java.lang.String");
 
-                // not sure if this type of recursion can occur, still worth 
checking
-                if (stringType instanceof CharArrayType) {
-                    throw new IllegalStateException("Can't create 
CharArrayType for "
-                            + objectClass.getName()
-                            + ": no ExtendedType exists for String");
-                }
-
                 return new CharArrayType(stringType);
             }
             else if (Byte.class.isAssignableFrom(elementType)) {
-                // note - can't use "getRegisteredType" as it causes infinite 
recursion
+                // can't use "getRegisteredType" as it causes infinite 
recursion
                 ExtendedType bytesType = 
map.getExplictlyRegisteredType("byte[]");
-
-                // not sure if this type of recursion can occur, still worth 
checking
-                if (bytesType instanceof ByteWrapperArrayType) {
-                    throw new IllegalStateException(
-                            "Can't create ByteWrapperArrayType for "
-                                    + objectClass.getName()
-                                    + ": no ExtendedType exists for byte[]");
-                }
-
                 return new ByteWrapperArrayType(bytesType);
             }
         }
+        else if (Character.class.isAssignableFrom(objectClass)) {
+
+            // can't use "getRegisteredType" as it causes infinite recursion
+            ExtendedType stringType = 
map.getExplictlyRegisteredType("java.lang.String");
+            return new CharacterType(stringType);
+        }
 
         return null;
+    }
+
+    final class CharacterType extends ExtendedTypeDecorator {
+
+        CharacterType(ExtendedType stringType) {
+            super(stringType);
+        }
+
+        public String getClassName() {
+            return "java.lang.Character";
+        }
+
+        Object fromJavaObject(Object object) {
+            return object != null
+                    ? String.valueOf(((Character) object).charValue())
+                    : null;
+        }
+
+        Object toJavaObject(Object object) {
+            if (object == null) {
+                return null;
+            }
+
+            String string = object.toString();
+            return (string.length() > 0) ? new Character(string.charAt(0)) : 
null;
+        }
     }
 
     final class CharArrayType extends ExtendedTypeDecorator {

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/CharacterEntity.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/CharacterEntity.java?rev=439637&view=auto
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/CharacterEntity.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/CharacterEntity.java
 Sat Sep  2 12:11:47 2006
@@ -0,0 +1,10 @@
+package org.apache.art;
+
+import org.apache.art.auto._CharacterEntity;
+
+public class CharacterEntity extends _CharacterEntity {
+
+}
+
+
+

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/auto/_CharacterEntity.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/auto/_CharacterEntity.java?rev=439637&view=auto
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/auto/_CharacterEntity.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/art/auto/_CharacterEntity.java
 Sat Sep  2 12:11:47 2006
@@ -0,0 +1,22 @@
+package org.apache.art.auto;
+
+/** Class _CharacterEntity was generated by Cayenne.
+  * It is probably a good idea to avoid changing this class manually, 
+  * since it may be overwritten next time code is regenerated. 
+  * If you need to make any customizations, please use subclass. 
+  */
+public class _CharacterEntity extends org.apache.cayenne.CayenneDataObject {
+
+    public static final String CHARACTER_FIELD_PROPERTY = "characterField";
+
+    public static final String ID_PK_COLUMN = "ID";
+
+    public void setCharacterField(Character characterField) {
+        writeProperty("characterField", characterField);
+    }
+    public Character getCharacterField() {
+        return (Character)readProperty("characterField");
+    }
+    
+    
+}

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/MiscTypesTst.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/MiscTypesTst.java?rev=439637&r1=439636&r2=439637&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/MiscTypesTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/MiscTypesTst.java
 Sat Sep  2 12:11:47 2006
@@ -21,6 +21,7 @@
 import java.lang.reflect.Array;
 
 import org.apache.art.ArraysEntity;
+import org.apache.art.CharacterEntity;
 import org.apache.art.SerializableEntity;
 import org.apache.cayenne.MockSerializable;
 import org.apache.cayenne.query.SelectQuery;
@@ -110,6 +111,23 @@
         assertArraysEqual(a, testRead.getCharWrapperArray());
 
         test.setCharWrapperArray(null);
+        context.commitChanges();
+    }
+    
+    public void testCharacter() {
+        DataContext context = createDataContext();
+
+        CharacterEntity test = (CharacterEntity) 
context.newObject(CharacterEntity.class);
+
+        test.setCharacterField(new Character('c'));
+        context.commitChanges();
+
+        SelectQuery q = new SelectQuery(CharacterEntity.class);
+        CharacterEntity testRead = (CharacterEntity) 
context.performQuery(q).get(0);
+        assertNotNull(testRead.getCharacterField());
+        assertEquals(new Character('c'), testRead.getCharacterField());
+
+        test.setCharacterField(null);
         context.commitChanges();
     }
 

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/resources/testmap.map.xml
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/resources/testmap.map.xml?rev=439637&r1=439636&r2=439637&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/resources/testmap.map.xml
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/resources/testmap.map.xml
 Sat Sep  2 12:11:47 2006
@@ -70,6 +70,10 @@
                <db-attribute name="CALENDAR_FIELD" type="TIMESTAMP"/>
                <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
isMandatory="true"/>
        </db-entity>
+       <db-entity name="CHARACTER_ENTITY">
+               <db-attribute name="CHARACTER_FIELD" type="CHAR" length="1"/>
+               <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" 
isMandatory="true"/>
+       </db-entity>
        <db-entity name="CHAR_FK_TEST">
                <db-attribute name="FK_COL" type="CHAR" length="10"/>
                <db-attribute name="NAME" type="VARCHAR" length="100"/>
@@ -260,6 +264,9 @@
        <obj-entity name="CharPkTestEntity" 
className="org.apache.art.CharPkTestEntity" dbEntityName="CHAR_PK_TEST">
                <obj-attribute name="otherCol" type="java.lang.String" 
db-attribute-path="OTHER_COL"/>
                <obj-attribute name="pkCol" type="java.lang.String" 
db-attribute-path="PK_COL"/>
+       </obj-entity>
+       <obj-entity name="CharacterEntity" 
className="org.apache.art.CharacterEntity" dbEntityName="CHARACTER_ENTITY">
+               <obj-attribute name="characterField" type="java.lang.Character" 
db-attribute-path="CHARACTER_FIELD"/>
        </obj-entity>
        <obj-entity name="ClobTestEntity" 
className="org.apache.art.ClobTestEntity" dbEntityName="CLOB_TEST">
                <obj-attribute name="clobCol" type="java.lang.String" 
db-attribute-path="CLOB_COL"/>


Reply via email to