1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sf.ezmorph.primitive;
18
19 import net.sf.ezmorph.MorphException;
20
21 import org.apache.commons.lang.builder.EqualsBuilder;
22 import org.apache.commons.lang.builder.HashCodeBuilder;
23
24
25
26
27
28
29 public final class BooleanMorpher extends AbstractPrimitiveMorpher
30 {
31 private boolean defaultValue;
32
33 public BooleanMorpher()
34 {
35 super();
36 }
37
38
39
40
41 public BooleanMorpher( boolean defaultValue )
42 {
43 super( true );
44 this.defaultValue = defaultValue;
45 }
46
47 public boolean equals( Object obj )
48 {
49 if( this == obj ){
50 return true;
51 }
52 if( obj == null ){
53 return false;
54 }
55
56 if( !(obj instanceof BooleanMorpher) ){
57 return false;
58 }
59
60 BooleanMorpher other = (BooleanMorpher) obj;
61 EqualsBuilder builder = new EqualsBuilder();
62 if( isUseDefault() && other.isUseDefault() ){
63 builder.append( getDefaultValue(), other.getDefaultValue() );
64 return builder.isEquals();
65 }else if( !isUseDefault() && !other.isUseDefault() ){
66 return builder.isEquals();
67 }else{
68 return false;
69 }
70 }
71
72
73
74
75 public boolean getDefaultValue()
76 {
77 return defaultValue;
78 }
79
80 public int hashCode()
81 {
82 HashCodeBuilder builder = new HashCodeBuilder();
83 if( isUseDefault() ){
84 builder.append( getDefaultValue() );
85 }
86 return builder.toHashCode();
87 }
88
89
90
91
92
93
94
95 public boolean morph( Object value )
96 {
97 if( value == null ){
98 if( isUseDefault() ){
99 return defaultValue;
100 }else{
101 throw new MorphException( "value is null" );
102 }
103 }
104
105 if( value instanceof Boolean ){
106 return ((Boolean) value).booleanValue();
107 }else if( value instanceof Number ){
108 if( value instanceof Double
109 && (Double.isInfinite( ((Number) value).doubleValue() ) || Double.isNaN( ((Number) value).doubleValue() )) ){
110 return true;
111 }
112 if( value instanceof Float
113 && (Float.isInfinite( ((Number) value).floatValue() ) || Float.isNaN( ((Number) value).floatValue() )) ){
114 return true;
115 }
116 long l = ((Number) value).longValue();
117 return l != 0;
118 }else{
119 String s = String.valueOf( value );
120
121 if( s.equalsIgnoreCase( "true" ) || s.equalsIgnoreCase( "yes" )
122 || s.equalsIgnoreCase( "on" ) ){
123 return true;
124 }else if( s.equalsIgnoreCase( "false" ) || s.equalsIgnoreCase( "no" )
125 || s.equalsIgnoreCase( "off" ) ){
126 return false;
127 }else if( isUseDefault() ){
128 return defaultValue;
129 }
130 }
131
132 throw new MorphException( "Can't morph value: " + value );
133 }
134
135 public Class morphsTo()
136 {
137 return Boolean.TYPE;
138 }
139 }