/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.base;

import java.io.InputStream;
import java.util.Calendar;

import javax.jcr.ItemVisitor;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.ValueFormatException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.PropertyDefinition;
import javax.jcr.version.VersionException;

/**
 * Property base class.
 */
public class BaseProperty extends BaseItem implements Property {

    /** Protected constructor. This class is only useful when extended. */
    protected BaseProperty() {
    }

    /**
     * Implemented by calling <code>visitor.visit(this)</code>.
     * {@inheritDoc}
     */
    public void accept(ItemVisitor visitor) throws RepositoryException {
        visitor.visit(this);
    }

    /** Always returns <code>false</code>. {@inheritDoc} */
    public boolean isNode() {
        return false;
    }

    /** Not implemented. {@inheritDoc} */
    public void setValue(Value value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /** Not implemented. {@inheritDoc} */
    public void setValue(Value[] values) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(String value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling <code>setValue(stringValues)</code> with
     * an array of Values that were created from the given strings by
     * <code>getSession().getValueFactory().createValue(values[i]))</code>.
     * {@inheritDoc}
     */
    public void setValue(String[] values) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        ValueFactory factory = getSession().getValueFactory();
        Value[] stringValues = new Value[values.length];
        for (int i = 0; i < values.length; i++) {
            stringValues[i] = factory.createValue(values[i]);
        }
        setValue(stringValues);
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(InputStream value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(long value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(double value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(Calendar value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(boolean value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /**
     * Implemented by calling
     * <code>setValue(getSession().getValueFactory().createValue(value))</code>.
     * {@inheritDoc}
     */
    public void setValue(Node value) throws ValueFormatException,
            VersionException, LockException, RepositoryException {
        setValue(getSession().getValueFactory().createValue(value));
    }

    /** Not implemented. {@inheritDoc} */
    public Value getValue() throws ValueFormatException, RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /** Not implemented. {@inheritDoc} */
    public Value[] getValues() throws ValueFormatException, RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /**
     * Implemented by calling <code>getValue().getString()</code>.
     * {@inheritDoc}
     */
    public String getString() throws ValueFormatException, RepositoryException {
        return getValue().getString();
    }

    /**
     * Implemented by calling <code>getValue().getStream()</code>.
     * {@inheritDoc}
     */
    public InputStream getStream() throws ValueFormatException,
            RepositoryException {
        return getValue().getStream();
    }

    /**
     * Implemented by calling <code>getValue().getLong()</code>.
     * {@inheritDoc}
     */
    public long getLong() throws ValueFormatException, RepositoryException {
        return getValue().getLong();
    }

    /**
     * Implemented by calling <code>getValue().getDouble()</code>.
     * {@inheritDoc}
     */
    public double getDouble() throws ValueFormatException, RepositoryException {
        return getValue().getDouble();
    }

    /**
     * Implemented by calling <code>getValue().getDate()</code>.
     * {@inheritDoc}
     */
    public Calendar getDate() throws ValueFormatException, RepositoryException {
        return getValue().getDate();
    }

    /**
     * Implemented by calling <code>getValue().getBoolean()</code>.
     * {@inheritDoc}
     */
    public boolean getBoolean() throws ValueFormatException,
            RepositoryException {
        return getValue().getBoolean();
    }

    /**
     * Implemented by calling
     * <code>getSession().getNodeByUUID(getString())</code>.
     * {@inheritDoc}
     */
    public Node getNode() throws ValueFormatException, RepositoryException {
        return getSession().getNodeByUUID(getString());
    }

    /**
     * Implemented by calling <code>getType()</code> and returning
     * <code>-1</code> if type is binary or <code>getString().length()</code>
     * otherwise.
     * {@inheritDoc}
     */
    public long getLength() throws ValueFormatException, RepositoryException {
        if (getType() == PropertyType.BINARY) {
            return -1;
        } else {
            return getString().length();
        }
    }

    /** {@inheritDoc} */
    public long[] getLengths() throws ValueFormatException, RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /** Not implemented. {@inheritDoc} */
    public PropertyDefinition getDefinition() throws RepositoryException {
        throw new UnsupportedRepositoryOperationException();
    }

    /**
     * Implemented by calling <code>getValue().getType()</code>.
     * {@inheritDoc}
     */
    public int getType() throws RepositoryException {
        return getValue().getType();
    }

}
