/* * Copyright © 2024 Smartoptics and others. All rights reserved. * * This program and the accompanying materials are made available under the * 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.transportpce.renderer.provisiondevice.transaction.history; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.opendaylight.transportpce.renderer.provisiondevice.transaction.DeviceInterface; import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Transaction; import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A class keeping track of transaction history. * *

* A transaction can be something like an interface or a roadm connection, that may need to be * rolled back in the future. */ public class TransactionHistory implements History { private static final Logger LOG = LoggerFactory.getLogger(TransactionHistory.class); Set transactionHistory = Collections.synchronizedSet(new LinkedHashSet<>()); @Override public boolean add(Transaction transaction) { boolean result = transactionHistory.add(transaction); if (result) { LOG.info("Adding {}", transaction.description()); } else { LOG.warn("Transaction {} not added.", transaction.description()); } return result; } @Override public boolean add(List transactions) { Set results = new HashSet<>(transactions.size()); for (Transaction transaction : transactions) { results.add(add(transaction)); } return results.stream().allMatch(i -> (i.equals(Boolean.TRUE))); } @Override public boolean addInterfaces(String nodeId, String interfaceId) { return addInterfaces(nodeId, Collections.singletonList(interfaceId)); } @Override public boolean addInterfaces(String nodeId, String[] interfaceIds) { return addInterfaces(nodeId, Arrays.asList(interfaceIds)); } @Override public boolean addInterfaces(String nodeId, List interfaceIds) { Set results = new HashSet<>(); Set unique = new LinkedHashSet<>(); for (String interfaceId : interfaceIds) { if (interfaceId != null && !interfaceId.trim().isEmpty()) { unique.add(interfaceId.trim()); } } for (String interfaceId : unique) { results.add(this.add(new DeviceInterface(nodeId, interfaceId))); } return results.stream().allMatch(i -> (i.equals(Boolean.TRUE))); } @Override public boolean rollback(Delete delete) { LOG.info("History contains {} items. Rolling them back in reverse order.", transactionHistory.size()); List reverse = new ArrayList<>(transactionHistory); Collections.reverse(reverse); boolean success = true; for (Transaction transaction : reverse) { LOG.info("Rolling back {}", transaction.description()); if (!transaction.rollback(delete)) { success = false; } } return success; } }