All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl Maven / Gradle / Ivy

/*
 * 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 ValueFactory interface,
 * wrapping an existing SPI QValueFactory and a
 * NamePathResolver.
 *
 * @see ValueFactory
 * @see QValueFactory
 */
public class ValueFactoryQImpl implements ValueFactory {

    private final QValueFactory qfactory;
    private final NamePathResolver resolver;

    /**
     * Constructs a new ValueFactoryQImpl based
     * on an existing SPI QValueFactory and a
     * NamePathResolver.
     * @param qfactory wrapped QValueFactory
     * @param resolver wrapped NamePathResolver
     */
    public ValueFactoryQImpl(QValueFactory qfactory, NamePathResolver resolver) {
        this.qfactory = qfactory;
        this.resolver = resolver;
    }

    /**
     * The QValueFactory that is wrapped by this ValueFactory
     * instance.
     *
     * @return qfactory The QValueFactory wrapped by this instance.
     */
    public QValueFactory getQValueFactory() {
        return qfactory;
    }

    /**
     * Create a new Value based on an existing
     * QValue
     * @param qvalue existing QValue
     * @return a Value representing the QValue
     */
    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);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy