KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > cayenne > access > types > ByteOrCharArrayFactory


1 /*****************************************************************
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  ****************************************************************/

19 package org.apache.cayenne.access.types;
20
21 /**
22  * A factory that dynamically creates ExtendedTypes for Character, Character[], Byte[] and
23  * char[] based on adapter configured types for String and byte[].
24  *
25  * @since 3.0
26  * @author Andrus Adamchik
27  */

28 class ByteOrCharArrayFactory implements ExtendedTypeFactory {
29
30     private ExtendedTypeMap map;
31
32     ByteOrCharArrayFactory(ExtendedTypeMap map) {
33         this.map = map;
34     }
35
36     public ExtendedType getType(Class JavaDoc objectClass) {
37
38         if (objectClass.isArray()) {
39
40             Class JavaDoc elementType = objectClass.getComponentType();
41
42             if (Character JavaDoc.class.isAssignableFrom(elementType)) {
43                 // can't use "getRegisteredType" as it causes infinite recursion
44
ExtendedType stringType = map
45                         .getExplictlyRegisteredType("java.lang.String");
46
47                 return new CharacterArrayType(stringType);
48             }
49             else if (Character.TYPE.isAssignableFrom(elementType)) {
50
51                 // can't use "getRegisteredType" as it causes infinite recursion
52
ExtendedType stringType = map
53                         .getExplictlyRegisteredType("java.lang.String");
54
55                 return new CharArrayType(stringType);
56             }
57             else if (Byte JavaDoc.class.isAssignableFrom(elementType)) {
58                 // can't use "getRegisteredType" as it causes infinite recursion
59
ExtendedType bytesType = map.getExplictlyRegisteredType("byte[]");
60                 return new ByteWrapperArrayType(bytesType);
61             }
62         }
63         else if (Character JavaDoc.class.isAssignableFrom(objectClass)) {
64
65             // can't use "getRegisteredType" as it causes infinite recursion
66
ExtendedType stringType = map.getExplictlyRegisteredType("java.lang.String");
67             return new CharacterType(stringType);
68         }
69
70         return null;
71     }
72
73     final class CharacterType extends ExtendedTypeDecorator {
74
75         CharacterType(ExtendedType stringType) {
76             super(stringType);
77         }
78
79         public String JavaDoc getClassName() {
80             return "java.lang.Character";
81         }
82
83         Object JavaDoc fromJavaObject(Object JavaDoc object) {
84             return object != null
85                     ? String.valueOf(((Character JavaDoc) object).charValue())
86                     : null;
87         }
88
89         Object JavaDoc toJavaObject(Object JavaDoc object) {
90             if (object == null) {
91                 return null;
92             }
93
94             String JavaDoc string = object.toString();
95             return (string.length() > 0) ? new Character JavaDoc(string.charAt(0)) : null;
96         }
97     }
98
99     final class CharArrayType extends ExtendedTypeDecorator {
100
101         CharArrayType(ExtendedType stringType) {
102             super(stringType);
103         }
104
105         public String JavaDoc getClassName() {
106             return "char[]";
107         }
108
109         Object JavaDoc fromJavaObject(Object JavaDoc object) {
110             return object != null ? new String JavaDoc((char[]) object) : null;
111         }
112
113         Object JavaDoc toJavaObject(Object JavaDoc object) {
114             return object != null ? ((String JavaDoc) object).toCharArray() : null;
115         }
116     }
117
118     final class CharacterArrayType extends ExtendedTypeDecorator {
119
120         CharacterArrayType(ExtendedType stringType) {
121             super(stringType);
122         }
123
124         public String JavaDoc getClassName() {
125             return "java.lang.Character[]";
126         }
127
128         Object JavaDoc fromJavaObject(Object JavaDoc object) {
129             if (object == null) {
130                 return null;
131             }
132
133             Character JavaDoc[] chars = (Character JavaDoc[]) object;
134             StringBuffer JavaDoc buffer = new StringBuffer JavaDoc(chars.length);
135             for (int i = 0; i < chars.length; i++) {
136                 buffer.append(chars[i] != null ? chars[i].charValue() : 0);
137             }
138
139             return buffer.toString();
140         }
141
142         Object JavaDoc toJavaObject(Object JavaDoc object) {
143             if (object == null) {
144                 return null;
145             }
146
147             String JavaDoc string = object.toString();
148             Character JavaDoc[] chars = new Character JavaDoc[string.length()];
149             for (int i = 0; i < string.length(); i++) {
150                 chars[i] = new Character JavaDoc(string.charAt(i));
151             }
152
153             return chars;
154         }
155     }
156
157     final class ByteWrapperArrayType extends ExtendedTypeDecorator {
158
159         ByteWrapperArrayType(ExtendedType byteArrayType) {
160             super(byteArrayType);
161         }
162
163         public String JavaDoc getClassName() {
164             return "java.lang.Byte[]";
165         }
166
167         Object JavaDoc fromJavaObject(Object JavaDoc object) {
168             if (object == null) {
169                 return null;
170             }
171
172             Byte JavaDoc[] bytes = (Byte JavaDoc[]) object;
173             byte[] buffer = new byte[bytes.length];
174             for (int i = 0; i < bytes.length; i++) {
175                 buffer[i] = bytes[i] != null ? bytes[i].byteValue() : 0;
176             }
177
178             return buffer;
179         }
180
181         Object JavaDoc toJavaObject(Object JavaDoc object) {
182             if (object == null) {
183                 return null;
184             }
185
186             byte[] bytes = (byte[]) object;
187             Byte JavaDoc[] byteWrappers = new Byte JavaDoc[bytes.length];
188
189             for (int i = 0; i < bytes.length; i++) {
190                 byteWrappers[i] = new Byte JavaDoc(bytes[i]);
191             }
192
193             return byteWrappers;
194         }
195     }
196 }
197
Popular Tags