/*************************************************************** Copyright (C) 2009-2013 by 52 North Initiative for Geospatial Open Source Software GmbH Contact: Andreas Wytzisk 52 North Initiative for Geospatial Open Source Software GmbH Martin-Luther-King-Weg 24 48155 Muenster, Germany info@52north.org This program is free software; you can redistribute and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed WITHOUT ANY WARRANTY; even without the implied WARRANTY OF MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see gnu-gpl v2.txt). If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA or visit the Free Software Foundation web page, http://www.fsf.org. ***************************************************************/ package org.n52.wps.ags.workspace; import java.io.File; import java.io.IOException; import java.util.List; import org.slf4j.Logger; import org.n52.wps.ags.workspace.ServerContextFactory.LockedServerContext; import org.n52.wps.ags.workspace.feature.SpatialRelation; import org.n52.wps.ags.workspace.feature.SpatialRelationFeaturePair; import com.esri.arcgis.geoprocessing.GeoProcessor; import com.esri.arcgis.interop.AutomationException; import com.esri.arcgis.server.IServerContext; import com.esri.arcgis.system.IVariantArray; import com.esri.arcgis.system.VarArray; /** * @author Matthias Mueller, TU Dresden * */ public class AGSWorkspace { private static Logger LOGGER = LoggerFactory.getLogger(AGSWorkspace.class); private final File workspaceDir; public AGSWorkspace(File workspace){ workspaceDir = workspace; } public final void executeGPTool(String toolName, String toolboxPath, String[] parameters) throws IOException { LockedServerContext context = null; try { context = ServerContextFactory.retrieveContext(); GeoProcessor gp = (GeoProcessor) (context.getContext().createObject(GeoProcessor.getClsid())); IVariantArray paramsPreparedForGeoProcessor = (VarArray)(context.getContext().createObject(VarArray.getClsid())); for (int i = 0; i < parameters.length; i++) { paramsPreparedForGeoProcessor.add(parameters[i]); } if (toolboxPath != null){ gp.addToolbox(toolboxPath); if (LOGGER.isInfoEnabled()) LOGGER.info("Added: " + toolboxPath); } if (LOGGER.isInfoEnabled()) LOGGER.info("Executing GPTool " +toolName); gp.execute(toolName, paramsPreparedForGeoProcessor, null); if (LOGGER.isInfoEnabled()) LOGGER.info("done!"); } catch (AutomationException ae){ LOGGER.error("Caught J-Integra AutomationException: " + ae.getMessage() + "\n"); throw new IOException("Error executing ArcGIS Server geoprocessor."); } catch (IOException e){ LOGGER.error("Caught IOException: " + e.getMessage() + "\n"); throw new IOException("Error executing ArcGIS Server geoprocessor."); } finally { if (context != null) ServerContextFactory.returnContext(context); } } public final File getWorkspace(){ return this.workspaceDir; } public static void shutdown() { try { ServerContextFactory.releaseAllCachedContexts(); } catch (IOException e) { LOGGER.error(e.getMessage(), e); } } public Object createObject(String clsid, IServerContext context) throws IOException { return context.createObject(clsid); } public boolean isReady() throws IOException { LockedServerContext context = ServerContextFactory.retrieveContext(); boolean result = context.getContext() != null; ServerContextFactory.returnContext(context); return result; } private SpatialRelationFeaturePair createRelationFeaturePair(List<File> shapeFiles) throws IOException { return new SpatialRelationFeaturePair(shapeFiles); } public boolean evaluateSpatialRelation(SpatialRelation relation, List<File> createShapefilesForFeatures) throws IOException { SpatialRelationFeaturePair pair = createRelationFeaturePair(createShapefilesForFeatures); boolean result = false; switch (relation) { case CONTAINS: result = pair.contains(); break; case COVERS: result = pair.covers(); break; case CROSSES: result = pair.crosses(); break; case OVERLAPS: result = pair.overlaps(); break; case EQUALS: result = pair.equals(); break; case WITHIN: result = pair.within(); break; case INTERSECTS: result = !pair.disjoint(); break; case DISJOINT: result = pair.disjoint(); break; case TOUCHES: result = pair.touches(); break; } pair.releaseContext(); return result; } }