ovsdb enable checkstyle on error
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / reconciliation / ReconciliationTask.java
1 /*
2  * Copyright (c) 2016 Brocade Communications 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.ovsdb.southbound.reconciliation;
9
10 import com.google.common.base.Preconditions;
11 import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
12 import org.opendaylight.ovsdb.southbound.reconciliation.connection.ConnectionReconciliationTask;
13 import org.opendaylight.yangtools.yang.binding.DataObject;
14 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 /**
19  * Abstract implementation of a reconciliation task. Each new type of
20  * resource configuration reconciliation task should extend this class
21  * and implement the abstract methods.
22  */
23 public abstract class ReconciliationTask implements Runnable {
24
25     private static final Logger LOG = LoggerFactory.getLogger(ReconciliationTask.class);
26
27     protected final ReconciliationManager reconciliationManager;
28     protected final OvsdbConnectionManager connectionManager;
29     protected final InstanceIdentifier<?> nodeIid;
30     protected final DataObject configData;
31
32     protected ReconciliationTask(ReconciliationManager reconciliationManager, OvsdbConnectionManager connectionManager,
33                                  InstanceIdentifier<?> nodeIid,
34                                  DataObject configData) {
35         Preconditions.checkNotNull(reconciliationManager, "Reconciliation manager must not be null");
36         Preconditions.checkNotNull(connectionManager, "Connection manager must not be null");
37         Preconditions.checkNotNull(nodeIid, "Node Iid must not be null");
38         this.reconciliationManager = reconciliationManager;
39         this.connectionManager = connectionManager;
40         this.nodeIid = nodeIid;
41         this.configData = configData;
42     }
43
44     /**
45      * Method contains task reconciliation logic. Please refer to
46      * {@link ConnectionReconciliationTask#reconcileConfiguration(OvsdbConnectionManager)}
47      * for example.
48      * @param connectionManager Connection manager to get connection instance of the device
49      * @return True if reconciliation was successful, else false
50      */
51     public abstract boolean reconcileConfiguration(OvsdbConnectionManager connectionManager);
52
53     /**
54      * Extended task should implement the logic that decides whether retry for the task
55      * is required or not. If retry is required but it does not requires any delay, submit
56      * the task immediately using {@link ReconciliationManager#enqueue(ReconciliationTask)}.
57      * If retry requires delay, use {@link ReconciliationManager#enqueueForRetry(ReconciliationTask)}
58      * and specify the delay using {@link #retryDelayInMills()}.
59      * If data store operation is required to decide if the task need retry, please implement
60      * it as an async operation and submit the task on the callback of the future.
61      * <p>
62      * Note:Please do not write blocking data store operations
63      * {@link ConnectionReconciliationTask#doRetry(boolean)}
64      * </p>
65      * @param wasPreviousAttemptSuccessful Status of the previous attempt
66      */
67     public abstract void doRetry(boolean wasPreviousAttemptSuccessful);
68
69     /**
70      * Extended task should implement the logic that check the readiness of the task
71      * for execution. If task is ready for the execution, submit it for immediate
72      * execution using {@link ReconciliationManager#enqueue(ReconciliationTask)}.
73      * If task is not ready for execution yet, enqueue it again for delayed execution
74      * using {@link ReconciliationManager#enqueueForRetry(ReconciliationTask)}.
75      * To check the readiness of the task, if the data store operation is required, please
76      * implement it as an async operation and submit the task on the callback of the future.
77      * <p>
78      * Note:Please do not write blocking data store operations
79      * {@link ConnectionReconciliationTask#doRetry(boolean)}
80      * </p>
81      */
82     public abstract void checkReadinessAndProcess();
83
84     /**
85      * Method returns the time interval for retrying the failed task.
86      * {@link ReconciliationTask#doRetry(boolean)}
87      * @return time
88      */
89     public abstract long retryDelayInMills();
90
91     @Override
92     public void run() {
93         boolean status = this.reconcileConfiguration(connectionManager);
94         doRetry(status);
95     }
96
97     @Override
98     public boolean equals(Object obj) {
99         if (this == obj) {
100             return true;
101         }
102         if (obj == null || getClass() != obj.getClass()) {
103             return false;
104         }
105
106         ReconciliationTask that = (ReconciliationTask) obj;
107
108         return nodeIid.equals(that.nodeIid);
109     }
110
111     @Override
112     public int hashCode() {
113         return getClass().hashCode() + nodeIid.hashCode();
114     }
115
116
117     @Override
118     public String toString() {
119         return "ReconciliationTask{ type=" + getClass().toString() + ", nodeIid=" + nodeIid + '}';
120     }
121 }