| /******************************************************************************* |
| * Copyright (c) 2009, 2015 Xored Software Inc 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: |
| * Xored Software Inc - initial API and implementation and/or initial documentation |
| *******************************************************************************/ |
| package org.eclipse.rcptt.core.internal.ecl.core.commands; |
| |
| import java.util.concurrent.ConcurrentHashMap; |
| import java.util.concurrent.ConcurrentMap; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.rcptt.core.ecl.core.model.BeginReportNode; |
| import org.eclipse.rcptt.core.ecl.core.model.CreateContext; |
| import org.eclipse.rcptt.core.ecl.core.model.CreateReport; |
| import org.eclipse.rcptt.core.ecl.core.model.EndReportNode; |
| import org.eclipse.rcptt.core.ecl.core.model.EnterContext; |
| import org.eclipse.rcptt.core.ecl.core.model.ExecVerification; |
| import org.eclipse.rcptt.core.ecl.core.model.GetQ7Information; |
| import org.eclipse.rcptt.core.ecl.core.model.GetReport; |
| import org.eclipse.rcptt.core.ecl.core.model.PrepareEnvironment; |
| import org.eclipse.rcptt.core.ecl.core.model.SetCommandsDelay; |
| import org.eclipse.rcptt.core.ecl.core.model.SetQ7Features; |
| import org.eclipse.rcptt.ecl.core.Command; |
| import org.eclipse.rcptt.ecl.core.Foreach; |
| import org.eclipse.rcptt.ecl.core.ISessionListener; |
| import org.eclipse.rcptt.ecl.core.Pipeline; |
| import org.eclipse.rcptt.ecl.core.RestoreState; |
| import org.eclipse.rcptt.ecl.core.SaveState; |
| import org.eclipse.rcptt.ecl.core.Script; |
| import org.eclipse.rcptt.ecl.core.Sequence; |
| import org.eclipse.rcptt.ecl.core.SessionListenerManager; |
| import org.eclipse.rcptt.ecl.core.With; |
| import org.eclipse.rcptt.ecl.core.util.CommandToStringConverter; |
| import org.eclipse.rcptt.ecl.gen.ast.AstExec; |
| import org.eclipse.rcptt.ecl.internal.core.CorePlugin; |
| import org.eclipse.rcptt.ecl.operations.Each; |
| import org.eclipse.rcptt.ecl.operations.Repeat; |
| import org.eclipse.rcptt.reporting.ItemKind; |
| import org.eclipse.rcptt.reporting.Q7Info; |
| import org.eclipse.rcptt.reporting.ReportingFactory; |
| import org.eclipse.rcptt.reporting.core.ReportHelper; |
| import org.eclipse.rcptt.reporting.core.ReportManager; |
| import org.eclipse.rcptt.sherlock.core.INodeBuilder; |
| import org.eclipse.rcptt.sherlock.core.reporting.AbstractEventProvider; |
| import org.eclipse.rcptt.sherlock.core.reporting.IEventProvider; |
| import org.eclipse.rcptt.sherlock.core.reporting.IReportBuilder; |
| |
| public class EclCommandEventProvider extends AbstractEventProvider implements |
| ISessionListener, IEventProvider { |
| |
| // We need to persist report nodes not to mismatch them with ones created in other threads |
| private ConcurrentMap<Command, INodeBuilder> openNodes = new ConcurrentHashMap<Command, INodeBuilder>(); |
| |
| public EclCommandEventProvider() { |
| } |
| |
| @Override |
| protected void initializeBuilder(IReportBuilder builder) { |
| SessionListenerManager.addListener(this); |
| } |
| |
| @Override |
| protected void doneBuilders() { |
| SessionListenerManager.removeListener(this); |
| } |
| |
| public void beginCommand(Command command) { |
| if (isIgnoredCommand(command)) { |
| return; |
| } |
| |
| String cmdName = buildName(command); |
| INodeBuilder node; |
| INodeBuilder currentNode = ReportManager.getCurrentReportNode(); |
| if (ReportHelper.isIterable(currentNode)) { |
| node = currentNode.appendTask(cmdName); |
| } else { |
| node = currentNode.beginTask(cmdName); |
| } |
| |
| Q7Info info = ReportingFactory.eINSTANCE.createQ7Info(); |
| info.setType(ItemKind.ECL_COMMAND); |
| ReportHelper.setInfo(node, info); |
| if (isIterableCommand(command)) { |
| ReportHelper.markIterable(node); |
| } |
| INodeBuilder previousValue = openNodes.putIfAbsent(command, node); |
| if (previousValue != null) { |
| throw new IllegalStateException("A node for command " + cmdName + " is already opened"); |
| } |
| } |
| |
| private static String buildName(Command command) { |
| String cmdName = null; |
| try { |
| Command cmd = EcoreUtil.copy(command); |
| if (cmd instanceof With) { |
| ((With) cmd).setDo(null); |
| } |
| cmdName = new CommandToStringConverter().convert(cmd).replace( |
| "\n", "\\n"); |
| } catch (Throwable e) { |
| CorePlugin.log(e); |
| cmdName = command.getClass().getSimpleName(); |
| } |
| return cmdName; |
| } |
| |
| private boolean isIgnoredCommand(Command command) { |
| String cname = command.getClass().getSimpleName(); |
| return command instanceof GetQ7Information |
| || command instanceof EnterContext |
| || command instanceof CreateContext |
| || command instanceof BeginReportNode |
| || command instanceof EndReportNode |
| || command instanceof SetQ7Features |
| || command instanceof SetCommandsDelay |
| || command instanceof PrepareEnvironment |
| || command instanceof Sequence || command instanceof Pipeline |
| || command instanceof AstExec || command instanceof Script |
| || cname.equals("SetupPlayerImpl") |
| || cname.equals("ShoutdownPlayerImpl") |
| || cname.equals("AutSendEventImpl") |
| || command instanceof SaveState |
| || command instanceof RestoreState |
| || command instanceof CreateReport |
| || command instanceof GetReport |
| || command instanceof ExecVerification; |
| } |
| |
| private boolean isIterableCommand(Command command) { |
| return command instanceof Each |
| || command instanceof Foreach |
| || command instanceof Repeat; |
| } |
| |
| public void endCommand(Command command, final IStatus status) { |
| if (isIgnoredCommand(command)) { |
| return; |
| } |
| final String name = buildName(command); |
| assert name != null; |
| final INodeBuilder node = openNodes.remove(command); |
| if (node == null) |
| throw new IllegalStateException("There is no open report node for command " + name); |
| ReportHelper.setResult(node, status); |
| node.endTask(); |
| } |
| } |