package peal.impl.processmodel;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
import betsy.bpel.engines.AbstractLocalBPELEngine;
import betsy.bpel.model.BPELProcess;
import betsy.bpmn.engines.AbstractBPMNEngine;
import betsy.bpmn.model.BPMNProcess;
import betsy.common.engines.EngineAPI;
import betsy.common.tasks.FileTasks;
import org.xml.sax.SAXException;
import peal.DeploymentException;
import peal.ProcessLanguage;
import peal.ProcessModelService;
import peal.helper.ZipFileHelper;
import peal.identifier.EngineId;
import peal.identifier.ProcessModelId;
import peal.impl.engine.EngineServiceImpl;
import peal.observer.ProcessModelState;
import peal.packages.DeploymentPackage;
import peal.packages.ProcessModelPackage;
import pebl.benchmark.feature.Capability;
import pebl.benchmark.feature.Feature;
import pebl.benchmark.feature.FeatureSet;
import pebl.benchmark.feature.Group;
import pebl.benchmark.feature.Language;
import pebl.benchmark.test.Test;
@WebService
public class ProcessModelServiceImpl implements ProcessModelService {
private final EngineServiceImpl engineService;
public ProcessModelServiceImpl(EngineServiceImpl engineService) {
this.engineService = engineService;
}
@Override
public DeploymentPackage makeDeployable(EngineId engineId, ProcessModelPackage processModelPackage) {
EngineAPI<?> engine = engineService.getEngineByID(engineId);
try {
Path folder = ZipFileHelper.extractIntoTemporaryFolder(processModelPackage);
ProcessLanguage processLanguage = engineService.getSupportedLanguage(engineId);
if(processLanguage == ProcessLanguage.BPEL) {
AbstractLocalBPELEngine bpelEngine = (AbstractLocalBPELEngine) engine;
ProcessModelId processModelId = determineProcessModelIdInBPELProcess(engineId, folder);
ZipFileHelper.adjustFileNameOfBpelToProcessName(folder);
Path bpelFile = ZipFileHelper.findBpelFileInPath(folder);
String language = processLanguage.toString();
Feature feature = new Feature(new FeatureSet(new Group("group", new Language(new Capability("capability"), language), ""), "featureset"), "feature");
List<Path> wsdlFilesInPath = ZipFileHelper.findWsdlFilesInPath(folder);
List<Path> otherFilesInPath = ZipFileHelper.findOtherFilesInPath(folder);
List<Path> files = new LinkedList<>();
files.addAll(wsdlFilesInPath);
files.addAll(otherFilesInPath);
Test test = new Test(bpelFile, "", Collections.emptyList(), feature, files, Collections.emptyList());
BPELProcess process = new BPELProcess(test);
process.setEngine(bpelEngine);
Path deployableArchivePath = bpelEngine.buildArchives(process);
return ZipFileHelper.zipToDeployablePackage(ZipFileHelper.createZipFileFromArchive(deployableArchivePath),
FileTasks.getFileExtension(deployableArchivePath.getFileName()),
processModelId);
} else {
AbstractBPMNEngine bpmnEngine = (AbstractBPMNEngine) engine;
ProcessModelId processModelId = determineProcessModelIdInBPMNProcess(engineId, folder);
ZipFileHelper.adjustFileNameOfBpmnToProcessName(folder);
Path bpmnFile = ZipFileHelper.findBpmnFileInPath(folder);
String language = processLanguage.toString();
Feature feature = new Feature(new FeatureSet(new Group("group", new Language(new Capability("capability"), language), ""), "featureset"), FileTasks.getFilenameWithoutExtension(bpmnFile));
List<Path> wsdlFilesInPath = ZipFileHelper.findWsdlFilesInPath(folder);
List<Path> otherFilesInPath = ZipFileHelper.findOtherFilesInPath(folder);
List<Path> files = new LinkedList<>();
files.addAll(wsdlFilesInPath);
files.addAll(otherFilesInPath);
Test test = new Test(bpmnFile, "", Collections.emptyList(), feature, files, Collections.emptyList());
BPMNProcess process = new BPMNProcess(test);
process.setEngine(bpmnEngine);
Path deployableArchivePath = bpmnEngine.buildArchives(process);
return ZipFileHelper.zipToDeployablePackage(ZipFileHelper.createZipFileFromArchive(deployableArchivePath),
FileTasks.getFileExtension(deployableArchivePath.getFileName()),
processModelId);
}
} catch (IOException | SAXException | ParserConfigurationException | XPathExpressionException e) {
throw new RuntimeException("error due to io", e);
}
}
@Override
public ProcessModelId deploy(EngineId engineId, DeploymentPackage bpelPackage)
throws DeploymentException {
try {
Path file = ZipFileHelper.storeDataAsZipFile(bpelPackage);
ProcessModelId processModelId = bpelPackage.processModelId;
// rename zip file to the name of the process
Path newFileName = file.getParent().resolve(processModelId.getProcessId().getLocalPart() + "." + bpelPackage.fileExtension);
Files.copy(file, newFileName);
EngineAPI<?> engine = engineService.getEngineByID(engineId);
engine.deploy(processModelId.getProcessId().getLocalPart(), newFileName);
System.out.println("FOUND " + processModelId);
return processModelId;
} catch (Exception e) {
throw new DeploymentException(e.getMessage(), e);
}
}
private ProcessModelId determineProcessModelIdInBPELProcess(EngineId engineId, Path extractedPath)
throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
String bpelName = ZipFileHelper.findBpelProcessNameInPath(extractedPath);
String bpelNamespace = ZipFileHelper.findBpelTargetNameSpaceInPath(extractedPath);
QName processId = new QName(bpelNamespace, bpelName);
return new ProcessModelId(engineId.getEngineId(), processId);
}
private ProcessModelId determineProcessModelIdInBPMNProcess(EngineId engineId, Path extractedPath)
throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
String bpmnName = ZipFileHelper.findBpmnProcessNameInPath(extractedPath);
String bpmnNamespace = ZipFileHelper.findBpmnTargetNameSpaceInPath(extractedPath);
QName processId = new QName(bpmnNamespace, bpmnName);
return new ProcessModelId(engineId.getEngineId(), processId);
}
@Override
public void undeploy(ProcessModelId processModelId) {
EngineAPI<?> engine = engineService.getEngineByID(processModelId.toEngineId());
engine.undeploy(processModelId.getProcessId());
}
@Override
public ProcessModelState getState(ProcessModelId processModelId) {
EngineAPI<?> engine = engineService.getEngineByID(processModelId.toEngineId());
if (engine.isDeployed(processModelId.getProcessId())) {
return ProcessModelState.DEPLOYED;
} else {
return ProcessModelState.NOT_DEPLOYED;
}
}
@Override
public List<ProcessModelId> getDeployedProcessModels() {
return null;
}
}