/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jackrabbit.core.xml; import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.util.Base64; import org.apache.jackrabbit.value.ValueHelper; import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; import org.apache.jackrabbit.spi.commons.value.ValueFormat; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.ValueFormatException; import javax.jcr.ValueFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * <code>StringValue</code> represents an immutable serialized value. */ class StringValue implements TextValue { private final String value; private final NamePathResolver nsContext; private final ValueFactory valueFactory; /** * Constructs a new <code>StringValue</code> representing the given * value. * * @param value * @param nsContext * @param valueFactory */ protected StringValue(String value, NamePathResolver nsContext, ValueFactory valueFactory) { this.value = value; this.nsContext = nsContext; this.valueFactory = valueFactory; } //--------------------------------------------------------< TextValue > public Value getValue(int type, NamePathResolver resolver) throws ValueFormatException, RepositoryException { if (type == PropertyType.NAME || type == PropertyType.PATH) { // NAME and PATH require special treatment because // they depend on the current namespace context // of the xml document // convert serialized value to InternalValue using // current namespace context of xml document InternalValue ival = InternalValue.create(ValueHelper.convert( value, type, valueFactory), nsContext); // convert InternalValue to Value using this // session's namespace mappings return ValueFormat.getJCRValue(ival, resolver, valueFactory); } else { // all other types return ValueHelper.deserialize(value, type, false, valueFactory); } } public InternalValue getInternalValue(int targetType) throws ValueFormatException, RepositoryException { try { if (targetType == PropertyType.BINARY) { // base64 encoded BINARY type; // decode using Reader ByteArrayOutputStream baos = new ByteArrayOutputStream(); Base64.decode(value, baos); return InternalValue.create(baos.toByteArray()); } else { // convert serialized value to InternalValue using // current namespace context of xml document return InternalValue.create(ValueHelper.convert( value, targetType, valueFactory), nsContext); } } catch (IOException e) { throw new RepositoryException("Error decoding Base64 content", e); } } public void dispose() { // do nothing } }