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