📄 coverageseditoraction.java
字号:
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.vfny.geoserver.action.data;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.factory.FactoryRegistryException;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.NamedIdentifier;
import org.geotools.resources.CRSUtilities;
import org.opengis.coverage.grid.Format;
import org.opengis.geometry.MismatchedDimensionException;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.cs.AxisDirection;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import org.vfny.geoserver.action.ConfigAction;
import org.vfny.geoserver.action.HTMLEncoder;
import org.vfny.geoserver.config.CoverageConfig;
import org.vfny.geoserver.config.DataConfig;
import org.vfny.geoserver.form.data.CoveragesEditorForm;
import org.vfny.geoserver.global.CoverageStoreInfo;
import org.vfny.geoserver.global.Data;
import org.vfny.geoserver.global.GeoserverDataDirectory;
import org.vfny.geoserver.global.MetaDataLink;
import org.vfny.geoserver.global.UserContainer;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* These Action handles all the buttons for the Coverage Editor.
*
* <p>
* Buttons that make this action go:
*
* <ul>
* <li> Submit: update the CoverageConfig held by the user, punt it back into
* DataConfig and return to the CoverageSelect screen. </li>
* </ul>
*
* As usual we will have to uninternationlize the action name provided to us.
* </p>
*
* @author Richard Gould
* @author Jody Garnett
* @author $Author: Alessio Fabiani (alessio.fabiani@gmail.com) $ (last
* modification)
* @author $Author: Simone Giannecchini (simboss1@gmail.com) $ (last
* modification)
*/
public final class CoveragesEditorAction extends ConfigAction {
public ActionForward execute(ActionMapping mapping, ActionForm form, UserContainer user,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer(new StringBuffer("form bean:").append(form.getClass().getName()).toString());
}
final CoveragesEditorForm coverageForm = (CoveragesEditorForm) form;
String action = coverageForm.getAction();
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer(new StringBuffer("CoveragesEditorAction is ").append(action).toString());
}
String newCoverage = coverageForm.getNewCoverage();
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer(new StringBuffer("CoveragesEditorNew is ").append(newCoverage).toString());
}
Locale locale = (Locale) request.getLocale();
MessageResources messages = getResources(request);
final String SUBMIT = HTMLEncoder.decode(messages.getMessage(locale, "label.submit"));
final String ENVELOPE = HTMLEncoder.decode(messages.getMessage(locale,
"config.data.calculateBoundingBox.label"));
final String LOOKUP_SRS = HTMLEncoder.decode(messages.getMessage(locale,
"config.data.lookupSRS.label"));
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer(new StringBuffer("ENVELOPE: ").append(ENVELOPE).toString());
}
if (SUBMIT.equals(action)) {
return executeSubmit(mapping, coverageForm, user, request);
}
if ((newCoverage != null) && "true".equals(newCoverage)) {
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer(new StringBuffer("NEW COVERAGE: ").append(newCoverage).toString());
}
request.setAttribute(DataCoveragesNewAction.NEW_COVERAGE_KEY, "true");
}
if (ENVELOPE.equals(action)) {
return executeEnvelope(mapping, coverageForm, user, request);
}
if (LOOKUP_SRS.equals(action)) {
return executeLookupSRS(mapping, coverageForm, user, request);
}
// Update, Up, Down, Add, Remove need to resync
try {
sync(coverageForm, user.getCoverageConfig(), request);
} catch (FactoryException e) {
throw new ServletException(e);
}
form.reset(mapping, request);
return mapping.findForward("config.data.coverage.editor");
}
/**
* Populate the bounding box fields from the source and pass control back to
* the UI
*
* @param mapping
* DOCUMENT ME!
* @param coverageForm
* DOCUMENT ME!
* @param user
* DOCUMENT ME!
* @param request
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IOException
* DOCUMENT ME!
* @throws ServletException
* DOCUMENT ME!
*/
private ActionForward executeEnvelope(ActionMapping mapping, CoveragesEditorForm coverageForm,
UserContainer user, HttpServletRequest request)
throws IOException, ServletException {
final String formatID = coverageForm.getFormatId();
final Data catalog = getData();
CoverageStoreInfo cvStoreInfo = catalog.getFormatInfo(formatID);
if (cvStoreInfo == null) {
cvStoreInfo = new CoverageStoreInfo(getDataConfig().getDataFormat(formatID).toDTO(),
catalog);
}
final Format format = cvStoreInfo.getFormat();
AbstractGridCoverage2DReader reader = (AbstractGridCoverage2DReader) cvStoreInfo.getReader();
if (reader == null) {
reader = (AbstractGridCoverage2DReader) ((AbstractGridFormat) format).getReader(GeoserverDataDirectory
.findDataFile(cvStoreInfo.getUrl()));
}
try {
final CoordinateReferenceSystem sourceCRS = reader.getCrs();
final GeneralEnvelope gEnvelope = reader.getOriginalEnvelope();
final GeneralEnvelope targetEnvelope = gEnvelope;
GeneralEnvelope envelope = targetEnvelope;
if (sourceCRS.getIdentifiers().isEmpty()) {
String nativeCRS = coverageForm.getSrsName();
if (nativeCRS != null) {
MathTransform transform;
if (!nativeCRS.toUpperCase().startsWith("EPSG:")) {
try {
nativeCRS = "EPSG:" + Integer.decode(nativeCRS);
transform = CRS.findMathTransform(sourceCRS, CRS.decode(nativeCRS), true);
envelope = CRSUtilities.transform(transform, envelope);
coverageForm.setSrsName(nativeCRS);
} catch (NumberFormatException e) {
coverageForm.setSrsName("UNKNOWN");
}
} else {
transform = CRS.findMathTransform(sourceCRS, CRS.decode(nativeCRS), true);
envelope = CRSUtilities.transform(transform, envelope);
}
} else {
coverageForm.setSrsName("UNKNOWN");
}
} else {
String identifier = sourceCRS.getIdentifiers().toArray()[0].toString();
/*
* CRS.lookupIdentifier(sourceCRS, Collections
* .singleton("EPSG"), false);
*/
if ((identifier != null) && !identifier.startsWith("EPSG:")) {
identifier = "EPSG:" + identifier;
}
coverageForm.setSrsName(identifier);
}
coverageForm.setWKTString(sourceCRS.toWKT());
coverageForm.setMinX(Double.toString(envelope.getLowerCorner().getOrdinate(0)));
coverageForm.setMaxX(Double.toString(envelope.getUpperCorner().getOrdinate(0)));
coverageForm.setMinY(Double.toString(envelope.getLowerCorner().getOrdinate(1)));
coverageForm.setMaxY(Double.toString(envelope.getUpperCorner().getOrdinate(1)));
} catch (FactoryRegistryException e) {
throw new ServletException(e);
} catch (MismatchedDimensionException e) {
throw new ServletException(e);
} catch (IndexOutOfBoundsException e) {
throw new ServletException(e);
} catch (NoSuchAuthorityCodeException e) {
throw new ServletException(e);
} catch (FactoryException e) {
throw new ServletException(e);
} catch (TransformException e) {
throw new ServletException(e);
}
return mapping.findForward("config.data.coverage.editor");
}
/**
* Sync generated attributes with schemaBase.
*
* @param form
* @param config
* @throws FactoryException
*/
private void sync(CoveragesEditorForm form, CoverageConfig config, HttpServletRequest request)
throws FactoryException {
config.setDefaultInterpolationMethod(form.getDefaultInterpolationMethod());
config.setDescription(form.getDescription());
config.setInterpolationMethods(interpolationMethods(form));
config.setKeywords(keyWords(form));
config.setLabel(form.getLabel());
config.setMetadataLink(metadataLink(form));
config.setNativeFormat(form.getNativeFormat());
config.setRequestCRSs(requestCRSs(form));
config.setResponseCRSs(responseCRSs(form));
config.setCrs(CRS.parseWKT(form.getWKTString()));
if(!form.getSrsName().toUpperCase().startsWith("EPSG"))
config.setSrsName("EPSG:" + form.getSrsName());
else
config.setSrsName(form.getSrsName());
config.setSrsWKT(form.getWKTString());
if (!"UNKNOWN".equals(config.getSrsName()) && (config.getSrsName() != null)
&& config.getSrsName().toUpperCase().startsWith("EPSG:")) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -