awips2/tests/manual/com/raytheon/uf/common/comm/MockWfsRequestBuilder.java
Dave Hladky cfbbc7336f Issue Initial update for OGC services
Change-Id: I1bc8fc8a4c125bc79057c4af929c0495f0e5eb99

Former-commit-id: d4407744c2 [formerly d3bae9e065] [formerly 83dba7b655] [formerly bef4b3cdbd [formerly 83dba7b655 [formerly 875006e24de0755cdd0dedc7b0afcf221bcbad49]]]
Former-commit-id: bef4b3cdbd
Former-commit-id: e08c7ddce03a7cbe60a4ac8ba5e3f76990cd7780 [formerly 37062aac21]
Former-commit-id: 6a1a06e3ee
2013-08-28 08:24:45 -05:00

176 lines
6 KiB
Java

package com.raytheon.uf.common.comm;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.geotools.geometry.jts.ReferencedEnvelope;
import com.raytheon.uf.common.datadelivery.registry.Coverage;
import com.raytheon.uf.common.datadelivery.registry.EnvelopeUtils;
import com.raytheon.uf.common.datadelivery.registry.Time;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.vividsolutions.jts.geom.Coordinate;
/**
*
* WFS Request Builder.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 18, 2013 2120 dhladky Initial Release
*
* </pre>
*
* @author dhladky
* @version 1.0
*/
public class MockWfsRequestBuilder {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(MockWfsRequestBuilder.class);
public static final String crs = "crs:84";
private final String wfsURL;
private final String version = "1.1.0";
private String typeName = null;
public MockWfsRequestBuilder(RetrievalAttribute ra) {
this.typeName = ra.getPlugin();
StringBuilder buffer = new StringBuilder();
buffer.append(createHeader(version, typeName));
buffer.append("<ogc:Filter>\n");
if (ra.getCoverage() != null && ra.getTime() != null) {
buffer.append("<ogc:And>\n");
}
buffer.append(processTime(ra.getTime(), typeName));
buffer.append(processCoverage(ra.getCoverage()));
if (ra.getCoverage() != null && ra.getTime() != null) {
buffer.append("</ogc:And>\n");
}
buffer.append("</ogc:Filter>\n");
buffer.append(createFooter());
this.wfsURL = buffer.toString().trim();
System.out.println(wfsURL);
}
private static SimpleDateFormat getDateFormat() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
return sdf;
}
public String createHeader(String version, String typeName) {
int maxfeatures = 5000;
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" ?>\n");
sb.append("<wfs:GetFeature service=\"WFS\"\n");
sb.append("version=\"").append(version).append("\"\n");
sb.append("outputFormat=\"application/gml+xml; version=3.1\"\n");
sb.append("xmlns:").append(typeName).append("=\"http://").append(typeName).append(".edex.uf.raytheon.com\"\n");
sb.append("xmlns:wfs=\"http://www.opengis.net/wfs\"\n");
sb.append("xmlns:gml=\"http://www.opengis.net/gml\"\n");
sb.append("xmlns:ogc=\"http://www.opengis.net/ogc\"\n");
sb.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
sb.append("xsi:schemaLocation=\"http://www.opengis.net/wfs../wfs/").append(version).append("/WFS.xsd\">\n");
sb.append("<wfs:Query typeName=\"").append(typeName).append(":").append(typeName).append("\" maxFeatures=\""+maxfeatures+"\">\n");
return sb.toString();
}
public String createFooter() {
StringBuilder sb = new StringBuilder();
sb.append("</wfs:Query>\n");
sb.append("</wfs:GetFeature>\n");
return sb.toString();
}
public String processCoverage(Coverage coverage) {
ReferencedEnvelope re = coverage.getRequestEnvelope();
Coordinate ll = EnvelopeUtils.getLowerLeftLatLon(re);
Coordinate ur = EnvelopeUtils.getUpperRightLatLon(re);
// manage the box
double lowerLon = ll.x;
double lowerLat = ll.y;
double upperLon = ur.x;
double upperLat = ur.y;
StringBuilder sb = new StringBuilder();
sb.append("<ogc:Within>\n");
sb.append("<ogc:PropertyName>location/location</ogc:PropertyName>\n");
sb.append("<gml:Envelope srsName=\"").append(crs).append("\">\n");
sb.append("<gml:lowerCorner>");
sb.append(lowerLon);
sb.append(" ");
sb.append(lowerLat);
sb.append("</gml:lowerCorner>\n");
sb.append("<gml:upperCorner>");
sb.append(upperLon);
sb.append(" ");
sb.append(upperLat);
sb.append("</gml:upperCorner>\n");
sb.append("</gml:Envelope>\n");
sb.append("</ogc:Within>\n");
return sb.toString();
}
public String processTime(Time inTime, String typeName) {
try {
if (inTime.getStartDate() != null) {
Date sDate = inTime.getRequestStartAsDate();
Date eDate = inTime.getRequestEndAsDate();
String endDateString = getDateFormat().format(eDate);
String startDateString = getDateFormat().format(sDate);
StringBuilder sb = new StringBuilder();
sb.append("<ogc:PropertyIsGreaterThan>\n");
sb.append("<ogc:PropertyName>").append(typeName).append(":timeObs</ogc:PropertyName>\n");
sb.append("<ogc:Literal>").append(startDateString).append("</ogc:Literal>\n");
sb.append("</ogc:PropertyIsGreaterThan>\n");
if (endDateString != null) {
sb.append("<ogc:PropertyIsLessThan>\n");
sb.append("<ogc:PropertyName>").append(typeName).append(":timeObs</ogc:PropertyName>\n");
sb.append("<ogc:Literal>").append(endDateString).append("</ogc:Literal>\n");
sb.append("</ogc:PropertyIsLessThan>\n");
}
return sb.toString();
}
} catch (Exception e) {
statusHandler.error("Couldn't parse Time object." + e);
}
// no times, return blank
return "";
}
public String getRequest() {
return wfsURL;
}
}