Merge "We already have a merged and validated flow entry. There is no need for extrac...
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / DataBrokerImpl.java
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.binding.impl;\r
9 \r
10 import java.util.Map;
11 import java.util.Map.Entry;
12 import java.util.concurrent.atomic.AtomicLong;
13
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;
21
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;
26 \r
27 \r
28 public class DataBrokerImpl extends AbstractDataBroker<InstanceIdentifier<? extends DataObject>, DataObject, DataChangeListener> //\r
29        implements DataProviderService, AutoCloseable {\r
30 \r
31     private final static class ContainsWildcarded implements Predicate<InstanceIdentifier<? extends DataObject>> {
32
33         private final  InstanceIdentifier<? extends DataObject> key;
34
35         public ContainsWildcarded(InstanceIdentifier<? extends DataObject> key) {
36             this.key = key;
37         }
38
39         @Override
40         public boolean apply(InstanceIdentifier<? extends DataObject> input) {
41             return key.containsWildcarded(input);
42         }
43     }
44
45     private final static class IsContainedWildcarded implements Predicate<InstanceIdentifier<? extends DataObject>> {
46
47         private final  InstanceIdentifier<? extends DataObject> key;
48
49         public IsContainedWildcarded(InstanceIdentifier<? extends DataObject> key) {
50             this.key = key;
51         }
52
53         @Override
54         public boolean apply(InstanceIdentifier<? extends DataObject> input) {
55             return input.containsWildcarded(key);
56         }
57     }
58
59     private final AtomicLong nextTransaction = new AtomicLong();\r
60     private final AtomicLong createdTransactionsCount = new AtomicLong();\r
61 \r
62     public AtomicLong getCreatedTransactionsCount() {\r
63         return createdTransactionsCount;\r
64     }\r
65 \r
66     public DataBrokerImpl() {\r
67         setDataReadRouter(new BindingAwareDataReaderRouter());\r
68     }\r
69 \r
70     @Override\r
71     public DataTransactionImpl beginTransaction() {\r
72         String transactionId = "BA-" + nextTransaction.getAndIncrement();\r
73         createdTransactionsCount.getAndIncrement();\r
74         return new DataTransactionImpl(transactionId,this);\r
75     }\r
76 \r
77     @Override\r
78     public void close() {\r
79 \r
80     }
81
82     @Override
83     protected Predicate<InstanceIdentifier<? extends DataObject>> createContainsPredicate(final
84             InstanceIdentifier<? extends DataObject> key) {
85         return new ContainsWildcarded(key);
86     }
87
88     @Override
89     protected Predicate<InstanceIdentifier<? extends DataObject>> createIsContainedPredicate(final
90             InstanceIdentifier<? extends DataObject> key) {
91         return new IsContainedWildcarded(key);
92     }
93
94     @SuppressWarnings({ "unchecked", "rawtypes" })
95     @Override
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()) {
102             try {
103                 builder.putAll(DataObjectReadingUtil.readData(entry.getValue(),(InstanceIdentifier)entry.getKey(),path));
104             } catch (Exception e) {
105                 // FIXME : Log exception;
106             }
107         }
108         return builder.build();
109
110     }
111 \r
112 }