Move AbstractDOMDataBroker to mdsal-dom-spi
[mdsal.git] / dom / mdsal-dom-spi / src / main / java / org / opendaylight / mdsal / dom / spi / AbstractDOMDataBroker.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.mdsal.dom.spi;
9
10 import java.util.EnumMap;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.concurrent.atomic.AtomicLong;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
16 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
17 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
18 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
19 import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
20 import org.opendaylight.mdsal.dom.spi.store.DOMStoreTreeChangePublisher;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransactionFactory<DOMStore>
25         implements PingPongMergingDOMDataBroker {
26     private static final Logger LOG = LoggerFactory.getLogger(AbstractDOMDataBroker.class);
27
28     private final AtomicLong txNum = new AtomicLong();
29     private final AtomicLong chainNum = new AtomicLong();
30     private final @NonNull List<Extension> supportedExtensions;
31
32     private volatile AutoCloseable closeable;
33
34     protected AbstractDOMDataBroker(final Map<LogicalDatastoreType, DOMStore> datastores) {
35         super(datastores);
36
37         boolean treeChange = true;
38         for (var ds : datastores.values()) {
39             if (!(ds instanceof DOMStoreTreeChangePublisher)) {
40                 treeChange = false;
41                 break;
42             }
43         }
44
45         if (treeChange) {
46             supportedExtensions = List.of((DOMDataTreeChangeService) (treeId, listener) -> {
47                 final var dsType = treeId.datastore();
48                 if (getTxFactories().get(dsType) instanceof DOMStoreTreeChangePublisher publisher) {
49                     return publisher.registerTreeChangeListener(treeId.path(), listener);
50                 }
51                 throw new IllegalStateException("Publisher for " + dsType + " data store is not available");
52             });
53         } else {
54             supportedExtensions = List.of();
55         }
56     }
57
58     public void setCloseable(final AutoCloseable closeable) {
59         this.closeable = closeable;
60     }
61
62     @SuppressWarnings("checkstyle:IllegalCatch")
63     @Override
64     public void close() {
65         super.close();
66
67         if (closeable != null) {
68             try {
69                 closeable.close();
70             } catch (Exception e) {
71                 LOG.debug("Error closing instance", e);
72             }
73         }
74     }
75
76     @Override
77     protected Object newTransactionIdentifier() {
78         return "DOM-" + txNum.getAndIncrement();
79     }
80
81     @Override
82     public final List<Extension> supportedExtensions() {
83         return supportedExtensions;
84     }
85
86
87     @Override
88     public DOMTransactionChain createTransactionChain() {
89         checkNotClosed();
90
91         final var delegates = new EnumMap<LogicalDatastoreType, DOMStoreTransactionChain>(LogicalDatastoreType.class);
92         for (var entry : getTxFactories().entrySet()) {
93             delegates.put(entry.getKey(), entry.getValue().createTransactionChain());
94         }
95
96         final long chainId = chainNum.getAndIncrement();
97         LOG.debug("Transactoin chain {} created, backing store chains {}", chainId, delegates);
98         return new DOMDataBrokerTransactionChainImpl(chainId, delegates, this);
99     }
100 }