BUG-625: split off SalCompatibilityProvider
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / ComponentActivator.xtend
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.compatibility
9
10 import java.util.Arrays
11 import java.util.Dictionary
12 import java.util.Hashtable
13 import org.apache.felix.dm.Component
14 import org.opendaylight.controller.clustering.services.IClusterGlobalServices
15 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker
16 import org.opendaylight.controller.sal.compatibility.adsal.DataPacketServiceAdapter
17 import org.opendaylight.controller.sal.compatibility.topology.TopologyAdapter
18 import org.opendaylight.controller.sal.compatibility.topology.TopologyProvider
19 import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase
20 import org.opendaylight.controller.sal.core.Node
21 import org.opendaylight.controller.sal.core.NodeConnector
22 import org.opendaylight.controller.sal.discovery.IDiscoveryService
23 import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerService
24 import org.opendaylight.controller.sal.flowprogrammer.IPluginOutFlowProgrammerService
25 import org.opendaylight.controller.sal.inventory.IPluginInInventoryService
26 import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService
27 import org.opendaylight.controller.sal.packet.IPluginInDataPacketService
28 import org.opendaylight.controller.sal.packet.IPluginOutDataPacketService
29 import org.opendaylight.controller.sal.reader.IPluginInReadService
30 import org.opendaylight.controller.sal.reader.IPluginOutReadService
31 import org.opendaylight.controller.sal.topology.IPluginInTopologyService
32 import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
33 import org.opendaylight.controller.sal.utils.GlobalConstants
34 import org.opendaylight.controller.sal.utils.INodeConnectorFactory
35 import org.opendaylight.controller.sal.utils.INodeFactory
36 import org.osgi.framework.BundleContext
37
38 import static org.opendaylight.controller.sal.compatibility.NodeMapping.*
39
40 class ComponentActivator extends ComponentActivatorAbstractBase {
41
42     private BundleContext context;
43
44     @Property
45     FlowProgrammerAdapter flow = new FlowProgrammerAdapter;
46
47     @Property
48     InventoryAndReadAdapter inventory = new InventoryAndReadAdapter;
49
50     @Property
51     DataPacketAdapter dataPacket = new DataPacketAdapter;
52
53     @Property
54     INodeFactory nodeFactory = new MDSalNodeFactory
55
56     @Property
57     INodeConnectorFactory nodeConnectorFactory = new MDSalNodeConnectorFactory
58     
59     @Property
60     TopologyAdapter topology = new TopologyAdapter
61     
62     @Property
63     TopologyProvider tpProvider = new TopologyProvider()
64
65     @Property
66     DataPacketServiceAdapter dataPacketService = new DataPacketServiceAdapter()
67
68
69
70     override protected init() {
71         Node.NodeIDType.registerIDType(MD_SAL_TYPE, String);
72         NodeConnector.NodeConnectorIDType.registerIDType(MD_SAL_TYPE, String, MD_SAL_TYPE);
73     }
74
75     override start(BundleContext context) {
76         super.start(context)
77         this.context = context;
78     }
79
80     def setBroker(BindingAwareBroker broker) {
81         broker.registerProvider(new SalCompatibilityProvider(this), context)
82     }
83
84
85     override protected getGlobalImplementations() {
86         return Arrays.asList(this, flow, inventory, dataPacket, nodeFactory, nodeConnectorFactory,topology,tpProvider)
87     }
88
89     override protected configureGlobalInstance(Component c, Object imp) {
90         configure(imp, c);
91     }
92
93     override protected getImplementations() {
94         return Arrays.asList(dataPacketService)
95     }
96
97     override protected configureInstance(Component c, Object imp, String containerName) {
98         instanceConfigure(imp, c, containerName);
99     }
100
101     private def dispatch configure(MDSalNodeFactory imp, Component it) {
102         setInterface(INodeFactory.name, properties);
103     }
104
105     private def dispatch configure(MDSalNodeConnectorFactory imp, Component it) {
106         setInterface(INodeConnectorFactory.name, properties);
107     }
108
109     private def dispatch configure(ComponentActivator imp, Component it) {
110         add(
111             createServiceDependency().setService(BindingAwareBroker) //
112             .setCallbacks("setBroker", "setBroker") //
113             .setRequired(true))
114
115
116     }
117
118     private def dispatch configure(DataPacketAdapter imp, Component it) {
119         add(
120             createServiceDependency() //
121             .setService(IPluginOutDataPacketService) //
122             .setCallbacks("setDataPacketPublisher", "setDataPacketPublisher") //
123             .setRequired(false))
124     }
125
126     private def dispatch configure(FlowProgrammerAdapter imp, Component it) {
127         setInterface(IPluginInFlowProgrammerService.name, properties)
128         add(
129             createServiceDependency() //
130             .setService(IPluginOutFlowProgrammerService) //
131             .setCallbacks("setFlowProgrammerPublisher", "setFlowProgrammerPublisher") //
132             .setRequired(false))
133
134         add(
135             createServiceDependency() //
136             .setService(IClusterGlobalServices) //
137             .setCallbacks("setClusterGlobalServices", "unsetClusterGlobalServices") //
138             .setRequired(false))
139
140     }
141
142     private def dispatch instanceConfigure(DataPacketServiceAdapter imp, Component it, String containerName) {
143         setInterface(IPluginInDataPacketService.name, properties)
144     }
145
146     private def dispatch instanceConfigure(ComponentActivator imp, Component it, String containerName) {
147     }
148
149
150     private def dispatch configure(InventoryAndReadAdapter imp, Component it) {
151         setInterface(Arrays.asList(IPluginInInventoryService.name, IPluginInReadService.name), properties)
152         add(
153             createServiceDependency() //
154             .setService(IPluginOutReadService) //
155             .setCallbacks("setReadPublisher", "unsetReadPublisher") //
156             .setRequired(false))
157         add(
158             createServiceDependency() //
159             .setService(IPluginOutInventoryService) //
160             .setCallbacks("setInventoryPublisher", "unsetInventoryPublisher") //
161             .setRequired(false))
162         add(
163             createServiceDependency() //
164             .setService(IDiscoveryService) //
165             .setCallbacks("setDiscoveryPublisher", "setDiscoveryPublisher") //
166             .setRequired(false))
167
168         
169     }
170     
171     private def dispatch configure (TopologyAdapter imp, Component it) {
172         setInterface(Arrays.asList(IPluginInTopologyService.name), properties)
173         add(
174             createServiceDependency() //
175             .setService(IPluginOutTopologyService) //
176             .setCallbacks("setTopologyPublisher", "setTopologyPublisher") //
177             .setRequired(false))
178     }
179     
180     private def dispatch configure (TopologyProvider imp, Component it) {
181         add(
182             createServiceDependency() //
183             .setService(IPluginOutTopologyService) //
184             .setCallbacks("setTopologyPublisher", "setTopologyPublisher") //
185             .setRequired(false))
186     }
187
188     private def Dictionary<String, Object> properties() {
189         val props = new Hashtable<String, Object>();
190         props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString, MD_SAL_TYPE)
191         props.put("protocolName", MD_SAL_TYPE);
192         return props;
193     }
194 }