1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sf.ezmorph.array;
18
19 import java.lang.reflect.Array;
20
21 import net.sf.ezmorph.MorphException;
22 import net.sf.ezmorph.primitive.CharMorpher;
23
24 import org.apache.commons.lang.builder.EqualsBuilder;
25 import org.apache.commons.lang.builder.HashCodeBuilder;
26
27
28
29
30
31
32 public final class CharArrayMorpher extends AbstractArrayMorpher
33 {
34 private static final Class CHAR_ARRAY_CLASS = char[].class;
35 private char defaultValue;
36
37 public CharArrayMorpher()
38 {
39 super( false );
40 }
41
42
43
44
45 public CharArrayMorpher( char defaultValue )
46 {
47 super( true );
48 this.defaultValue = defaultValue;
49 }
50
51 public boolean equals( Object obj )
52 {
53 if( this == obj ){
54 return true;
55 }
56 if( obj == null ){
57 return false;
58 }
59
60 if( !(obj instanceof CharArrayMorpher) ){
61 return false;
62 }
63
64 CharArrayMorpher other = (CharArrayMorpher) obj;
65 EqualsBuilder builder = new EqualsBuilder();
66 if( isUseDefault() && other.isUseDefault() ){
67 builder.append( getDefaultValue(), other.getDefaultValue() );
68 return builder.isEquals();
69 }else if( !isUseDefault() && !other.isUseDefault() ){
70 return builder.isEquals();
71 }else{
72 return false;
73 }
74 }
75
76
77
78
79 public char getDefaultValue()
80 {
81 return defaultValue;
82 }
83
84 public int hashCode()
85 {
86 HashCodeBuilder builder = new HashCodeBuilder();
87 if( isUseDefault() ){
88 builder.append( getDefaultValue() );
89 }
90 return builder.toHashCode();
91 }
92
93 public Object morph( Object array )
94 {
95 if( array == null ){
96 return null;
97 }
98
99 if( CHAR_ARRAY_CLASS.isAssignableFrom( array.getClass() ) ){
100
101 return (char[]) array;
102 }
103
104 if( array.getClass()
105 .isArray() ){
106 int length = Array.getLength( array );
107 int dims = getDimensions( array.getClass() );
108 int[] dimensions = createDimensions( dims, length );
109 Object result = Array.newInstance( char.class, dimensions );
110 CharMorpher morpher = isUseDefault() ? new CharMorpher( defaultValue ) : new CharMorpher();
111 if( dims == 1 ){
112 for( int index = 0; index < length; index++ ){
113 Array.set( result, index, new Character( morpher.morph( Array.get( array, index ) ) ) );
114 }
115 }else{
116 for( int index = 0; index < length; index++ ){
117 Array.set( result, index, morph( Array.get( array, index ) ) );
118 }
119 }
120 return result;
121 }else{
122 throw new MorphException( "argument is not an array: " + array.getClass() );
123 }
124 }
125
126 public Class morphsTo()
127 {
128 return CHAR_ARRAY_CLASS;
129 }
130 }