X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api%2Fsrc%2Forg%2Fargeo%2Fapi%2Fgcr%2Fspi%2FAbstractContent.java;h=10f36acdf0509ac117871235faa92aea3bba8b9f;hb=e5a22cdc7d0f4918f2740c626e1ab6384bd5ee44;hp=2da186ef2538eb6d2d1f2da67be1d9dae6675d6a;hpb=8767858f1fca02ea7c53ca244f6c1fa745d91ac4;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 2da186ef2..10f36acdf 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 @@ -1,48 +1,134 @@ package org.argeo.api.gcr.spi; import java.util.AbstractMap; -import java.util.HashSet; +import java.util.AbstractSet; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Set; +import javax.xml.namespace.QName; + import org.argeo.api.gcr.Content; +import org.argeo.api.gcr.CrName; + +public abstract class AbstractContent extends AbstractMap implements Content { + + @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(); + + protected abstract void removeAttr(QName key); + + @Override + public String getPath() { + List ancestors = new ArrayList<>(); + collectAncestors(ancestors, this); + StringBuilder path = new StringBuilder(); + for (Content c : ancestors) { + QName name = c.getName(); + // FIXME + if (!CrName.ROOT.get().equals(name)) + path.append('/').append(name); + } + return path.toString(); + } + + private void collectAncestors(List ancestors, Content content) { + if (content == null) + return; + ancestors.add(0, content); + collectAncestors(ancestors, content.getParent()); + } -public abstract class AbstractContent extends AbstractMap implements Content { + /* + * UTILITIES + */ + protected boolean isDefaultAttrTypeRequested(Class clss) { + // check whether clss is Object.class + return clss.isAssignableFrom(Object.class); + } @Override - public Set> entrySet() { - Set> result = new HashSet<>(); - for (String key : keys()) { - Entry entry = new Entry() { + public String toString() { + return "content " + getPath(); + } + + /* + * SUB CLASSES + */ + + class AttrSet extends AbstractSet> { + + @Override + public Iterator> iterator() { + final Iterator keys = keys().iterator(); + Iterator> it = new Iterator>() { + + QName key = null; @Override - public String getKey() { - return key; + public boolean hasNext() { + return keys.hasNext(); } @Override - public Object getValue() { + public Entry next() { + key = keys.next(); // TODO check type - return get(key, Object.class); + Object value = get(key, Object.class); + AbstractMap.SimpleEntry entry = new SimpleEntry<>(key, value); + return entry; } @Override - public Object setValue(Object value) { - throw new UnsupportedOperationException(); + public void remove() { + if (key != null) { + AbstractContent.this.removeAttr(key); + } else { + throw new IllegalStateException("Iteration has not started"); + } } }; - result.add(entry); + return it; + } + + @Override + public int size() { + int count = 0; + for (QName key : keys()) { + count++; + } + return count; } - return result; - } - protected abstract Iterable keys(); - - /* - * UTILITIES - */ - protected boolean isDefaultAttrTypeRequested(Class clss) { - // check whether clss is Object.class - return clss.isAssignableFrom(Object.class); } }