/*
* Created on Dec 4, 2005
*
*/
package org.incha.core.jswingripples.analysis;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.incha.core.ModuleConfiguration;
import org.incha.core.jswingripples.JRipplesAnalysisModuleInterface;
import org.incha.core.jswingripples.eig.JSwingRipplesEIG;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGEdge;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGEvent;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGListener;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGNodeEvent;
import org.incha.ui.jripples.EIGStatusMarks;
/**
* @author Maksym Petrenko
*
*/
public class JRipplesModuleAnalysisDefaultImpactSetConnections implements
JRipplesAnalysisModuleInterface, JSwingRipplesEIGListener {
private Set<JSwingRipplesEIGNode> impact_set = new HashSet<JSwingRipplesEIGNode>();
private final JSwingRipplesEIG eig;
/**
*
*/
public JRipplesModuleAnalysisDefaultImpactSetConnections(final JSwingRipplesEIG eig) {
super();
this.eig = eig;
}
/*
* (non-Javadoc)
*
* @see org.severe.jripples.modules.interfaces.JRipplesAnalysisModuleInterface#AnalyzeProject(java.lang.String)
*/
@Override
public void AnalyzeProject() {
if (isConceptLocationModuleUsed()) {
return;
}
boolean dirty=!impact_set.isEmpty();
impact_set.clear();
final JSwingRipplesEIGNode[] nodes=eig.getAllNodes();
if (nodes.length==0) return;
for (int i=0;i<nodes.length;i++) {
final JSwingRipplesEIGNode node = nodes[i];
final String mark=node.getMark();
if ((mark.compareTo(EIGStatusMarks.CHANGED)==0) || (mark.compareTo(EIGStatusMarks.IMPACTED)==0)) {
if (impact_set.add(node)) dirty=true;
if (impact_set.addAll(Arrays.asList(eig.getNodeMembers(node)))) dirty=true;
}
}
if (dirty)
calculateCouplingAndUpdateNodes();
}
/**
* @return
*/
protected boolean isConceptLocationModuleUsed() {
return eig.getJavaProject().getModuleConfiguration().getIncrementalChange()
== ModuleConfiguration.MODULE_CONCEPT_LOCATION;
}
/*
* (non-Javadoc)
*
* @see org.severe.jripples.modules.interfaces.JRipplesAnalysisModuleInterface#ReAnalyzeProjectAtNodes(java.util.Set)
*/
@Override
public void ReAnalyzeProjectAtNodes(final Set<JSwingRipplesEIGNode> changed_nodes) {
if (isConceptLocationModuleUsed())
return;
boolean dirty=false;
final JSwingRipplesEIGNode[] nodes=eig.getAllNodes();
if (nodes.length==0) return;
for (int i=0;i<nodes.length;i++) {
final JSwingRipplesEIGNode node = nodes[i];
final String mark=node.getMark();
if ((mark.compareTo(EIGStatusMarks.CHANGED)==0) || (mark.compareTo(EIGStatusMarks.IMPACTED)==0)) {
if (impact_set.add(node)) dirty=true;
if (impact_set.addAll(Arrays.asList(eig.getNodeMembers(node)))) dirty=true;
} else {
if (impact_set.remove(node)) dirty=true;
if (impact_set.removeAll(Arrays.asList(eig.getNodeMembers(node)))) dirty=true;
if ((mark.compareTo(EIGStatusMarks.VISITED_CONTINUE)==0) || (mark.compareTo(EIGStatusMarks.NEXT_VISIT)==0))
dirty=true;
}
}
if (dirty)
calculateCouplingAndUpdateNodes();
}
/*
* (non-Javadoc)
*
* @see org.severe.jripples.modules.interfaces.JRipplesModuleInterface#shutDown(int controllerType)
*/
@Override
public void shutDown(final int controllerType) {
eig.removeJRipplesEIGListener(this);
}
@Override
public void jRipplesEIGChanged(final JSwingRipplesEIGEvent event) {
if (isConceptLocationModuleUsed())
return;
if (!event.hasNodeEvents()) return;
boolean dirty=false;
final JSwingRipplesEIGNodeEvent[] nodeEvents=event.getNodeTypedEvents(
new int[] {JSwingRipplesEIGNodeEvent.NODE_ADDED,JSwingRipplesEIGNodeEvent.NODE_REMOVED,JSwingRipplesEIGNodeEvent.NODE_MARK_CHANGED});
if (nodeEvents.length==0) return;
for (int i=0;i<nodeEvents.length;i++) {
final JSwingRipplesEIGNode changedNode = nodeEvents[i].getSource();
switch (nodeEvents[i].getEventType()) {
case JSwingRipplesEIGNodeEvent.NODE_REMOVED: {
if (impact_set.remove(changedNode)) dirty=true;
if (impact_set.removeAll(Arrays.asList(eig.getNodeMembers(changedNode)))) dirty=true;
break;
}
case JSwingRipplesEIGNodeEvent.NODE_ADDED: {
if (impact_set.add(changedNode)) dirty=true;
if (impact_set.addAll(Arrays.asList(eig.getNodeMembers(changedNode)))) dirty=true;
break;
}
case JSwingRipplesEIGNodeEvent.NODE_MARK_CHANGED: {
final String mark=changedNode.getMark();
if ((mark!=null) && ((mark.compareTo(EIGStatusMarks.CHANGED)==0) || (mark.compareTo(EIGStatusMarks.IMPACTED)==0))) {
if (impact_set.add(changedNode)) dirty=true;
if (impact_set.addAll(Arrays.asList(eig.getNodeMembers(changedNode)))) dirty=true;
} else {
if (impact_set.remove(changedNode)) dirty=true;
if (impact_set.removeAll(Arrays.asList(eig.getNodeMembers(changedNode)))) dirty=true;
if ((mark!=null) && (mark.compareTo(EIGStatusMarks.VISITED_CONTINUE)==0) || (mark.compareTo(EIGStatusMarks.NEXT_VISIT)==0))
dirty=true;
}
break;
}
}
}
if (dirty)
calculateCouplingAndUpdateNodes();
}
private void calculateCouplingAndUpdateNodes() {
final JSwingRipplesEIGNode[] nodeArr=eig.getAllNodes();
final JSwingRipplesEIGEdge[] edgesArr=eig.getAllEdges();
final HashMap<JSwingRipplesEIGNode,Integer> nodes=new HashMap<JSwingRipplesEIGNode,Integer>();
for (int i=0;i<nodeArr.length;i++) {
nodes.put(nodeArr[i], Integer.valueOf(0));
}
for (int i=0;i<edgesArr.length;i++) {
final JSwingRipplesEIGNode nodeFrom=edgesArr[i].getFromNode();
final JSwingRipplesEIGNode nodeTo=edgesArr[i].getToNode();
if ((impact_set.contains(nodeFrom))) {
nodes.put(nodeTo, Integer.valueOf(nodes.get(nodeTo).intValue()+1) );
if (!nodeTo.isTop()) {
final JSwingRipplesEIGNode topNode=eig.findTopNodeForMemberNode(nodeTo);
if (topNode!=null)
nodes.put(topNode, Integer.valueOf(nodes.get(topNode).intValue()+1));
}
}
if ((impact_set.contains(nodeTo))) {
nodes.put(nodeFrom, Integer.valueOf(nodes.get(nodeFrom).intValue()+1) );
if (!nodeFrom.isTop()) {
final JSwingRipplesEIGNode topNode=eig.findTopNodeForMemberNode(nodeFrom);
if (topNode!=null)
nodes.put(topNode, Integer.valueOf(nodes.get(topNode).intValue()+1) );
}
}
}
for (final Iterator<JSwingRipplesEIGNode> iter=nodes.keySet().iterator();iter.hasNext();){
final JSwingRipplesEIGNode node=iter.next();
updateNodeProbability(node, nodes.get(node).toString());
}
}
private void updateNodeProbability(final JSwingRipplesEIGNode node, String newProbability) {
if (newProbability==null) newProbability="";
if (node.getMark()==null) {
newProbability="";
} else if (!((node.getMark().compareTo(EIGStatusMarks.NEXT_VISIT)==0) || (node.getMark().compareTo(EIGStatusMarks.VISITED_CONTINUE)==0) )) {
newProbability="";
}
String oldProbability=node.getProbability();
if (oldProbability==null) oldProbability="";
if (oldProbability.compareTo(newProbability)!=0) node.setProbability(newProbability);
}
/* (non-Javadoc)
* @see org.incha.core.jswingripples.JRipplesModuleInterface#runInAnalize()
*/
@Override
public void runInAnalize() {
AnalyzeProject();
}
}