diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderParser.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderParser.java new file mode 100644 index 0000000000..981b7e7f09 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderParser.java @@ -0,0 +1,91 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.edex.ogc.common.http; + +import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Parses Accept-Encoding headers for HTTP requests + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Nov 8, 2013  2539       bclement     Initial creation
+ * 
+ * 
+ * + * @author bclement + * @version 1.0 + */ +public class AcceptHeaderParser implements Iterable { + + private static final Pattern ENCODING_PATTERN = Pattern + .compile("([^;, \\t]+)\\s*(;\\s*(q\\s*=\\s*([0-9.]+)))?"); + + private final String input; + + /** + * + */ + public AcceptHeaderParser(String input) { + this.input = input; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + final Matcher matcher = ENCODING_PATTERN.matcher(input); + return new Iterator() { + + @Override + public boolean hasNext() { + return matcher.find(); + } + + @Override + public AcceptHeaderValue next() { + String enc = matcher.group(1); + String qvalStr = matcher.group(4); + if (qvalStr == null) { + return new AcceptHeaderValue(enc); + } else { + return new AcceptHeaderValue(enc, + Double.parseDouble(qvalStr)); + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException( + "Remove not supported for " + this.getClass()); + } + }; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderValue.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderValue.java new file mode 100644 index 0000000000..1df92f26d9 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/AcceptHeaderValue.java @@ -0,0 +1,77 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.edex.ogc.common.http; + +/** + * Represents a single HTTP accept(-encoding) header encoding with weight value + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Nov 8, 2013  2539       bclement     Initial creation
+ * 
+ * 
+ * + * @author bclement + * @version 1.0 + */ +public class AcceptHeaderValue { + + private final String encoding; + + private final double qvalue; + + public AcceptHeaderValue(String encoding, double qvalue) { + this.encoding = encoding; + if (qvalue < 0 || qvalue > 1.0) { + throw new IllegalArgumentException( + "qvalue must be between 0 and 1.0"); + } + this.qvalue = qvalue; + } + + public AcceptHeaderValue(String encoding) { + this(encoding, 1.0); + } + + /** + * @return the encoding + */ + public String getEncoding() { + return encoding; + } + + /** + * @return the qvalue + */ + public double getQvalue() { + return qvalue; + } + + /** + * @return true if encoding is acceptable + */ + public boolean isAcceptable(){ + return qvalue != 0; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpErrorException.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpErrorException.java new file mode 100644 index 0000000000..d53927371e --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpErrorException.java @@ -0,0 +1,97 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.edex.ogc.common.http; + +/** + * Exception for when an OGC request fails at the HTTP level. Contains HTTP + * error code for response. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Nov 11, 2013 2539       bclement     Initial creation
+ * 
+ * 
+ * + * @author bclement + * @version 1.0 + */ +public class OgcHttpErrorException extends Exception { + + private static final long serialVersionUID = -452797331391106559L; + + private final int code; + + /** + * + */ + public OgcHttpErrorException(int code) { + super(); + this.code = code; + } + + /** + * @param message + * @param cause + * @param enableSuppression + * @param writableStackTrace + */ + public OgcHttpErrorException(int code, String message, Throwable cause, + boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + this.code = code; + } + + /** + * @param message + * @param cause + */ + public OgcHttpErrorException(int code, String message, Throwable cause) { + super(message, cause); + this.code = code; + } + + /** + * @param message + */ + public OgcHttpErrorException(int code, String message) { + super(message); + this.code = code; + } + + /** + * @param cause + */ + public OgcHttpErrorException(int code, Throwable cause) { + super(cause); + this.code = code; + } + + /** + * @return the error status code + */ + public int getCode() { + return code; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpHandler.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpHandler.java index 5b0529156e..f84c194ba6 100644 --- a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/http/OgcHttpHandler.java @@ -22,11 +22,15 @@ */ package com.raytheon.uf.edex.ogc.common.http; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.util.Collection; import java.util.Iterator; import java.util.Map; +import javax.ws.rs.core.Response.Status; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -42,6 +46,7 @@ import com.raytheon.uf.edex.ogc.common.OgcResponse; import com.raytheon.uf.edex.ogc.common.OgcResponse.TYPE; import com.raytheon.uf.edex.ogc.common.output.IOgcHttpResponse; import com.raytheon.uf.edex.ogc.common.output.OgcResponseOutput; +import com.raytheon.uf.edex.ogc.common.output.ServletOgcResponse; /** @@ -53,7 +58,8 @@ import com.raytheon.uf.edex.ogc.common.output.OgcResponseOutput; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 2011 bclement Initial creation + * 2011 bclement Initial creation + * Nov 11, 2013 2539 bclement added accept encoding parsing * * * @@ -72,6 +78,8 @@ public abstract class OgcHttpHandler { public static final String ACCEPT_VERSIONS_HEADER = "acceptversions"; + public static final String ACCEPT_ENC_HEADER = "accept-encoding"; + public abstract void handle(OgcHttpRequest request); private IUFStatusHandler log = UFStatus.getHandler(this.getClass()); @@ -285,4 +293,67 @@ public abstract class OgcHttpHandler { return rval; } + /** + * Check if accept encoding header is present and modify response + * accordingly. + * + * @param headers + * @param response + * @throws OgcException + * on internal server error + * @throws OgcHttpErrorException + * on HTTP protocol error condition + */ + protected void acceptEncodingCheck(Map headers, + ServletOgcResponse response) throws OgcException, + OgcHttpErrorException { + Object obj = headers.get(ACCEPT_ENC_HEADER); + if (obj == null) { + // omitted accept encoding signifies that they accept anything + return; + } + if (!(obj instanceof String)) { + log.error("Unsupported header type encountered: " + obj.getClass()); + throw new OgcException(Code.InternalServerError); + } + String encoding = (String) obj; + boolean gzipAcceptable = false; + boolean anyAcceptable = false; + for (AcceptHeaderValue value : new AcceptHeaderParser(encoding)) { + if (value.getEncoding().toLowerCase().contains("gzip") + && value.isAcceptable()) { + gzipAcceptable = true; + } else if (value.getEncoding().trim().equals("*")) { + anyAcceptable = true; + } + } + if (gzipAcceptable) { + response.enableGzip(); + } else if (!anyAcceptable) { + throw new OgcHttpErrorException(406); + } + } + + /** + * Output HTTP protocol error + * + * @param response + * @param errorCode + * @throws IOException + */ + protected void outputHttpError(ServletOgcResponse response, int errorCode) + throws IOException { + response.setStatus(errorCode); + response.setContentType("text/plain"); + Writer writer = null; + try { + writer = new OutputStreamWriter(response.getOutputStream()); + writer.write(Status.fromStatusCode(errorCode).toString()); + } finally { + if (writer != null) { + writer.flush(); + writer.close(); + } + } + } } diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/output/ServletOgcResponse.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/output/ServletOgcResponse.java index c5cd6adae8..9c308cf14f 100644 --- a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/output/ServletOgcResponse.java +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/output/ServletOgcResponse.java @@ -11,6 +11,7 @@ package com.raytheon.uf.edex.ogc.common.output; import java.io.IOException; import java.io.OutputStream; +import java.util.zip.GZIPOutputStream; import javax.servlet.http.HttpServletResponse; @@ -24,6 +25,7 @@ import javax.servlet.http.HttpServletResponse; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 7, 2013 bclement Initial creation + * Nov 11, 2013 2539 bclement added GZIP support * * * @@ -32,8 +34,14 @@ import javax.servlet.http.HttpServletResponse; */ public class ServletOgcResponse implements IOgcHttpResponse { + public static final String CONTENT_ENC_HEADER = "Content-Encoding"; + private final HttpServletResponse response; + private boolean gzip = false; + + private volatile OutputStream out = null; + /** * */ @@ -46,7 +54,13 @@ public class ServletOgcResponse implements IOgcHttpResponse { */ @Override public OutputStream getOutputStream() throws IOException { - return response.getOutputStream(); + if (out == null) { + out = response.getOutputStream(); + if (gzip) { + out = new GZIPOutputStream(out); + } + } + return out; } /* (non-Javadoc) @@ -73,4 +87,20 @@ public class ServletOgcResponse implements IOgcHttpResponse { response.setCharacterEncoding(encoding); } + /** + * @return true if response Content-Encoding is GZIP + */ + public boolean isGzip() { + return gzip; + } + + /** + * Turn on GZIP Content Encoding + * + */ + public void enableGzip() { + response.addHeader(CONTENT_ENC_HEADER, "gzip"); + this.gzip = true; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/WfsHttpHandler.java b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/WfsHttpHandler.java index 6e7c68ba05..6db12bbf4f 100644 --- a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/WfsHttpHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/WfsHttpHandler.java @@ -45,9 +45,9 @@ import com.raytheon.uf.edex.ogc.common.OgcException.Code; import com.raytheon.uf.edex.ogc.common.OgcResponse; import com.raytheon.uf.edex.ogc.common.Version; import com.raytheon.uf.edex.ogc.common.http.EndpointInfo; +import com.raytheon.uf.edex.ogc.common.http.OgcHttpErrorException; import com.raytheon.uf.edex.ogc.common.http.OgcHttpHandler; import com.raytheon.uf.edex.ogc.common.http.OgcHttpRequest; -import com.raytheon.uf.edex.ogc.common.output.IOgcHttpResponse; import com.raytheon.uf.edex.ogc.common.output.OgcResponseOutput; import com.raytheon.uf.edex.ogc.common.output.ServletOgcResponse; @@ -106,7 +106,8 @@ public class WfsHttpHandler extends OgcHttpHandler { protected void handleInternal(OgcHttpRequest req) throws Exception { Map headers = req.getHeaders(); - IOgcHttpResponse response = new ServletOgcResponse(req.getResponse()); + ServletOgcResponse response = new ServletOgcResponse(req.getResponse()); + HttpServletRequest httpReq = req.getRequest(); int port = httpReq.getLocalPort(); String host = httpReq.getServerName(); @@ -114,6 +115,13 @@ public class WfsHttpHandler extends OgcHttpHandler { // TODO dynamic path and protocol EndpointInfo info = new EndpointInfo(host, port, path); try { + try { + acceptEncodingCheck(headers, response); + } catch (OgcHttpErrorException e) { + // there was a problem with the acceptable encodings + outputHttpError(response, e.getCode()); + return; + } if (req.isPost()) { InputStream is = req.getInputStream(); BufferedInputStream bufin = new BufferedInputStream(is); diff --git a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/provider/AbstractWfsProvider.java b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/provider/AbstractWfsProvider.java index 16a49bd856..768b812bcd 100644 --- a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/provider/AbstractWfsProvider.java +++ b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/provider/AbstractWfsProvider.java @@ -11,6 +11,7 @@ package com.raytheon.uf.edex.wfs.provider; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -27,9 +28,16 @@ import com.raytheon.uf.edex.ogc.common.OgcBoundingBox; import com.raytheon.uf.edex.ogc.common.OgcException; import com.raytheon.uf.edex.ogc.common.OgcNamespace; import com.raytheon.uf.edex.ogc.common.OgcPrefix; +import com.raytheon.uf.edex.ogc.common.OgcResponse; import com.raytheon.uf.edex.ogc.common.OgcTimeRange; +import com.raytheon.uf.edex.ogc.common.http.MimeType; import com.raytheon.uf.edex.ogc.common.http.OgcHttpHandler; +import com.raytheon.uf.edex.ogc.common.output.IOgcHttpResponse; +import com.raytheon.uf.edex.ogc.common.output.OgcResponseOutput; import com.raytheon.uf.edex.wfs.IWfsProvider; +import com.raytheon.uf.edex.wfs.WfsException; +import com.raytheon.uf.edex.wfs.WfsException.Code; +import com.raytheon.uf.edex.wfs.reg.WfsRegistryImpl; import com.raytheon.uf.edex.wfs.request.QualifiedName; import com.raytheon.uf.edex.wfs.request.SortBy; import com.raytheon.uf.edex.wfs.request.SortBy.Order; @@ -45,6 +53,7 @@ import com.raytheon.uf.edex.wfs.request.SortBy.Order; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 25, 2012 bclement Initial creation + * Nov 11, 2013 2539 bclement moved registry/marshal from children * * * @@ -122,6 +131,17 @@ public abstract class AbstractWfsProvider implements IWfsProvider { }; + protected final WfsRegistryImpl registry; + + protected final IUFStatusHandler log = UFStatus.getHandler(this.getClass()); + + /** + * + */ + public AbstractWfsProvider(WfsRegistryImpl registry) { + this.registry = registry; + } + /** * @param nsmap * @param string @@ -270,4 +290,44 @@ public abstract class AbstractWfsProvider implements IWfsProvider { } } + /** + * Marshal object through response. Response cannot be reused after this + * method is called. + * + * @param jaxbobject + * @param mimeType + * @param response + * @throws Exception + * on unrecoverable error attempting to send response + */ + protected void marshalResponse(Object jaxbobject, MimeType mimeType, + IOgcHttpResponse response) throws Exception { + OutputStream out = null; + try { + out = response.getOutputStream(); + response.setContentType(mimeType.toString()); + registry.marshal(jaxbobject, out); + } catch (Exception e) { + log.error("Unable to marshal WFS response", e); + OgcResponse err = getError(new WfsException( + Code.OperationProcessingFailed), null); + OgcResponseOutput.sendText(err, response, out); + } finally { + if (out != null) { + out.flush(); + out.close(); + } + } + } + + /** + * Create an error response + * + * @param e + * @param exceptionFormat + * @return + */ + public abstract OgcResponse getError(WfsException e, + MimeType exceptionFormat); + } diff --git a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v1_1_0/Wfs1_1_0Provider.java b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v1_1_0/Wfs1_1_0Provider.java index dc83c42ebf..b2e2276e1b 100644 --- a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v1_1_0/Wfs1_1_0Provider.java +++ b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v1_1_0/Wfs1_1_0Provider.java @@ -45,8 +45,6 @@ import org.opengis.feature.simple.SimpleFeature; import org.springframework.context.ApplicationContext; import org.w3.xmlschema.Schema; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.ogc.common.OgcException; import com.raytheon.uf.edex.ogc.common.OgcOperationInfo; @@ -89,6 +87,7 @@ import com.raytheon.uf.edex.wfs.soap2_0_0.util.DescribeFeatureTypeResponseType; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 22, 2011 bclement Initial creation + * Nov 11, 2013 2539 bclement moved registry/marshal to parent * * * @@ -97,14 +96,10 @@ import com.raytheon.uf.edex.wfs.soap2_0_0.util.DescribeFeatureTypeResponseType; */ public class Wfs1_1_0Provider extends AbstractWfsProvider { - protected final IUFStatusHandler log = UFStatus.getHandler(this.getClass()); - public static final String version = "1.1.0"; public static final MimeType GML_MIME = GmlUtils.GML311_OLD_TYPE; - protected final WfsRegistryImpl registry; - protected final Capabilities capabilities; protected final Gml31FeatureFetcher features; @@ -116,18 +111,21 @@ public class Wfs1_1_0Provider extends AbstractWfsProvider { protected final ObjectFactory wfsFactory = new ObjectFactory(); public Wfs1_1_0Provider(WfsRegistryImpl registry) { + super(registry); this.capabilities = new Capabilities(registry); this.features = new Gml31FeatureFetcher(registry); this.describer = new FeatureDescriber(registry, this); - this.registry = registry; this.transactor = new Transactor(); } + /** + * Unit tests + */ protected Wfs1_1_0Provider() { + super(null); this.capabilities = null; this.features = null; this.describer = null; - this.registry = null; this.transactor = null; } @@ -338,35 +336,6 @@ public class Wfs1_1_0Provider extends AbstractWfsProvider { return rval; } - /** - * Marshal object through response. Response cannot be reused after this - * method is called. - * - * @param jaxbobject - * @param mimeType - * @param response - * @throws Exception - * on unrecoverable error attempting to send response - */ - protected void marshalResponse(Object jaxbobject, MimeType mimeType, - IOgcHttpResponse response) throws Exception { - OutputStream out = null; - try { - out = response.getOutputStream(); - response.setContentType(mimeType.toString()); - registry.marshal(jaxbobject, response.getOutputStream()); - } catch (Exception e) { - log.error("Unable to marshal WFS response", e); - OgcResponse err = getError(new WfsException( - Code.OperationProcessingFailed), null); - OgcResponseOutput.sendText(err, response, out); - } finally { - if (out != null) { - out.close(); - } - } - } - /** * Get features as JAXB object * diff --git a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v2_0_0/Wfs2_0_0Provider.java b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v2_0_0/Wfs2_0_0Provider.java index 3cb0c191c0..e69acae490 100644 --- a/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v2_0_0/Wfs2_0_0Provider.java +++ b/edexOsgi/com.raytheon.uf.edex.wfs/src/com/raytheon/uf/edex/wfs/v2_0_0/Wfs2_0_0Provider.java @@ -67,8 +67,6 @@ import org.w3.xmlschema.Schema; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.ogc.common.OgcException; import com.raytheon.uf.edex.ogc.common.OgcOperationInfo; @@ -119,6 +117,7 @@ import com.raytheon.uf.edex.wfs.util.XMLGregorianCalendarConverter; * ------------ ---------- ----------- -------------------------- * Oct 17, 2012 bclement Initial creation * Sep 18, 2013 #411 skorolev Added required RESPONSE METADATA + * Nov 11, 2013 2539 bclement moved registry/marshal to parent * * * @@ -128,14 +127,10 @@ import com.raytheon.uf.edex.wfs.util.XMLGregorianCalendarConverter; public class Wfs2_0_0Provider extends AbstractWfsProvider implements IStoredQueryCallback { - protected final IUFStatusHandler log = UFStatus.getHandler(this.getClass()); - public static final String version = "2.0.0"; public static final MimeType GML_MIME = GmlUtils.GML32_TYPE; - protected WfsRegistryImpl registry; - protected final Capabilities capabilities; protected final Gml32FeatureFetcher features; @@ -151,10 +146,10 @@ public class Wfs2_0_0Provider extends AbstractWfsProvider implements protected final NamespaceContext nsContext; public Wfs2_0_0Provider(WfsRegistryImpl registry) { + super(registry); this.capabilities = new Capabilities(registry); this.features = new Gml32FeatureFetcher(registry); this.describer = new FeatureDescriber(registry, this); - this.registry = registry; // this name must match preloaded store in utility directory this.queryStore = new FileSystemQueryStore(registry, "wfsQueryStore"); Map reverseNsMap = new HashMap( @@ -169,10 +164,10 @@ public class Wfs2_0_0Provider extends AbstractWfsProvider implements * Unit tests */ protected Wfs2_0_0Provider() { + super(null); this.capabilities = null; this.features = null; this.describer = null; - this.registry = null; this.queryStore = null; this.nsContext = null; } @@ -384,34 +379,7 @@ public class Wfs2_0_0Provider extends AbstractWfsProvider implements return rval; } - /** - * Marshal object through response. Response cannot be reused after this - * method is called. - * - * @param jaxbobject - * @param mimeType - * @param response - * @throws Exception - * on unrecoverable error attempting to send response - */ - protected void marshalResponse(Object jaxbobject, MimeType mimeType, - IOgcHttpResponse response) throws Exception { - OutputStream out = null; - try { - out = response.getOutputStream(); - response.setContentType(mimeType.toString()); - registry.marshal(jaxbobject, response.getOutputStream()); - } catch (Exception e) { - log.error("Unable to marshal WFS response", e); - OgcResponse err = getError(new WfsException( - Code.OperationProcessingFailed), null); - OgcResponseOutput.sendText(err, response, out); - } finally { - if (out != null) { - out.close(); - } - } - } + /** * Get features as JAXB object