28fcabafe9cb622a6c91ea14f70be1053b4767bd
[neutron.git] / transcriber / src / main / java / org / opendaylight / neutron / transcriber / NeutronTranscriberProvider.java
1 /*
2  * Copyright (c) 2015 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
9 package org.opendaylight.neutron.transcriber;
10
11 import com.google.common.base.Preconditions;
12 import java.util.ArrayList;
13 import java.util.List;
14 import javax.annotation.PostConstruct;
15 import javax.annotation.PreDestroy;
16 import javax.inject.Inject;
17 import javax.inject.Singleton;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.neutron.spi.INeutronBgpvpnCRUD;
20 import org.opendaylight.neutron.spi.INeutronCRUD;
21 import org.opendaylight.neutron.spi.INeutronFirewallCRUD;
22 import org.opendaylight.neutron.spi.INeutronFirewallPolicyCRUD;
23 import org.opendaylight.neutron.spi.INeutronFirewallRuleCRUD;
24 import org.opendaylight.neutron.spi.INeutronFloatingIpCRUD;
25 import org.opendaylight.neutron.spi.INeutronL2gatewayCRUD;
26 import org.opendaylight.neutron.spi.INeutronL2gatewayConnectionCRUD;
27 import org.opendaylight.neutron.spi.INeutronLoadBalancerCRUD;
28 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorCRUD;
29 import org.opendaylight.neutron.spi.INeutronLoadBalancerListenerCRUD;
30 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
31 import org.opendaylight.neutron.spi.INeutronMeteringLabelCRUD;
32 import org.opendaylight.neutron.spi.INeutronMeteringLabelRuleCRUD;
33 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
34 import org.opendaylight.neutron.spi.INeutronPortCRUD;
35 import org.opendaylight.neutron.spi.INeutronQosPolicyCRUD;
36 import org.opendaylight.neutron.spi.INeutronRouterCRUD;
37 import org.opendaylight.neutron.spi.INeutronSFCFlowClassifierCRUD;
38 import org.opendaylight.neutron.spi.INeutronSFCPortChainCRUD;
39 import org.opendaylight.neutron.spi.INeutronSFCPortPairCRUD;
40 import org.opendaylight.neutron.spi.INeutronSFCPortPairGroupCRUD;
41 import org.opendaylight.neutron.spi.INeutronSecurityGroupCRUD;
42 import org.opendaylight.neutron.spi.INeutronSecurityRuleCRUD;
43 import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
44 import org.opendaylight.neutron.spi.INeutronTrunkCRUD;
45 import org.opendaylight.neutron.spi.INeutronVpnIkePolicyCRUD;
46 import org.opendaylight.neutron.spi.INeutronVpnIpSecPolicyCRUD;
47 import org.opendaylight.neutron.spi.INeutronVpnIpSecSiteConnectionsCRUD;
48 import org.opendaylight.neutron.spi.INeutronVpnServiceCRUD;
49 import org.osgi.framework.BundleContext;
50 import org.osgi.framework.ServiceRegistration;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 @Singleton
55 public final class NeutronTranscriberProvider implements NeutronTranscriber {
56     private static final Logger LOG = LoggerFactory.getLogger(NeutronTranscriberProvider.class);
57
58     private BundleContext context;
59     private final DataBroker db;
60     private final List<ServiceRegistration<? extends INeutronCRUD<?>>> registrations = new ArrayList<>();
61     private final List<AutoCloseable> neutronInterfaces = new ArrayList<>();
62
63     @Inject
64     public NeutronTranscriberProvider(BundleContext context, DataBroker db) {
65         LOG.debug("DataBroker set to: {}", db);
66         this.context = Preconditions.checkNotNull(context);
67         this.db = Preconditions.checkNotNull(db);
68     }
69
70     private <S extends INeutronCRUD<?>,
71             T extends AutoCloseable /* & S */> void registerCRUDInterface(java.lang.Class<S> clazz, T crudInterface) {
72         neutronInterfaces.add(crudInterface);
73         @SuppressWarnings("unchecked")
74         S castCrudInterface = (S) crudInterface;
75         final ServiceRegistration<S> crudInterfaceRegistration =
76                 context.registerService(clazz, castCrudInterface, null);
77         registrations.add(crudInterfaceRegistration);
78     }
79
80     @PostConstruct
81     public void init() {
82         registerCRUDInterface(INeutronBgpvpnCRUD.class, new NeutronBgpvpnInterface(db));
83         registerCRUDInterface(INeutronFirewallCRUD.class, new NeutronFirewallInterface(db));
84         registerCRUDInterface(INeutronFirewallPolicyCRUD.class, new NeutronFirewallPolicyInterface(db));
85         registerCRUDInterface(INeutronFirewallRuleCRUD.class, new NeutronFirewallRuleInterface(db));
86         registerCRUDInterface(INeutronFloatingIpCRUD.class, new NeutronFloatingIpInterface(db));
87         registerCRUDInterface(INeutronL2gatewayConnectionCRUD.class, new NeutronL2gatewayConnectionInterface(db));
88         registerCRUDInterface(INeutronL2gatewayCRUD.class, new NeutronL2gatewayInterface(db));
89         registerCRUDInterface(INeutronLoadBalancerHealthMonitorCRUD.class,
90                               new NeutronLoadBalancerHealthMonitorInterface(db));
91         registerCRUDInterface(INeutronLoadBalancerCRUD.class, new NeutronLoadBalancerInterface(db));
92         registerCRUDInterface(INeutronLoadBalancerListenerCRUD.class, new NeutronLoadBalancerListenerInterface(db));
93         registerCRUDInterface(INeutronLoadBalancerPoolCRUD.class, new NeutronLoadBalancerPoolInterface(db));
94         registerCRUDInterface(INeutronMeteringLabelCRUD.class, new NeutronMeteringLabelInterface(db));
95         registerCRUDInterface(INeutronMeteringLabelRuleCRUD.class, new NeutronMeteringLabelRuleInterface(db));
96         registerCRUDInterface(INeutronNetworkCRUD.class, new NeutronNetworkInterface(db));
97         registerCRUDInterface(INeutronPortCRUD.class, new NeutronPortInterface(db));
98         registerCRUDInterface(INeutronQosPolicyCRUD.class, new NeutronQosPolicyInterface(db));
99         registerCRUDInterface(INeutronRouterCRUD.class, new NeutronRouterInterface(db));
100         registerCRUDInterface(INeutronSFCFlowClassifierCRUD.class, new NeutronSFCFlowClassifierInterface(db));
101         registerCRUDInterface(INeutronSFCPortPairCRUD.class, new NeutronSFCPortPairInterface(db));
102         registerCRUDInterface(INeutronSFCPortPairGroupCRUD.class, new NeutronSFCPortPairGroupInterface(db));
103         registerCRUDInterface(INeutronSFCPortChainCRUD.class, new NeutronSFCPortChainInterface(db));
104         registerCRUDInterface(INeutronSecurityGroupCRUD.class, new NeutronSecurityGroupInterface(db));
105         registerCRUDInterface(INeutronSecurityRuleCRUD.class, new NeutronSecurityRuleInterface(db));
106         registerCRUDInterface(INeutronSubnetCRUD.class, new NeutronSubnetInterface(db));
107         registerCRUDInterface(INeutronTrunkCRUD.class, new NeutronTrunkInterface(db));
108         registerCRUDInterface(INeutronVpnIkePolicyCRUD.class, new NeutronVpnIkePolicyInterface(db));
109         registerCRUDInterface(INeutronVpnIpSecPolicyCRUD.class, new NeutronVpnIpSecPolicyInterface(db));
110         registerCRUDInterface(INeutronVpnIpSecSiteConnectionsCRUD.class,
111                               new NeutronVpnIpSecSiteConnectionsInterface(db));
112         registerCRUDInterface(INeutronVpnServiceCRUD.class, new NeutronVpnServiceInterface(db));
113
114         // We don't need context any more
115         this.context = null;
116     }
117
118     @PreDestroy
119     public void close() throws Exception {
120         for (final ServiceRegistration registration : registrations) {
121             registration.unregister();
122         }
123         for (final AutoCloseable neutronCRUD : neutronInterfaces) {
124             neutronCRUD.close();
125         }
126         neutronInterfaces.clear();
127     }
128 }