/** * Copyright (C) 2008 - 2016 52°North Initiative for Geospatial Open Source * Software GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. * * If the program is linked with libraries which are licensed under one of * the following licenses, the combination of the program with the linked * library is not considered a "derivative work" of the program: * * • Apache License, version 2.0 * • Apache Software License, version 1.0 * • GNU Lesser General Public License, version 3 * • Mozilla Public License, versions 1.0, 1.1 and 2.0 * • Common Development and Distribution License (CDDL), version 1.0 * * Therefore the distribution of the program linked with libraries licensed * under the aforementioned licenses, is permitted by the copyright holders * if the distribution is compliant with both the GNU General Public * License version 2 and the aforementioned licenses. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. */ package org.n52.wps.server.sextante; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import net.opengis.wps.x100.ProcessDescriptionType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.xmlbeans.XmlException; import org.n52.wps.PropertyDocument.Property; import org.n52.wps.commons.WPSConfig; import org.n52.wps.server.IAlgorithm; import org.n52.wps.server.IAlgorithmRepository; import org.n52.wps.server.sextante.SextanteProcessDescriptionCreator.UnsupportedGeoAlgorithmException; import es.unex.sextante.core.GeoAlgorithm; import es.unex.sextante.core.Sextante; import es.unex.sextante.exceptions.NullParameterAdditionalInfoException; /* * A container, which allows the 52n WPS to recognize the sextante library. * Basic initialization is performed here. * * Whenever a getcapabilities request comes in, the process names are extraced based on the available process description documents for sextante processes. * This should be changed in the future, when process descriptions should be generated automatically. When a execute process request comes in, a generic GenericSextanteProcessDelegator is created. */ public class SextanteProcessRepository implements IAlgorithmRepository{ private static Logger LOGGER = LoggerFactory.getLogger(SextanteProcessRepository.class); private Map<String, ProcessDescriptionType> registeredProcesses; public SextanteProcessRepository(){ LOGGER.info("Initializing Sextante Repository"); registeredProcesses = new HashMap<String, ProcessDescriptionType>(); /* * get properties of Repository * * check whether process is amongst them and active * * if properties are empty (not initialized yet) * add all valid processes to WPSConfig */ Property[] propertyProcesses = WPSConfig.getInstance().getPropertiesForRepositoryClass(this.getClass().getName()); ArrayList<String> processList = new ArrayList<String>(propertyProcesses.length); for (Property prop : propertyProcesses) { if(prop.getActive()){ processList.add(prop.getStringValue()); }else{ LOGGER.info("Sextante Process : " + prop.getStringValue() + " not active."); } } Sextante.initialize(); HashMap<String, HashMap<String, GeoAlgorithm>> sextanteMap = Sextante.getAlgorithms(); HashMap<String, GeoAlgorithm> algorithmMap = sextanteMap.get("SEXTANTE"); Set<String> keys = algorithmMap.keySet(); SextanteProcessDescriptionCreator descriptionCreator = new SextanteProcessDescriptionCreator(); for(Object keyObject : keys){ String key = (String) keyObject; if(!processList.contains(key)){ LOGGER.info("Did not add Sextante Process : " + key +". Not in Repository properties or not active."); continue; } GeoAlgorithm sextanteProcess = Sextante.getAlgorithmFromCommandLineName(key); ProcessDescriptionType processDescription; try { processDescription = descriptionCreator.createDescribeProcessType(sextanteProcess); } catch (NullParameterAdditionalInfoException e) { LOGGER.warn("Could not add Sextante Process : " + key +". Errors while creating describe Process"); continue; } catch (UnsupportedGeoAlgorithmException e) { LOGGER.warn("Could not add Sextante Process : " + key + ". Errors while creating describe Process"); continue; } registeredProcesses.put(key, processDescription); LOGGER.info("Sextante Process " + key + " added."); } LOGGER.info("Initialization of Sextante Repository successfull"); } public boolean addAlgorithm(Object describeProcess) { String processName = ""; ProcessDescriptionType document = null; try { if(describeProcess instanceof File){ document = ProcessDescriptionType.Factory.parse((File)describeProcess); } if(describeProcess instanceof ProcessDescriptionType){ document = (ProcessDescriptionType) describeProcess; } } catch (IOException e) { LOGGER.warn("Could not add Sextante Extension Process. Identifier: Unknown", e); e.printStackTrace(); } catch (XmlException e) { e.printStackTrace(); } if(describeProcess == null){ throw new RuntimeException("Could not add process"); } registeredProcesses.put(document.getIdentifier().getStringValue(), document); LOGGER.info("Sextante Extension Process "+ processName + " added successfully"); return true; } public boolean containsAlgorithm(String processID) { if(registeredProcesses.containsKey(processID)){ return true; } LOGGER.warn("Could not find Sextante Process " + processID); return false; } public IAlgorithm getAlgorithm(String processID) { if(!containsAlgorithm(processID)){ throw new RuntimeException("Could not allocate Process"); } return new GenericSextanteProcessDelegator(processID, registeredProcesses.get(processID)); } public Collection<String> getAlgorithmNames() { return registeredProcesses.keySet(); } public boolean removeAlgorithm(Object className) { //not implemented return false; } @Override public ProcessDescriptionType getProcessDescription(String processID) { if(!registeredProcesses.containsKey(processID)){ registeredProcesses.put(processID, getAlgorithm(processID).getDescription()); } return registeredProcesses.get(processID); } @Override public void shutdown() { // TODO Auto-generated method stub } }