teichmann@5831: package org.dive4elements.river.artifacts; bjoern@3936: bjoern@3936: import java.util.ArrayList; bjoern@4158: import java.util.Collection; bjoern@3936: import java.util.List; bjoern@3936: bjoern@4158: import org.apache.log4j.Logger; bjoern@4158: bjoern@4158: import org.w3c.dom.Document; bjoern@4158: import org.w3c.dom.Element; bjoern@4158: teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.ArtifactNamespaceContext; bjoern@4158: teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; bjoern@4158: teichmann@5831: import org.dive4elements.artifactdatabase.ProtocolUtils; teichmann@5831: import org.dive4elements.artifactdatabase.data.StateData; teichmann@5831: import org.dive4elements.artifactdatabase.state.State; bjoern@3936: teichmann@5831: import org.dive4elements.river.artifacts.states.StaticState; bjoern@4157: bjoern@3936: /** bjoern@3936: * A abstract baseclass for Artifacts which are using only one static state. bjoern@3936: * bjoern@3936: * This class is intended to be used without the config/stateengine to generate bjoern@3936: * the static state. bjoern@3936: * bjoern@3936: * @author Björn Ricks bjoern@3936: */ bjoern@3936: public abstract class AbstractStaticStateArtifact extends StaticFLYSArtifact { bjoern@3936: bjoern@4157: private transient StaticState staticstate; bjoern@3936: bjoern@4158: private static final Logger logger = bjoern@4158: Logger.getLogger(AbstractStaticStateArtifact.class); bjoern@4158: bjoern@3936: /** bjoern@3936: * Get a list containing the one and only State. bjoern@3936: * @param context ignored. bjoern@3936: * @return list with one and only state. bjoern@3936: */ bjoern@3936: @Override bjoern@3936: protected List getStates(Object context) { bjoern@3936: ArrayList states = new ArrayList(); bjoern@3936: states.add(getStaticState()); bjoern@3936: return states; bjoern@3936: } bjoern@3936: bjoern@3936: bjoern@3936: /** bjoern@3936: * Get the "current" state. bjoern@3936: * @param cc ignored. bjoern@3936: * @return always the set static state. bjoern@3936: */ bjoern@3936: @Override bjoern@3936: public State getCurrentState(Object cc) { bjoern@3936: return getStaticState(); bjoern@3936: } bjoern@3936: bjoern@3936: /** bjoern@3936: * A child class must override this method to set its static state bjoern@3936: */ bjoern@3936: protected abstract void initStaticState(); bjoern@3936: bjoern@4157: protected void setStaticState(StaticState state) { bjoern@3936: this.staticstate = state; bjoern@3936: } bjoern@3936: bjoern@4157: protected StaticState getStaticState() { bjoern@3936: if (staticstate == null) { bjoern@3936: initStaticState(); bjoern@3936: } bjoern@3936: return staticstate; bjoern@3936: } bjoern@3936: bjoern@3936: /** bjoern@3936: * Get the state. bjoern@3936: * @param context ignored. bjoern@3936: * @param stateID ignored. bjoern@3936: * @return the state. bjoern@3936: */ bjoern@3936: @Override bjoern@3936: protected State getState(Object context, String stateID) { bjoern@3936: return getStaticState(); bjoern@3936: } bjoern@4158: bjoern@4158: @Override bjoern@4158: public Document describe(Document data, CallContext cc) { bjoern@4158: logger.debug("Describe artifact: " + identifier()); bjoern@4158: bjoern@4158: Document desc = XMLUtils.newDocument(); bjoern@4158: bjoern@4158: ElementCreator creator = new ElementCreator( bjoern@4158: desc, bjoern@4158: ArtifactNamespaceContext.NAMESPACE_URI, bjoern@4158: ArtifactNamespaceContext.NAMESPACE_PREFIX); bjoern@4158: bjoern@4158: Element root = ProtocolUtils.createRootNode(creator); bjoern@4158: desc.appendChild(root); bjoern@4158: bjoern@4158: Element name = ProtocolUtils.createArtNode( bjoern@4158: creator, "name", bjoern@4158: new String[] { "value" }, bjoern@4158: new String[] { getName() }); bjoern@4158: bjoern@4158: root.appendChild(name); bjoern@4158: root.appendChild(createOutputModes(cc, desc, creator)); bjoern@4158: bjoern@4158: ProtocolUtils.appendDescribeHeader(creator, root, identifier(), hash()); bjoern@4158: bjoern@4158: // Add the data to an anonymous state. bjoern@4158: Collection datas = getAllData(); bjoern@4158: if (datas.size() > 0) { bjoern@4158: Element ui = creator.create("ui"); bjoern@4158: Element staticE = creator.create("static"); bjoern@4158: bjoern@4158: StaticState current = getStaticState(); bjoern@4158: Element state = current.describeStatic(this, desc, root, cc, null); bjoern@4158: staticE.appendChild(state); bjoern@4158: bjoern@4158: for (StateData dataItem : datas) { bjoern@4158: Element itemelent = creator.create("data"); bjoern@4158: creator.addAttr(itemelent, "name", dataItem.getName(), true); bjoern@4158: creator.addAttr(itemelent, "type", dataItem.getType(), true); bjoern@4158: state.appendChild(itemelent); bjoern@4158: Element valuement = creator.create("item"); bjoern@4158: creator.addAttr(valuement, "label", dataItem.getDescription(), true); bjoern@4158: creator.addAttr(valuement, "value", dataItem.getValue().toString(), true); bjoern@4158: itemelent.appendChild(valuement); bjoern@4158: } bjoern@4158: bjoern@4158: ui.appendChild(staticE); bjoern@4158: root.appendChild(ui); bjoern@4158: } bjoern@4158: bjoern@4158: return desc; bjoern@4158: } bjoern@3936: }