ingo@1408: package de.intevation.flys.client.server;
ingo@1408:
ingo@1408: import java.io.InputStream;
ingo@1408: import java.io.IOException;
ingo@1408: import java.net.MalformedURLException;
ingo@1408: import java.net.URL;
ingo@1408: import java.net.URLConnection;
ingo@1411: import java.util.ArrayList;
ingo@1411: import java.util.List;
ingo@1408:
ingo@1408: import javax.xml.xpath.XPathConstants;
ingo@1408:
ingo@1408: import com.google.gwt.user.server.rpc.RemoteServiceServlet;
ingo@1408:
ingo@1408: import org.w3c.dom.Document;
ingo@1409: import org.w3c.dom.Node;
ingo@1411: import org.w3c.dom.NodeList;
ingo@1408:
ingo@1408: import org.apache.log4j.Logger;
ingo@1408:
ingo@1408: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@1408:
ingo@1408: import de.intevation.flys.client.shared.exceptions.ServerException;
ingo@1408: import de.intevation.flys.client.shared.model.Capabilities;
ingo@1409: import de.intevation.flys.client.shared.model.ContactInformation;
ingo@1411: import de.intevation.flys.client.shared.model.WMSLayer;
ingo@1408: import de.intevation.flys.client.client.services.GCService;
ingo@1408:
ingo@1408:
ingo@1408: /**
ingo@1408: * @author Ingo Weinzierl
ingo@1408: */
ingo@1408: public class GCServiceImpl
ingo@1408: extends RemoteServiceServlet
ingo@1408: implements GCService
ingo@1408: {
ingo@1408: public static final String ERR_GC_REQUEST_FAILED =
ingo@1408: "error_gc_req_failed";
ingo@1408:
ingo@1408: public static final String ERR_GC_DOC_NOT_VALID =
ingo@1408: "error_gc_doc_not_valid";
ingo@1408:
ingo@1408: public static final String ERR_MALFORMED_URL =
ingo@1408: "error_malformed_url";
ingo@1408:
ingo@1416: public static final String XPATH_WMS_CAPS =
ingo@1416: "/WMS_Capabilities";
ingo@1416:
ingo@1416: public static final String XPATH_WMT_CAPS =
ingo@1416: "/WMT_MS_Capabilities";
ingo@1416:
ingo@1409: public static final String XPATH_TITLE =
ingo@1416: "Service/Title/text()";
ingo@1409:
ingo@1409: public static final String XPATH_ONLINE_RESOURCE =
ingo@1416: "Service/OnlineResource/@href";
ingo@1409:
ingo@1409: public static final String XPATH_CONTACT_INFORMATION =
ingo@1416: "Service/ContactInformation";
ingo@1409:
ingo@1409: public static final String XPATH_CI_PERSON =
ingo@1409: "ContactPersonPrimary/ContactPerson/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_ORGANIZATION =
ingo@1409: "ContactPersonPrimary/ContactOrganization/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_ADDRESS =
ingo@1409: "ContactAddress/Address/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_CITY =
ingo@1409: "ContactAddress/City/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_POSTCODE =
ingo@1409: "ContactAddress/PostCode/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_PHONE =
ingo@1409: "ContactVoiceTelephone/text()";
ingo@1409:
ingo@1409: public static final String XPATH_CI_EMAIL =
ingo@1409: "ContactElectronicMailAddress/text()";
ingo@1409:
ingo@1408: public static final String XPATH_FEES =
ingo@1416: "Service/Fees/text()";
ingo@1408:
ingo@1408: public static final String XPATH_ACCESS_CONSTRAINTS =
ingo@1416: "Service/AccessConstraints/text()";
ingo@1408:
ingo@1411: public static final String XPATH_LAYERS =
ingo@1416: "Capability/Layer";
ingo@1411:
ingo@1408:
ingo@1408: private Logger logger = Logger.getLogger(GCServiceImpl.class);
ingo@1408:
ingo@1408:
ingo@1408: public Capabilities query(String path)
ingo@1408: throws ServerException
ingo@1408: {
ingo@1408: logger.info("GCServiceImpl.query");
ingo@1408:
ingo@1408: try {
ingo@1408: URL url = new URL(path);
ingo@1408:
ingo@1408: logger.debug("Open connection to url: " + path);
ingo@1408:
ingo@1408: URLConnection conn = url.openConnection();
ingo@1408: conn.connect();
ingo@1408:
ingo@1408: InputStream is = conn.getInputStream();
ingo@1408:
ingo@1408: return parseCapabilitiesResponse(is);
ingo@1408: }
ingo@1408: catch (MalformedURLException mue) {
ingo@1408: logger.warn(mue, mue);
ingo@1408: throw new ServerException(ERR_MALFORMED_URL);
ingo@1408: }
ingo@1408: catch (IOException ioe) {
ingo@1408: logger.warn(ioe, ioe);
ingo@1408: }
ingo@1408:
ingo@1408: throw new ServerException(ERR_GC_REQUEST_FAILED);
ingo@1408: }
ingo@1408:
ingo@1408:
ingo@1408: protected Capabilities parseCapabilitiesResponse(InputStream is)
ingo@1408: throws ServerException
ingo@1408: {
ingo@1408: logger.debug("GCServiceImpl.parseCapabilitiesResponse");
ingo@1408:
ingo@1408: Document doc = XMLUtils.parseDocument(is, false);
ingo@1408:
ingo@1408: if (doc == null) {
ingo@1408: throw new ServerException(ERR_GC_DOC_NOT_VALID);
ingo@1408: }
ingo@1408:
ingo@1416: Node capabilities = getCapabilitiesNode(doc);
ingo@1416:
ingo@1409: String title = (String) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1409: XPATH_TITLE,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String onlineResource = (String) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1409: XPATH_ONLINE_RESOURCE,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1408: String fees = (String) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1408: XPATH_FEES,
ingo@1408: XPathConstants.STRING);
ingo@1408:
ingo@1408: String accessConstraints = (String) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1408: XPATH_ACCESS_CONSTRAINTS,
ingo@1408: XPathConstants.STRING);
ingo@1408:
ingo@1409: Node contactInformation = (Node) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1409: XPATH_CONTACT_INFORMATION,
ingo@1409: XPathConstants.NODE);
ingo@1409:
ingo@1409: ContactInformation ci = parseContactInformation(contactInformation);
ingo@1409:
ingo@1408: logger.debug("Found fees: " + fees);
ingo@1408: logger.debug("Found access constraints: " + accessConstraints);
ingo@1408:
ingo@1411: NodeList layerNodes = (NodeList) XMLUtils.xpath(
ingo@1416: capabilities,
ingo@1411: XPATH_LAYERS,
ingo@1411: XPathConstants.NODESET);
ingo@1411:
ingo@1414: List layers = parseLayers(layerNodes, onlineResource);
ingo@1408:
ingo@1409: return new Capabilities(
ingo@1409: title,
ingo@1409: onlineResource,
ingo@1409: ci,
ingo@1409: fees,
ingo@1409: accessConstraints,
ingo@1411: layers);
ingo@1409: }
ingo@1409:
ingo@1409:
ingo@1416: protected Node getCapabilitiesNode(Document doc)
ingo@1416: throws ServerException {
ingo@1416: Node capabilities = (Node) XMLUtils.xpath(
ingo@1416: doc,
ingo@1416: XPATH_WMS_CAPS,
ingo@1416: XPathConstants.NODE);
ingo@1416:
ingo@1416: if (capabilities == null) {
ingo@1416: logger.info("No '/WMS_Capabilities' node found.");
ingo@1416: logger.info("Try to find a '/WMT_MS_Capabilities' node.");
ingo@1416:
ingo@1416: capabilities = (Node) XMLUtils.xpath(
ingo@1416: doc,
ingo@1416: XPATH_WMT_CAPS,
ingo@1416: XPathConstants.NODE);
ingo@1416: }
ingo@1416:
ingo@1416: if (capabilities == null) {
ingo@1416: throw new ServerException(ERR_GC_DOC_NOT_VALID);
ingo@1416: }
ingo@1416:
ingo@1416: return capabilities;
ingo@1416: }
ingo@1416:
ingo@1416:
ingo@1409: protected ContactInformation parseContactInformation(Node node) {
ingo@1409: String person = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_PERSON,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String organization = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_ORGANIZATION,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String address = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_ADDRESS,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String postcode = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_POSTCODE,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String city = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_CITY,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String phone = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_PHONE,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: String email = (String) XMLUtils.xpath(
ingo@1409: node,
ingo@1409: XPATH_CI_EMAIL,
ingo@1409: XPathConstants.STRING);
ingo@1409:
ingo@1409: ContactInformation ci = new ContactInformation();
ingo@1409: ci.setPerson(person);
ingo@1409: ci.setOrganization(organization);
ingo@1409: ci.setAddress(address);
ingo@1409: ci.setPostcode(postcode);
ingo@1409: ci.setCity(city);
ingo@1409: ci.setPhone(phone);
ingo@1409: ci.setEmail(email);
ingo@1409:
ingo@1409: return ci;
ingo@1408: }
ingo@1411:
ingo@1411:
ingo@1414: /**
ingo@1414: * @param layersNode
ingo@1414: * @param onlineResource
ingo@1414: *
ingo@1414: * @return
ingo@1414: */
ingo@1414: protected List parseLayers(
ingo@1414: NodeList layersNode,
ingo@1414: String onlineResource
ingo@1414: ) {
ingo@1411: int len = layersNode != null ? layersNode.getLength() : 0;
ingo@1411:
ingo@1411: logger.debug("Node has " + len + " layers.");
ingo@1411:
ingo@1411: List layers = new ArrayList(len);
ingo@1411:
ingo@1411: for (int i = 0; i < len; i++) {
ingo@1414: layers.add(parseLayer(layersNode.item(i), onlineResource));
ingo@1411: }
ingo@1411:
ingo@1411: return layers;
ingo@1411: }
ingo@1411:
ingo@1411:
ingo@1414: protected WMSLayer parseLayer(Node layerNode, String onlineResource) {
ingo@1411: String title = (String) XMLUtils.xpath(
ingo@1411: layerNode,
ingo@1411: "Title/text()",
ingo@1411: XPathConstants.STRING);
ingo@1411:
ingo@1411: String name = (String) XMLUtils.xpath(
ingo@1411: layerNode,
ingo@1411: "Name/text()",
ingo@1411: XPathConstants.STRING);
ingo@1411:
ingo@1411: logger.debug("Found layers: " + title + "(" + name + ")");
ingo@1411:
ingo@1411: NodeList layersNodes = (NodeList) XMLUtils.xpath(
ingo@1411: layerNode,
ingo@1411: "Layer",
ingo@1411: XPathConstants.NODESET);
ingo@1411:
ingo@1414: List layers = parseLayers(layersNodes, onlineResource);
ingo@1411:
ingo@1414: return new WMSLayer(onlineResource, title, name, layers);
ingo@1411: }
ingo@1408: }
ingo@1408: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :