sascha@403: package de.intevation.artifactdatabase.state; sascha@403: sascha@403: import de.intevation.artifacts.Artifact; sascha@403: sascha@405: import java.util.ArrayList; sascha@403: import java.util.HashMap; sascha@405: import java.util.List; sascha@403: import java.util.Map; sascha@403: felix@438: import org.apache.log4j.Logger; felix@436: felix@438: felix@438: /** felix@438: * System used in practice used by AttributeWriter in flys-artifacts to decide felix@438: * whether a facet is initially active. felix@438: * Provides a singleton Registry into which FacetActivities can be registered felix@438: * under a key (in practice the artifacts name. This Registry is queried for felix@438: * new Facets in order to find whether they are active or inactive. felix@438: */ sascha@403: public interface FacetActivity sascha@403: { felix@436: /** Static 'activity' that lets all facets be active. */ sascha@403: public static final FacetActivity ACTIVE = new FacetActivity() { sascha@403: @Override sascha@405: public Boolean isInitialActive( sascha@403: Artifact artifact, sascha@403: Facet facet, sascha@403: String output sascha@403: ) { sascha@405: return Boolean.TRUE; sascha@403: } sascha@403: }; sascha@403: felix@436: /** Static 'activity' that lets all facets be inactive. */ sascha@403: public static final FacetActivity INACTIVE = new FacetActivity() { sascha@403: @Override sascha@405: public Boolean isInitialActive( sascha@403: Artifact artifact, sascha@403: Facet facet, sascha@403: String output sascha@403: ) { sascha@405: return Boolean.FALSE; sascha@403: } sascha@403: }; sascha@403: sascha@405: Boolean isInitialActive(Artifact artifact, Facet facet, String output); sascha@403: felix@436: /** Singleton registry, that maps artifact names to the activities, which felix@436: * decide whether or not a facet should be (initially) active. */ sascha@403: public static final class Registry { sascha@403: felix@438: /** The logger for this class. */ felix@438: private static Logger logger = Logger.getLogger(Registry.class); felix@438: felix@436: /** Singleton instance. */ sascha@403: private static final Registry INSTANCE = new Registry(); sascha@403: felix@438: /** Map of keys (artifact names) to the activities. */ sascha@405: private Map> activities; sascha@403: felix@436: /** Private singleton constructor for the Facet-Activity-Registry. */ sascha@403: private Registry() { sascha@405: activities = new HashMap>(); sascha@403: } sascha@403: felix@436: /** Access Singleton instance. */ sascha@404: public static Registry getInstance() { sascha@403: return INSTANCE; sascha@403: } sascha@403: felix@436: /** Queries whether a given facet should be active or not. */ sascha@405: public synchronized boolean isInitialActive( sascha@405: String key, sascha@405: Artifact artifact, sascha@405: Facet facet, sascha@405: String output sascha@405: ) { sascha@405: List activityList = activities.get(key); sascha@405: if (activityList == null) { felix@443: logger.debug("FacetActivity.Registry: No activity " + felix@438: "registered for " + key); sascha@405: return true; sascha@405: } felix@438: if (activityList.size() != 1) { felix@443: logger.warn("FacetActivity.Registry: More than one " + felix@438: "FacetActivity registered for " + key); felix@438: } sascha@405: for (FacetActivity activity: activityList) { sascha@405: Boolean isActive = sascha@405: activity.isInitialActive(artifact, facet, output); felix@438: // Nice. Only, in practice they never return NULL. sascha@405: if (isActive != null) { sascha@405: return isActive; sascha@405: } sascha@405: } sascha@405: return true; sascha@403: } sascha@403: felix@438: felix@438: /** Add a FacetActivity under given key (usually artifacts name). */ sascha@403: public synchronized void register(String key, FacetActivity activity) { sascha@405: List activityList = activities.get(key); sascha@405: if (activityList == null) { sascha@405: activityList = new ArrayList(3); sascha@405: activities.put(key, activityList); sascha@405: } sascha@405: activityList.add(activity); sascha@403: } sascha@403: } sascha@403: } sascha@403: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :