/**
* 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;
}
}