package org.jtheque.metrics.view.impl.model.builders; import org.jtheque.core.managers.Managers; import org.jtheque.core.managers.language.ILanguageManager; import org.jtheque.metrics.utils.elements.Class; import org.jtheque.metrics.utils.elements.Constructor; import org.jtheque.metrics.utils.elements.Method; import org.jtheque.metrics.utils.elements.Package; import org.jtheque.metrics.utils.elements.Project; import org.jtheque.metrics.view.impl.nodes.lines.code.ClassLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.ConstructorLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.ConstructorsLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.LinesOfCodeRootNode; import org.jtheque.metrics.view.impl.nodes.lines.code.MethodLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.MethodsLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.PackageLinesOfCodeNode; import org.jtheque.metrics.view.impl.nodes.lines.code.ProjectLinesOfCodeNode; import org.jdesktop.swingx.treetable.AbstractMutableTreeTableNode; import java.util.ArrayList; import java.util.Collection; /* * Copyright JTheque (Baptiste Wicht) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * A builder to add the "lines of code" metrics node to the root node of the tree table model. * * @author Baptiste Wicht */ public final class LinesOfCodeModelBuilder { /** * Create a new LinesOfCodeModelBuilder. */ private LinesOfCodeModelBuilder() { super(); } /** * Add Lines of code nodes to the root. * * @param projects The projects. * @param root The root node. */ public static void addLinesOfCodeNodes(Iterable<Project> projects, AbstractMutableTreeTableNode root) { LinesOfCodeRootNode modelNode = new LinesOfCodeRootNode(Managers.getManager(ILanguageManager.class).getMessage("results.models.lines.code")); double classes = 0; for (Project project : projects) { AbstractMutableTreeTableNode projectNode = new ProjectLinesOfCodeNode(project); addSub(projectNode, project.getRootPackage()); modelNode.add(projectNode); modelNode.setTotal(modelNode.getTotal() + project.getRootPackage().getTotalNumberLinesOfCode()); classes += project.getRootPackage().getTotalNumberOfClasses(); } modelNode.setAverage(modelNode.getTotal() / classes); root.add(modelNode); } /** * Add a sub package to the node. * * @param node The current node. * @param aPackage The package to add. */ private static void addSub(AbstractMutableTreeTableNode node, Package aPackage) { if (aPackage.isEmpty()) { return; } AbstractMutableTreeTableNode packageNode = new PackageLinesOfCodeNode(aPackage); for (Package p : aPackage.getPackages()) { addSub(packageNode, p); } for (Class c : aPackage.getClasses()) { AbstractMutableTreeTableNode classNode = new ClassLinesOfCodeNode(c); addConstructors(c, classNode); addMethods(c, classNode); packageNode.add(classNode); } node.add(packageNode); } /** * Extract the methods from a class and add them on the node. * * @param c The class. * @param classNode The node of the class. */ private static void addMethods(org.jtheque.metrics.utils.elements.Class c, AbstractMutableTreeTableNode classNode) { if (!c.getMethods().isEmpty()) { Collection<MethodLinesOfCodeNode> methodNodes = new ArrayList<MethodLinesOfCodeNode>(c.getMethods().size()); int linesOfCode = 0; for (Method method : c.getMethods()) { methodNodes.add(new MethodLinesOfCodeNode(method)); linesOfCode += method.getCodeLines(); } double linesOfCodeMethod = linesOfCode / (double) methodNodes.size(); AbstractMutableTreeTableNode methodsNode = new MethodsLinesOfCodeNode( Managers.getManager(ILanguageManager.class).getMessage("results.model.nodes.methods"), linesOfCode, linesOfCodeMethod ); for (MethodLinesOfCodeNode methodNode : methodNodes) { methodsNode.add(methodNode); } classNode.add(methodsNode); } } /** * Extract the constructors from a class and add them on the node. * * @param c The class. * @param classNode The node of the class. */ private static void addConstructors(Class c, AbstractMutableTreeTableNode classNode) { if (!c.getConstructors().isEmpty()) { Collection<ConstructorLinesOfCodeNode> constructorNodes = new ArrayList<ConstructorLinesOfCodeNode>(c.getConstructors().size()); int linesOfCode = 0; for (Constructor constructor : c.getConstructors()) { constructorNodes.add(new ConstructorLinesOfCodeNode(constructor)); linesOfCode += constructor.getCodeLines(); } double linesOfCodeConstructor = linesOfCode / (double) constructorNodes.size(); AbstractMutableTreeTableNode constructorsNode = new ConstructorsLinesOfCodeNode( Managers.getManager(ILanguageManager.class).getMessage("results.model.nodes.constructors"), linesOfCode, linesOfCodeConstructor ); for (ConstructorLinesOfCodeNode constructorNode : constructorNodes) { constructorsNode.add(constructorNode); } classNode.add(constructorsNode); } } }