blob: 7a512a381f1437fad7e2f91c68b0cf7764b7d6ac [file] [log] [blame]
Pierre De Ropfaca2892016-01-31 23:27:05 +00001package org.apache.felix.dm.lambda.impl;
2
3import java.util.Dictionary;
4import java.util.function.BiFunction;
5import java.util.function.Function;
6
7import org.apache.felix.dm.Component;
8import org.apache.felix.dm.DependencyManager;
9import org.apache.felix.dm.ServiceDependency;
10import org.apache.felix.dm.lambda.ServiceDependencyBuilder;
11import org.osgi.framework.ServiceReference;
12
13public class ServiceDependencyBuilderImpl<S> extends ServiceCallbacksBuilderImpl<S, ServiceDependencyBuilder<S>> implements ServiceDependencyBuilder<S> {
14 private final Class<S> m_serviceIface;
15 private final Component m_component;
16 private String m_filter;
17 private ServiceReference<S> m_ref;
18 private boolean m_required = true;
19 private String m_debug;
20 private boolean m_propagate;
21 private Object m_propagateInstance;
22 private String m_propagateMethod;
23 private Object m_defaultImpl;
24 private long m_timeout = -1;
25
26 public ServiceDependencyBuilderImpl(Component component, Class<S> service) {
27 super(service);
28 m_serviceIface = service;
29 m_component = component;
Pierre De Rop11527502016-02-18 21:07:16 +000030 m_required = Helpers.isDependencyRequiredByDefault(component);
Pierre De Ropfaca2892016-01-31 23:27:05 +000031 }
32
33 public ServiceDependencyBuilder<S> filter(String filter) {
34 m_filter = filter;
35 return this;
36 }
37
38 public ServiceDependencyBuilder<S> ref(ServiceReference<S> ref) {
39 m_ref = ref;
40 return this;
41 }
42
43 public ServiceDependencyBuilder<S> optional() {
44 return required(false);
45 }
46
47 public ServiceDependencyBuilder<S> required() {
48 return required(true);
49 }
50
51 public ServiceDependencyBuilder<S> required(boolean required) {
52 m_required = required;
53 return this;
54 }
55
56 public ServiceDependencyBuilder<S> debug(String label) {
57 m_debug = label;
58 return this;
59 }
60
61 public ServiceDependencyBuilder<S> propagate() {
62 return propagate(true);
63 }
64
65 public ServiceDependencyBuilder<S> propagate(boolean propagate) {
66 m_propagate = propagate;
67 return this;
68 }
69
70 public ServiceDependencyBuilder<S> propagate(Object instance, String method) {
71 m_propagateInstance = instance;
72 m_propagateMethod = method;
73 return this;
74 }
75
76 public ServiceDependencyBuilder<S> propagate(Function<ServiceReference<S>, Dictionary<String, Object>> propagate) {
77 Object wrappedCallback = new Object() {
78 @SuppressWarnings("unused")
79 Dictionary<String, Object> propagate(ServiceReference<S> ref) {
80 return propagate.apply(ref);
81 }
82 };
83 propagate(wrappedCallback, "propagate");
84 return this;
85 }
86
87 public ServiceDependencyBuilder<S> propagate(BiFunction<ServiceReference<S>, S, Dictionary<String, Object>> propagate) {
88 Object wrappedCallback = new Object() {
89 @SuppressWarnings("unused")
90 Dictionary<String, Object> propagate(ServiceReference<S> ref, S service) {
91 return propagate.apply(ref, service);
92 }
93 };
94 propagate(wrappedCallback, "propagate");
95 return this;
96 }
97
98 public ServiceDependencyBuilder<S> defImpl(Object defaultImpl) {
99 m_defaultImpl = defaultImpl;
100 return this;
101 }
102
103 public ServiceDependencyBuilder<S> timeout(long timeout) {
104 m_timeout = timeout;
105 return this;
106 }
107
108 // Build final ServiceDependency object.
109 @Override
110 public ServiceDependency build() {
111 DependencyManager dm = m_component.getDependencyManager();
112 if (m_ref != null && m_filter != null) {
113 throw new IllegalArgumentException("Can not set ref and filter at the same time");
114 }
115 ServiceDependency sd = m_timeout > -1 ? dm.createTemporalServiceDependency(m_timeout) : dm.createServiceDependency();
116 if (m_ref != null) {
117 sd.setService(m_serviceIface, m_ref);
118 } else {
119 sd.setService(m_serviceIface, m_filter);
120 }
121 sd.setRequired(m_required);
122 sd.setDefaultImplementation(m_defaultImpl);
123 if (m_debug != null) {
124 sd.setDebug(m_debug);
125 }
126 if (m_propagate) {
127 sd.setPropagate(true);
128 } else if (m_propagateInstance != null) {
129 if (m_propagateMethod == null) {
130 throw new IllegalArgumentException("propagate instance can't be null");
131 }
132 sd.setPropagate(m_propagateInstance, m_propagateMethod);
133 }
134 if (hasCallbacks()) {
135 sd.setCallbacks(m_callbackInstance, m_added, m_changed, m_removed, m_swapped);
136 } else if (hasRefs()) {
137 Object cb = createCallbackInstance();
138 sd.setCallbacks(cb, "add", "change", "remove", m_swapRefs.size() > 0 ? "swap" : null);
139 }
140
141 if (m_autoConfigField != null) {
142 sd.setAutoConfig(m_autoConfigField);
143 } else {
144 sd.setAutoConfig(m_autoConfig);
145 }
146 return sd;
147 }
148
149}