X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api%2Fsrc%2Forg%2Fargeo%2Fapi%2Fgcr%2Fspi%2FAbstractContent.java;h=2d3bcde93c9f23228e2f00c187f2802f903ee936;hb=865fc51900459b888938cc0d6943673ee6f20d09;hp=10f36acdf0509ac117871235faa92aea3bba8b9f;hpb=212a43ed44ffc186b69e838d65a1421fd5e1f3a5;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.api/src/org/argeo/api/gcr/spi/AbstractContent.java b/org.argeo.api/src/org/argeo/api/gcr/spi/AbstractContent.java index 10f36acdf..2d3bcde93 100644 --- a/org.argeo.api/src/org/argeo/api/gcr/spi/AbstractContent.java +++ b/org.argeo.api/src/org/argeo/api/gcr/spi/AbstractContent.java @@ -3,9 +3,11 @@ package org.argeo.api.gcr.spi; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import javax.xml.namespace.QName; @@ -15,37 +17,64 @@ import org.argeo.api.gcr.CrName; public abstract class AbstractContent extends AbstractMap implements Content { + /* + * ATTRIBUTES OPERATIONS + */ + protected abstract Iterable keys(); + + protected abstract void removeAttr(QName key); + @Override public Set> entrySet() { -// Set> result = new HashSet<>(); -// for (String key : keys()) { -// Entry entry = new Entry() { -// -// @Override -// public String getKey() { -// return key; -// } -// -// @Override -// public Object getValue() { -// return get(key, Object.class); -// } -// -// @Override -// public Object setValue(Object value) { -// throw new UnsupportedOperationException(); -// } -// -// }; -// result.add(entry); -// } Set> result = new AttrSet(); return result; } - protected abstract Iterable keys(); + @Override + public Class getType(QName key) { + return String.class; + } - protected abstract void removeAttr(QName key); + @Override + public boolean isMultiple(QName key) { + return false; + } + + @Override + public Optional> getMultiple(QName key, Class clss) { + Object value = get(key); + if (value == null) + return null; + if (value instanceof List) { + try { + List res = (List) value; + return Optional.of(res); + } catch (ClassCastException e) { + List res = new ArrayList<>(); + List lst = (List) value; + try { + for (Object o : lst) { + A item = (A) o; + res.add(item); + } + return Optional.of(res); + } catch (ClassCastException e1) { + return Optional.empty(); + } + } + } else {// singleton + try { + A res = (A) value; + return Optional.of(Collections.singletonList(res)); + } catch (ClassCastException e) { + return Optional.empty(); + } + } + } + + /* + * CONTENT OPERATIONS + */ @Override public String getPath() { @@ -103,8 +132,9 @@ public abstract class AbstractContent extends AbstractMap impleme public Entry next() { key = keys.next(); // TODO check type - Object value = get(key, Object.class); - AbstractMap.SimpleEntry entry = new SimpleEntry<>(key, value); + Optional value = get(key, Object.class); + assert !value.isEmpty(); + AbstractMap.SimpleEntry entry = new SimpleEntry<>(key, value.get()); return entry; }