/*
* Copyright 1998-2014 University Corporation for Atmospheric Research/Unidata
*
* Portions of this software were developed by the Unidata Program at the
* University Corporation for Atmospheric Research.
*
* Access and use of this software shall impose the following obligations
* and understandings on the user. The user is granted the right, without
* any fee or cost, to use, copy, modify, alter, enhance and distribute
* this software, and any derivative works thereof, and its supporting
* documentation for any purpose whatsoever, provided that this entire
* notice appears in all copies of the software, derivative works and
* supporting documentation. Further, UCAR requests that the user credit
* UCAR/Unidata in any publications that result from the use of this
* software or in any product that includes this software. The names UCAR
* and/or Unidata, however, may not be used in any advertising or publicity
* to endorse or promote any products or commercial entity unless specific
* written permission is obtained from UCAR/Unidata. The user also
* understands that UCAR/Unidata is not obligated to provide the user with
* any support, consulting, training or assistance of any kind with regard
* to the use, operation and performance of this software nor to provide
* the user with any updates, revisions, new versions or "bug fixes."
*
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package thredds.server.wcs.v1_0_0_1;
import thredds.servlet.ServletUtil;
import thredds.server.wcs.VersionHandler;
import thredds.util.ContentType;
import thredds.util.Version;
import thredds.wcs.Request;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import ucar.nc2.constants.CDM;
import ucar.nc2.util.DiskCache2;
/**
* _more_
*
* @author edavis
* @since 4.0
*/
public class WcsHandler implements VersionHandler {
private static org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(WcsHandler.class);
private Version version;
/**
* Declare the default constructor to be package private.
*
* @param verString the version string.
*/
public WcsHandler(String verString) {
this.version = new Version(verString);
}
public Version getVersion() {
return this.version;
}
public VersionHandler setDiskCache(DiskCache2 diskCache) {
thredds.wcs.v1_0_0_1.WcsCoverage.setDiskCache(diskCache);
return this;
}
private boolean deleteImmediately = true;
public VersionHandler setDeleteImmediately(boolean deleteImmediately) {
this.deleteImmediately = deleteImmediately;
return this;
}
public void handleKVP(HttpServlet servlet, HttpServletRequest req, HttpServletResponse res) throws IOException {
thredds.wcs.v1_0_0_1.WcsRequest request = null;
try {
URI serverURI = new URI(req.getRequestURL().toString());
request = WcsRequestParser.parseRequest(this.getVersion().getVersionString(), serverURI, req, res);
if (request.getOperation().equals(Request.Operation.GetCapabilities)) {
res.setContentType(ContentType.xml.getContentHeader());
res.setStatus(HttpServletResponse.SC_OK);
//res.setCharacterEncoding(CDM.UTF8);
PrintWriter pw = res.getWriter();
((thredds.wcs.v1_0_0_1.GetCapabilities) request).writeCapabilitiesReport(pw);
pw.flush();
} else if (request.getOperation().equals(Request.Operation.DescribeCoverage)) {
res.setContentType(ContentType.xml.getContentHeader());
res.setStatus(HttpServletResponse.SC_OK);
res.setCharacterEncoding(CDM.UTF8);
PrintWriter pw = res.getWriter();
((thredds.wcs.v1_0_0_1.DescribeCoverage) request).writeDescribeCoverageDoc(pw);
pw.flush();
} else if (request.getOperation().equals(Request.Operation.GetCoverage)) {
File covFile = ((thredds.wcs.v1_0_0_1.GetCoverage) request).writeCoverageDataToFile();
if (covFile != null && covFile.exists()) {
int pos = covFile.getPath().lastIndexOf(".");
String suffix = covFile.getPath().substring(pos);
String resultFilename = request.getDataset().getDatasetName(); // this is name browser will show
if (!resultFilename.endsWith(suffix))
resultFilename = resultFilename + suffix;
res.setHeader("Content-Disposition", "attachment; filename=\"" + resultFilename + "\"");
ServletUtil.returnFile(servlet, "", covFile.getPath(), req, res, ((thredds.wcs.v1_0_0_1.GetCoverage) request).getFormat().getMimeType());
if (deleteImmediately) covFile.delete();
} else {
log.error("handleKVP(): Failed to create coverage file" + (covFile == null ? "" : (": " + covFile.getAbsolutePath())));
throw new thredds.wcs.v1_0_0_1.WcsException("Problem creating requested coverage.");
}
}
} catch (thredds.wcs.v1_0_0_1.WcsException e) {
handleExceptionReport(res, e);
} catch (URISyntaxException e) {
handleExceptionReport(res, new thredds.wcs.v1_0_0_1.WcsException("Bad URI: " + e.getMessage()));
} catch (Throwable t) {
log.error("Unknown problem.", t);
handleExceptionReport(res, new thredds.wcs.v1_0_0_1.WcsException("Unknown problem", t));
} finally {
if (request != null && request.getDataset() != null) {
request.getDataset().close();
}
}
}
public thredds.wcs.v1_0_0_1.GetCapabilities.ServiceInfo getServiceInfo() {
// Todo Figure out how to configure serviceId info.
thredds.wcs.v1_0_0_1.GetCapabilities.ServiceInfo sid;
thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty respParty;
thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty.ContactInfo contactInfo;
contactInfo = new thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty.ContactInfo(
Collections.singletonList("voice phone"),
Collections.singletonList("voice phone"),
new thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty.Address(
Collections.singletonList("address"), "city", "admin area", "postal code", "country",
Collections.singletonList("email")
),
new thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty.OnlineResource(null, "title")
);
respParty = new thredds.wcs.v1_0_0_1.GetCapabilities.ResponsibleParty("indiv name", "org name", "position",
contactInfo);
sid = new thredds.wcs.v1_0_0_1.GetCapabilities.ServiceInfo("name", "label", "description",
Collections.singletonList("keyword"),
respParty, "no fees",
Collections.singletonList("no access constraints"));
return sid;
}
public void handleExceptionReport(HttpServletResponse res, thredds.wcs.v1_0_0_1.WcsException exception)
throws IOException {
res.setContentType(ContentType.ogc_exception.getContentHeader());
res.setStatus(HttpServletResponse.SC_BAD_REQUEST);
thredds.wcs.v1_0_0_1.ExceptionReport exceptionReport = new thredds.wcs.v1_0_0_1.ExceptionReport(exception);
PrintWriter pw = res.getWriter();
exceptionReport.writeExceptionReport(pw);
pw.flush();
}
public void handleExceptionReport(HttpServletResponse res, String code, String locator, String message)
throws IOException {
thredds.wcs.v1_0_0_1.WcsException.Code c;
thredds.wcs.v1_0_0_1.WcsException exception;
try {
c = thredds.wcs.v1_0_0_1.WcsException.Code.valueOf(code);
exception = new thredds.wcs.v1_0_0_1.WcsException(c, locator, message);
} catch (IllegalArgumentException e) {
exception = new thredds.wcs.v1_0_0_1.WcsException(message);
log.debug("handleExceptionReport(): bad code given [" + code + "].");
}
handleExceptionReport(res, exception);
}
public void handleExceptionReport(HttpServletResponse res, String code, String locator, Throwable t)
throws IOException {
handleExceptionReport(res, code, locator, t.getMessage());
if (t instanceof FileNotFoundException)
log.info("handleExceptionReport", t.getMessage()); // dont clutter up log files
else
log.info("handleExceptionReport", t);
}
}