Java tutorial
/** * Copyright (C) 2010 David Montao * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package seeit3d.java.modeler.generator; import static com.google.common.collect.Lists.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.jdt.core.*; import seeit3d.base.model.Container; import seeit3d.base.model.generator.IModelGenerator; import seeit3d.base.model.generator.metrics.MetricCalculator; import seeit3d.java.modeler.generator.annotation.CompilationUnitModeler; import seeit3d.java.modeler.generator.metrics.annotation.LCOM; import seeit3d.java.modeler.generator.metrics.annotation.LOC; import seeit3d.java.modeler.generator.metrics.annotation.McCabeComplexity; import com.google.inject.Inject; import com.google.inject.Singleton; /** * Package analyzer @see AbstracModelGenerator * * @author David Montao * */ @Singleton public class PackageModelGenerator extends AbstracModelGenerator<IPackageFragment, ICompilationUnit> { private final List<MetricCalculator> metrics; @Inject public PackageModelGenerator(@CompilationUnitModeler IModelGenerator<ICompilationUnit> lowerLevelModelGenerator, @LOC MetricCalculator loc, @McCabeComplexity MetricCalculator mccabe, @LCOM MetricCalculator lcom) { super(lowerLevelModelGenerator); this.metrics = newArrayList(loc, mccabe, lcom); } @Override protected List<MetricCalculator> getMetrics() { return metrics; } @Override protected ICompilationUnit[] fetchChildren(IPackageFragment element) throws JavaModelException { return element.getCompilationUnits(); } @Override protected void extraOperationsOnContainer(Container createdContainer, IPackageFragment element, boolean analizeDepedencies) throws JavaModelException { List<String> relatedPackages = new ArrayList<String>(); if (analizeDepedencies) { for (ICompilationUnit javaFile : element.getCompilationUnits()) { IImportDeclaration[] imports = javaFile.getImports(); for (IImportDeclaration imp : imports) { String packageName = imp.getElementName().substring(0, imp.getElementName().lastIndexOf(".")); if (!relatedPackages.contains(packageName)) { relatedPackages.add(packageName); } } } } analizeDependencies(createdContainer, relatedPackages, element.getJavaProject()); } private void analizeDependencies(Container container, Collection<String> packagesNames, IJavaProject javaProject) throws JavaModelException { List<IPackageFragment> evaluatedPackages = new ArrayList<IPackageFragment>(); for (String packageName : packagesNames) { IPackageFragmentRoot[] allPackageFragmentRoots = javaProject.getAllPackageFragmentRoots(); for (IPackageFragmentRoot iPackageFragmentRoot : allPackageFragmentRoots) { if (!iPackageFragmentRoot.isArchive()) { IPackageFragment packageFragment = iPackageFragmentRoot.getPackageFragment(packageName); if (packageFragment != null && packageFragment.exists() && !evaluatedPackages.contains(packageFragment)) { Container relatedContainer = this.analize(packageFragment, false); if (relatedContainer != null) { container.addRelatedContainer(relatedContainer); } evaluatedPackages.add(packageFragment); } } } } } }