ReferencePrioritiesImpl.java
/**
* Copyright (c) 2023, Coreso SA (https://www.coreso.eu/) and TSCNET Services GmbH (https://www.tscnet.eu/)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.iidm.network.impl.extensions;
import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.Connectable;
import com.powsybl.iidm.network.Terminal;
import com.powsybl.iidm.network.extensions.ReferencePriorities;
import com.powsybl.iidm.network.extensions.ReferencePriority;
import com.powsybl.iidm.network.extensions.ReferencePriorityAdder;
import com.powsybl.iidm.network.impl.AbstractMultiVariantIdentifiableExtension;
import java.util.*;
/**
* @author Damien Jeandemange {@literal <damien.jeandemange at artelys.com>}
*/
class ReferencePrioritiesImpl<C extends Connectable<C>> extends AbstractMultiVariantIdentifiableExtension<C> implements ReferencePriorities<C> {
private final ArrayList<Map<Terminal, ReferencePriority>> referencePrioritiesPerVariant;
public ReferencePrioritiesImpl(C extendable) {
super(extendable);
this.referencePrioritiesPerVariant = new ArrayList<>(
Collections.nCopies(getVariantManagerHolder().getVariantManager().getVariantArraySize(), new LinkedHashMap<>()));
}
ReferencePrioritiesImpl<C> add(ReferencePriority referencePriority) {
if (!getExtendable().getTerminals().contains(referencePriority.getTerminal())) {
throw new PowsyblException(String.format("The provided terminal does not belong to the connectable %s",
getExtendable().getId()));
}
referencePrioritiesPerVariant.get(getVariantIndex()).put(referencePriority.getTerminal(), referencePriority);
return this;
}
@Override
public ReferencePriorityAdder newReferencePriority() {
return new ReferencePriorityAdderImpl(this);
}
@Override
public List<ReferencePriority> getReferencePriorities() {
return referencePrioritiesPerVariant.get(getVariantIndex()).values().stream().toList();
}
@Override
public void deleteReferencePriorities() {
referencePrioritiesPerVariant.get(getVariantIndex()).clear();
}
@Override
public void extendVariantArraySize(int initVariantArraySize, int number, int sourceIndex) {
referencePrioritiesPerVariant.ensureCapacity(referencePrioritiesPerVariant.size() + number);
Map<Terminal, ReferencePriority> sourcePriorities = referencePrioritiesPerVariant.get(sourceIndex);
for (int i = 0; i < number; ++i) {
referencePrioritiesPerVariant.add(new LinkedHashMap<>(sourcePriorities));
}
}
@Override
public void reduceVariantArraySize(int number) {
for (int i = 0; i < number; i++) {
referencePrioritiesPerVariant.remove(referencePrioritiesPerVariant.size() - 1); // remove elements from the top to avoid moves inside the array
}
}
@Override
public void deleteVariantArrayElement(int index) {
referencePrioritiesPerVariant.set(index, null);
}
@Override
public void allocateVariantArrayElement(int[] indexes, int sourceIndex) {
Map<Terminal, ReferencePriority> sourcePriorities = referencePrioritiesPerVariant.get(sourceIndex);
for (int index : indexes) {
referencePrioritiesPerVariant.set(index, new LinkedHashMap<>(sourcePriorities));
}
}
}