package com.jsonde.gui.reports.custom; import com.jsonde.client.dao.DaoException; import com.jsonde.client.dao.DaoFactory; import com.jsonde.client.domain.CodeSource; import com.jsonde.gui.Main; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; public class DependencyReport implements ReportGenerator { public JComponent generateReport() { Map<Long, Set<Long>> dependencies = DaoFactory.getReportDao().getDependencies(); JTree dependencyTree = new JTree(); DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Dependency tree"); DefaultTreeModel dependencyTreeModel = new DefaultTreeModel(rootNode); int i = 0; for (Long codeSourceId : dependencies.keySet()) { try { CodeSource codeSource = DaoFactory.getCodeSourceDao().get(codeSourceId); MutableTreeNode dependencyNode = new DefaultMutableTreeNode(codeSource.getSource()); dependencyTreeModel.insertNodeInto(dependencyNode, rootNode, i); createTree( dependencies, dependencyTreeModel, dependencyNode, dependencies.get(codeSourceId), new LinkedHashSet<Long>(Arrays.asList(codeSourceId))); } catch (DaoException e) { Main.getInstance().processException(e); } i++; } dependencyTree.setModel(dependencyTreeModel); JScrollPane scrollPane = new JScrollPane(); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setViewportView(dependencyTree); return scrollPane; } private void createTree( Map<Long, Set<Long>> dependencies, DefaultTreeModel dependencyTreeModel, MutableTreeNode parent, Set<Long> codeSourceIds, Set<Long> shownSourceIds) { int i = 0; for (Long codeSourceId : codeSourceIds) { try { CodeSource codeSource = DaoFactory.getCodeSourceDao().get(codeSourceId); MutableTreeNode dependencyNode = new DefaultMutableTreeNode(codeSource.getSource()); dependencyTreeModel.insertNodeInto(dependencyNode, parent, i); if (!shownSourceIds.contains(codeSourceId)) { shownSourceIds.add(codeSourceId); createTree(dependencies, dependencyTreeModel, dependencyNode, dependencies.get(codeSourceId), shownSourceIds); } } catch (DaoException e) { Main.getInstance().processException(e); } i++; } } }