package org.argeo.api.gcr; import java.util.Map; /** * A semi-structured content, with attributes, within a hierarchical structure. */ public interface Content extends Iterable, Map { String getName(); String getPath(); Content getParent(); /* * ATTRIBUTES OPERATIONS */ A get(String key, Class clss) throws IllegalArgumentException; /* * CONTENT OPERATIONS */ Content add(String name, ContentName... classes); void remove(); /* * DEFAULT METHODS */ default A adapt(Class clss) throws IllegalArgumentException { throw new IllegalArgumentException("Cannot adapt content " + this + " to " + clss.getName()); } default C open(Class clss) throws Exception, IllegalArgumentException { throw new IllegalArgumentException("Cannot open content " + this + " as " + clss.getName()); } /* * CONVENIENCE METHODS */ default String attr(String key) { return get(key, String.class); } default String attr(Object key) { return key != null ? attr(key.toString()) : attr(null); } default A get(Object key, Class clss) { return key != null ? get(key.toString(), clss) : get(null, clss); } /* * EXPERIMENTAL UNSUPPORTED */ default boolean hasText() { return false; } default String getText() { throw new UnsupportedOperationException(); } }