public static PropertyValue convert()

in oak-core/src/main/java/org/apache/jackrabbit/oak/query/ValueConverter.java [90:191]


    public static PropertyValue convert(@NotNull PropertyValue value, int targetType, @Nullable NamePathMapper mapper) {
        int sourceType = value.getType().tag();
        if (sourceType == targetType) {
            return value;
        }
        switch (targetType) {
            case PropertyType.BINARY:
                Blob blob = value.getValue(Type.BINARY);
                return PropertyValues.newBinary(blob);
            case PropertyType.BOOLEAN:
                return PropertyValues.newBoolean(value.getValue(Type.BOOLEAN));
            case PropertyType.DATE:
                return PropertyValues.newDate(value.getValue(Type.DATE));
            case PropertyType.DOUBLE:
                return PropertyValues.newDouble(value.getValue(Type.DOUBLE));
            case PropertyType.LONG:
                return PropertyValues.newLong(value.getValue(Type.LONG));
            case PropertyType.DECIMAL:
                return PropertyValues.newDecimal(value.getValue(Type.DECIMAL));
        }
        // for other types, the value is first converted to a string
        String v = value.getValue(Type.STRING);
        switch (targetType) {
            case PropertyType.STRING:
                return PropertyValues.newString(v);
            case PropertyType.PATH:
                switch (sourceType) {
                    case PropertyType.BINARY:
                    case PropertyType.STRING:
                    case PropertyType.NAME:
                        return PropertyValues.newPath(v);
                    case PropertyType.URI:
                        URI uri = URI.create(v);
                        if (uri.isAbsolute()) {
                            // uri contains scheme
                            throw new IllegalArgumentException(
                                    "Failed to convert URI " + v + " to PATH");
                        }
                        String p = uri.getPath();
                        if (p.startsWith("./")) {
                            p = p.substring(2);
                        }
                        return PropertyValues.newPath(v);
                }
                break;
            case PropertyType.NAME:
                switch (sourceType) {
                    case PropertyType.BINARY:
                    case PropertyType.STRING:
                    case PropertyType.PATH:
                        // path might be a name (relative path of length 1)
                        // try conversion via string
                        return PropertyValues.newName(getOakPath(v, mapper));
                    case PropertyType.URI:
                        URI uri = URI.create(v);
                        if (uri.isAbsolute()) {
                            // uri contains scheme
                            throw new IllegalArgumentException(
                                    "Failed to convert URI " + v + " to PATH");
                        }
                        String p = uri.getPath();
                        if (p.startsWith("./")) {
                            p = p.substring(2);
                        }
                        return PropertyValues.newName(getOakPath(v, mapper));
                }
                break;
            case PropertyType.REFERENCE:
                switch (sourceType) {
                    case PropertyType.BINARY:
                    case PropertyType.STRING:
                    case PropertyType.WEAKREFERENCE:
                        return PropertyValues.newReference(v);
                }
                break;
            case PropertyType.WEAKREFERENCE:
                switch (sourceType) {
                    case PropertyType.BINARY:
                    case PropertyType.STRING:
                    case PropertyType.REFERENCE:
                        return PropertyValues.newWeakReference(v);
                }
                break;
            case PropertyType.URI:
                switch (sourceType) {
                    case PropertyType.BINARY:
                    case PropertyType.STRING:
                        return PropertyValues.newUri(v);
                    case PropertyType.NAME:
                        // prefix name with "./" (JCR 2.0 spec 3.6.4.8)
                        return PropertyValues.newUri("./" + v);
                    case PropertyType.PATH:
                        // prefix name with "./" (JCR 2.0 spec 3.6.4.9)
                        return PropertyValues.newUri("./" + v);
                }
        }
        throw new IllegalArgumentException(
                "Unsupported conversion from property type " +
                        PropertyType.nameFromValue(sourceType) +
                        " to property type " +
                        PropertyType.nameFromValue(targetType));
    }