/** * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.frm.meter; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; /** * Meter Provider registers the {@link MeterChangeListener} and it holds all needed * services for {@link MeterChangeListener}. * * @author Vaclav Demcak * */ public class MeterProvider implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(MeterProvider.class); private SalMeterService salMeterService; private DataBroker dataService; /* DataChangeListener */ private DataChangeListener meterDataChangeListener; private ListenerRegistration meterDataChangeListenerRegistration; /** * Provider Initialization Phase. * * @param DataProviderService dataService */ public void init(final DataBroker dataService) { LOG.info("FRM Meter Config Provider initialization."); this.dataService = Preconditions.checkNotNull(dataService, "DataProviderService can not be null !"); } /** * Listener Registration Phase * * @param RpcConsumerRegistry rpcRegistry */ public void start(final RpcConsumerRegistry rpcRegistry) { Preconditions.checkArgument(rpcRegistry != null, "RpcConsumerRegistry can not be null !"); this.salMeterService = Preconditions.checkNotNull(rpcRegistry.getRpcService(SalMeterService.class), "RPC SalMeterService not found."); /* Build Path */ InstanceIdentifier meterIdentifier = InstanceIdentifier.create(Nodes.class) .child(Node.class).augmentation(FlowCapableNode.class).child(Meter.class); /* DataChangeListener registration */ this.meterDataChangeListener = new MeterChangeListener(MeterProvider.this); this.meterDataChangeListenerRegistration = this.dataService.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, meterIdentifier, meterDataChangeListener, DataChangeScope.SUBTREE); LOG.info("FRM Meter Config Provider started."); } @Override public void close() { LOG.info("FRM Meter Config Provider stopped."); if (meterDataChangeListenerRegistration != null) { try { meterDataChangeListenerRegistration.close(); } catch (Exception e) { String errMsg = "Error by stop FRM Meter Config Provider."; LOG.error(errMsg, e); throw new IllegalStateException(errMsg, e); } finally { meterDataChangeListenerRegistration = null; } } } public DataChangeListener getMeterDataChangeListener() { return meterDataChangeListener; } public DataBroker getDataService() { return dataService; } public SalMeterService getSalMeterService() { return salMeterService; } }