/*
* RapidMiner
*
* Copyright (C) 2001-2011 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.io.process.rules;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import com.rapidminer.gui.tools.VersionNumber;
import com.rapidminer.io.process.XMLImporter;
import com.rapidminer.operator.ExecutionUnit;
import com.rapidminer.operator.IOMultiplier;
import com.rapidminer.operator.IOMultiplyOperator;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.OperatorCreationException;
import com.rapidminer.operator.ports.InputPort;
import com.rapidminer.operator.ports.OutputPort;
import com.rapidminer.parameter.UndefinedParameterError;
import com.rapidminer.tools.LogService;
import com.rapidminer.tools.OperatorService;
/**
* Replaces the old {@link IOMultiplyOperator} by a number of {@link IOMultiplier}s.
*
* @author Simon Fischer
*
*/
public class ReplaceIOMultiplierRule extends AbstractGenericParseRule {
private static final VersionNumber APPLIES_UNTIL = new VersionNumber(5, 0, 0, false, 0, false, 0);
@Override
public String apply(final Operator oldMultiplier, VersionNumber processVersion, final XMLImporter importer) {
if (processVersion == null || processVersion.compareTo(APPLIES_UNTIL) < 0) {
if (oldMultiplier.getClass().equals(IOMultiplyOperator.class)) {
importer.doAfterAutoWire(new Runnable() {
@Override
public void run() {
int count = 0;
ExecutionUnit unit = oldMultiplier.getExecutionUnit();
int oldIndex = unit.getOperators().indexOf(oldMultiplier);
int numOutports;
try {
numOutports = oldMultiplier.getParameterAsInt(IOMultiplyOperator.PARAMETER_NUMBER_OF_COPIES) + 1;
} catch (UndefinedParameterError e) {
importer.addMessage("<div class=\"error\">Cannot replace <code>IOMultiplier</code>. Parameter <var>" + IOMultiplyOperator.PARAMETER_NUMBER_OF_COPIES + "</var> is not set.</div>");
return;
}
OutputPort[] sources = new OutputPort[oldMultiplier.getInputPorts().getNumberOfPorts()];
InputPort[][] sinks = new InputPort[oldMultiplier.getInputPorts().getNumberOfPorts()][numOutports];
// copy sources and destinations
for (int i = 0; i < sources.length; i++) {
InputPort in = oldMultiplier.getInputPorts().getPortByIndex(i);
if (in.isConnected()) {
sources[i] = in.getSource();
sources[i].lock();
for (int j = 0; j < numOutports; j++) {
sinks[i][j] = oldMultiplier.getOutputPorts().getPortByIndex(i * numOutports + j).getDestination();
if (sinks[i][j] != null) {
sinks[i][j].lock();
}
}
}
}
oldMultiplier.remove();
for (int i = 0; i < sources.length; i++) {
try {
if (sources[i] != null) {
IOMultiplier newMultiplier = OperatorService.createOperator(IOMultiplier.class);
unit.addOperator(newMultiplier, oldIndex);
count++;
newMultiplier.rename(oldMultiplier.getName() + "_" + count);
sources[i].connectTo(newMultiplier.getInputPorts().getPortByIndex(0));
for (int j = 0; j < numOutports; j++) {
if (sinks[i][j] != null) {
newMultiplier.getOutputPorts().getPortByIndex(j).connectTo(sinks[i][j]);
sinks[i][j].unlock();
}
}
sources[i].unlock();
}
} catch (OperatorCreationException e) {
importer.addMessage("<div class=\"error\">Cannot replace <code>IOMultiplier</code>. Cannot create <code>IOMultiplier2</code>.");
LogService.getRoot().log(Level.WARNING, "Cannot create IOMultiplier2: " + e, e);
return;
}
}
importer.addMessage("Replaced <code>IOMultiplier</code> '<var>" + oldMultiplier.getName() + "</var>' by " + count + " <code>IOMultiplier2</code>.");
}
});
}
}
return null;
}
@Override
public List<String> getApplicableOperatorKeys() {
return Collections.singletonList("iomultiplier");
}
}