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.UuidFactory;
042    import org.jboss.dna.graph.properties.ValueFactory;
043    import org.jboss.dna.graph.properties.ValueFormatException;
044    
045    /**
046     * The standard {@link ValueFactory} for {@link PropertyType#URI} values.
047     * 
048     * @author Randall Hauch
049     * @author John Verhaeg
050     */
051    @Immutable
052    public class UuidValueFactory extends AbstractValueFactory<UUID> implements UuidFactory {
053    
054        public UuidValueFactory( TextDecoder decoder,
055                                 ValueFactory<String> stringValueFactory ) {
056            super(PropertyType.UUID, decoder, stringValueFactory);
057        }
058    
059        /**
060         * {@inheritDoc}
061         * 
062         * @see org.jboss.dna.graph.properties.UuidFactory#create()
063         */
064        public UUID create() {
065            return UUID.randomUUID();
066        }
067    
068        /**
069         * {@inheritDoc}
070         */
071        public UUID create( String value ) {
072            if (value == null) return null;
073            value = value.trim();
074            try {
075                return UUID.fromString(value);
076            } catch (IllegalArgumentException err) {
077                throw new ValueFormatException(value, PropertyType.UUID,
078                                               GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
079                                                                                URI.class.getSimpleName(),
080                                                                                value), err);
081            }
082        }
083    
084        /**
085         * {@inheritDoc}
086         */
087        public UUID create( String value,
088                            TextDecoder decoder ) {
089            // 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
090            return create(getDecoder(decoder).decode(value));
091        }
092    
093        /**
094         * {@inheritDoc}
095         */
096        public UUID create( int value ) {
097            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
098                                                                                                      Integer.class.getSimpleName(),
099                                                                                                      value));
100        }
101    
102        /**
103         * {@inheritDoc}
104         */
105        public UUID create( long value ) {
106            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
107                                                                                                      Long.class.getSimpleName(),
108                                                                                                      value));
109        }
110    
111        /**
112         * {@inheritDoc}
113         */
114        public UUID create( boolean value ) {
115            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
116                                                                                                      Boolean.class.getSimpleName(),
117                                                                                                      value));
118        }
119    
120        /**
121         * {@inheritDoc}
122         */
123        public UUID create( float value ) {
124            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
125                                                                                                      Float.class.getSimpleName(),
126                                                                                                      value));
127        }
128    
129        /**
130         * {@inheritDoc}
131         */
132        public UUID create( double value ) {
133            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
134                                                                                                      Double.class.getSimpleName(),
135                                                                                                      value));
136        }
137    
138        /**
139         * {@inheritDoc}
140         */
141        public UUID create( BigDecimal value ) {
142            throw new ValueFormatException(value, PropertyType.UUID,
143                                           GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
144                                                                            BigDecimal.class.getSimpleName(),
145                                                                            value));
146        }
147    
148        /**
149         * {@inheritDoc}
150         */
151        public UUID create( Calendar value ) {
152            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
153                                                                                                      Calendar.class.getSimpleName(),
154                                                                                                      value));
155        }
156    
157        /**
158         * {@inheritDoc}
159         */
160        public UUID create( Date value ) {
161            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
162                                                                                                      Date.class.getSimpleName(),
163                                                                                                      value));
164        }
165    
166        /**
167         * {@inheritDoc}
168         * 
169         * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.DateTime)
170         */
171        public UUID create( DateTime value ) throws ValueFormatException {
172            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
173                                                                                                      DateTime.class.getSimpleName(),
174                                                                                                      value));
175        }
176    
177        /**
178         * {@inheritDoc}
179         */
180        public UUID create( Name value ) {
181            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
182                                                                                                      Name.class.getSimpleName(),
183                                                                                                      value));
184        }
185    
186        /**
187         * {@inheritDoc}
188         */
189        public UUID create( Path value ) {
190            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
191                                                                                                      Path.class.getSimpleName(),
192                                                                                                      value));
193        }
194    
195        /**
196         * {@inheritDoc}
197         */
198        public UUID create( Reference value ) {
199            if (value instanceof UuidReference) {
200                UuidReference ref = (UuidReference)value;
201                return ref.getUuid();
202            }
203            throw new ValueFormatException(value, PropertyType.UUID,
204                                           GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
205                                                                            Reference.class.getSimpleName(),
206                                                                            value));
207        }
208    
209        /**
210         * {@inheritDoc}
211         */
212        public UUID create( URI value ) {
213            throw new ValueFormatException(value, PropertyType.UUID, GraphI18n.unableToCreateValue.text(getPropertyType().getName(),
214                                                                                                      URI.class.getSimpleName(),
215                                                                                                      value));
216        }
217    
218        /**
219         * {@inheritDoc}
220         * 
221         * @see org.jboss.dna.graph.properties.ValueFactory#create(java.util.UUID)
222         */
223        public UUID create( UUID value ) {
224            return value;
225        }
226    
227        /**
228         * {@inheritDoc}
229         */
230        public UUID create( byte[] value ) {
231            // First attempt to create a string from the value, then a long from the string ...
232            return create(getStringValueFactory().create(value));
233        }
234    
235        /**
236         * {@inheritDoc}
237         * 
238         * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.Binary)
239         */
240        public UUID create( Binary value ) throws ValueFormatException, IoException {
241            // First create a string and then create the boolean from the string value ...
242            return create(getStringValueFactory().create(value));
243        }
244    
245        /**
246         * {@inheritDoc}
247         */
248        public UUID create( InputStream stream,
249                            long approximateLength ) throws IoException {
250            // First attempt to create a string from the value, then a double from the string ...
251            return create(getStringValueFactory().create(stream, approximateLength));
252        }
253    
254        /**
255         * {@inheritDoc}
256         */
257        public UUID create( Reader reader,
258                            long approximateLength ) throws IoException {
259            // First attempt to create a string from the value, then a double from the string ...
260            return create(getStringValueFactory().create(reader, approximateLength));
261        }
262    
263        /**
264         * {@inheritDoc}
265         */
266        @Override
267        protected UUID[] createEmptyArray( int length ) {
268            return new UUID[length];
269        }
270    
271    }