/**
* Copyright (C) 2007 - 2014 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.transactional.service;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.opengis.wps.x100.ProcessDescriptionType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.n52.wps.PropertyDocument.Property;
import org.n52.wps.commons.WPSConfig;
import org.n52.wps.server.IAlgorithm;
import org.n52.wps.server.ITransactionalAlgorithmRepository;
import org.n52.wps.server.request.ExecuteRequest;
import org.n52.wps.transactional.algorithm.GenericTransactionalAlgorithm;
import org.n52.wps.transactional.deploy.AbstractProcessManager;
import org.n52.wps.transactional.deploy.IProcessManager;
import org.n52.wps.transactional.request.DeployProcessRequest;
import org.n52.wps.transactional.request.UndeployProcessRequest;
public class GenericTransactionalProcessRepository implements ITransactionalAlgorithmRepository{
private static Logger LOGGER = LoggerFactory.getLogger(GenericTransactionalProcessRepository.class);
protected Map<String, ProcessDescriptionType> processDescriptionMap;
protected IProcessManager deployManager;
public GenericTransactionalProcessRepository(String format){
Property[] properties = WPSConfig.getInstance().getPropertiesForRepositoryClass(this.getClass().getName());
//TODO think of multiple instance of this class registered (yet not possible since singleton)
Property deployManagerXML = WPSConfig.getInstance().getPropertyForKey(properties, "DeployManager");
if(deployManagerXML==null){
throw new RuntimeException("Error. Could not find matching DeployManager");
}
processDescriptionMap = new HashMap<String, ProcessDescriptionType>();
String className = deployManagerXML.getStringValue();
try {
Class deployManagerClass = Class.forName(className);
if(deployManagerClass.asSubclass(AbstractProcessManager.class).equals(deployManagerClass)){
Constructor constructor = deployManagerClass.getConstructor(ITransactionalAlgorithmRepository.class);
deployManager = (IProcessManager) constructor.newInstance(this);
}else{
deployManager = (IProcessManager) deployManagerClass.newInstance();
}
} catch (InstantiationException e) {
e.printStackTrace();
throw new RuntimeException("Error. Could not find matching DeployManager");
} catch (IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException("Error. Could not find matching DeployManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("Error. Could not find matching DeployManager");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean addAlgorithm(Object process) {
if(!(process instanceof DeployProcessRequest)){
return false;
}
DeployProcessRequest request = (DeployProcessRequest) process;
try {
deployManager.deployProcess(request);
} catch (Exception e) {
LOGGER.warn("Could not instantiate algorithm: " + request);
e.printStackTrace();
return false;
}
return true;
}
public boolean containsAlgorithm(String processID) {
try {
return deployManager.containsProcess(processID);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public IAlgorithm getAlgorithm(String processID) {
return new GenericTransactionalAlgorithm(processID, this.getClass());
}
public Collection<String> getAlgorithmNames() {
try {
return deployManager.getAllProcesses();
} catch (Exception e) {
e.printStackTrace();
return new ArrayList<String>();
}
}
public Collection<IAlgorithm> getAlgorithms() {
Collection<IAlgorithm> result = new ArrayList<IAlgorithm>();
Collection<String> allAlgorithms;
try {
allAlgorithms = deployManager.getAllProcesses();
} catch (Exception e) {
e.printStackTrace();
return new ArrayList<IAlgorithm>();
}
for(String processID : allAlgorithms){
result.add(new GenericTransactionalAlgorithm(processID, this.getClass()));
}
return result;
}
public boolean removeAlgorithm(Object process) {
if(!(process instanceof UndeployProcessRequest)){
return false;
}
UndeployProcessRequest request = (UndeployProcessRequest) process;
try {
deployManager.unDeployProcess(request);
} catch (Exception e) {
LOGGER.warn("Could not remove algorithm: " + request);
e.printStackTrace();
return false;
}
processDescriptionMap.remove(request.getProcessID());
return true;
}
@Override
public ProcessDescriptionType getProcessDescription(String processID) {
if(!processDescriptionMap.containsKey(processID)){
processDescriptionMap.put(processID, getAlgorithm(processID).getDescription());
}
return processDescriptionMap.get(processID);
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
}