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