1 package org
.argeo
.slc
.osgi
;
3 import java
.util
.ArrayList
;
4 import java
.util
.HashMap
;
8 import org
.apache
.commons
.logging
.Log
;
9 import org
.apache
.commons
.logging
.LogFactory
;
10 import org
.argeo
.slc
.SlcException
;
11 import org
.argeo
.slc
.core
.execution
.AbstractExecutionModulesManager
;
12 import org
.argeo
.slc
.core
.execution
.DefaultDescriptorConverter
;
13 import org
.argeo
.slc
.execution
.ExecutionContext
;
14 import org
.argeo
.slc
.execution
.ExecutionFlow
;
15 import org
.argeo
.slc
.execution
.ExecutionFlowDescriptor
;
16 import org
.argeo
.slc
.execution
.ExecutionFlowDescriptorConverter
;
17 import org
.argeo
.slc
.execution
.ExecutionModuleDescriptor
;
18 import org
.argeo
.slc
.process
.RealizedFlow
;
19 import org
.osgi
.framework
.InvalidSyntaxException
;
20 import org
.osgi
.framework
.ServiceReference
;
21 import org
.osgi
.util
.tracker
.ServiceTracker
;
22 import org
.springframework
.beans
.factory
.DisposableBean
;
23 import org
.springframework
.beans
.factory
.InitializingBean
;
25 public class OsgiExecutionModulesManager
extends AbstractExecutionModulesManager
implements
26 InitializingBean
, DisposableBean
{
27 private final static Log log
= LogFactory
.getLog(OsgiExecutionModulesManager
.class);
29 private BundlesManager bundlesManager
;
30 private ServiceTracker executionContexts
;
31 private ExecutionFlowDescriptorConverter defaultDescriptorConverter
= new DefaultDescriptorConverter();
33 public ExecutionModuleDescriptor
getExecutionModuleDescriptor(
34 String moduleName
, String version
) {
35 return createDescriptor(moduleName
, version
, listFlows(moduleName
,
39 public List
<ExecutionModuleDescriptor
> listExecutionModules() {
40 List
<ExecutionModuleDescriptor
> descriptors
= new ArrayList
<ExecutionModuleDescriptor
>();
42 ServiceReference
[] srs
= executionContexts
.getServiceReferences();
43 for (ServiceReference sr
: srs
) {
44 String moduleName
= sr
.getBundle().getSymbolicName();
45 String moduleVersion
= sr
.getBundle().getHeaders().get(
46 "Bundle-Version").toString();
47 ExecutionModuleDescriptor md
= new ExecutionModuleDescriptor();
48 md
.setName(moduleName
);
49 md
.setVersion(moduleVersion
);
55 protected Map
<String
, ExecutionFlow
> listFlows(String moduleName
,
56 String moduleVersion
) {
57 // TODO: use service trackers?
58 // String filter = OsgiFilterUtils.unifyFilter(ExecutionFlow.class,
61 String filter
= "(Bundle-SymbolicName=" + moduleName
+ ")";
62 ServiceReference
[] sfs
;
64 sfs
= bundlesManager
.getBundleContext().getServiceReferences(
65 ExecutionFlow
.class.getName(), filter
);
66 } catch (InvalidSyntaxException e
) {
67 throw new SlcException(
68 "Cannot retrieve service reference for flow " + filter
, e
);
71 Map
<String
, ExecutionFlow
> flows
= new HashMap
<String
, ExecutionFlow
>();
72 for (ServiceReference sf
: sfs
) {
73 ExecutionFlow flow
= (ExecutionFlow
) bundlesManager
74 .getBundleContext().getService(sf
);
75 flows
.put(flow
.getName(), flow
);
80 public ExecutionFlow
findExecutionFlow(String moduleName
,
81 String moduleVersion
, String flowName
) {
82 String filter
= "(&(Bundle-SymbolicName=" + moduleName
83 + ")(org.springframework.osgi.bean.name=" + flowName
+ "))";
84 return bundlesManager
.getSingleServiceStrict(ExecutionFlow
.class,
88 public ExecutionContext
findExecutionContext(String moduleName
,
89 String moduleVersion
) {
90 String filter
= "(&(Bundle-SymbolicName=" + moduleName
91 + ")(Bundle-Version=" + moduleVersion
+ "))";
92 return bundlesManager
.getSingleServiceStrict(ExecutionContext
.class,
96 public ExecutionFlowDescriptorConverter
findExecutionFlowDescriptorConverter(
97 String moduleName
, String moduleVersion
) {
98 String filter
= "(&(Bundle-SymbolicName=" + moduleName
99 + ")(Bundle-Version=" + moduleVersion
+ "))";
100 return bundlesManager
.getSingleService(
101 ExecutionFlowDescriptorConverter
.class, filter
);
104 public void setBundlesManager(BundlesManager bundlesManager
) {
105 this.bundlesManager
= bundlesManager
;
108 public void afterPropertiesSet() throws Exception
{
109 executionContexts
= bundlesManager
.newTracker(ExecutionContext
.class);
112 public void destroy() throws Exception
{
113 if (executionContexts
!= null)
114 executionContexts
.close();
118 * Builds a minimal realized flow, based on the provided information
119 * (typically from the command line).
122 * a bundle id, or a pattern contained in a bundle symbolic name
124 * the execution flow name
125 * @return a minimal realized flow, to be used in an execution
127 public RealizedFlow
findRealizedFlow(String module
, String executionName
) {
128 // First check whether we have a bundleId
129 Long bundleId
= null;
131 bundleId
= Long
.parseLong(module
);
132 } catch (NumberFormatException e
) {
136 // Look for bundle names containing pattern
137 OsgiBundle bundle
= null;
138 if (bundleId
!= null) {
139 bundle
= bundlesManager
.getBundle(bundleId
);
141 bundle
= bundlesManager
.findFromPattern(module
);
144 if (bundle
!= null) {
145 RealizedFlow launch
= new RealizedFlow();
146 launch
.setModuleName(bundle
.getName());
147 launch
.setModuleVersion(bundle
.getVersion());
148 ExecutionFlowDescriptor descriptor
= new ExecutionFlowDescriptor();
149 descriptor
.setName(executionName
);
150 launch
.setFlowDescriptor(descriptor
);
154 .warn("Could not find any execution module matching these requirements.");
159 public void updateAndExecute(RealizedFlow realizedFlow
) {
160 OsgiBundle osgiBundle
= new OsgiBundle(realizedFlow
);
161 bundlesManager
.upgradeSynchronous(osgiBundle
);
162 execute(realizedFlow
);
165 public void execute(RealizedFlow realizedFlow
) {
166 if (log
.isTraceEnabled())
167 log
.trace("Executing " + realizedFlow
);
169 String moduleName
= realizedFlow
.getModuleName();
170 String moduleVersion
= realizedFlow
.getModuleVersion();
172 ExecutionContext executionContext
= findExecutionContext(moduleName
,
175 // Check whether a descriptor converter is published by this module
176 ExecutionFlowDescriptorConverter descriptorConverter
= findExecutionFlowDescriptorConverter(
177 moduleName
, moduleVersion
);
179 final Map
<?
extends String
, ?
extends Object
> variablesToAdd
;
180 if (descriptorConverter
!= null)
181 variablesToAdd
= descriptorConverter
.convertValues(realizedFlow
182 .getFlowDescriptor());
184 variablesToAdd
= defaultDescriptorConverter
185 .convertValues(realizedFlow
.getFlowDescriptor());
187 executionContext
.addVariables(variablesToAdd
);
189 ExecutionFlow flow
= findExecutionFlow(moduleName
, moduleVersion
,
190 realizedFlow
.getFlowDescriptor().getName());
193 // Actually runs the flow, IN THIS THREAD