View Javadoc

1   /*
2    * ModeShape (http://www.modeshape.org)
3    * See the COPYRIGHT.txt file distributed with this work for information
4    * regarding copyright ownership.  Some portions may be licensed
5    * to Red Hat, Inc. under one or more contributor license agreements.
6    * See the AUTHORS.txt file in the distribution for a full listing of 
7    * individual contributors. 
8    *
9    * ModeShape is free software. Unless otherwise indicated, all code in ModeShape
10   * is licensed to you under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation; either version 2.1 of
12   * the License, or (at your option) any later version.
13   *
14   * ModeShape is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this software; if not, write to the Free
21   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
23   */
24  package org.modeshape.graph.property.basic;
25  
26  import java.io.InputStream;
27  import java.io.Reader;
28  import java.math.BigDecimal;
29  import java.net.URI;
30  import java.util.Calendar;
31  import java.util.Date;
32  import java.util.UUID;
33  import net.jcip.annotations.Immutable;
34  import org.modeshape.common.text.TextDecoder;
35  import org.modeshape.graph.GraphI18n;
36  import org.modeshape.graph.property.Binary;
37  import org.modeshape.graph.property.DateTime;
38  import org.modeshape.graph.property.IoException;
39  import org.modeshape.graph.property.Name;
40  import org.modeshape.graph.property.Path;
41  import org.modeshape.graph.property.PropertyType;
42  import org.modeshape.graph.property.Reference;
43  import org.modeshape.graph.property.ValueFactory;
44  import org.modeshape.graph.property.ValueFormatException;
45  
46  /**
47   * The standard {@link ValueFactory} for {@link PropertyType#DOUBLE} values.
48   */
49  @Immutable
50  public class DoubleValueFactory extends AbstractValueFactory<Double> {
51  
52      public DoubleValueFactory( TextDecoder decoder,
53                                 ValueFactory<String> stringValueFactory ) {
54          super(PropertyType.DOUBLE, decoder, stringValueFactory);
55      }
56  
57      /**
58       * {@inheritDoc}
59       */
60      public Double create( String value ) {
61          if (value == null) return null;
62          try {
63              return Double.valueOf(value.trim());
64          } catch (NumberFormatException err) {
65              throw new ValueFormatException(value, getPropertyType(),
66                                             GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
67                                                                                Double.class.getSimpleName(),
68                                                                                value), err);
69          }
70      }
71  
72      /**
73       * {@inheritDoc}
74       */
75      public Double create( String value,
76                            TextDecoder decoder ) {
77          // 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
78          return create(getDecoder(decoder).decode(value));
79      }
80  
81      /**
82       * {@inheritDoc}
83       */
84      public Double create( int value ) {
85          return Double.valueOf(value);
86      }
87  
88      /**
89       * {@inheritDoc}
90       */
91      public Double create( long value ) {
92          return new Double(value);
93      }
94  
95      /**
96       * {@inheritDoc}
97       */
98      public Double create( boolean value ) {
99          throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
100                                                                                                     Double.class.getSimpleName(),
101                                                                                                     value));
102     }
103 
104     /**
105      * {@inheritDoc}
106      */
107     public Double create( float value ) {
108         return Double.valueOf(value);
109     }
110 
111     /**
112      * {@inheritDoc}
113      */
114     public Double create( double value ) {
115         return value;
116     }
117 
118     /**
119      * {@inheritDoc}
120      */
121     public Double create( BigDecimal value ) {
122         if (value == null) return null;
123         double result = value.doubleValue();
124         if (result == Double.NEGATIVE_INFINITY || result == Double.POSITIVE_INFINITY) {
125             throw new ValueFormatException(value, getPropertyType(),
126                                            GraphI18n.errorConvertingType.text(BigDecimal.class.getSimpleName(),
127                                                                               Double.class.getSimpleName(),
128                                                                               value));
129         }
130         return result;
131     }
132 
133     /**
134      * {@inheritDoc}
135      */
136     public Double create( Calendar value ) {
137         if (value == null) return null;
138         return create(value.getTimeInMillis());
139     }
140 
141     /**
142      * {@inheritDoc}
143      */
144     public Double create( Date value ) {
145         if (value == null) return null;
146         return create(value.getTime());
147     }
148 
149     /**
150      * {@inheritDoc}
151      * 
152      * @see org.modeshape.graph.property.ValueFactory#create(org.modeshape.graph.property.DateTime)
153      */
154     public Double create( DateTime value ) throws ValueFormatException {
155         if (value == null) return null;
156         return create(value.getMilliseconds());
157     }
158 
159     /**
160      * {@inheritDoc}
161      */
162     public Double create( Name value ) {
163         throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
164                                                                                                     Name.class.getSimpleName(),
165                                                                                                     value));
166     }
167 
168     /**
169      * {@inheritDoc}
170      */
171     public Double create( Path value ) {
172         throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
173                                                                                                     Path.class.getSimpleName(),
174                                                                                                     value));
175     }
176 
177     /**
178      * {@inheritDoc}
179      */
180     public Double create( Path.Segment value ) {
181         throw new ValueFormatException(value, getPropertyType(),
182                                        GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
183                                                                           Path.Segment.class.getSimpleName(),
184                                                                           value));
185     }
186 
187     /**
188      * {@inheritDoc}
189      */
190     public Double create( Reference value ) {
191         throw new ValueFormatException(value, getPropertyType(),
192                                        GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
193                                                                           Reference.class.getSimpleName(),
194                                                                           value));
195     }
196 
197     /**
198      * {@inheritDoc}
199      */
200     public Double create( URI value ) {
201         throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
202                                                                                                     URI.class.getSimpleName(),
203                                                                                                     value));
204     }
205 
206     /**
207      * {@inheritDoc}
208      * 
209      * @see org.modeshape.graph.property.ValueFactory#create(java.util.UUID)
210      */
211     public Double create( UUID value ) {
212         throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
213                                                                                                     UUID.class.getSimpleName(),
214                                                                                                     value));
215     }
216 
217     /**
218      * {@inheritDoc}
219      */
220     public Double create( byte[] value ) {
221         // First attempt to create a string from the value, then a long from the string ...
222         return create(getStringValueFactory().create(value));
223     }
224 
225     /**
226      * {@inheritDoc}
227      * 
228      * @see org.modeshape.graph.property.ValueFactory#create(org.modeshape.graph.property.Binary)
229      */
230     public Double create( Binary value ) throws ValueFormatException, IoException {
231         // First create a string and then create the boolean from the string value ...
232         return create(getStringValueFactory().create(value));
233     }
234 
235     /**
236      * {@inheritDoc}
237      */
238     public Double create( InputStream stream,
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(stream, approximateLength));
242     }
243 
244     /**
245      * {@inheritDoc}
246      */
247     public Double create( Reader reader,
248                           long approximateLength ) throws IoException {
249         // First attempt to create a string from the value, then a double from the string ...
250         return create(getStringValueFactory().create(reader, approximateLength));
251     }
252 
253     /**
254      * {@inheritDoc}
255      */
256     @Override
257     protected Double[] createEmptyArray( int length ) {
258         return new Double[length];
259     }
260 
261 }