001    /*
002     * JBoss DNA (http://www.jboss.org/dna)
003     * See the COPYRIGHT.txt file distributed with this work for information
004     * regarding copyright ownership.  Some portions may be licensed
005     * to Red Hat, Inc. under one or more contributor license agreements.
006     * See the AUTHORS.txt file in the distribution for a full listing of 
007     * individual contributors. 
008     *
009     * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
010     * is licensed to you under the terms of the GNU Lesser General Public License as
011     * published by the Free Software Foundation; either version 2.1 of
012     * the License, or (at your option) any later version.
013     *
014     * JBoss DNA is distributed in the hope that it will be useful,
015     * but WITHOUT ANY WARRANTY; without even the implied warranty of
016     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017     * Lesser General Public License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this software; if not, write to the Free
021     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
022     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
023     */
024    package org.jboss.dna.graph.property.basic;
025    
026    import java.io.InputStream;
027    import java.io.Reader;
028    import java.math.BigDecimal;
029    import java.net.URI;
030    import java.util.Calendar;
031    import java.util.Date;
032    import java.util.UUID;
033    import net.jcip.annotations.Immutable;
034    import org.jboss.dna.common.text.TextDecoder;
035    import org.jboss.dna.graph.GraphI18n;
036    import org.jboss.dna.graph.property.Binary;
037    import org.jboss.dna.graph.property.DateTime;
038    import org.jboss.dna.graph.property.DateTimeFactory;
039    import org.jboss.dna.graph.property.IoException;
040    import org.jboss.dna.graph.property.Name;
041    import org.jboss.dna.graph.property.Path;
042    import org.jboss.dna.graph.property.PropertyType;
043    import org.jboss.dna.graph.property.Reference;
044    import org.jboss.dna.graph.property.ValueFactory;
045    import org.jboss.dna.graph.property.ValueFormatException;
046    import org.joda.time.DateTimeZone;
047    
048    /**
049     * The standard {@link ValueFactory} for {@link PropertyType#DATE} values.
050     * 
051     * @author Randall Hauch
052     * @author John Verhaeg
053     */
054    @Immutable
055    public class JodaDateTimeValueFactory extends AbstractValueFactory<DateTime> implements DateTimeFactory {
056    
057        public JodaDateTimeValueFactory( TextDecoder decoder,
058                                         ValueFactory<String> stringValueFactory ) {
059            super(PropertyType.DATE, decoder, stringValueFactory);
060        }
061    
062        /**
063         * {@inheritDoc}
064         */
065        public DateTime create( String value ) {
066            if (value == null) return null;
067            try {
068                return new JodaDateTime(value.trim());
069            } catch (IllegalArgumentException err) {
070                throw new ValueFormatException(value, getPropertyType(),
071                                               GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
072                                                                                DateTime.class.getSimpleName(),
073                                                                                value), err);
074            }
075        }
076    
077        /**
078         * {@inheritDoc}
079         */
080        public DateTime create( String value,
081                                TextDecoder decoder ) {
082            // 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
083            return create(getDecoder(decoder).decode(value));
084        }
085    
086        /**
087         * {@inheritDoc}
088         */
089        public DateTime create( int value ) {
090            return create((long)value);
091        }
092    
093        /**
094         * {@inheritDoc}
095         */
096        public DateTime create( long value ) {
097            return new JodaDateTime(value);
098        }
099    
100        /**
101         * {@inheritDoc}
102         */
103        public DateTime create( boolean value ) {
104            throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
105                                                                                                      Date.class.getSimpleName(),
106                                                                                                      value));
107        }
108    
109        /**
110         * {@inheritDoc}
111         */
112        public DateTime create( float value ) {
113            return create((long)value);
114        }
115    
116        /**
117         * {@inheritDoc}
118         */
119        public DateTime create( double value ) {
120            return create((long)value);
121        }
122    
123        /**
124         * {@inheritDoc}
125         */
126        public DateTime create( BigDecimal value ) {
127            if (value == null) return null;
128            return create(value.longValue());
129        }
130    
131        /**
132         * {@inheritDoc}
133         */
134        public DateTime create( Calendar value ) {
135            if (value == null) return null;
136            return new JodaDateTime(value);
137        }
138    
139        /**
140         * {@inheritDoc}
141         */
142        public DateTime create( Date value ) {
143            if (value == null) return null;
144            return new JodaDateTime(value);
145        }
146    
147        /**
148         * {@inheritDoc}
149         * 
150         * @see org.jboss.dna.graph.property.ValueFactory#create(org.jboss.dna.graph.property.DateTime)
151         */
152        public DateTime create( DateTime value ) throws ValueFormatException {
153            return value;
154        }
155    
156        /**
157         * {@inheritDoc}
158         */
159        public DateTime create( Name value ) {
160            throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
161                                                                                                      Name.class.getSimpleName(),
162                                                                                                      value));
163        }
164    
165        /**
166         * {@inheritDoc}
167         */
168        public DateTime create( Path value ) {
169            throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
170                                                                                                      Path.class.getSimpleName(),
171                                                                                                      value));
172        }
173    
174        /**
175         * {@inheritDoc}
176         */
177        public DateTime create( Reference value ) {
178            throw new ValueFormatException(value, getPropertyType(),
179                                           GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
180                                                                            Reference.class.getSimpleName(),
181                                                                            value));
182        }
183    
184        /**
185         * {@inheritDoc}
186         */
187        public DateTime create( URI value ) {
188            throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
189                                                                                                      URI.class.getSimpleName(),
190                                                                                                      value));
191        }
192    
193        /**
194         * {@inheritDoc}
195         * 
196         * @see org.jboss.dna.graph.property.ValueFactory#create(java.util.UUID)
197         */
198        public DateTime create( UUID value ) {
199            throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
200                                                                                                      UUID.class.getSimpleName(),
201                                                                                                      value));
202        }
203    
204        /**
205         * {@inheritDoc}
206         */
207        public DateTime create( byte[] value ) {
208            // First attempt to create a string from the value, then a long from the string ...
209            return create(getStringValueFactory().create(value));
210        }
211    
212        /**
213         * {@inheritDoc}
214         * 
215         * @see org.jboss.dna.graph.property.ValueFactory#create(org.jboss.dna.graph.property.Binary)
216         */
217        public DateTime create( Binary value ) throws ValueFormatException, IoException {
218            // First create a string and then create the boolean from the string value ...
219            return create(getStringValueFactory().create(value));
220        }
221    
222        /**
223         * {@inheritDoc}
224         */
225        public DateTime create( InputStream stream,
226                                long approximateLength ) throws IoException {
227            // First attempt to create a string from the value, then a double from the string ...
228            return create(getStringValueFactory().create(stream, approximateLength));
229        }
230    
231        /**
232         * {@inheritDoc}
233         */
234        public DateTime create( Reader reader,
235                                long approximateLength ) throws IoException {
236            // First attempt to create a string from the value, then a double from the string ...
237            return create(getStringValueFactory().create(reader, approximateLength));
238        }
239    
240        /**
241         * {@inheritDoc}
242         */
243        public DateTime create() {
244            return new JodaDateTime();
245        }
246    
247        /**
248         * {@inheritDoc}
249         * 
250         * @see org.jboss.dna.graph.property.DateTimeFactory#createUtc()
251         */
252        public DateTime createUtc() {
253            return new JodaDateTime(DateTimeZone.UTC);
254        }
255    
256        /**
257         * {@inheritDoc}
258         */
259        public DateTime create( int year,
260                                int monthOfYear,
261                                int dayOfMonth,
262                                int hourOfDay,
263                                int minuteOfHour,
264                                int secondOfMinute,
265                                int millisecondsOfSecond ) {
266            return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond);
267        }
268    
269        /**
270         * {@inheritDoc}
271         */
272        public DateTime create( int year,
273                                int monthOfYear,
274                                int dayOfMonth,
275                                int hourOfDay,
276                                int minuteOfHour,
277                                int secondOfMinute,
278                                int millisecondsOfSecond,
279                                int timeZoneOffsetHours ) {
280            return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond,
281                                    timeZoneOffsetHours);
282        }
283    
284        /**
285         * {@inheritDoc}
286         */
287        public DateTime create( int year,
288                                int monthOfYear,
289                                int dayOfMonth,
290                                int hourOfDay,
291                                int minuteOfHour,
292                                int secondOfMinute,
293                                int millisecondsOfSecond,
294                                String timeZoneId ) {
295            return new JodaDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisecondsOfSecond,
296                                    timeZoneId);
297        }
298    
299        /**
300         * {@inheritDoc}
301         * 
302         * @see org.jboss.dna.graph.property.DateTimeFactory#create(org.jboss.dna.graph.property.DateTime, long)
303         */
304        public DateTime create( DateTime original,
305                                long offsetInMillis ) {
306            assert original != null;
307            if (offsetInMillis == 0l) return original;
308            long newMillis = original.getMilliseconds() + offsetInMillis;
309            return new JodaDateTime(newMillis, original.getTimeZoneId());
310        }
311    
312        /**
313         * {@inheritDoc}
314         */
315        @Override
316        protected DateTime[] createEmptyArray( int length ) {
317            return new DateTime[length];
318        }
319    }