/*
* 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.spi.commons.value;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Calendar;
import javax.jcr.Binary;
import javax.jcr.NamespaceException;
import javax.jcr.Node;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.ValueFormatException;
import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.QValue;
import org.apache.jackrabbit.spi.QValueFactory;
import org.apache.jackrabbit.util.ISO8601;
/**
* This class implements the <code>ValueFactory</code> interface,
* wrapping an existing SPI <code>QValueFactory</code> and a
* <code>NamePathResolver</code>.
*
* @see ValueFactory
* @see QValueFactory
*/
public class ValueFactoryQImpl implements ValueFactory {
private final QValueFactory qfactory;
private final NamePathResolver resolver;
/**
* Constructs a new <code>ValueFactoryQImpl</code> based
* on an existing SPI <code>QValueFactory</code> and a
* <code>NamePathResolver</code>.
* @param qfactory wrapped <code>QValueFactory</code>
* @param resolver wrapped <code>NamePathResolver</code>
*/
public ValueFactoryQImpl(QValueFactory qfactory, NamePathResolver resolver) {
this.qfactory = qfactory;
this.resolver = resolver;
}
/**
* The <code>QValueFactory</code> that is wrapped by this <code>ValueFactory</code>
* instance.
*
* @return qfactory The <code>QValueFactory</code> wrapped by this instance.
*/
public QValueFactory getQValueFactory() {
return qfactory;
}
/**
* Create a new <code>Value</code> based on an existing
* <code>QValue</code>
* @param qvalue existing <code>QValue</code>
* @return a <code>Value</code> representing the <code>QValue</code>
*/
public Value createValue(QValue qvalue) {
return new QValueValue(qvalue, resolver);
}
//---------------------------------------------------------< ValueFactory >
/**
* {@inheritDoc}
*/
public Value createValue(String value) {
try {
QValue qvalue = qfactory.create(value, PropertyType.STRING);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(long value) {
try {
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(double value) {
try {
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(boolean value) {
try {
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(Calendar value) {
try {
ISO8601.getYear(value);
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(InputStream value) {
try {
try {
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} finally {
value.close(); // JCR-2903
}
} catch (IOException ex) {
throw new RuntimeException(ex);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
/**
* {@inheritDoc}
*/
public Value createValue(Node value) throws RepositoryException {
return createValue(value, false);
}
/**
* {@inheritDoc}
*/
public Value createValue(String value, int type) throws ValueFormatException {
try {
QValue qvalue;
if (type == PropertyType.NAME) {
Name name = resolver.getQName(value);
qvalue = qfactory.create(name);
} else if (type == PropertyType.PATH) {
Path path = resolver.getQPath(value, false);
qvalue = qfactory.create(path);
} else {
qvalue = qfactory.create(value, type);
}
return new QValueValue(qvalue, resolver);
} catch (IllegalNameException ex) {
throw new ValueFormatException(ex);
} catch (MalformedPathException ex) {
throw new ValueFormatException(ex);
} catch (NamespaceException ex) {
throw new ValueFormatException(ex);
} catch (ValueFormatException ex) {
throw ex;
} catch (RepositoryException ex) {
throw new ValueFormatException(ex);
}
}
public Binary createBinary(InputStream stream) throws RepositoryException {
// TODO review/optimize/refactor
try {
try {
QValue qvalue = qfactory.create(stream);
return qvalue.getBinary();
} finally {
stream.close(); // JCR-2903
}
} catch (IOException ex) {
throw new RuntimeException(ex);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
public Value createValue(Binary value) {
// TODO review/optimize/refactor
try {
return createValue(value.getStream());
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
public Value createValue(BigDecimal value) {
try {
QValue qvalue = qfactory.create(value);
return new QValueValue(qvalue, resolver);
} catch (RepositoryException ex) {
throw new RuntimeException(ex);
}
}
public Value createValue(Node value, boolean weak) throws RepositoryException {
QValue qvalue = qfactory.create(value.getUUID(), weak ? PropertyType.WEAKREFERENCE : PropertyType.REFERENCE);
return new QValueValue(qvalue, resolver);
}
}