Pierre De Rop | faca289 | 2016-01-31 23:27:05 +0000 | [diff] [blame] | 1 | package org.apache.felix.dm.lambda.impl; |
| 2 | |
| 3 | import java.util.Dictionary; |
| 4 | import java.util.function.BiFunction; |
| 5 | import java.util.function.Function; |
| 6 | |
| 7 | import org.apache.felix.dm.Component; |
| 8 | import org.apache.felix.dm.DependencyManager; |
| 9 | import org.apache.felix.dm.ServiceDependency; |
| 10 | import org.apache.felix.dm.lambda.ServiceDependencyBuilder; |
| 11 | import org.osgi.framework.ServiceReference; |
| 12 | |
| 13 | public 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 Rop | 1152750 | 2016-02-18 21:07:16 +0000 | [diff] [blame^] | 30 | m_required = Helpers.isDependencyRequiredByDefault(component); |
Pierre De Rop | faca289 | 2016-01-31 23:27:05 +0000 | [diff] [blame] | 31 | } |
| 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 | } |