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.DateTimeFactory;
037 import org.jboss.dna.graph.properties.IoException;
038 import org.jboss.dna.graph.properties.Name;
039 import org.jboss.dna.graph.properties.Path;
040 import org.jboss.dna.graph.properties.PropertyType;
041 import org.jboss.dna.graph.properties.Reference;
042 import org.jboss.dna.graph.properties.ValueFactory;
043 import org.jboss.dna.graph.properties.ValueFormatException;
044 import org.joda.time.DateTimeZone;
045
046 /**
047 * The standard {@link ValueFactory} for {@link PropertyType#DATE} values.
048 *
049 * @author Randall Hauch
050 * @author John Verhaeg
051 */
052 @Immutable
053 public class JodaDateTimeValueFactory extends AbstractValueFactory<DateTime> implements DateTimeFactory {
054
055 public JodaDateTimeValueFactory( TextDecoder decoder,
056 ValueFactory<String> stringValueFactory ) {
057 super(PropertyType.DATE, decoder, stringValueFactory);
058 }
059
060 /**
061 * {@inheritDoc}
062 */
063 public DateTime create( String value ) {
064 if (value == null) return null;
065 try {
066 return new JodaDateTime(value.trim());
067 } catch (IllegalArgumentException err) {
068 throw new ValueFormatException(value, getPropertyType(),
069 GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
070 DateTime.class.getSimpleName(),
071 value), err);
072 }
073 }
074
075 /**
076 * {@inheritDoc}
077 */
078 public DateTime create( String value,
079 TextDecoder decoder ) {
080 // 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
081 return create(getDecoder(decoder).decode(value));
082 }
083
084 /**
085 * {@inheritDoc}
086 */
087 public DateTime create( int value ) {
088 return create((long)value);
089 }
090
091 /**
092 * {@inheritDoc}
093 */
094 public DateTime create( long value ) {
095 return new JodaDateTime(value);
096 }
097
098 /**
099 * {@inheritDoc}
100 */
101 public DateTime create( boolean value ) {
102 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
103 Date.class.getSimpleName(),
104 value));
105 }
106
107 /**
108 * {@inheritDoc}
109 */
110 public DateTime create( float value ) {
111 return create((long)value);
112 }
113
114 /**
115 * {@inheritDoc}
116 */
117 public DateTime create( double value ) {
118 return create((long)value);
119 }
120
121 /**
122 * {@inheritDoc}
123 */
124 public DateTime create( BigDecimal value ) {
125 if (value == null) return null;
126 return create(value.longValue());
127 }
128
129 /**
130 * {@inheritDoc}
131 */
132 public DateTime create( Calendar value ) {
133 if (value == null) return null;
134 return new JodaDateTime(value);
135 }
136
137 /**
138 * {@inheritDoc}
139 */
140 public DateTime create( Date value ) {
141 if (value == null) return null;
142 return new JodaDateTime(value);
143 }
144
145 /**
146 * {@inheritDoc}
147 *
148 * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.DateTime)
149 */
150 public DateTime create( DateTime value ) throws ValueFormatException {
151 return value;
152 }
153
154 /**
155 * {@inheritDoc}
156 */
157 public DateTime create( Name value ) {
158 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
159 Name.class.getSimpleName(),
160 value));
161 }
162
163 /**
164 * {@inheritDoc}
165 */
166 public DateTime create( Path value ) {
167 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
168 Path.class.getSimpleName(),
169 value));
170 }
171
172 /**
173 * {@inheritDoc}
174 */
175 public DateTime create( Reference value ) {
176 throw new ValueFormatException(value, getPropertyType(),
177 GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
178 Reference.class.getSimpleName(),
179 value));
180 }
181
182 /**
183 * {@inheritDoc}
184 */
185 public DateTime create( URI value ) {
186 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
187 URI.class.getSimpleName(),
188 value));
189 }
190
191 /**
192 * {@inheritDoc}
193 *
194 * @see org.jboss.dna.graph.properties.ValueFactory#create(java.util.UUID)
195 */
196 public DateTime create( UUID value ) {
197 throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
198 UUID.class.getSimpleName(),
199 value));
200 }
201
202 /**
203 * {@inheritDoc}
204 */
205 public DateTime create( byte[] value ) {
206 // First attempt to create a string from the value, then a long from the string ...
207 return create(getStringValueFactory().create(value));
208 }
209
210 /**
211 * {@inheritDoc}
212 *
213 * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.Binary)
214 */
215 public DateTime create( Binary value ) throws ValueFormatException, IoException {
216 // First create a string and then create the boolean from the string value ...
217 return create(getStringValueFactory().create(value));
218 }
219
220 /**
221 * {@inheritDoc}
222 */
223 public DateTime create( InputStream stream,
224 long approximateLength ) throws IoException {
225 // First attempt to create a string from the value, then a double from the string ...
226 return create(getStringValueFactory().create(stream, approximateLength));
227 }
228
229 /**
230 * {@inheritDoc}
231 */
232 public DateTime create( Reader reader,
233 long approximateLength ) throws IoException {
234 // First attempt to create a string from the value, then a double from the string ...
235 return create(getStringValueFactory().create(reader, approximateLength));
236 }
237
238 /**
239 * {@inheritDoc}
240 */
241 public DateTime create() {
242 return new JodaDateTime();
243 }
244
245 /**
246 * {@inheritDoc}
247 *
248 * @see org.jboss.dna.graph.properties.DateTimeFactory#createUtc()
249 */
250 public DateTime createUtc() {
251 return new JodaDateTime(DateTimeZone.UTC);
252 }
253
254 /**
255 * {@inheritDoc}
256 */
257 public DateTime create( int year,
258 int monthOfYear,
259 int dayOfMonth,
260 int hourOfDay,
261 int minuteOfHour,
262 int secondOfMinute,
263 int millisecondsOfSecond ) {
264 return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond);
265 }
266
267 /**
268 * {@inheritDoc}
269 */
270 public DateTime create( int year,
271 int monthOfYear,
272 int dayOfMonth,
273 int hourOfDay,
274 int minuteOfHour,
275 int secondOfMinute,
276 int millisecondsOfSecond,
277 int timeZoneOffsetHours ) {
278 return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond,
279 timeZoneOffsetHours);
280 }
281
282 /**
283 * {@inheritDoc}
284 */
285 public DateTime create( int year,
286 int monthOfYear,
287 int dayOfMonth,
288 int hourOfDay,
289 int minuteOfHour,
290 int secondOfMinute,
291 int millisecondsOfSecond,
292 String timeZoneId ) {
293 return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond,
294 timeZoneId);
295 }
296
297 /**
298 * {@inheritDoc}
299 *
300 * @see org.jboss.dna.graph.properties.DateTimeFactory#create(org.jboss.dna.graph.properties.DateTime, long)
301 */
302 public DateTime create( DateTime original,
303 long offsetInMillis ) {
304 assert original != null;
305 if (offsetInMillis == 0l) return original;
306 long newMillis = original.getMilliseconds() + offsetInMillis;
307 return new JodaDateTime(newMillis, original.getTimeZoneId());
308 }
309
310 /**
311 * {@inheritDoc}
312 */
313 @Override
314 protected DateTime[] createEmptyArray( int length ) {
315 return new DateTime[length];
316 }
317 }