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 :