2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sal.binding.impl;
\r
11 import java.util.Map.Entry;
12 import java.util.concurrent.atomic.AtomicLong;
14 import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataBroker;
15 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
16 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
17 import org.opendaylight.controller.sal.binding.impl.util.BindingAwareDataReaderRouter;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20 import org.opendaylight.yangtools.yang.binding.util.DataObjectReadingUtil;
22 import com.google.common.base.Predicate;
23 import com.google.common.collect.ImmutableMap;
24 import com.google.common.collect.ImmutableMap.Builder;
25 import com.google.common.collect.Maps;
28 public class DataBrokerImpl extends AbstractDataBroker<InstanceIdentifier<? extends DataObject>, DataObject, DataChangeListener> //
\r
29 implements DataProviderService, AutoCloseable {
\r
31 private final static class ContainsWildcarded implements Predicate<InstanceIdentifier<? extends DataObject>> {
33 private final InstanceIdentifier<? extends DataObject> key;
35 public ContainsWildcarded(InstanceIdentifier<? extends DataObject> key) {
40 public boolean apply(InstanceIdentifier<? extends DataObject> input) {
41 return key.containsWildcarded(input);
45 private final static class IsContainedWildcarded implements Predicate<InstanceIdentifier<? extends DataObject>> {
47 private final InstanceIdentifier<? extends DataObject> key;
49 public IsContainedWildcarded(InstanceIdentifier<? extends DataObject> key) {
54 public boolean apply(InstanceIdentifier<? extends DataObject> input) {
55 return input.containsWildcarded(key);
59 private final AtomicLong nextTransaction = new AtomicLong();
\r
60 private final AtomicLong createdTransactionsCount = new AtomicLong();
\r
62 public AtomicLong getCreatedTransactionsCount() {
\r
63 return createdTransactionsCount;
\r
66 public DataBrokerImpl() {
\r
67 setDataReadRouter(new BindingAwareDataReaderRouter());
\r
71 public DataTransactionImpl beginTransaction() {
\r
72 String transactionId = "BA-" + nextTransaction.getAndIncrement();
\r
73 createdTransactionsCount.getAndIncrement();
\r
74 return new DataTransactionImpl(transactionId,this);
\r
78 public void close() {
\r
83 protected Predicate<InstanceIdentifier<? extends DataObject>> createContainsPredicate(final
84 InstanceIdentifier<? extends DataObject> key) {
85 return new ContainsWildcarded(key);
89 protected Predicate<InstanceIdentifier<? extends DataObject>> createIsContainedPredicate(final
90 InstanceIdentifier<? extends DataObject> key) {
91 return new IsContainedWildcarded(key);
94 @SuppressWarnings({ "unchecked", "rawtypes" })
96 protected Map<InstanceIdentifier<? extends DataObject>, DataObject> deepGetBySubpath(
97 Map<InstanceIdentifier<? extends DataObject>, DataObject> dataSet,
98 InstanceIdentifier<? extends DataObject> path) {
99 Builder<InstanceIdentifier<? extends DataObject>, DataObject> builder = ImmutableMap.builder();
100 Map<InstanceIdentifier<? extends DataObject>, DataObject> potential = Maps.filterKeys(dataSet, createIsContainedPredicate(path));
101 for(Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : potential.entrySet()) {
103 builder.putAll(DataObjectReadingUtil.readData(entry.getValue(),(InstanceIdentifier)entry.getKey(),path));
104 } catch (Exception e) {
105 // FIXME : Log exception;
108 return builder.build();