package org.incha.core.jswingripples.parser; /* * Created on Dec 5, 2005 * */ import java.awt.Window; import java.util.Iterator; import java.util.Set; import javax.swing.JOptionPane; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jdt.core.IMember; import org.incha.core.jswingripples.JRipplesDependencyGraphModuleInterface; import org.incha.core.jswingripples.eig.JSwingRipplesEIG; import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode; import org.incha.ui.JSwingRipplesApplication; import org.incha.ui.TaskProgressMonitor; import org.incha.ui.util.ModalContext; import org.incha.ui.util.NullMonitor; import org.incha.ui.util.RunnableWithProgress; /** * @author Maksym Petrenko * */ public class MethodGranularityDependencyBuilder implements JRipplesDependencyGraphModuleInterface{ private static final Log log = LogFactory.getLog(MethodGranularityDependencyBuilder.class); private final JSwingRipplesEIG eig; /** * @param eig the eight. */ public MethodGranularityDependencyBuilder(final JSwingRipplesEIG eig) { super(); this.eig = eig; } private class AnalysisJob implements RunnableWithProgress { public boolean canceled=false; public AnalysisJob(final Set<IMember> EIGNodes) { if (EIGNodes==null) return; if (EIGNodes.size()==0) return; for (final Iterator<IMember> iter=EIGNodes.iterator();iter.hasNext();) { final JSwingRipplesEIGNode EIGnode=(JSwingRipplesEIGNode) iter.next(); if (EIGnode.getNodeIMember()!=null) { final JSwingRipplesEIGNode[] refferedNodes=eig.getOutgoingAnyNodeNeighbors(EIGnode); if (refferedNodes!=null) for (int i=0;i<refferedNodes.length;i++) { eig.removeEdge(eig.getEdge(EIGnode, refferedNodes[i])); } } } } /* (non-Javadoc) * @see org.incha.ui.core.RunnableWithProgress#run(org.incha.ui.core.TaskProgressMonitor) */ @Override public void run(final TaskProgressMonitor monitor) { try { monitor.beginTask("Building call graph",10); final Thread thread = createAnalizer(monitor); thread.start(); while (thread.isAlive()) { if (monitor.isCanceled()) { thread.interrupt(); monitor.setTaskName("Canceled"); canceled=true; monitor.done(); return; } Thread.yield();; //XXX Make this more general } } finally { monitor.done(); } } } /* (non-Javadoc) * @see org.severe.jripples.defaultmodules.parsers.interfaces.JRipplesDependencyGraphModuleInterface#AnalyzeProject() */ @Override public void AnalyzeProject() { // if (!JRipplesEIG.isLocked()) runn(null); } /** * @param nodes * @param monitor * @return */ protected Analyzer createAnalizer(final TaskProgressMonitor monitor) { return new Analyzer(eig, monitor); } /* (non-Javadoc) * @see org.severe.jripples.defaultmodules.parsers.interfaces.JRipplesDependencyGraphModuleInterface#ReAnalyzeProjectAtNodes(java.util.Set) */ @Override public void ReAnalyzeProjectAtNodes(final Set<JSwingRipplesEIGNode> changed_nodes) { } /* (non-Javadoc) * @see org.severe.jripples.defaultmodules.parsers.interfaces.JRipplesModuleInterface#shutDown(int controllerType) */ @Override public void shutDown(final int controllerType) { } // ---------------------------------------------------------------------- private void runn(final Set<IMember> changed_nodes){ AnalysisJob job=null; final Window window = JSwingRipplesApplication.getInstance(); if (window != null) { try { job=new AnalysisJob(changed_nodes); final JSwingRipplesApplication app = JSwingRipplesApplication.getInstance(); try { ModalContext.run(job, false, app.getProgressMonitor()); } finally { app.getProgressMonitor().done(); } } catch (final Exception e) { log.error(e); }; } else { final NullMonitor monitor=new NullMonitor(); job=new AnalysisJob(changed_nodes); try { job.run(monitor); } catch (final Exception e) { log.error(e); }; } if (job==null) return; if (job.canceled) { JOptionPane.showMessageDialog(JSwingRipplesApplication.getInstance(), "Parser analysis was canceled.", "Parsing canceled", JOptionPane.ERROR_MESSAGE); return ; } } /* (non-Javadoc) * @see org.incha.core.jswingripples.JRipplesModuleInterface#initializeStage() */ @Override public void runInAnalize() { AnalyzeProject(); } }