a06ee5edfeab3094538d404c11e53810a3013b40
[controller.git] / opendaylight / md-sal / mdsal-trace / dom-impl / src / main / java / org / opendaylight / controller / md / sal / trace / dom / impl / AbstractTracingWriteTransaction.java
1 /*
2  * Copyright (c) 2016 Red Hat, 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.md.sal.trace.dom.impl;
9
10 import com.google.common.collect.ImmutableSet;
11 import com.google.common.util.concurrent.CheckedFuture;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Objects;
16 import java.util.Set;
17 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
20 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
21 import org.opendaylight.yangtools.yang.common.RpcResult;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
23 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
24
25 abstract class AbstractTracingWriteTransaction implements DOMDataWriteTransaction {
26
27     private final DOMDataWriteTransaction delegate;
28     private final TracingBroker tracingBroker;
29     private final List<String> logs = new ArrayList<>();
30
31     AbstractTracingWriteTransaction(DOMDataWriteTransaction delegate, TracingBroker tracingBroker) {
32         this.delegate = Objects.requireNonNull(delegate);
33         this.tracingBroker = Objects.requireNonNull(tracingBroker);
34     }
35
36     private void recordOp(LogicalDatastoreType store, YangInstanceIdentifier yiid, String method,
37             NormalizedNode<?, ?> node) {
38         if (!tracingBroker.isWriteWatched(yiid, store)) {
39             return;
40         }
41
42         final Object value = node != null ? node.getValue() : null;
43
44         if (value != null && value instanceof ImmutableSet && ((Set<?>)value).isEmpty()) {
45             if (TracingBroker.LOG.isDebugEnabled()) {
46                 TracingBroker.LOG.debug("Empty data set write to {}", tracingBroker.toPathString(yiid));
47             }
48         } else {
49             StringBuilder sb = new StringBuilder();
50             sb.append("Method \"").append(method);
51             sb.append("\" to ").append(store);
52             sb.append(" at ").append(tracingBroker.toPathString(yiid)).append('.');
53             sb.append(" Data: ");
54             if (node != null) {
55                 sb.append(node.getValue());
56             } else {
57                 sb.append("null");
58             }
59             sb.append(" Stack:").append(tracingBroker.getStackSummary());
60             synchronized (this) {
61                 logs.add(sb.toString());
62             }
63         }
64     }
65
66     private synchronized void logOps() {
67         synchronized (this) {
68             logs.forEach(log -> TracingBroker.LOG.warn(log));
69             logs.clear();
70         }
71     }
72
73     @Override
74     public void put(LogicalDatastoreType store, YangInstanceIdentifier yiid, NormalizedNode<?, ?> node) {
75         recordOp(store, yiid, "put", node);
76         delegate.put(store, yiid, node);
77     }
78
79     @Override
80     public void merge(LogicalDatastoreType store, YangInstanceIdentifier yiid, NormalizedNode<?, ?> node) {
81         recordOp(store, yiid, "merge", node);
82         delegate.merge(store, yiid, node);
83     }
84
85     @Override
86     public boolean cancel() {
87         synchronized (this) {
88             logs.clear();
89         }
90         boolean result = delegate.cancel();
91         return result;
92     }
93
94     @Override
95     public void delete(LogicalDatastoreType store, YangInstanceIdentifier yiid) {
96         recordOp(store, yiid, "delete", null);
97         delegate.delete(store, yiid);
98     }
99
100     @Override
101     public CheckedFuture<Void, TransactionCommitFailedException> submit() {
102         logOps();
103         return delegate.submit();
104     }
105
106     @Override
107     public ListenableFuture<RpcResult<TransactionStatus>> commit() {
108         logOps();
109         return delegate.commit();
110     }
111
112     @Override
113     public Object getIdentifier() {
114         return delegate.getIdentifier();
115     }
116 }