Java tutorial
/******************************************************************************* * Copyright (c) 2012 BestSolution.at 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 * * Contributors: * Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation *******************************************************************************/ package at.bestsolution.efxclipse.tooling.rrobot.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang.text.StrSubstitutor; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import at.bestsolution.efxclipse.tooling.rrobot.ProjectHandler; import at.bestsolution.efxclipse.tooling.rrobot.RRobot; import at.bestsolution.efxclipse.tooling.rrobot.model.task.Project; import at.bestsolution.efxclipse.tooling.rrobot.model.task.RobotTask; import at.bestsolution.efxclipse.tooling.rrobot.model.task.Variable; public class RRobotImpl implements RRobot { private List<ProjectHandler<Project>> handlers = new ArrayList<ProjectHandler<Project>>(); public void addProjectHandler(ProjectHandler<Project> handler) { synchronized (handlers) { handlers.add(handler); } } public void removeProjectHandler(ProjectHandler<Project> handler) { synchronized (handlers) { handlers.remove(handler); } } private static Object getVariableData(Variable v) { switch (v.getType()) { case BOOLEAN: return Boolean.parseBoolean(v.getDefaultValue()); case DOUBLE: return Double.parseDouble(v.getDefaultValue()); case INT: return Integer.parseInt(v.getDefaultValue()); default: return v.getDefaultValue(); } } @Override public IStatus executeTask(IProgressMonitor monitor, RobotTask task, Map<String, Object> additionalData) { // We'll operate on a copy because we modify the model and replace variable if (!task.getVariables().isEmpty()) { task = EcoreUtil.copy(task); } System.err.println("ADDITIONAL: " + additionalData); for (Variable v : task.getVariables()) { if (!additionalData.containsKey(v.getKey())) { additionalData.put(v.getKey(), getVariableData(v)); } } for (Entry<String, Object> e : additionalData.entrySet()) { if (e.getValue() instanceof String) { e.setValue(StrSubstitutor.replace((String) e.getValue(), additionalData)); } } List<ProjectHandler<Project>> handlers; synchronized (this.handlers) { handlers = new ArrayList<ProjectHandler<Project>>(this.handlers); } TreeIterator<EObject> it = task.eAllContents(); while (it.hasNext()) { EObject eo = it.next(); for (EStructuralFeature f : eo.eClass().getEAllStructuralFeatures()) { Object val = eo.eGet(f); if (val instanceof String) { // System.err.println("REPLACING: " + f + " val: " + val); eo.eSet(f, StrSubstitutor.replace(val, additionalData)); } } } System.err.println("ADDITIONAL: " + additionalData); List<IStatus> states = new ArrayList<IStatus>(); for (Project p : task.getProjects()) { for (ProjectHandler<Project> handler : handlers) { if (handler.isHandled(p.eClass())) { states.add(handler.createProject(monitor, p, additionalData)); } } } return new MultiStatus("at.bestsolution.efxclipse.tooling.rrobot", 0, states.toArray(new IStatus[0]), "Task executed", null); } }