Merge "Cosmetics: check in pom.xml files as _sort_pom_ wants them to be"
[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.binding.api.BindingAwareBroker.ConsumerContext
17 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext
18 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider
19 import org.opendaylight.controller.sal.binding.api.NotificationService
20 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService
21 import org.opendaylight.controller.sal.binding.api.data.DataProviderService
22 import org.opendaylight.controller.sal.compatibility.adsal.DataPacketServiceAdapter
23 import org.opendaylight.controller.sal.compatibility.topology.TopologyAdapter
24 import org.opendaylight.controller.sal.compatibility.topology.TopologyProvider
25 import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase
26 import org.opendaylight.controller.sal.core.Node
27 import org.opendaylight.controller.sal.core.NodeConnector
28 import org.opendaylight.controller.sal.discovery.IDiscoveryService
29 import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerService
30 import org.opendaylight.controller.sal.flowprogrammer.IPluginOutFlowProgrammerService
31 import org.opendaylight.controller.sal.inventory.IPluginInInventoryService
32 import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService
33 import org.opendaylight.controller.sal.packet.IPluginInDataPacketService
34 import org.opendaylight.controller.sal.packet.IPluginOutDataPacketService
35 import org.opendaylight.controller.sal.reader.IPluginInReadService
36 import org.opendaylight.controller.sal.reader.IPluginOutReadService
37 import org.opendaylight.controller.sal.topology.IPluginInTopologyService
38 import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
39 import org.opendaylight.controller.sal.utils.GlobalConstants
40 import org.opendaylight.controller.sal.utils.INodeConnectorFactory
41 import org.opendaylight.controller.sal.utils.INodeFactory
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryService
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService
48 import org.osgi.framework.BundleContext
49
50 import static org.opendaylight.controller.sal.compatibility.NodeMapping.*
51
52 class ComponentActivator extends ComponentActivatorAbstractBase {
53
54     private BundleContext context;
55
56     @Property
57     FlowProgrammerAdapter flow = new FlowProgrammerAdapter;
58
59     @Property
60     InventoryAndReadAdapter inventory = new InventoryAndReadAdapter;
61
62     @Property
63     DataPacketAdapter dataPacket = new DataPacketAdapter;
64
65     @Property
66     INodeFactory nodeFactory = new MDSalNodeFactory
67
68     @Property
69     INodeConnectorFactory nodeConnectorFactory = new MDSalNodeConnectorFactory
70     
71     @Property
72     TopologyAdapter topology = new TopologyAdapter
73     
74     @Property
75     TopologyProvider tpProvider = new TopologyProvider()
76
77     @Property
78     DataPacketServiceAdapter dataPacketService = new DataPacketServiceAdapter()
79
80
81
82     override protected init() {
83         Node.NodeIDType.registerIDType(MD_SAL_TYPE, String);
84         NodeConnector.NodeConnectorIDType.registerIDType(MD_SAL_TYPE, String, MD_SAL_TYPE);
85     }
86
87     override start(BundleContext context) {
88         super.start(context)
89         this.context = context;
90     }
91
92     def setBroker(BindingAwareBroker broker) {
93         broker.registerProvider(new SalCompatibilityProvider(this), context)
94     }
95
96
97     override protected getGlobalImplementations() {
98         return Arrays.asList(this, flow, inventory, dataPacket, nodeFactory, nodeConnectorFactory,topology,tpProvider)
99     }
100
101     override protected configureGlobalInstance(Component c, Object imp) {
102         configure(imp, c);
103     }
104
105     override protected getImplementations() {
106         return Arrays.asList(dataPacketService)
107     }
108
109     override protected configureInstance(Component c, Object imp, String containerName) {
110         instanceConfigure(imp, c, containerName);
111     }
112
113     private def dispatch configure(MDSalNodeFactory imp, Component it) {
114         setInterface(INodeFactory.name, properties);
115     }
116
117     private def dispatch configure(MDSalNodeConnectorFactory imp, Component it) {
118         setInterface(INodeConnectorFactory.name, properties);
119     }
120
121     private def dispatch configure(ComponentActivator imp, Component it) {
122         add(
123             createServiceDependency().setService(BindingAwareBroker) //
124             .setCallbacks("setBroker", "setBroker") //
125             .setRequired(true))
126
127
128     }
129
130     private def dispatch configure(DataPacketAdapter imp, Component it) {
131         add(
132             createServiceDependency() //
133             .setService(IPluginOutDataPacketService) //
134             .setCallbacks("setDataPacketPublisher", "setDataPacketPublisher") //
135             .setRequired(false))
136     }
137
138     private def dispatch configure(FlowProgrammerAdapter imp, Component it) {
139         setInterface(IPluginInFlowProgrammerService.name, properties)
140         add(
141             createServiceDependency() //
142             .setService(IPluginOutFlowProgrammerService) //
143             .setCallbacks("setFlowProgrammerPublisher", "setFlowProgrammerPublisher") //
144             .setRequired(false))
145
146         add(
147             createServiceDependency() //
148             .setService(IClusterGlobalServices) //
149             .setCallbacks("setClusterGlobalServices", "unsetClusterGlobalServices") //
150             .setRequired(false))
151
152     }
153
154     private def dispatch instanceConfigure(DataPacketServiceAdapter imp, Component it, String containerName) {
155         setInterface(IPluginInDataPacketService.name, properties)
156     }
157
158     private def dispatch instanceConfigure(ComponentActivator imp, Component it, String containerName) {
159     }
160
161
162     private def dispatch configure(InventoryAndReadAdapter imp, Component it) {
163         setInterface(Arrays.asList(IPluginInInventoryService.name, IPluginInReadService.name), properties)
164         add(
165             createServiceDependency() //
166             .setService(IPluginOutReadService) //
167             .setCallbacks("setReadPublisher", "unsetReadPublisher") //
168             .setRequired(false))
169         add(
170             createServiceDependency() //
171             .setService(IPluginOutInventoryService) //
172             .setCallbacks("setInventoryPublisher", "unsetInventoryPublisher") //
173             .setRequired(false))
174         add(
175             createServiceDependency() //
176             .setService(IDiscoveryService) //
177             .setCallbacks("setDiscoveryPublisher", "setDiscoveryPublisher") //
178             .setRequired(false))
179
180         
181     }
182     
183     private def dispatch configure (TopologyAdapter imp, Component it) {
184         setInterface(Arrays.asList(IPluginInTopologyService.name), properties)
185         add(
186             createServiceDependency() //
187             .setService(IPluginOutTopologyService) //
188             .setCallbacks("setTopologyPublisher", "setTopologyPublisher") //
189             .setRequired(false))
190     }
191     
192     private def dispatch configure (TopologyProvider imp, Component it) {
193         add(
194             createServiceDependency() //
195             .setService(IPluginOutTopologyService) //
196             .setCallbacks("setTopologyPublisher", "setTopologyPublisher") //
197             .setRequired(false))
198     }
199
200     private def Dictionary<String, Object> properties() {
201         val props = new Hashtable<String, Object>();
202         props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString, MD_SAL_TYPE)
203         props.put("protocolName", MD_SAL_TYPE);
204         return props;
205     }
206 }
207 package class SalCompatibilityProvider implements BindingAwareProvider {
208     
209     private val ComponentActivator activator;
210     
211     new(ComponentActivator cmpAct) {
212         activator = cmpAct;
213     }
214     
215     override getFunctionality() {
216         // Noop
217     }
218     
219     override getImplementations() {
220         // Noop
221     }
222     
223     
224     override onSessionInitialized(ConsumerContext session) {
225         // Noop
226     }
227     
228     
229     override onSessionInitiated(ProviderContext session) {
230         val it = activator
231                 val subscribe = session.getSALService(NotificationService)
232
233         // Registration of Flow Service
234         flow.delegate = session.getRpcService(SalFlowService)
235         flow.dataBrokerService = session.getSALService(DataBrokerService);
236         subscribe.registerNotificationListener(flow);
237
238         // Data Packet Service
239         subscribe.registerNotificationListener(inventory);
240         dataPacketService.delegate = session.getRpcService(PacketProcessingService)
241
242         // Inventory Service
243         inventory.dataService = session.getSALService(DataBrokerService);
244         inventory.flowStatisticsService = session.getRpcService(OpendaylightFlowStatisticsService);
245         inventory.flowTableStatisticsService = session.getRpcService(OpendaylightFlowTableStatisticsService);
246         inventory.nodeConnectorStatisticsService = session.getRpcService(OpendaylightPortStatisticsService);
247         inventory.topologyDiscovery = session.getRpcService(FlowTopologyDiscoveryService);
248         inventory.dataProviderService = session.getSALService(DataProviderService)
249         topology.dataService = session.getSALService(DataProviderService)
250         tpProvider.dataService = session.getSALService(DataProviderService)
251
252         inventory.startAdapter();
253
254         tpProvider.startAdapter();
255
256         subscribe.registerNotificationListener(dataPacket)
257     }
258 }