From: Mathieu Baudier Date: Wed, 21 Sep 2022 07:22:34 +0000 (+0200) Subject: Start centralising ACR attribute cast. X-Git-Tag: v2.3.10~33 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=da1148af1d866cb815c69dd3d9a46415bcf8e7ef Start centralising ACR attribute cast. --- diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/CrAttributeType.java b/org.argeo.api.acr/src/org/argeo/api/acr/CrAttributeType.java index 7cef11926..4dae9221c 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/CrAttributeType.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/CrAttributeType.java @@ -9,6 +9,8 @@ import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.Base64; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.UUID; import javax.xml.namespace.QName; @@ -130,6 +132,41 @@ public enum CrAttributeType { return STRING.getFormatter().parse(str); } + /** + * Cast well know java types based on {@link Object#toString()} of the provided + * object. + * + */ + @SuppressWarnings("unchecked") + public static Optional cast(Class clss, Object value) { + // TODO Or should we? + Objects.requireNonNull(value, "Cannot cast a null value"); + if (String.class.isAssignableFrom(clss)) { + return Optional.of((T) value.toString()); + } + // Numbers + else if (Long.class.isAssignableFrom(clss)) { + if (value instanceof Long) + return Optional.of((T) value); + return Optional.of((T) Long.valueOf(value.toString())); + } else if (Integer.class.isAssignableFrom(clss)) { + if (value instanceof Integer) + return Optional.of((T) value); + return Optional.of((T) Integer.valueOf(value.toString())); + } else if (Double.class.isAssignableFrom(clss)) { + if (value instanceof Double) + return Optional.of((T) value); + return Optional.of((T) Double.valueOf(value.toString())); + } + // Numbers +// else if (Number.class.isAssignableFrom(clss)) { +// if (value instanceof Number) +// return Optional.of((T) value); +// return Optional.of((T) Number.valueOf(value.toString())); +// } + return Optional.empty(); + } + /** Utility to convert a data: URI to bytes. */ public static byte[] bytesFromDataURI(URI uri) { if (!"data".equals(uri.getScheme())) diff --git a/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java b/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java index 42b0a0804..2d337c0dd 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java @@ -11,6 +11,7 @@ import java.util.TreeSet; import javax.xml.namespace.QName; import org.argeo.api.acr.ContentName; +import org.argeo.api.acr.CrAttributeType; import org.argeo.api.acr.CrName; import org.argeo.api.acr.NamespaceUtils; import org.argeo.api.acr.spi.ContentProvider; @@ -34,12 +35,13 @@ abstract class AbstractDirectoryContent extends AbstractContent { public Optional get(QName key, Class clss) { String attrName = key.getLocalPart(); Object value = doGetProperties().get(attrName); - if (Long.class.isAssignableFrom(clss)) - return Optional.of((A) (Long) Long.parseLong(value.toString())); if (value == null) return Optional.empty(); - // TODO deal with type and multiple - return Optional.of((A) value); + Optional res = CrAttributeType.cast(clss, value); + if (res.isEmpty()) + return Optional.of((A) value); + else + return res; } @Override