*/
package org.opendaylight.lispflowmapping.dsbackend;
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
* Stores data coming from the mapping database RPCs into the MD-SAL datastore.
*
* @author Lorand Jakab
- *
*/
public class DataStoreBackEnd implements TransactionChainListener {
private static final Logger LOG = LoggerFactory.getLogger(DataStoreBackEnd.class);
InstanceIdentifier.create(MappingDatabase.class);
private static final InstanceIdentifier<LastUpdated> LAST_UPDATED =
InstanceIdentifier.create(MappingDatabase.class).child(LastUpdated.class);
- private final DataBroker broker;
- private TransactionChain txChain;
- public DataStoreBackEnd(DataBroker broker) {
- this.broker = broker;
- createTransactionChain();
- }
+ private final TransactionChain configTxChain;
+ private final TransactionChain operTxChain;
- public void createTransactionChain() {
+ @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "Non-final for mocking")
+ public DataStoreBackEnd(DataBroker broker) {
LOG.debug("Creating DataStoreBackEnd transaction chain...");
- txChain = broker.createMergingTransactionChain(this);
+ configTxChain = broker.createMergingTransactionChain(this);
+ operTxChain = broker.createMergingTransactionChain(this);
}
public void addAuthenticationKey(AuthenticationKey authenticationKey) {
// This method assumes that it is only called for southbound originated Map-Registers
public void addXtrIdMapping(XtrIdMapping mapping) {
XtrId xtrId = mapping.getMappingRecord().getXtrId();
- Preconditions.checkNotNull(xtrId, "Make sure you only call addXtrIdMapping when the MappingRecord "
- + "contains an xTR-ID");
+ requireNonNull(xtrId, "Make sure you only call addXtrIdMapping when the MappingRecord contains an xTR-ID");
if (LOG.isDebugEnabled()) {
LOG.debug("MD-SAL: Adding mapping for {}, xTR-ID {}",
LispAddressStringifier.getString(mapping.getMappingRecord().getEid()), xtrId);
public void removeXtrIdMapping(XtrIdMapping mapping) {
XtrId xtrId = mapping.getMappingRecord().getXtrId();
- Preconditions.checkNotNull(xtrId, "Make sure you only call addXtrIdMapping when the MappingRecord "
- + "contains an xTR-ID");
+ requireNonNull(xtrId, "Make sure you only call addXtrIdMapping when the MappingRecord contains an xTR-ID");
if (LOG.isDebugEnabled()) {
LOG.debug("MD-SAL: Removing mapping for {}, xTR-ID {}",
LispAddressStringifier.getString(mapping.getMappingRecord().getEid()), xtrId);
: LogicalDatastoreType.CONFIGURATION;
}
+ private TransactionChain getChain(LogicalDatastoreType logicalDatastoreType) {
+ return switch (logicalDatastoreType) {
+ case CONFIGURATION -> configTxChain;
+ case OPERATIONAL -> operTxChain;
+ };
+ }
+
private <U extends org.opendaylight.yangtools.yang.binding.DataObject> void writePutTransaction(
InstanceIdentifier<U> addIID, U data, LogicalDatastoreType logicalDatastoreType, String errMsg) {
- WriteTransaction writeTx = txChain.newWriteOnlyTransaction();
+ WriteTransaction writeTx = getChain(logicalDatastoreType).newWriteOnlyTransaction();
// TODO: is is a utility method, hence we do not have enough lifecycle knowledge to use plain put()
writeTx.mergeParentStructurePut(logicalDatastoreType, addIID, data);
writeTx.commit().addCallback(new FutureCallback<CommitInfo>() {
private <U extends org.opendaylight.yangtools.yang.binding.DataObject> U readTransaction(
InstanceIdentifier<U> readIID, LogicalDatastoreType logicalDatastoreType) {
final ListenableFuture<Optional<U>> readFuture;
- try (ReadTransaction readTx = txChain.newReadOnlyTransaction()) {
+ try (ReadTransaction readTx = getChain(logicalDatastoreType).newReadOnlyTransaction()) {
readFuture = readTx.read(logicalDatastoreType, readIID);
}
try {
Optional<U> optionalDataObject = readFuture.get();
if (optionalDataObject != null && optionalDataObject.isPresent()) {
- return optionalDataObject.get();
+ return optionalDataObject.orElseThrow();
} else {
LOG.debug("{}: Failed to read", Thread.currentThread().getStackTrace()[1]);
}
private <U extends org.opendaylight.yangtools.yang.binding.DataObject> void deleteTransaction(
InstanceIdentifier<U> deleteIID, LogicalDatastoreType logicalDatastoreType, String errMsg) {
-
- WriteTransaction writeTx = txChain.newWriteOnlyTransaction();
+ WriteTransaction writeTx = getChain(logicalDatastoreType).newWriteOnlyTransaction();
writeTx.delete(logicalDatastoreType, deleteIID);
writeTx.commit().addCallback(new FutureCallback<CommitInfo>() {
@Override
public void closeTransactionChain() {
LOG.debug("Closing DataStoreBackEnd transaction chain...");
- txChain.close();
+ configTxChain.close();
+ operTxChain.close();
}
}