/*
- * Copyright (C) 2007-2012 Mathieu Baudier
+ * Copyright (C) 2007-2012 Argeo GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.argeo.slc.execution.ExecutionFlowDescriptorConverter;
import org.argeo.slc.execution.ExecutionModuleDescriptor;
import org.argeo.slc.execution.ExecutionModulesListener;
-import org.argeo.slc.process.RealizedFlow;
+import org.argeo.slc.execution.RealizedFlow;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleException;
log.debug("Launch unique flow " + flow + " from module " + module);
try {
OsgiBundle osgiBundle = bundlesManager.findFromPattern(module);
+ if (osgiBundle == null)
+ throw new SlcException("No OSGi bundle found for " + module);
Bundle moduleBundle = bundlesManager.findRelatedBundle(osgiBundle);
bundlesManager.startSynchronous(moduleBundle);
RealizedFlow lastLaunch = findRealizedFlow(module, flow);
protected ExecutionFlow findExecutionFlow(String moduleName,
String moduleVersion, String flowName) {
- String filter = "(&(Bundle-SymbolicName=" + moduleName
- + ")(org.springframework.osgi.bean.name=" + flowName + "))";
+ String filter = moduleVersion == null || moduleVersion.equals("0.0.0") ? "(&(Bundle-SymbolicName="
+ + moduleName
+ + ")(org.springframework.osgi.bean.name="
+ + flowName + "))"
+ : "(&(Bundle-SymbolicName=" + moduleName + ")(Bundle-Version="
+ + moduleVersion
+ + ")(org.springframework.osgi.bean.name=" + flowName
+ + "))";
return bundlesManager.getSingleServiceStrict(ExecutionFlow.class,
filter, true);
}
protected ExecutionContext findExecutionContext(String moduleName,
String moduleVersion) {
- String filter = "(&(Bundle-SymbolicName=" + moduleName
- + ")(Bundle-Version=" + moduleVersion + "))";
+ String filter = moduleFilter(moduleName, moduleVersion);
return bundlesManager.getSingleServiceStrict(ExecutionContext.class,
filter, true);
}
protected ExecutionFlowDescriptorConverter findExecutionFlowDescriptorConverter(
String moduleName, String moduleVersion) {
- String filter = "(&(Bundle-SymbolicName=" + moduleName
- + ")(Bundle-Version=" + moduleVersion + "))";
+ String filter = moduleFilter(moduleName, moduleVersion);
return bundlesManager.getSingleService(
ExecutionFlowDescriptorConverter.class, filter, false);
}
+ /** Only based on symbolic name if version is null or "0.0.0" */
+ protected String moduleFilter(String moduleName, String moduleVersion) {
+ return moduleVersion == null || moduleVersion.equals("0.0.0") ? "(Bundle-SymbolicName="
+ + moduleName + ")"
+ : "(&(Bundle-SymbolicName=" + moduleName + ")(Bundle-Version="
+ + moduleVersion + "))";
+
+ }
+
/**
* Builds a minimal realized flow, based on the provided information
* (typically from the command line).
try {
Bundle bundle = bundlesManager.findRelatedBundle(new OsgiBundle(
nameVersion));
+ if (bundle == null)
+ throw new SlcException("Counld not find bundle for "
+ + nameVersion);
+
bundlesManager.startSynchronous(bundle);
- boolean isSpringInstrumented = bundle.getEntryPaths(
- "/META-INF/spring").hasMoreElements()
- || bundle.getHeaders().get("Spring-Context") == null;
- if (isSpringInstrumented) {
+ if (isSpringInstrumented(bundle)) {
// Wait for Spring application context to be ready
String filter = "(Bundle-SymbolicName="
+ bundle.getSymbolicName() + ")";
}
}
+ /** Do it calmly in order to avoid NPE */
+ private Boolean isSpringInstrumented(Bundle bundle) {
+ Dictionary<?, ?> headers = bundle.getHeaders();
+ if (headers != null && headers.get("Spring-Context") != null)
+ return true;
+ Enumeration<?> springEntryPaths = bundle
+ .getEntryPaths("/META-INF/spring");
+ if (springEntryPaths != null && springEntryPaths.hasMoreElements())
+ return true;
+ return false;
+ }
+
public void stop(NameVersion nameVersion) {
try {
Bundle bundle = bundlesManager.findRelatedBundle(new OsgiBundle(