/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.testutils; import java.util.concurrent.Callable; import de.rcenvironment.core.communication.channel.MessageChannelLifecycleListener; import de.rcenvironment.core.communication.channel.MessageChannelTrafficListener; import de.rcenvironment.core.communication.model.NetworkContactPoint; import de.rcenvironment.core.communication.transport.spi.NetworkTransportProvider; import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils; import de.rcenvironment.toolkit.modules.concurrency.api.CallablesGroup; import de.rcenvironment.toolkit.modules.concurrency.api.TaskDescription; /** * Utility class to simplify the management of virtual node instances. Any methods called are delegated to each node in the group. * * @author Robert Mischke */ public class VirtualInstanceGroup implements CommonVirtualInstanceControl { private CommonVirtualInstanceControl[] instances; /** * Creates a new group with the given nodes. * * Note: There is no specific reason against dynamically adding/removing instances; add this feature when necessary. * * @param instances the dynamic-length list of instances to add */ public VirtualInstanceGroup(CommonVirtualInstanceControl... instances) { this.instances = instances; } @Override public void setTargetState(final VirtualInstanceState state) throws InterruptedException { CallablesGroup<Void> callablesGroup = ConcurrencyUtils.getFactory().createCallablesGroup(Void.class); for (final CommonVirtualInstanceControl instance : instances) { callablesGroup.add(new Callable<Void>() { @Override @TaskDescription("Set individual target states in a virtual instance group") public Void call() throws Exception { instance.setTargetState(state); return null; } }); } callablesGroup.executeParallel(null); } @Override public void waitForStateChangesToFinish() throws InterruptedException { for (CommonVirtualInstanceControl instance : instances) { instance.waitForStateChangesToFinish(); } } @Override public void start() throws InterruptedException { // first set all target states, then wait for all changes to finish; this results in better // parallelization than looping and calling start() on each instance -- misc_ro setTargetState(VirtualInstanceState.STARTED); waitForStateChangesToFinish(); } @Override public void simulateCrash() throws InterruptedException { // first set all target states, then wait for all changes to finish; this results in better // parallelization than looping and calling simulateCrash() on each instance -- misc_ro setTargetState(VirtualInstanceState.SIMULATED_CRASHING); waitForStateChangesToFinish(); } @Override public void shutDown() throws InterruptedException { // first set all target states, then wait for all changes to finish; this results in better // parallelization than looping and calling shutDown() on each instance -- misc_ro setTargetState(VirtualInstanceState.STOPPED); waitForStateChangesToFinish(); } @Override public void registerNetworkTransportProvider(NetworkTransportProvider provider) { for (CommonVirtualInstanceControl instance : instances) { instance.registerNetworkTransportProvider(provider); } } @Override public void simulateCustomProtocolVersion(String version) { for (CommonVirtualInstanceControl instance : instances) { instance.simulateCustomProtocolVersion(version); } } @Override public void addInitialNetworkPeer(NetworkContactPoint contactPoint) { for (CommonVirtualInstanceControl instance : instances) { instance.addInitialNetworkPeer(contactPoint); } } @Override public void addNetworkConnectionListener(MessageChannelLifecycleListener listener) { for (CommonVirtualInstanceControl instance : instances) { instance.addNetworkConnectionListener(listener); } } @Override public void addNetworkTrafficListener(MessageChannelTrafficListener listener) { for (CommonVirtualInstanceControl instance : instances) { instance.addNetworkTrafficListener(listener); } } /** * @return all contained instances as an array */ public VirtualInstance[] toArray() { VirtualInstance[] result = new VirtualInstance[instances.length]; int i = 0; for (CommonVirtualInstanceControl instance : instances) { result[i++] = (VirtualInstance) instance; } return result; } }