/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.csw.response; import java.io.StringReader; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import net.opengis.cat.csw20.RequestBaseType; import org.apache.xml.serializer.TreeWalker; import org.geoserver.csw.xml.v2_0_2.CSWRecordingXmlReader; import org.geoserver.ows.Dispatcher; import org.geoserver.ows.Request; import org.geoserver.platform.ServiceException; import org.geotools.csw.CSW; import org.geotools.ows.OWS; import org.geotools.util.Converters; import org.geotools.xlink.XLINK; import org.geotools.xml.transform.Translator; import org.w3c.dom.Document; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.helpers.AttributesImpl; /** * Encodes a Acknoledgement response * * @author Andrea Aime - GeoSolutions */ public class AcknowledgementTransformer extends AbstractCSWTransformer { public AcknowledgementTransformer(RequestBaseType request, boolean canonicalSchemaLocation) { super(request, canonicalSchemaLocation); } @Override public Translator createTranslator(ContentHandler handler) { return new AcknowledgementTranslator(handler); } class AcknowledgementTranslator extends AbstractCSWTranslator { public AcknowledgementTranslator(ContentHandler handler) { super(handler); } @Override public void encode(Object o) throws IllegalArgumentException { AttributesImpl attributes = new AttributesImpl(); addAttribute(attributes, "xmlns:csw", CSW.NAMESPACE); addAttribute(attributes, "xmlns:ows", OWS.NAMESPACE); addAttribute(attributes, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); addAttribute(attributes, "xmlns:xlink", XLINK.NAMESPACE); String locationAtt = "xsi:schemaLocation"; StringBuilder locationDef = new StringBuilder(); locationDef.append(CSW.NAMESPACE).append(" "); locationDef.append(cswSchemaLocation("record.xsd")); addAttribute(attributes, locationAtt, locationDef.toString()); addAttribute(attributes, "timeStamp", Converters.convert(new Date(), String.class)); start("csw:Acknowledgement", attributes); start("csw:EchoedRequest"); Request request = Dispatcher.REQUEST.get(); if (request.isGet()) { encodeGetEcho(request); } else { encodePostEcho(); } end("csw:EchoedRequest"); end("csw:Acknowledgement"); } private void encodeGetEcho(Request request) { // grab the full request url HttpServletRequest httpRequest = request.getHttpRequest(); String fullRequest = httpRequest.getRequestURL().toString(); String queryString = httpRequest.getQueryString(); // odd check, used because the mock http request used for testing // actually includes the query string in the request url if (queryString != null && !fullRequest.contains("?")) { fullRequest += "?" + queryString; } // build the ows:Get element AttributesImpl attributes = new AttributesImpl(); addAttribute(attributes, "xlink:type", "simple"); addAttribute(attributes, "xlink:href", fullRequest); element("ows:Get", null, attributes); } public void encodePostEcho() { String request = CSWRecordingXmlReader.RECORDED_REQUEST.get(); if (request != null) { Document dom = parseAsXML(request); dumpAsXML(dom); } } private void dumpAsXML(Document document) { try { TreeWalker tw = new TreeWalker(contentHandler); tw.traverse(document); } catch (Exception e) { throw new ServiceException( "Failed to re-encode the original request in the Acknowledgement response"); } } private Document parseAsXML(String data) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware( true ); factory.setValidating( false ); DocumentBuilder builder = factory.newDocumentBuilder(); if (!data.startsWith("<?xml")) { data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + data; } return builder.parse(new InputSource(new StringReader(data))); } catch (Throwable t) { throw new ServiceException("Failed to parse the original request into XML, " + "this should never happen??", t); } } } }