package org.camunda.bpm.extension.osgi.internal.impl;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.DeploymentBuilder;
import org.camunda.bpm.extension.osgi.internal.ProcessDefinitionDeployer;
import org.osgi.util.tracker.ServiceTracker;
/**
* Basic implementation to deploy a processes to the repository by using a
* {@link ServiceTracker} that tracks a {@link ProcessEngine}.
*
* @author Ronny Bräunlich
*
*/
public class ProcessDefinitionDeployerImpl implements ProcessDefinitionDeployer {
private static final Logger LOGGER = Logger
.getLogger(ProcessDefinitionDeployerImpl.class.getName());
private volatile ProcessEngine engine;
public ProcessDefinitionDeployerImpl(){}
public ProcessDefinitionDeployerImpl(ProcessEngine engine) {
this.engine = engine;
}
@Override
public void deployProcessDefinitions(String bundleSymbolicName, List<URL> pathList) {
try {
LOGGER.log(Level.FINE,
"Found process in bundle " + bundleSymbolicName
+ " with paths: " + pathList);
if (engine == null) {
throw new IllegalStateException(
"Unable to find a ProcessEngine service");
}
RepositoryService service = engine.getRepositoryService();
DeploymentBuilder builder = service.createDeployment();
builder.name(bundleSymbolicName);
for (URL url : pathList) {
InputStream is = url.openStream();
if (is == null) {
throw new IOException("Error opening url: " + url);
}
try {
builder.addInputStream(getPath(url), is);
} finally {
is.close();
}
}
builder.enableDuplicateFiltering(true);
builder.deploy();
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Unable to deploy bundle", e);
}
}
/**
* remove bundle protocol specific part, so that resource can be accessed by
* path relative to bundle root
*/
private String getPath(URL url) {
String path = url.toExternalForm();
return path.replaceAll("bundle://[^/]*/", "");
}
}