Fix loose typing in ItmMonitorWorker 30/90230/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 3 Jun 2020 11:27:16 +0000 (13:27 +0200)
committerHema Gopalakrishnan <hema.gopalkrishnan@ericsson.com>
Mon, 3 Aug 2020 17:09:22 +0000 (17:09 +0000)
Having a type-variant constructor with internal instanceof checks
prevents proper type safety. Fix this by introducing two separate
constructors. Fixes:

java.lang.ClassCastException: class org.opendaylight.yangtools.yang.common.Uint16 cannot be cast to class java.lang.Integer
at org.opendaylight.genius.itm.confighelpers.ItmMonitorWorker.<init>(ItmMonitorWorker.java:71) ~[bundleFile:?]
at org.opendaylight.genius.itm.listeners.TunnelMonitorIntervalListener.add(TunnelMonitorIntervalListener.java:127) ~[bundleFile:?]
at org.opendaylight.genius.itm.listeners.TunnelMonitorIntervalListener.add(TunnelMonitorIntervalListener.java:34) ~[bundleFile:?]
at org.opendaylight.serviceutils.tools.listener.DataTreeChangeListenerActions.onDataTreeChanged(DataTreeChangeListenerActions.java:65) ~[bundleFile:?]
at org.opendaylight.serviceutils.tools.listener.AbstractSyncDataTreeChangeListener.onDataTreeChanged(AbstractSyncDataTreeChangeListener.java:50) ~[bundleFile:?]
at org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataTreeChangeListenerAdapter.onDataTreeChanged(BindingDOMDataTreeChangeListenerAdapter.java:37) ~[bundleFile:?]
at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.dataTreeChanged(DataTreeChangeListenerActor.java:83) [bundleFile:?]
at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.handleReceive(DataTreeChangeListenerActor.java:44) [bundleFile:?]

Change-Id: I3d6e312532dead3b1668e03fe58984d77b40d6de
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmMonitorWorker.java

index 2f5f938815b724e7f55fadcaeeb16983e4c586e4..da1aabadfb8f4ce0d4b0c83aeb2e5011d741e711 100644 (file)
@@ -34,12 +34,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.dpns.teps.RemoteDpns;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.dpns.teps.RemoteDpnsBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ItmMonitorWorker implements Callable<List<? extends ListenableFuture<?>>> {
-
     private static final Logger LOG = LoggerFactory.getLogger(ItmMonitorWorker.class);
 
     private final String tzone;
@@ -49,32 +49,42 @@ public class ItmMonitorWorker implements Callable<List<? extends ListenableFutur
     private final OvsBridgeRefEntryCache ovsBridgeRefEntryCache;
     private final ManagedNewTransactionRunner txRunner;
     private final Boolean enabled;
-    private final Integer interval;
+    private final Uint16 interval;
 
-    public <T> ItmMonitorWorker(String tzone, T monitoring,
-                                Class<? extends TunnelMonitoringTypeBase> monitorProtocol, DataBroker dataBroker,
-                                DirectTunnelUtils directTunnelUtils,
-                                DpnTepStateCache dpnTepStateCache,
-                                OvsBridgeRefEntryCache ovsBridgeRefEntryCache) {
+    private ItmMonitorWorker(String tzone, Boolean enabled, Uint16 interval,
+                             Class<? extends TunnelMonitoringTypeBase> monitorProtocol, DataBroker dataBroker,
+                             DirectTunnelUtils directTunnelUtils, DpnTepStateCache dpnTepStateCache,
+                             OvsBridgeRefEntryCache ovsBridgeRefEntryCache) {
         this.tzone = tzone;
         this.monitorProtocol = monitorProtocol;
         this.directTunnelUtils = directTunnelUtils;
         this.dpnTepStateCache = dpnTepStateCache;
         this.ovsBridgeRefEntryCache = ovsBridgeRefEntryCache;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
-        LOG.trace("ItmMonitorWorker initialized with  tzone {} and toggleBoolean {}", tzone, monitoring);
-        if (monitoring instanceof Boolean) {
-            this.enabled = (Boolean) monitoring;
-            this.interval = null;
-        }
-        else {
-            this.interval = (Integer) monitoring;
-            this.enabled = null;
-        }
+        LOG.trace("ItmMonitorWorker initialized with  tzone {} and toggleBoolean {}", tzone, enabled);
+        this.enabled = enabled;
+        this.interval = interval;
         LOG.debug("Toggle monitoring enabled {} interval {} monitor protocol {}", enabled, interval, monitorProtocol);
     }
 
-    @Override public List<ListenableFuture<Void>> call() {
+    public <T> ItmMonitorWorker(String tzone, Boolean enabled,
+                                Class<? extends TunnelMonitoringTypeBase> monitorProtocol, DataBroker dataBroker,
+                                DirectTunnelUtils directTunnelUtils, DpnTepStateCache dpnTepStateCache,
+                                OvsBridgeRefEntryCache ovsBridgeRefEntryCache) {
+        this(tzone, enabled, null, monitorProtocol, dataBroker, directTunnelUtils, dpnTepStateCache,
+            ovsBridgeRefEntryCache);
+    }
+
+    public <T> ItmMonitorWorker(String tzone, Uint16 interval,
+                                Class<? extends TunnelMonitoringTypeBase> monitorProtocol, DataBroker dataBroker,
+                                DirectTunnelUtils directTunnelUtils, DpnTepStateCache dpnTepStateCache,
+                                OvsBridgeRefEntryCache ovsBridgeRefEntryCache) {
+        this(tzone, null, interval, monitorProtocol, dataBroker, directTunnelUtils, dpnTepStateCache,
+            ovsBridgeRefEntryCache);
+    }
+
+    @Override
+    public List<ListenableFuture<Void>> call() {
         LOG.debug("ItmMonitorWorker invoked with tzone = {} enabled {}", tzone, enabled);
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         return toggleTunnelMonitoring(futures);
@@ -117,7 +127,6 @@ public class ItmMonitorWorker implements Callable<List<? extends ListenableFutur
         }
     }
 
-
     private void toggleForDirectEnabled(DpnsTeps dpnTeps, TypedWriteTransaction<Datastore.Configuration> tx)
             throws ReadFailedException {
         List<RemoteDpns> remoteDpnTepNewList = new ArrayList<>();
@@ -150,5 +159,4 @@ public class ItmMonitorWorker implements Callable<List<? extends ListenableFutur
         LOG.debug("DirectTunnelUtils - Builder remoteDPNs: {}", builder.getRemoteDpns());
         tx.merge(iid, builder.build());
     }
-
 }