- static Object convertSingleValue(Value value) throws JcrException, IllegalArgumentException {
- try {
- switch (value.getType()) {
- case PropertyType.STRING:
- return value.getString();
- case PropertyType.DOUBLE:
- return (Double) value.getDouble();
- case PropertyType.LONG:
- return (Long) value.getLong();
- case PropertyType.BOOLEAN:
- return (Boolean) value.getBoolean();
- case PropertyType.DATE:
- Calendar calendar = value.getDate();
- return calendar.toInstant();
- case PropertyType.BINARY:
- throw new IllegalArgumentException("Binary is not supported as an attribute");
- default:
- return value.getString();
- }
- } catch (RepositoryException e) {
- throw new JcrException("Cannot convert " + value + " to an object.", e);
- }
- }
-
- static Value convertSingleObject(ValueFactory factory, Object value) {
- if (value instanceof String string) {
- return factory.createValue(string);
- } else if (value instanceof Double dbl) {
- return factory.createValue(dbl);
- } else if (value instanceof Float flt) {
- return factory.createValue(flt);
- } else if (value instanceof Long lng) {
- return factory.createValue(lng);
- } else if (value instanceof Integer intg) {
- return factory.createValue(intg);
- } else if (value instanceof Boolean bool) {
- return factory.createValue(bool);
- } else if (value instanceof Instant instant) {
- GregorianCalendar calendar = new GregorianCalendar();
- calendar.setTime(Date.from(instant));
- return factory.createValue(calendar);
- } else {
- // TODO or use String by default?
- throw new IllegalArgumentException("Unsupported value " + value.getClass());
- }
- }
-
- @Override
- public Class<?> getType(QName key) {
- Node node = getJcrNode();
- String p = NamespaceUtils.toFullyQualified(key);
- try {
- if (node.hasProperty(p)) {
- Property property = node.getProperty(p);
- return switch (property.getType()) {
- case PropertyType.STRING:
- case PropertyType.NAME:
- case PropertyType.PATH:
- case PropertyType.DECIMAL:
- yield String.class;
- case PropertyType.LONG:
- yield Long.class;
- case PropertyType.DOUBLE:
- yield Double.class;
- case PropertyType.BOOLEAN:
- yield Boolean.class;
- case PropertyType.DATE:
- yield Instant.class;
- case PropertyType.WEAKREFERENCE:
- case PropertyType.REFERENCE:
- yield UUID.class;
- default:
- yield Object.class;
- };
- } else {
- // TODO does it make sense?
- return Object.class;
- }
- } catch (RepositoryException e) {
- throw new JcrException("Cannot get type of property " + p + " of " + jcrPath + " in " + jcrWorkspace, e);
- }
- }
-