X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=library%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Flib%2Fimpl%2FOvsdbClientImpl.java;h=72afec33459c88cecb16158d1242f00ed6a34f5f;hb=2c95ccc220ddcc6fef541c002a8761ff9f843912;hp=7eaaa6ba8548d6adc8324728d94db51a8c30d0bf;hpb=16ff45fde3c2a1e24380016db770f32b67611863;p=ovsdb.git diff --git a/library/impl/src/main/java/org/opendaylight/ovsdb/lib/impl/OvsdbClientImpl.java b/library/impl/src/main/java/org/opendaylight/ovsdb/lib/impl/OvsdbClientImpl.java index 7eaaa6ba8..72afec334 100644 --- a/library/impl/src/main/java/org/opendaylight/ovsdb/lib/impl/OvsdbClientImpl.java +++ b/library/impl/src/main/java/org/opendaylight/ovsdb/lib/impl/OvsdbClientImpl.java @@ -5,12 +5,10 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.ovsdb.lib.impl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.common.util.concurrent.Futures; @@ -61,14 +59,13 @@ import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - public class OvsdbClientImpl implements OvsdbClient { private static final Logger LOG = LoggerFactory.getLogger(OvsdbClientImpl.class); private ExecutorService executorService; private OvsdbRPC rpc; - private Map schemas = new HashMap<>(); - private Map monitorCallbacks = new HashMap<>(); + private final Map schemas = new HashMap<>(); + private final Map monitorCallbacks = new HashMap<>(); private OvsdbRPC.Callback rpcCallback; private OvsdbConnectionInfo connectionInfo; private Channel channel; @@ -80,8 +77,8 @@ public class OvsdbClientImpl implements OvsdbClient { private static final ThreadFactory THREAD_FACTORY_NON_SSL = new ThreadFactoryBuilder().setNameFormat("OVSDB-PassiveConnection-Non-SSL-%d").build(); - public OvsdbClientImpl(OvsdbRPC rpc, Channel channel, ConnectionType type, - SocketConnectionType socketConnType) { + public OvsdbClientImpl(final OvsdbRPC rpc, final Channel channel, final ConnectionType type, + final SocketConnectionType socketConnType) { this.rpc = rpc; ThreadFactory threadFactory = getThreadFactory(type, socketConnType, channel.remoteAddress().toString()); @@ -97,8 +94,8 @@ public class OvsdbClientImpl implements OvsdbClient { * @param executorNameArgs Additional args to append to thread name format * @return {@link ThreadFactory} */ - private ThreadFactory getThreadFactory(ConnectionType type, - SocketConnectionType socketConnType, String executorNameArgs) { + private ThreadFactory getThreadFactory(final ConnectionType type, + final SocketConnectionType socketConnType, final String executorNameArgs) { if (type == ConnectionType.PASSIVE) { switch (socketConnType) { case SSL: @@ -125,7 +122,7 @@ public class OvsdbClientImpl implements OvsdbClient { if (rpcCallback == null) { OvsdbRPC.Callback temp = new OvsdbRPC.Callback() { @Override - public void update(Object node, UpdateNotification updateNotification) { + public void update(final Object node, final UpdateNotification updateNotification) { String key = updateNotification.getContext(); CallbackContext callbackContext = monitorCallbacks.get(key); MonitorCallBack monitorCallBack = callbackContext.monitorCallBack; @@ -140,12 +137,12 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public void locked(Object node, List ids) { + public void locked(final Object node, final List ids) { } @Override - public void stolen(Object node, List ids) { + public void stolen(final Object node, final List ids) { } }; @@ -155,7 +152,7 @@ public class OvsdbClientImpl implements OvsdbClient { } - protected TableUpdates transformingCallback(JsonNode tableUpdatesJson, DatabaseSchema dbSchema) { + protected TableUpdates transformingCallback(final JsonNode tableUpdatesJson, final DatabaseSchema dbSchema) { //todo(ashwin): we should move all the JSON parsing logic to a utility class if (tableUpdatesJson instanceof ObjectNode) { Map tableUpdateMap = new HashMap<>(); @@ -174,7 +171,8 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public ListenableFuture> transact(DatabaseSchema dbSchema, List operations) { + public ListenableFuture> transact(final DatabaseSchema dbSchema, + final List operations) { //todo, we may not need transactionbuilder if we can have JSON objects TransactBuilder builder = new TransactBuilder(dbSchema); @@ -187,16 +185,16 @@ public class OvsdbClientImpl implements OvsdbClient { @Override public > TableUpdates monitor(final DatabaseSchema dbSchema, - List monitorRequest, + final List monitorRequest, final MonitorCallBack callback) { return monitor(dbSchema, monitorRequest, callback, NO_TIMEOUT); } @Override public > TableUpdates monitor(final DatabaseSchema dbSchema, - List monitorRequest, + final List monitorRequest, final MonitorCallBack callback, - int timeout) { + final int timeout) { final ImmutableMap reqMap = Maps.uniqueIndex(monitorRequest, MonitorRequest::getTableName); @@ -222,7 +220,7 @@ public class OvsdbClientImpl implements OvsdbClient { @Override public > TableUpdates monitor(final DatabaseSchema dbSchema, - List monitorRequest, + final List monitorRequest, final MonitorHandle monitorHandle, final MonitorCallBack callback) { return monitor(dbSchema, monitorRequest, monitorHandle, callback, NO_TIMEOUT); @@ -230,10 +228,10 @@ public class OvsdbClientImpl implements OvsdbClient { @Override public > TableUpdates monitor(final DatabaseSchema dbSchema, - List monitorRequest, + final List monitorRequest, final MonitorHandle monitorHandle, final MonitorCallBack callback, - int timeout) { + final int timeout) { final ImmutableMap reqMap = Maps.uniqueIndex(monitorRequest, MonitorRequest::getTableName); @@ -256,7 +254,8 @@ public class OvsdbClientImpl implements OvsdbClient { return transformingCallback(result, dbSchema); } - private void registerCallback(MonitorHandle monitorHandle, MonitorCallBack callback, DatabaseSchema schema) { + private void registerCallback(final MonitorHandle monitorHandle, final MonitorCallBack callback, + final DatabaseSchema schema) { this.monitorCallbacks.put(monitorHandle.getId(), new CallbackContext(callback, schema)); setupUpdateListener(); } @@ -267,7 +266,7 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public void cancelMonitor(final MonitorHandle handler, int timeout) { + public void cancelMonitor(final MonitorHandle handler, final int timeout) { ListenableFuture cancelMonitor = rpc.monitor_cancel(() -> Collections.singletonList(handler.getId())); JsonNode result = null; @@ -294,22 +293,23 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public void lock(String lockId, LockAquisitionCallback lockedCallBack, LockStolenCallback stolenCallback) { + public void lock(final String lockId, final LockAquisitionCallback lockedCallBack, + final LockStolenCallback stolenCallback) { throw new UnsupportedOperationException("not yet implemented"); } @Override - public ListenableFuture steal(String lockId) { + public ListenableFuture steal(final String lockId) { throw new UnsupportedOperationException("not yet implemented"); } @Override - public ListenableFuture unLock(String lockId) { + public ListenableFuture unLock(final String lockId) { throw new UnsupportedOperationException("not yet implemented"); } @Override - public void startEchoService(EchoServiceCallbackFilters callbackFilters) { + public void startEchoService(final EchoServiceCallbackFilters callbackFilters) { throw new UnsupportedOperationException("not yet implemented"); } @@ -319,7 +319,7 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public TransactionBuilder transactBuilder(DatabaseSchema dbSchema) { + public TransactionBuilder transactBuilder(final DatabaseSchema dbSchema) { return new TransactionBuilder(this, dbSchema); } @@ -342,25 +342,21 @@ public class OvsdbClientImpl implements OvsdbClient { @Override public ListenableFuture getSchema(final String database) { - - DatabaseSchema databaseSchema = schemas.get(database); - - if (databaseSchema == null) { - return Futures.transform( - getSchemaFromDevice(Collections.singletonList(database)), - (Function, DatabaseSchema>) result -> { - if (result.containsKey(database)) { - DatabaseSchema dbSchema = result.get(database); - dbSchema.populateInternallyGeneratedColumns(); - OvsdbClientImpl.this.schemas.put(database, dbSchema); - return dbSchema; - } else { - return null; - } - }, executorService); - } else { - return Futures.immediateFuture(databaseSchema); + final DatabaseSchema existing = schemas.get(database); + if (existing != null) { + return Futures.immediateFuture(existing); } + + return Futures.transform(getSchemaFromDevice(Collections.singletonList(database)), result -> { + final DatabaseSchema dbSchema = result.get(database); + if (dbSchema == null) { + return null; + } + + dbSchema.populateInternallyGeneratedColumns(); + final DatabaseSchema raced = schemas.putIfAbsent(database, dbSchema); + return raced != null ? raced : dbSchema; + }, executorService); } private ListenableFuture> getSchemaFromDevice(final List dbNames) { @@ -394,7 +390,7 @@ public class OvsdbClientImpl implements OvsdbClient { }, MoreExecutors.directExecutor()); } - public void setRpc(OvsdbRPC rpc) { + public void setRpc(final OvsdbRPC rpc) { this.rpc = rpc; } @@ -402,14 +398,14 @@ public class OvsdbClientImpl implements OvsdbClient { MonitorCallBack monitorCallBack; DatabaseSchema schema; - CallbackContext(MonitorCallBack monitorCallBack, DatabaseSchema schema) { + CallbackContext(final MonitorCallBack monitorCallBack, final DatabaseSchema schema) { this.monitorCallBack = monitorCallBack; this.schema = schema; } } @Override - public DatabaseSchema getDatabaseSchema(String dbName) { + public DatabaseSchema getDatabaseSchema(final String dbName) { return schemas.get(dbName); } @@ -421,7 +417,7 @@ public class OvsdbClientImpl implements OvsdbClient { * @param klazz Typed Class that represents a Table * @return DatabaseSchema that matches a Typed Table Class */ - private DatabaseSchema getDatabaseSchemaForTypedTable(Class klazz) { + private DatabaseSchema getDatabaseSchemaForTypedTable(final Class klazz) { TypedTable typedTable = klazz.getAnnotation(TypedTable.class); if (typedTable != null) { return this.getDatabaseSchema(typedTable.database()); @@ -437,7 +433,7 @@ public class OvsdbClientImpl implements OvsdbClient { * @return Proxy wrapper for the actual raw Row class. */ @Override - public > T createTypedRowWrapper(Class klazz) { + public > T createTypedRowWrapper(final Class klazz) { DatabaseSchema dbSchema = getDatabaseSchemaForTypedTable(klazz); return this.createTypedRowWrapper(dbSchema, klazz); } @@ -451,7 +447,7 @@ public class OvsdbClientImpl implements OvsdbClient { * @return Proxy wrapper for the actual raw Row class. */ @Override - public > T createTypedRowWrapper(DatabaseSchema dbSchema, Class klazz) { + public > T createTypedRowWrapper(final DatabaseSchema dbSchema, final Class klazz) { return TyperUtils.getTypedRowWrapper(dbSchema, klazz, new Row<>()); } @@ -492,7 +488,7 @@ public class OvsdbClientImpl implements OvsdbClient { } @Override - public void setConnectionPublished(boolean connectionPublished) { + public void setConnectionPublished(final boolean connectionPublished) { isConnectionPublished = connectionPublished; } }