package org.argeo.api.gcr.spi; import java.util.AbstractMap; 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 org.argeo.api.gcr.Content; 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(String key); @Override public String getPath() { List ancestors = new ArrayList<>(); collectAncestors(ancestors, this); StringBuilder path = new StringBuilder(); for (Content c : ancestors) { String name = c.getName(); if (!"".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()); } /* * UTILITIES */ protected boolean isDefaultAttrTypeRequested(Class clss) { // check whether clss is Object.class return clss.isAssignableFrom(Object.class); } @Override 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>() { String key = null; @Override public boolean hasNext() { return keys.hasNext(); } @Override public Entry next() { key = keys.next(); // TODO check type Object value = get(key, Object.class); AbstractMap.SimpleEntry entry = new SimpleEntry<>(key, value); return entry; } @Override public void remove() { if (key != null) { AbstractContent.this.removeAttr(key); } else { throw new IllegalStateException("Iteration has not started"); } } }; return it; } @Override public int size() { int count = 0; for (String key : keys()) { count++; } return count; } } }