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@1409: public static final String XPATH_TITLE = ingo@1409: "/WMS_Capabilities/Service/Title/text()"; ingo@1409: ingo@1409: public static final String XPATH_ONLINE_RESOURCE = ingo@1409: "/WMS_Capabilities/Service/OnlineResource/@href"; ingo@1409: ingo@1409: public static final String XPATH_CONTACT_INFORMATION = ingo@1409: "/WMS_Capabilities/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@1408: "/WMS_Capabilities/Service/Fees/text()"; ingo@1408: ingo@1408: public static final String XPATH_ACCESS_CONSTRAINTS = ingo@1408: "/WMS_Capabilities/Service/AccessConstraints/text()"; ingo@1408: ingo@1411: public static final String XPATH_LAYERS = ingo@1411: "/WMS_Capabilities/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@1409: String title = (String) XMLUtils.xpath( ingo@1409: doc, ingo@1409: XPATH_TITLE, ingo@1409: XPathConstants.STRING); ingo@1409: ingo@1409: String onlineResource = (String) XMLUtils.xpath( ingo@1409: doc, ingo@1409: XPATH_ONLINE_RESOURCE, ingo@1409: XPathConstants.STRING); ingo@1409: ingo@1408: String fees = (String) XMLUtils.xpath( ingo@1408: doc, ingo@1408: XPATH_FEES, ingo@1408: XPathConstants.STRING); ingo@1408: ingo@1408: String accessConstraints = (String) XMLUtils.xpath( ingo@1408: doc, ingo@1408: XPATH_ACCESS_CONSTRAINTS, ingo@1408: XPathConstants.STRING); ingo@1408: ingo@1409: Node contactInformation = (Node) XMLUtils.xpath( ingo@1409: doc, 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@1411: doc, 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@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 :