/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.jcr.value.basic; import java.io.InputStream; import java.math.BigDecimal; import java.net.URI; import java.net.URISyntaxException; import java.util.Calendar; import java.util.Date; import java.util.UUID; import org.modeshape.common.annotation.Immutable; import org.modeshape.common.text.TextDecoder; import org.modeshape.common.util.CheckArg; import org.modeshape.jcr.GraphI18n; import org.modeshape.jcr.api.value.DateTime; import org.modeshape.jcr.cache.NodeKey; import org.modeshape.jcr.value.BinaryValue; import org.modeshape.jcr.value.IoException; import org.modeshape.jcr.value.Name; import org.modeshape.jcr.value.NamespaceRegistry; import org.modeshape.jcr.value.NamespaceRegistry.Holder; import org.modeshape.jcr.value.Path; import org.modeshape.jcr.value.PropertyType; import org.modeshape.jcr.value.Reference; import org.modeshape.jcr.value.UriFactory; import org.modeshape.jcr.value.ValueFactories; import org.modeshape.jcr.value.ValueFactory; import org.modeshape.jcr.value.ValueFormatException; /** * The standard {@link ValueFactory} for {@link PropertyType#URI} values. */ @Immutable public class UriValueFactory extends AbstractValueFactory<URI> implements UriFactory { private final NamespaceRegistry.Holder namespaceRegistryHolder; /** * Create a new instance. * * @param namespaceRegistryHolder the holder of the namespace registry; may not be null * @param decoder the text decoder; may be null if the default decoder should be used * @param factories the set of value factories, used to obtain the {@link ValueFactories#getStringFactory() string value * factory}; may not be null */ public UriValueFactory( NamespaceRegistry.Holder namespaceRegistryHolder, TextDecoder decoder, ValueFactories factories ) { super(PropertyType.URI, decoder, factories); CheckArg.isNotNull(namespaceRegistryHolder, "namespaceRegistryHolder"); this.namespaceRegistryHolder = namespaceRegistryHolder; } @Override public UriFactory with( ValueFactories valueFactories ) { return super.valueFactories == valueFactories ? this : new UriValueFactory(namespaceRegistryHolder, super.getDecoder(), valueFactories); } @Override public UriFactory with( Holder namespaceRegistryHolder ) { return this.namespaceRegistryHolder == namespaceRegistryHolder ? this : new UriValueFactory(namespaceRegistryHolder, super.getDecoder(), valueFactories); } @Override public URI create( String value ) { if (value == null) return null; try { return new URI(value); } catch (URISyntaxException err) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.errorConvertingType.text(String.class.getSimpleName(), URI.class.getSimpleName(), value), err); } } @Override public URI create( String value, TextDecoder decoder ) { // 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 return create(getDecoder(decoder).decode(value)); } @Override public URI create( int value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Integer.class.getSimpleName(), value)); } @Override public URI create( long value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Long.class.getSimpleName(), value)); } @Override public URI create( boolean value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Boolean.class.getSimpleName(), value)); } @Override public URI create( float value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Float.class.getSimpleName(), value)); } @Override public URI create( double value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Double.class.getSimpleName(), value)); } @Override public URI create( BigDecimal value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), BigDecimal.class.getSimpleName(), value)); } @Override public URI create( Calendar value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Calendar.class.getSimpleName(), value)); } @Override public URI create( Date value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Date.class.getSimpleName(), value)); } @Override public URI create( DateTime value ) throws ValueFormatException { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), DateTime.class.getSimpleName(), value)); } @Override public URI create( Name value ) { if (value == null) return null; return create("./" + value.getString(namespaceRegistryHolder.getNamespaceRegistry())); } @Override public URI create( Path value ) { if (value == null) return null; if (value.isAbsolute()) { return create("/" + value.getString(namespaceRegistryHolder.getNamespaceRegistry())); } return create("./" + value.getString(namespaceRegistryHolder.getNamespaceRegistry())); } @Override public URI create( Path.Segment value ) { if (value == null) return null; return create("./" + value.getString(namespaceRegistryHolder.getNamespaceRegistry())); } @Override public URI create( Reference value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), Reference.class.getSimpleName(), value)); } @Override public URI create( UUID value ) { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), UUID.class.getSimpleName(), value)); } @Override public URI create( NodeKey value ) throws ValueFormatException { throw new ValueFormatException(value, getPropertyType(), GraphI18n.unableToCreateValue.text(getPropertyType().getName(), NodeKey.class.getSimpleName(), value)); } @Override public URI create( URI value ) { return value; } @Override public URI create( byte[] value ) { // First attempt to create a string from the value, then a long from the string ... return create(getStringValueFactory().create(value)); } @Override public URI create( BinaryValue value ) throws ValueFormatException, IoException { // First create a string and then create the boolean from the string value ... return create(getStringValueFactory().create(value)); } @Override public URI create( InputStream stream ) throws IoException { // First attempt to create a string from the value, then a double from the string ... return create(getStringValueFactory().create(stream)); } @Override public URI[] createEmptyArray( int length ) { return new URI[length]; } }