1
2
3
4
5
6
7 package org.mule.module.jersey;
8
9 import org.mule.api.MuleContext;
10 import org.mule.api.component.JavaComponent;
11 import org.mule.api.object.ObjectFactory;
12 import org.mule.component.BindingUtils;
13
14 import com.sun.jersey.core.spi.component.ComponentContext;
15 import com.sun.jersey.core.spi.component.ioc.IoCComponentProvider;
16 import com.sun.jersey.core.spi.component.ioc.IoCComponentProviderFactory;
17 import com.sun.jersey.core.spi.component.ioc.IoCInstantiatedComponentProvider;
18
19 import java.util.List;
20
21 public class MuleComponentProviderFactory implements IoCComponentProviderFactory
22 {
23
24 private final List<JavaComponent> components;
25 private final MuleContext muleContext;
26
27 public MuleComponentProviderFactory(MuleContext muleContext, List<JavaComponent> components)
28 {
29 this.muleContext = muleContext;
30 this.components = components;
31 }
32
33 public IoCComponentProvider getComponentProvider(Class<?> cls)
34 {
35 for (JavaComponent c : components)
36 {
37 if (c.getObjectType().isAssignableFrom(cls))
38 {
39 return getComponentProvider(null, cls);
40 }
41 }
42 return null;
43 }
44
45 public IoCComponentProvider getComponentProvider(ComponentContext ctx, final Class<?> cls)
46 {
47 final JavaComponent selected = getSelectedComponent(cls);
48
49 if (selected == null)
50 {
51 return null;
52 }
53
54 return new IoCInstantiatedComponentProvider()
55 {
56 public Object getInjectableInstance(Object o)
57 {
58 return o;
59 }
60
61 public Object getInstance()
62 {
63 try
64 {
65 ObjectFactory objectFactory = selected.getObjectFactory();
66 Object instance = objectFactory.getInstance(muleContext);
67 BindingUtils.configureBinding(selected, instance);
68
69 return instance;
70 }
71 catch (Exception e)
72 {
73 throw new RuntimeException(e);
74 }
75 }
76 };
77 }
78
79 private JavaComponent getSelectedComponent(final Class<?> cls)
80 {
81 JavaComponent selected = null;
82 for (JavaComponent c : components)
83 {
84 if (c.getObjectType().isAssignableFrom(cls))
85 {
86 selected = c;
87 }
88 }
89 return selected;
90 }
91
92 }