ingo@16: package de.intevation.flys.client.server; ingo@16: ingo@16: import java.util.ArrayList; ingo@16: import java.util.List; ingo@16: ingo@16: import javax.xml.xpath.XPathConstants; ingo@16: ingo@16: import org.w3c.dom.Document; ingo@16: import org.w3c.dom.Node; ingo@16: import org.w3c.dom.NodeList; ingo@16: ingo@16: import de.intevation.artifacts.common.ArtifactNamespaceContext; ingo@16: import de.intevation.artifacts.common.utils.ClientProtocolUtils; ingo@16: import de.intevation.artifacts.common.utils.XMLUtils; ingo@16: ingo@16: import de.intevation.flys.client.shared.model.ArtifactDescription; ingo@16: import de.intevation.flys.client.shared.model.Data; ingo@16: import de.intevation.flys.client.shared.model.DataItem; ingo@16: import de.intevation.flys.client.shared.model.DefaultData; ingo@16: import de.intevation.flys.client.shared.model.DefaultDataItem; ingo@16: import de.intevation.flys.client.shared.model.DefaultArtifactDescription; ingo@16: ingo@16: ingo@16: /** ingo@16: * This factory class helps creating an {@link ArtifactDescription} based on the ingo@16: * DESCRIBE document of an artifact returned by the artifact server. Use the ingo@16: * {@link createArtifactDescription(org.w3c.dom.Document)} method with the ingo@16: * DESCRIBE document to create such an {@link ArtifactDescription}. ingo@16: * ingo@16: * @author Ingo Weinzierl ingo@16: */ ingo@16: public class ArtifactDescriptionFactory { ingo@16: ingo@16: public static final String XPATH_STATE_NAME = "@art:name"; ingo@16: ingo@22: public static final String XPATH_UIPROVIDER = "@art:uiprovider"; ingo@22: ingo@16: /** ingo@16: * This method creates the {@link ArtifactDescription} of the DESCRIBE ingo@16: * document doc. ingo@16: * ingo@16: * @param doc A DESCRIBE document. ingo@16: * ingo@16: * @return the {@link ArtifactDescription}. ingo@16: */ ingo@16: public static ArtifactDescription createArtifactDescription(Document doc) { ingo@16: System.out.println("ArtifactDescriptionFactory - create()"); ingo@16: ingo@16: Node currentState = ClientProtocolUtils.getCurrentState(doc); ingo@16: Node staticNode = ClientProtocolUtils.getStaticUI(doc); ingo@16: Node dynamicNode = ClientProtocolUtils.getDynamicUI(doc); ingo@16: ingo@16: String state = (String) XMLUtils.xpath( ingo@16: currentState, ingo@16: XPATH_STATE_NAME, ingo@16: XPathConstants.STRING, ingo@16: ArtifactNamespaceContext.INSTANCE); ingo@16: System.out.println("Current state name: " + state); ingo@16: ingo@16: Data currentData = extractCurrentData(dynamicNode); ingo@16: ingo@16: // TODO parse the static ui part ingo@16: return new DefaultArtifactDescription(null, currentData, state, null); ingo@16: } ingo@16: ingo@16: ingo@16: /** ingo@16: * This method extracts the data that the user is able to enter in the ingo@16: * current state of the artifact. ingo@16: * ingo@16: * @param dynamicNode The dynamic node of the DESCRIBE document. ingo@16: * ingo@16: * @return A {@link Data} object that represents the data which might be ingo@16: * entered by the user in the current state or null, if no data might be ingo@16: * entered. ingo@16: */ ingo@16: protected static Data extractCurrentData(Node dynamicNode) { ingo@16: System.out.println("ArtifactDescriptionFactory - extractCurrentData()"); ingo@16: ingo@16: Node data = ClientProtocolUtils.getSelectNode(dynamicNode); ingo@16: NodeList choices = ClientProtocolUtils.getItemNodes(data); ingo@16: String label = ClientProtocolUtils.getLabel(data); ingo@16: ingo@16: DataItem[] dataItems = extractCurrentDataItems(choices); ingo@22: String uiProvider = extractUIProvider(data); ingo@16: ingo@22: return new DefaultData(label, null, null, dataItems, uiProvider); ingo@16: } ingo@16: ingo@16: ingo@16: /** ingo@16: * This method extract the {@link DataItem}s of the DESCRIBE document. ingo@16: * ingo@16: * @param items The items in the DESCRIBE document. ingo@16: * ingo@16: * @return the {@link DataItem}s. ingo@16: */ ingo@16: protected static DataItem[] extractCurrentDataItems(NodeList items) { ingo@16: System.out.println( ingo@16: "ArtifactDescriptionFactory - extractCurrentDataItems()"); ingo@16: ingo@16: if (items == null || items.getLength() == 0) { ingo@16: System.out.println("No data items found."); ingo@16: return null; ingo@16: } ingo@16: ingo@16: int count = items.getLength(); ingo@16: ingo@16: List dataItems = new ArrayList(count); ingo@16: ingo@16: for (int i = 0; i < count; i++) { ingo@16: Node item = items.item(i); ingo@16: String label = ClientProtocolUtils.getLabel(item); ingo@16: String value = ClientProtocolUtils.getValue(item); ingo@16: ingo@16: dataItems.add(new DefaultDataItem(label, null, value)); ingo@16: } ingo@16: ingo@16: return (DataItem[]) dataItems.toArray(new DataItem[count]); ingo@16: } ingo@22: ingo@22: ingo@22: /** ingo@22: * This method extracts the UIProvider specified by the data node. ingo@22: * ingo@22: * @param data The data node. ingo@22: * ingo@22: * @return the UIProvider that is specified in the data node. ingo@22: */ ingo@22: protected static String extractUIProvider(Node data) { ingo@22: return (String) XMLUtils.xpath( ingo@22: data, ingo@22: XPATH_UIPROVIDER, ingo@22: XPathConstants.STRING, ingo@22: ArtifactNamespaceContext.INSTANCE); ingo@22: } ingo@16: } ingo@16: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :