/*
* 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 com.rapidminer.gui.tools.VersionNumber;
import com.rapidminer.io.process.XMLImporter;
import com.rapidminer.operator.ExecutionUnit;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.OperatorCreationException;
import com.rapidminer.operator.meta.OperatorEnabler;
import com.rapidminer.operator.meta.OperatorSelector;
import com.rapidminer.parameter.UndefinedParameterError;
import com.rapidminer.tools.OperatorService;
/**
*
* @author Sebastian Land
*/
public class OperatorEnablerRepairRule extends AbstractGenericParseRule {
private static final VersionNumber APPLIES_UNTIL = new VersionNumber(5, 0, 0, false, 0, false, 0);
@Override
public String apply(Operator operator, VersionNumber processVersion, XMLImporter importer) {
if (operator.getClass().equals(OperatorEnabler.class) && (processVersion == null || processVersion.compareTo(APPLIES_UNTIL) < 0)) {
OperatorEnabler enabler = (OperatorEnabler) operator;
Operator selected = null;
String selectedName;
try {
selectedName = enabler.getParameterAsString(OperatorEnabler.PARAMETER_OPERATOR_NAME);
} catch (UndefinedParameterError e) {
selectedName = null;
}
for (Operator op : enabler.getAllInnerOperators()) {
if (op.getName().equals(selectedName)) {
selected = op;
break;
}
}
OperatorSelector selector;
try {
selector = OperatorService.createOperator(OperatorSelector.class);
} catch (OperatorCreationException e) {
return "<em class=\"error\">The operator <var>"+enabler.getName()+"</var> (<code>OperatorEnabler</code>) could not be imported: "+e.getMessage()+"</em>";
}
int selectedSubprocess = enabler.getParameterAsBoolean(OperatorEnabler.PARAMETER_ENABLE) ? 0 : 1;
selector.setParameter(OperatorSelector.PARAMETER_SELECT_WHICH, ""+(selectedSubprocess+1));
while (!enabler.getSubprocess(0).getOperators().isEmpty()) {
Operator child = enabler.getSubprocess(0).getOperators().get(0);
child.remove();
selector.getSubprocess(0).addOperator(child.cloneOperator(null, false));
if (!child.getName().equals(selectedName)) {
selector.getSubprocess(1).addOperator(child.cloneOperator(null, false));
}
}
ExecutionUnit parent = enabler.getExecutionUnit();
int oldIndex = parent.getOperators().indexOf(enabler);
enabler.remove();
selector.rename(enabler.getName());
parent.addOperator(selector, oldIndex);
if (selected == null) {
return "<em class=\"error\">The operator <var>"+enabler.getName()+"</var> (<code>OperatorEnabler</code>) could not be correctly imported since the enabled/disabled child '"+selectedName+"' was not found.</em>";
} else {
return "The operator <var>"+enabler.getName()+"</var> (<code>OperatorEnabler</code>) was replaced by an <code>OperatorSelector</code> where in subprocess "+selectedSubprocess+" the operator <var>"+selected.getName()+"</var> was omitted.";
}
} else {
return null;
}
}
@Override
public List<String> getApplicableOperatorKeys() {
return Collections.singletonList("operatorenabler");
}
}