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

org.apache.jackrabbit.oak.remote.RemoteValue Maven / Gradle / Ivy

The newest version!
/*
 * 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.oak.remote;

import java.io.InputStream;
import java.math.BigDecimal;

/**
 * Represents a value that can be assigned to a property in the repository.
 * Client of the remote repository provides values as instances of this class.
 */
public class RemoteValue {

    /**
     * A generic interface to represent a supplier of an item.
     * 

* In the specific, it is used by values whose underlying implementation is * an {@code InputStream}. To enable multiple traversals of {@code * InputStream}s, the value is wrapped by this interface to effectively have * a factory over the underlying {@code InputStream}. * * @param Type of the item this object is able to create. */ public static interface Supplier { T get(); } /** * This class helps executing logic that depends on the type of a remote * value. Instead of manually branching code depending on the result of * {@code isText}, {@code isBoolean} and so on, a handler can be implemented * to provide different logic for different types. */ public static class TypeHandler { public void isBinary(Supplier value) { throw new IllegalStateException("case not handled"); } public void isMultiBinary(Iterable> value) { throw new IllegalStateException("case not handled"); } public void isBinaryId(String value) { throw new IllegalStateException("case not handled"); } public void isMultiBinaryId(Iterable value) { throw new IllegalStateException("case not handled"); } public void isBoolean(Boolean value) { throw new IllegalStateException("case not handled"); } public void isMultiBoolean(Iterable value) { throw new IllegalStateException("case not handled"); } public void isDate(Long value) { throw new IllegalStateException("case not handled"); } public void isMultiDate(Iterable value) { throw new IllegalStateException("case not handled"); } public void isDecimal(BigDecimal value) { throw new IllegalStateException("case not handled"); } public void isMultiDecimal(Iterable value) { throw new IllegalStateException("case not handled"); } public void isDouble(Double value) { throw new IllegalStateException("case not handled"); } public void isMultiDouble(Iterable value) { throw new IllegalStateException("case not handled"); } public void isLong(Long value) { throw new IllegalStateException("case not handled"); } public void isMultiLong(Iterable value) { throw new IllegalStateException("case not handled"); } public void isName(String value) { throw new IllegalStateException("case not handled"); } public void isMultiName(Iterable value) { throw new IllegalStateException("case not handled"); } public void isPath(String value) { throw new IllegalStateException("case not handled"); } public void isMultiPath(Iterable value) { throw new IllegalStateException("case not handled"); } public void isReference(String value) { throw new IllegalStateException("case not handled"); } public void isMultiReference(Iterable value) { throw new IllegalStateException("case not handled"); } public void isText(String value) { throw new IllegalStateException("case not handled"); } public void isMultiText(Iterable value) { throw new IllegalStateException("case not handled"); } public void isUri(String value) { throw new IllegalStateException("case not handled"); } public void isMultiUri(Iterable value) { throw new IllegalStateException("case not handled"); } public void isWeakReference(String value) { throw new IllegalStateException("case not handled"); } public void isMultiWeakReference(Iterable value) { throw new IllegalStateException("case not handled"); } public void isUnknown() { throw new IllegalStateException("case not handled"); } } /** * Create a remote value of type string. * * @param value The string wrapped by the remote value. * @return A remote value of type string wrapping the provided value. */ public static RemoteValue toText(final String value) { return new RemoteValue() { @Override public boolean isText() { return true; } @Override public String asText() { return value; } }; } /** * Create a remote multi-value of type string. * * @param value The collection of strings wrapped by the remote value. * @return A remote multi-value of type string wrapping the provided * collection of strings. */ public static RemoteValue toMultiText(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiText() { return true; } @Override public Iterable asMultiText() { return value; } }; } /** * Create a remote value of type binary. * * @param value The factory of input streams wrapped by the remote value. * @return A remote value of type binary wrapping the provided factory of * input streams. */ public static RemoteValue toBinary(final Supplier value) { return new RemoteValue() { @Override public boolean isBinary() { return true; } @Override public Supplier asBinary() { return value; } }; } /** * Create a remote multi-value of type binary. * * @param value The collection of factories of input streams wrapped by the * remote value. * @return A remote multi-value of type binary wrapping the provided * collection of input streams. */ public static RemoteValue toMultiBinary(final Iterable> value) { return new RemoteValue() { @Override public boolean isMultiBinary() { return true; } @Override public Iterable> asMultiBinary() { return value; } }; } /** * Create a remote value of type binary ID. * * @param value The binary ID wrapped by the remote value. * @return A remote value wrapping the provided binary ID. */ public static RemoteValue toBinaryId(final String value) { return new RemoteValue() { @Override public boolean isBinaryId() { return true; } @Override public String asBinaryId() { return value; } }; } /** * Create a remote multi-value of type binary ID. * * @param value The collection of binary IDs wrapped by the remote value. * @return A remote multi-value wrapping the provided collection of binary * IDs. */ public static RemoteValue toMultiBinaryId(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiBinaryId() { return true; } @Override public Iterable asMultiBinaryId() { return value; } }; } /** * Create a remote value of type long. * * @param value The long to wrap in a remote value. * @return A remote value of type long wrapping the provided long value. */ public static RemoteValue toLong(final long value) { return new RemoteValue() { @Override public boolean isLong() { return true; } @Override public Long asLong() { return value; } }; } /** * Create a remote multi-value of type long. * * @param value The collection of long values to wrap in a remote value. * @return A remote multi-value of type long wrapping the provided * collection of long values. */ public static RemoteValue toMultiLong(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiLong() { return true; } @Override public Iterable asMultiLong() { return value; } }; } /** * Create a remote value of type double. * * @param value The double value to wrap into a remote value. * @return A remote value wrapping the provided remote value. */ public static RemoteValue toDouble(final double value) { return new RemoteValue() { @Override public boolean isDouble() { return true; } @Override public Double asDouble() { return value; } }; } /** * Create a remote multi-value of type double. * * @param value The collection of double values to wrap into a remote * value. * @return A remote multi-value of type double wrapping the provided * collection of double values. */ public static RemoteValue toMultiDouble(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiDouble() { return true; } @Override public Iterable asMultiDouble() { return value; } }; } /** * Create a remote value of type date. * * @param value The date to wrap into a remote value. The date is expressed * in milliseconds since January 1, 1970, 00:00:00 GMT. * @return A remote value of type date wrapping the provided date. */ public static RemoteValue toDate(final long value) { return new RemoteValue() { @Override public boolean isDate() { return true; } @Override public Long asDate() { return value; } }; } /** * Create a remote multi-value of type date. * * @param value The collection of dates to wrap into a remote value. Every * date is expressed in milliseconds since January 1, 1970, * 00:00:00 GMT. * @return A remote multi-value of type date wrapping the provided * collection of dates. */ public static RemoteValue toMultiDate(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiDate() { return true; } @Override public Iterable asMultiDate() { return value; } }; } /** * Create a remote value of type boolean. * * @param value The boolean value to wrap into a remote value. * @return A remote value wrapping the provided boolean value. */ public static RemoteValue toBoolean(final boolean value) { return new RemoteValue() { @Override public boolean isBoolean() { return true; } @Override public boolean asBoolean() { return value; } }; } /** * Create a remote multi-value of type boolean. * * @param value The collection of boolean values to wrap into a remote * value. * @return A remote value wrapping the provided collection of boolean * values. */ public static RemoteValue toMultiBoolean(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiBoolean() { return true; } @Override public Iterable asMultiBoolean() { return value; } }; } /** * Create a remote value of type name. * * @param value The name to wrap into a remote value. A name is represented * as a string. * @return A remote value of type name wrapping the provided string. */ public static RemoteValue toName(final String value) { return new RemoteValue() { @Override public boolean isName() { return true; } @Override public String asName() { return value; } }; } /** * Create a remote multi-value of type name. * * @param value The collection of names to wrap into a remote value. Every * name is represented by a string. * @return A remote multi-value of type name wrapping the provided * collection of strings. */ public static RemoteValue toMultiName(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiName() { return true; } @Override public Iterable asMultiName() { return value; } }; } /** * Create a remote value of type path. * * @param value The path to wrap into the remote value. A path is * represented by a string. * @return A remote value of type path wrapping the provided string. */ public static RemoteValue toPath(final String value) { return new RemoteValue() { @Override public boolean isPath() { return true; } @Override public String asPath() { return value; } }; } /** * Create a remote multi-value of type path. * * @param value The collection of paths to wrap into a remote value. Every * path is represented by a string. * @return A remote multi-value of type path wrapping the provided strings. */ public static RemoteValue toMultiPath(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiPath() { return true; } @Override public Iterable asMultiPath() { return value; } }; } /** * Create a remote value of type reference. * * @param value The reference to wrap in a remote value. The reference is * represented by a string. * @return A remote value of type reference wrapping the provided string. */ public static RemoteValue toReference(final String value) { return new RemoteValue() { @Override public boolean isReference() { return true; } @Override public String asReference() { return value; } }; } /** * Create a remote multi-value of type reference. * * @param value The collection of references to wrap in a remote value. * Every reference is represented by a string. * @return A remote multi-value of type reference wrapping the provided * collection of strings. */ public static RemoteValue toMultiReference(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiReference() { return true; } @Override public Iterable asMultiReference() { return value; } }; } /** * Create a remote value of type weak reference. * * @param value The weak reference to wrap into a remote value. The weak * reference is represented by a string value. * @return A remote value of type weak reference wrapping the provided * string value. */ public static RemoteValue toWeakReference(final String value) { return new RemoteValue() { @Override public boolean isWeakReference() { return true; } @Override public String asWeakReference() { return value; } }; } /** * Create a remote multi-value of type weak reference. * * @param value The collection of weak references to wrap into a remote * value. Every weak reference is represented by a string. * @return A remote multi-value of type weak reference wrapping the provided * collection of strings. */ public static RemoteValue toMultiWeakReference(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiWeakReference() { return true; } @Override public Iterable asMultiWeakReference() { return value; } }; } /** * Create a remote value of type URI. * * @param value The string representation of the URI to wrap into a remote * value. * @return A remote value of type URI wrapping the provided string. */ public static RemoteValue toUri(final String value) { return new RemoteValue() { @Override public boolean isUri() { return true; } @Override public String asUri() { return value; } }; } /** * Create a remote multi-value of type URI. * * @param value The collection of URIs to wrap into the remote value. Every * URI is represented by a string. * @return A remote multi-value of type URI wrapping the provided collection * of strings. */ public static RemoteValue toMultiUri(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiUri() { return true; } @Override public Iterable asMultiUri() { return value; } }; } /** * Create a remote value of type decimal. * * @param value The decimal to wrap into a remote value. * @return A remote value of type decimal wrapping the provided decimal * value. */ public static RemoteValue toDecimal(final BigDecimal value) { return new RemoteValue() { @Override public boolean isDecimal() { return true; } @Override public BigDecimal asDecimal() { return value; } }; } /** * Create a remote multi-value of type decimal. * * @param value The collection of decimals to wrap into a remote value. * @return A remote multi-value of type decimal wrapping the provided * collection of decimals. */ public static RemoteValue toMultiDecimal(final Iterable value) { return new RemoteValue() { @Override public boolean isMultiDecimal() { return true; } @Override public Iterable asMultiDecimal() { return value; } }; } private RemoteValue() { } /** * Check if this remote value is of type string. * * @return {@code true} if this remote value is of type string, {@code * false} otherwise. */ public boolean isText() { return false; } /** * Read the value of this remote string value. * * @return The string wrapped by this remote value if this remote value is * of type string, {@code null} otherwise. */ public String asText() { return null; } /** * Check if this remote value is a multi-value of type string. * * @return {@code true} if this remote value is a multi-value of type * string, {@code false} otherwise. */ public boolean isMultiText() { return false; } /** * Read the value of this remote string multi-value. * * @return The collection of strings wrapped by this remote value if this * remote value is a multi-value of type string, {@code null} otherwise. */ public Iterable asMultiText() { return null; } /** * Check if this remote value is of type binary. * * @return {@code true} if this remote value is of type binary, {@code * false} otherwise. */ public boolean isBinary() { return false; } /** * Read the value of this remote boolean value. * * @return The value of this remote value if this remote value is of type * binary, {@code null} otherwise. */ public Supplier asBinary() { return null; } /** * Check if this remote value is a multi-value of type binary. * * @return {@code true} if this remote value is a multi-value of type * binary, {@code false} otherwise. */ public boolean isMultiBinary() { return false; } /** * Read the value of this remote binary multi-value. * * @return The value of this remote value if this remote value is a * multi-value of type binary, {@code null} otherwise. */ public Iterable> asMultiBinary() { return null; } /** * Check if this remote value is of type binary ID. * * @return {@code true} if this remote value is of type binary ID, {@code * false} otherwise. */ public boolean isBinaryId() { return false; } /** * Read the value of this remote binary ID multi-value. * * @return The value of this remote value if this remote value is of type * binary ID, {@code null} otherwise. */ public String asBinaryId() { return null; } /** * Check if this remote value is a multi-value of type binary ID. * * @return {@code true} if this remote value is a multi-value of type binary * ID, {@code false} otherwise. */ public boolean isMultiBinaryId() { return false; } /** * Return the value of this remote binary ID multi-value. * * @return The value of this remote value if this remote value is a * multi-value of type binary ID, {@code null} otherwise. */ public Iterable asMultiBinaryId() { return null; } /** * Check if this remote value is of type long. * * @return {@code true} if this remote value is of type long, {@code false} * otherwise. */ public boolean isLong() { return false; } /** * Read the value of this remote long multi-value. * * @return The value of this remote value if this remote value is of type * long, {@code null} otherwise. */ public Long asLong() { return null; } /** * Check if this remote value is a multi-value of type long. * * @return {@code true} if this value is a multi-value of type long, {@code * false} otherwise. */ public boolean isMultiLong() { return false; } /** * Read the value of this remote multi-value of type long. * * @return The value of this remote value if this remote value is a * multi-value of type long, {@code null} otherwise. */ public Iterable asMultiLong() { return null; } /** * Check if this remote value is of type double. * * @return {@code true} if this remote value is of type long, {@code false} * otherwise. */ public boolean isDouble() { return false; } /** * Read the value of this remote value of type double. * * @return The value of this remote value if this remote value is of type * double, {@code null} otherwise. */ public Double asDouble() { return null; } /** * Check if this remote value is a multi-value of type double. * * @return {@code true} if this remote value is a multi-value of type * double, {@code false} otherwise. */ public boolean isMultiDouble() { return false; } /** * Read the value of this remote multi-value of type double. * * @return The value of this remote value if this remote value is a * multi-value of type double, {@code null} otherwise. */ public Iterable asMultiDouble() { return null; } /** * Check if this remote value is of type date. * * @return {@code true} if this remote value is of type date, {@code false} * otherwise. */ public boolean isDate() { return false; } /** * Read the value of this remote multi-value of type date. * * @return The value of this remote value if this remote value is of type * date, {@code null} otherwise. */ public Long asDate() { return null; } /** * Check if this remote value is a multi-value of type date. * * @return {@code true} if this remote value is a multi-value of type date, * {@code false} otherwise. */ public boolean isMultiDate() { return false; } /** * Read the value of this remote multi-value of type date. * * @return The value of this remote value if this remote value is a * multi-value of type date, {@code null} otherwise. */ public Iterable asMultiDate() { return null; } /** * Check if this remote value is of type boolean. * * @return {@code true} if this remote value is fo type boolean, {@code * false} otherwise. */ public boolean isBoolean() { return false; } /** * Read the value of this remote value of type boolean. * * @return The value of this remote value if this remote value is of type * boolean, false otherwise. */ public boolean asBoolean() { return false; } /** * Check if this remote value is a multi-value of type boolean. * * @return {@code true} if this remote value is a multi-value of type * boolean, {@code false} otherwise. */ public boolean isMultiBoolean() { return false; } /** * Read the value of this remote multi-value of type boolean. * * @return The value of this remote value if this remote value is a * multi-value of type boolean, {@code null} otherwise. */ public Iterable asMultiBoolean() { return null; } /** * Check if this remote value is of type name. * * @return {@code true} if this remote value is of type name, {@code false} * otherwise. */ public boolean isName() { return false; } /** * Read the value of this remote value of type name. * * @return The value of this remote value if this remote value is of type * name, {@code null} otherwise. */ public String asName() { return null; } /** * Check if this remote value is a multi-value of type name. * * @return {@code true} if this remote value is a multi-value of type name, * {@code false} otherwise. */ public boolean isMultiName() { return false; } /** * Read the value of this remote multi-value of type name. * * @return The value of this remote value if this remote value is a * multi-value of type name, {@code null} otherwise. */ public Iterable asMultiName() { return null; } /** * Check if this value is of type path. * * @return {@code true} if this remote value is of type path, {@code false} * otherwise. */ public boolean isPath() { return false; } /** * Read the value of this remote value of type path. * * @return The value of this remote value if this remote value is of type * path, {@code null} otherwise. */ public String asPath() { return null; } /** * Check if this remote value is a multi-value of type path. * * @return {@code true} if this remote value is a multi-value of type path, * {@code false} otherwise. */ public boolean isMultiPath() { return false; } /** * Read the value of this remote multi-value of type path. * * @return The value of this remote value if this remote value is a * multi-value of type path, {@code null} otherwise. */ public Iterable asMultiPath() { return null; } /** * Check if this remote value is of type reference. * * @return {@code true} if this remote value is of type reference, {@code * false} otherwise. */ public boolean isReference() { return false; } /** * Read the value of this remote value of type reference. * * @return The value of this remote value if this remote value is of type * reference, {@code null} otherwise. */ public String asReference() { return null; } /** * Check if this remote value is a multi-value of type reference. * * @return {@code true} if this remote value is a multi-value of type * reference, {@code false} otherwise. */ public boolean isMultiReference() { return false; } /** * Read the value of this remote multi-value of type reference. * * @return The value of this remote value if this remote value is a * multi-value of type reference, {@code null} otherwise. */ public Iterable asMultiReference() { return null; } /** * Check if this remote value is of type weak reference. * * @return {@code true} if this remote value is fo type weak reference, * {@code false} otherwise. */ public boolean isWeakReference() { return false; } /** * Read the value of this remote value of type weak reference. * * @return The value of this remote value if this remote value is of type * weak reference, {@code null} otherwise. */ public String asWeakReference() { return null; } /** * Check if this remote value is a multi-value of type weak reference. * * @return {@code true} if this remote value is a multi-value of type weak * reference, {@code false} otherwise. */ public boolean isMultiWeakReference() { return false; } /** * Read the value of this remote multi-value of type weak reference. * * @return The value of this remote value if this remote value is a * multi-value of type weak reference, {@code null} otherwise. */ public Iterable asMultiWeakReference() { return null; } /** * Check if this remote value is of type decimal. * * @return {@code true} if this remote value is of type decimal, {@code * false} otherwise. */ public boolean isDecimal() { return false; } /** * Read the value of this remote value of type decimal. * * @return The value of this remote value if this remote value is of type * decimal, {@code null} otherwise. */ public BigDecimal asDecimal() { return null; } /** * Check if this remote value is a multi-value of type decimal. * * @return {@code true} if this remote value is a multi-value of type * decimal, {@code false} otherwise. */ public boolean isMultiDecimal() { return false; } /** * Read the value of this remote multi-value of type decimal. * * @return The value of this remote value if this remote value is a * multi-value of type decimal, {@code null} otherwise. */ public Iterable asMultiDecimal() { return null; } /** * Check if this remote value is of type URI. * * @return {@code true} if this remote value is of type URI, {@code false} * otherwise. */ public boolean isUri() { return false; } /** * Read the value of this remote value of type URI. * * @return The value of this remote value if this remote value is of type * URI, {@code null} otherwise. */ public String asUri() { return null; } /** * Check if this remote value is a multi-value of type URI. * * @return {@code true} if this remote value is a multi-value of type URI, * {@code false} otherwise. */ public boolean isMultiUri() { return false; } /** * Read the value of this remote multi-value of type URI. * * @return The value of this remote value if this remote value is a * multi-value of type URI, {@code null} otherwise. */ public Iterable asMultiUri() { return null; } /** * Calls a method of the provided handler according to the type of this * remote value. * * @param handler Handler containing logic to be executing according to the * type of this remote value. */ public void whenType(TypeHandler handler) { if (isBinary()) { handler.isBinary(asBinary()); return; } if (isMultiBinary()) { handler.isMultiBinary(asMultiBinary()); return; } if (isBinaryId()) { handler.isBinaryId(asBinaryId()); return; } if (isMultiBinaryId()) { handler.isMultiBinaryId(asMultiBinaryId()); return; } if (isBoolean()) { handler.isBoolean(asBoolean()); return; } if (isMultiBoolean()) { handler.isMultiBoolean(asMultiBoolean()); return; } if (isDate()) { handler.isDate(asDate()); return; } if (isMultiDate()) { handler.isMultiDate(asMultiDate()); return; } if (isDecimal()) { handler.isDecimal(asDecimal()); return; } if (isMultiDecimal()) { handler.isMultiDecimal(asMultiDecimal()); return; } if (isDouble()) { handler.isDouble(asDouble()); return; } if (isMultiDouble()) { handler.isMultiDouble(asMultiDouble()); return; } if (isLong()) { handler.isLong(asLong()); return; } if (isMultiLong()) { handler.isMultiLong(asMultiLong()); return; } if (isName()) { handler.isName(asName()); return; } if (isMultiName()) { handler.isMultiName(asMultiName()); return; } if (isPath()) { handler.isPath(asPath()); return; } if (isMultiPath()) { handler.isMultiPath(asMultiPath()); return; } if (isReference()) { handler.isReference(asReference()); return; } if (isMultiReference()) { handler.isMultiReference(asMultiReference()); return; } if (isText()) { handler.isText(asText()); return; } if (isMultiText()) { handler.isMultiText(asMultiText()); return; } if (isUri()) { handler.isUri(asUri()); return; } if (isMultiUri()) { handler.isMultiUri(asMultiUri()); return; } if (isWeakReference()) { handler.isWeakReference(asWeakReference()); return; } if (isMultiWeakReference()) { handler.isMultiWeakReference(asMultiWeakReference()); return; } handler.isUnknown(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy