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