/* * Created on Dec 4, 2005 * */ package org.incha.core.jswingripples.rules; import java.awt.Color; import java.awt.Image; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.incha.core.jswingripples.JRipplesICModuleInterface; import org.incha.core.jswingripples.eig.JSwingRipplesEIG; import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode; import org.incha.ui.jripples.EIGStatusMarks; /** * @author Maksym Petrenko * */ public class JRipplesModuleICImpactAnalysis implements JRipplesICModuleInterface { private static final Log log = LogFactory.getLog(JRipplesModuleICImpactAnalysis.class); //algorithm //1. Identify all members or parents at specified granularity //2. find all neighbors of these members //3. filter them based on the specified granularity //4. apply mark to the member and the neighbors //5. verify bottom-up the consistency of the marks of all involved parties and in between private final JSwingRipplesEIG eig; /** * @param eig the eig. */ public JRipplesModuleICImpactAnalysis(final JSwingRipplesEIG eig) { super(); this.eig = eig; } /* * (non-Javadoc) * * @see org.severe.jripples.modules.interfaces.JRipplesICModuleInterface#GetAvailableRulesForMark(java.lang.String) */ @Override public Set<String> GetAvailableRulesForMark(final String mark) { if (mark == null) { return null; } else if (mark.compareTo(EIGStatusMarks.BLANK) == 0) { return null; } else if (mark.compareTo(EIGStatusMarks.NEXT_VISIT) == 0) { final String marks[] = { EIGStatusMarks.IMPACTED, EIGStatusMarks.VISITED_CONTINUE, EIGStatusMarks.VISITED }; return (new LinkedHashSet<String>(Arrays.asList(marks))); } else if (mark.compareTo(EIGStatusMarks.IMPACTED) == 0) { final String marks[] = { EIGStatusMarks.IMPACTED}; return (new LinkedHashSet<String>(Arrays.asList(marks))); } else if (mark.compareTo(EIGStatusMarks.VISITED_CONTINUE) == 0) { final String marks[] = { EIGStatusMarks.IMPACTED,EIGStatusMarks.VISITED_CONTINUE}; return (new LinkedHashSet<String>(Arrays.asList(marks))); } else { return null; } } /* * (non-Javadoc) * * @see org.severe.jripples.modules.interfaces.JRipplesModuleInterface#shutDown(int controllerType) */ @Override public void shutDown(final int controllerType) { } /* * (non-Javadoc) * * @see org.severe.jripples.modules.interfaces.JRipplesICModuleInterface#initializeStage() */ @Override public void InitializeStage() { final JSwingRipplesEIGNode[] nodes = eig.getAllNodes(); final Set<JSwingRipplesEIGNode> locatedMemberNodes = new LinkedHashSet<JSwingRipplesEIGNode>(); final Set<JSwingRipplesEIGNode> locatedTopNodes = new LinkedHashSet<JSwingRipplesEIGNode>(); if (nodes != null) { for (int i = 0; i < nodes.length; i++) { if ((nodes[i].getMark()==null) || ( (nodes[i].getMark().compareTo(EIGStatusMarks.LOCATED) != 0) && (nodes[i].getMark().compareTo(EIGStatusMarks.IMPACTED) != 0) && (nodes[i].getMark().compareTo(EIGStatusMarks.CHANGED) != 0))) nodes[i].setMark(EIGStatusMarks.BLANK); else { if (!nodes[i].isTop()) locatedMemberNodes.add(nodes[i]); else locatedTopNodes.add(nodes[i]); } } //Process members first for (final Iterator<JSwingRipplesEIGNode> iter = locatedMemberNodes.iterator(); iter.hasNext();) { final JSwingRipplesEIGNode located_node = iter.next(); located_node.setMark(EIGStatusMarks.NEXT_VISIT); CommonEIGRules.applyRuleToNode(eig, located_node,EIGStatusMarks.IMPACTED,0); } //Process top nodes if any for (final Iterator<JSwingRipplesEIGNode> iter = locatedTopNodes.iterator(); iter.hasNext();) { final JSwingRipplesEIGNode located_node = iter.next(); if ( (located_node.getMark().compareTo(EIGStatusMarks.IMPACTED) != 0)) { located_node.setMark(EIGStatusMarks.NEXT_VISIT); CommonEIGRules.applyRuleToNode(eig, located_node,EIGStatusMarks.IMPACTED,0); } } } eig.getHistory().clear(); } @Override public Set<String> getAllMarks() { final String marks[] = { EIGStatusMarks.IMPACTED, EIGStatusMarks.VISITED_CONTINUE, EIGStatusMarks.VISITED,EIGStatusMarks.BLANK ,EIGStatusMarks.NEXT_VISIT}; return (new LinkedHashSet<String>(Arrays.asList(marks))); } @Override public void ApplyRuleAtNode(final String rule, final JSwingRipplesEIGNode nodeFrom, final JSwingRipplesEIGNode nodeTo) { if ((rule.compareTo(EIGStatusMarks.IMPACTED) == 0) || (rule.compareTo(EIGStatusMarks.VISITED_CONTINUE) == 0)) { CommonEIGRules.assignMarkToNodeAndNeighbor(eig, nodeFrom, nodeTo,rule,EIGStatusMarks.NEXT_VISIT); } else if (rule.compareTo(EIGStatusMarks.VISITED) == 0) { CommonEIGRules.applyRuleToNode(eig, nodeFrom,rule,0); } } /* * (non-Javadoc) * * @see org.severe.jripples.modules.interfaces.JRipplesICModuleInterface#ApplyRuleAtNode(java.lang.String, * java.lang.String) */ @Override public void ApplyRuleAtNode(final String rule, final JSwingRipplesEIGNode node, final int granularity) { try { CommonEIGRules.applyRuleToNode(eig, node,rule,granularity); } catch (final Exception e) { log.error(e); } } @Override public Image getImageDescriptorForMark(final String mark) { return EIGStatusMarks.getImageDescriptorForMark(mark); } @Override public Color getColorForMark(final String mark) { return EIGStatusMarks.getColorForMark(mark); } /* (non-Javadoc) * @see org.incha.core.jswingripples.JRipplesModuleInterface#initializeStage() */ @Override public void runInAnalize() { InitializeStage(); } }