001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.graph.properties.basic;
023
024 import java.io.InputStream;
025 import java.io.Reader;
026 import java.math.BigDecimal;
027 import java.net.URI;
028 import java.util.Calendar;
029 import java.util.Date;
030 import java.util.UUID;
031 import net.jcip.annotations.Immutable;
032 import org.jboss.dna.common.text.TextDecoder;
033 import org.jboss.dna.graph.GraphI18n;
034 import org.jboss.dna.graph.properties.Binary;
035 import org.jboss.dna.graph.properties.DateTime;
036 import org.jboss.dna.graph.properties.IoException;
037 import org.jboss.dna.graph.properties.Name;
038 import org.jboss.dna.graph.properties.Path;
039 import org.jboss.dna.graph.properties.PropertyType;
040 import org.jboss.dna.graph.properties.Reference;
041 import org.jboss.dna.graph.properties.ValueFactory;
042 import org.jboss.dna.graph.properties.ValueFormatException;
043
044 /**
045 * The standard {@link ValueFactory} for {@link PropertyType#DOUBLE} values.
046 *
047 * @author Randall Hauch
048 * @author John Verhaeg
049 */
050 @Immutable
051 public class DoubleValueFactory extends AbstractValueFactory<Double> {
052
053 public DoubleValueFactory( TextDecoder decoder,
054 ValueFactory<String> stringValueFactory ) {
055 super(PropertyType.DOUBLE, decoder, stringValueFactory);
056 }
057
058 /**
059 * {@inheritDoc}
060 */
061 public Double create( String value ) {
062 if (value == null) return null;
063 try {
064 return Double.valueOf(value.trim());
065 } catch (NumberFormatException err) {
066 throw new ValueFormatException(value, getPropertyType(),
067 GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
068 Double.class.getSimpleName(),
069 value), err);
070 }
071 }
072
073 /**
074 * {@inheritDoc}
075 */
076 public Double create( String value,
077 TextDecoder decoder ) {
078 // this probably doesn't really need to call the decoder, but by doing so then we don't care at all what the decoder does
079 return create(getDecoder(decoder).decode(value));
080 }
081
082 /**
083 * {@inheritDoc}
084 */
085 public Double create( int value ) {
086 return Double.valueOf(value);
087 }
088
089 /**
090 * {@inheritDoc}
091 */
092 public Double create( long value ) {
093 return new Double(value);
094 }
095
096 /**
097 * {@inheritDoc}
098 */
099 public Double create( boolean value ) {
100 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
101 Double.class.getSimpleName(),
102 value));
103 }
104
105 /**
106 * {@inheritDoc}
107 */
108 public Double create( float value ) {
109 return Double.valueOf(value);
110 }
111
112 /**
113 * {@inheritDoc}
114 */
115 public Double create( double value ) {
116 return value;
117 }
118
119 /**
120 * {@inheritDoc}
121 */
122 public Double create( BigDecimal value ) {
123 if (value == null) return null;
124 double result = value.doubleValue();
125 if (result == Double.NEGATIVE_INFINITY || result == Double.POSITIVE_INFINITY) {
126 throw new ValueFormatException(value, getPropertyType(),
127 GraphI18n.errorConvertingType.text(BigDecimal.class.getSimpleName(),
128 Double.class.getSimpleName(),
129 value));
130 }
131 return result;
132 }
133
134 /**
135 * {@inheritDoc}
136 */
137 public Double create( Calendar value ) {
138 if (value == null) return null;
139 return create(value.getTimeInMillis());
140 }
141
142 /**
143 * {@inheritDoc}
144 */
145 public Double create( Date value ) {
146 if (value == null) return null;
147 return create(value.getTime());
148 }
149
150 /**
151 * {@inheritDoc}
152 *
153 * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.DateTime)
154 */
155 public Double create( DateTime value ) throws ValueFormatException {
156 if (value == null) return null;
157 return create(value.getMilliseconds());
158 }
159
160 /**
161 * {@inheritDoc}
162 */
163 public Double create( Name value ) {
164 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
165 Name.class.getSimpleName(),
166 value));
167 }
168
169 /**
170 * {@inheritDoc}
171 */
172 public Double create( Path value ) {
173 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
174 Path.class.getSimpleName(),
175 value));
176 }
177
178 /**
179 * {@inheritDoc}
180 */
181 public Double create( Reference value ) {
182 throw new ValueFormatException(value, getPropertyType(),
183 GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
184 Reference.class.getSimpleName(),
185 value));
186 }
187
188 /**
189 * {@inheritDoc}
190 */
191 public Double create( URI value ) {
192 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
193 URI.class.getSimpleName(),
194 value));
195 }
196
197 /**
198 * {@inheritDoc}
199 *
200 * @see org.jboss.dna.graph.properties.ValueFactory#create(java.util.UUID)
201 */
202 public Double create( UUID value ) {
203 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
204 UUID.class.getSimpleName(),
205 value));
206 }
207
208 /**
209 * {@inheritDoc}
210 */
211 public Double create( byte[] value ) {
212 // First attempt to create a string from the value, then a long from the string ...
213 return create(getStringValueFactory().create(value));
214 }
215
216 /**
217 * {@inheritDoc}
218 *
219 * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.Binary)
220 */
221 public Double create( Binary value ) throws ValueFormatException, IoException {
222 // First create a string and then create the boolean from the string value ...
223 return create(getStringValueFactory().create(value));
224 }
225
226 /**
227 * {@inheritDoc}
228 */
229 public Double create( InputStream stream,
230 long approximateLength ) throws IoException {
231 // First attempt to create a string from the value, then a double from the string ...
232 return create(getStringValueFactory().create(stream, approximateLength));
233 }
234
235 /**
236 * {@inheritDoc}
237 */
238 public Double create( Reader reader,
239 long approximateLength ) throws IoException {
240 // First attempt to create a string from the value, then a double from the string ...
241 return create(getStringValueFactory().create(reader, approximateLength));
242 }
243
244 /**
245 * {@inheritDoc}
246 */
247 @Override
248 protected Double[] createEmptyArray( int length ) {
249 return new Double[length];
250 }
251
252 }