/******************************************************************************* * Copyright (c) 2004, 2011 BREDEX GmbH. * 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: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.core.businessprocess.compcheck; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.MultiRule; import org.eclipse.jubula.client.core.Activator; import org.eclipse.jubula.client.core.businessprocess.problems.IProblem; import org.eclipse.jubula.client.core.businessprocess.problems.ProblemFactory; import org.eclipse.jubula.client.core.events.DataEventDispatcher; import org.eclipse.jubula.client.core.i18n.Messages; import org.eclipse.jubula.client.core.model.ICategoryPO; import org.eclipse.jubula.client.core.model.INodePO; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.core.persistence.GeneralStorage; import org.eclipse.jubula.client.core.rules.SingleJobRule; import org.eclipse.jubula.client.core.utils.AbstractNonPostOperatingTreeNodeOperation; import org.eclipse.jubula.client.core.utils.ITreeNodeOperation; import org.eclipse.jubula.client.core.utils.ITreeTraverserContext; import org.eclipse.jubula.client.core.utils.TreeTraverser; /** * @author BREDEX GmbH * @created 27.10.2011 */ public enum ProblemPropagator { /** Singleton */ INSTANCE; /** the rule for the propagation Job */ private static final ISchedulingRule PROPAGATIONRULE = new SingleJobRule(); /** {@inheritDoc} */ public void propagate() { final IProjectPO project = GeneralStorage.getInstance().getProject(); if (project != null) { Job pp = new ProblemPropagationJob( Messages.ProblemPropagationJobName, project); pp.setRule( new MultiRule(new ISchedulingRule[]{ SingleJobRule.COMPLETENESSRULE, ProblemPropagator.PROPAGATIONRULE, SingleJobRule.TESTSTYLERULE})); pp.schedule(1000); for (Job job : Job.getJobManager().find(pp)) { if (job != pp) { job.cancel(); } } } } /** * @author BREDEX GmbH */ private final class ProblemPropagationJob extends Job { /** the project */ private final IProjectPO m_project; /** * @param name the name of the job * @param project the project to use */ private ProblemPropagationJob(String name, IProjectPO project) { super(name); m_project = project; } /** {@inheritDoc} */ public boolean belongsTo(Object family) { if (family instanceof ProblemPropagationJob) { return true; } return super.belongsTo(family); } /** {@inheritDoc} */ protected IStatus run(IProgressMonitor monitor) { int status = IStatus.OK; try { TreeTraverser treeTraverser = new TreeTraverser(m_project, new ProblemPropagationOperation(), true, true); treeTraverser.setMonitor(monitor); treeTraverser.traverse(true); } finally { if (monitor.isCanceled()) { status = IStatus.CANCEL; } else { DataEventDispatcher.getInstance() .fireProblemPropagationFinished(); } monitor.done(); } return new Status(status, Activator.PLUGIN_ID, getName()); } } /** * removing all non-teststyle problems from all nodes * @author BREDEX GmbH */ public static class ProblemCleanupOperation extends AbstractNonPostOperatingTreeNodeOperation<INodePO> { /** {@inheritDoc} */ public boolean operate(ITreeTraverserContext<INodePO> ctx, INodePO parent, INodePO node, boolean alreadyVisited) { if (alreadyVisited) { return false; } Set<IProblem> copy = new HashSet<IProblem>(node.getProblems()); for (IProblem problem : copy) { if (!problem.getStatus().getPlugin() .contains("teststyle")) { //$NON-NLS-1$ node.removeProblem(problem); } } return true; } } /** * @author BREDEX GmbH */ public static class ProblemPropagationOperation implements ITreeNodeOperation<INodePO> { /** {@inheritDoc} */ public boolean operate(ITreeTraverserContext<INodePO> ctx, INodePO parent, INodePO node, boolean alreadyVisited) { return node.isActive(); } /** {@inheritDoc} */ public void postOperate(ITreeTraverserContext<INodePO> ctx, INodePO parent, INodePO node, boolean alreadyVisited) { if (parent instanceof ICategoryPO) { if (ProblemFactory.hasProblem(node)) { setProblem(parent, ProblemFactory.getWorstProblem( node.getProblems()).getStatus().getSeverity()); } } else { if (ProblemFactory.hasNoOMIProblem(node)) { setProblem(parent, ProblemFactory. getWorstNoOMIncompleteProblem( node.getProblems()).getStatus().getSeverity()); } } } } /** * @param node * the node where the problem should be added. * @param severity * severity of which the problem should be set */ public static void setProblem(INodePO node, int severity) { switch (severity) { case IStatus.ERROR: node.addProblem(ProblemFactory.ERROR_IN_CHILD); break; case IStatus.WARNING: node.addProblem(ProblemFactory.WARNING_IN_CHILD); break; case IStatus.INFO: default: break; } } }