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));
}