at.bestsolution.efxclipse.tooling.rrobot.impl.RRobotImpl.java Source code

Java tutorial

Introduction

Here is the source code for at.bestsolution.efxclipse.tooling.rrobot.impl.RRobotImpl.java

Source

/*******************************************************************************
 * 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);
    }

}