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