Start centralising ACR attribute cast.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 21 Sep 2022 07:22:34 +0000 (09:22 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 21 Sep 2022 07:22:34 +0000 (09:22 +0200)
org.argeo.api.acr/src/org/argeo/api/acr/CrAttributeType.java
org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java

index 7cef11926f829bfcb9464e4b2db8bceda949cf81..4dae9221c4eae4036a0a6f15f18e31dcb08d5ed0 100644 (file)
@@ -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 <T> Optional<T> cast(Class<T> 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()))
index 42b0a08044370a8bc57dfe0adcd5c6e275850f73..2d337c0dda38d78bdfc5d78a428a6ae110942cd8 100644 (file)
@@ -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 <A> Optional<A> get(QName key, Class<A> 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<A> res = CrAttributeType.cast(clss, value);
+               if (res.isEmpty())
+                       return Optional.of((A) value);
+               else
+                       return res;
        }
 
        @Override