/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale 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 Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.squalecommon.util.mapping; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.squalecommon.enterpriselayer.businessobject.component.ComponentType; /** * Mapping Cette classe permet de faire le lien entre des noms textuels de composant, m�trique ou mesures et les classes * correspondantes Par exemple, le composant de type classe a le nom component.class et une classe * org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO La mesure ckjm sur les classes porte le nom * ckjm.class et a pour classe org.squale.squalecommon.enterpriselayer.businessobject.result.ckjm.CkjmClassMetricsBO La * m�trique McCabe profondeur d'h�ritage pour une classe porte le nom mccabe.class.dit et correspond � la classe * org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAClassMetricsBO */ public class Mapping { /** log */ private static Log LOG = LogFactory.getLog( Mapping.class ); /** Ensemble des composants */ private static MappingMap component = new MappingMap(); // Traitement des composants static { component.put( ComponentType.CLASS, org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO.class ); component.put( ComponentType.PACKAGE, org.squale.squalecommon.enterpriselayer.businessobject.component.PackageBO.class ); component.put( ComponentType.METHOD, org.squale.squalecommon.enterpriselayer.businessobject.component.MethodBO.class ); component.put( ComponentType.PROJECT, org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO.class ); component.put( ComponentType.APPLICATION, org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO.class ); component.put( ComponentType.UML_MODEL, org.squale.squalecommon.enterpriselayer.businessobject.component.UmlModelBO.class ); component.put( ComponentType.UML_CLASS, org.squale.squalecommon.enterpriselayer.businessobject.component.UmlClassBO.class ); component.put( ComponentType.UML_INTERFACE, org.squale.squalecommon.enterpriselayer.businessobject.component.UmlInterfaceBO.class ); component.put( ComponentType.UML_PACKAGE, org.squale.squalecommon.enterpriselayer.businessobject.component.UmlPackageBO.class ); component.put( ComponentType.JSP, org.squale.squalecommon.enterpriselayer.businessobject.component.JspBO.class ); } /** Ensemble des composants mapp�s avec hibernate */ private static Map mappingComponent = new HashMap(); // Traitement des composants static { mappingComponent.put( ComponentType.CLASS, "ClassBO" ); mappingComponent.put( ComponentType.PACKAGE, "Package" ); mappingComponent.put( ComponentType.METHOD, "Method" ); mappingComponent.put( ComponentType.PROJECT, "Project" ); mappingComponent.put( ComponentType.APPLICATION, "Application" ); mappingComponent.put( ComponentType.UML_MODEL, "UmlModel" ); mappingComponent.put( ComponentType.UML_CLASS, "UmlClass" ); mappingComponent.put( ComponentType.UML_INTERFACE, "UmlInterface" ); mappingComponent.put( ComponentType.UML_PACKAGE, "UmlPackageBO" ); mappingComponent.put( ComponentType.JSP, "Jsp" ); } /** Ensemble des mesures */ private static MappingMap measures = new MappingMap(); // Traitement des mesures static { // Ckjm measures.put( "ckjm.class", org.squale.squalecommon.enterpriselayer.businessobject.result.ckjm.CkjmClassMetricsBO.class ); // Jdepend measures.put( "jdepend.package", org.squale.squalecommon.enterpriselayer.businessobject.result.jdepend.JDependPackageMetricsBO.class ); // McCabe ################ measures.put( "mccabe.class", org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAClassMetricsBO.class ); measures.put( "mccabe.method", org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAMethodMetricsBO.class ); measures.put( "mccabe.project", org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAProjectMetricsBO.class ); measures.put( "mccabe.jsp", org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAJspMetricsBO.class ); // RSM measures.put( "rsm.class", org.squale.squalecommon.enterpriselayer.businessobject.result.rsm.RSMClassMetricsBO.class ); measures.put( "rsm.method", org.squale.squalecommon.enterpriselayer.businessobject.result.rsm.RSMMethodMetricsBO.class ); measures.put( "rsm.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rsm.RSMProjectMetricsBO.class ); // JSPVolumetry measures.put( "jspvolumetry.project", org.squale.squalecommon.enterpriselayer.businessobject.result.jspvolumetry.JSPVolumetryProjectBO.class ); // Checkstyle measures.put( "checkstyle.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.CheckstyleTransgressionBO.class ); // CppTest measures.put( "cpptest.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.CppTestTransgressionBO.class ); // Macker measures.put( "macker.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.MackerTransgressionBO.class ); // UMLQuality measures.put( "umlquality.umlclass", org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityClassMetricsBO.class ); measures.put( "umlquality.umlinterface", org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityInterfaceMetricsBO.class ); measures.put( "umlquality.umlpackage", org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityPackageMetricsBO.class ); measures.put( "umlquality.umlmodel", org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityModelMetricsBO.class ); // Cpd measures.put( "copypaste.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.CpdTransgressionBO.class ); // Pmd pour Java measures.put( "javapmd.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.JavaPmdTransgressionBO.class ); // Pmd pour Jsp measures.put( "jsppmd.project", org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.JspPmdTransgressionBO.class ); // Roi measures.put( "roi.application", org.squale.squalecommon.enterpriselayer.businessobject.result.roi.RoiMetricsBO.class ); // PureComments (pour les projets audit�s avant le lot 3.0) measures.put( "purecomments.project", org.squale.squalecommon.enterpriselayer.businessobject.result.misc.CommentsBO.class ); // BugTracking QC measures.put( "extbugtrackingqc.project", org.squale.squalecommon.enterpriselayer.businessobject.result.external.bugtracking.ExtBugTrackingMetricsBO.class ); // Test manager QC measures.put( "testmanagerqc.project", org.squale.squalecommon.enterpriselayer.businessobject.result.external.bugtracking.qc.ExtTestManagerQCMetricsBO.class ); // Javancss measures.put( "javancss.project", org.squale.squalecommon.enterpriselayer.businessobject.result.javancss.JavancssProjectMetricsBO.class ); measures.put( "javancss.package", org.squale.squalecommon.enterpriselayer.businessobject.result.javancss.JavancssPackageMetricsBO.class ); measures.put( "javancss.class", org.squale.squalecommon.enterpriselayer.businessobject.result.javancss.JavancssClassMetricsBO.class ); measures.put( "javancss.method", org.squale.squalecommon.enterpriselayer.businessobject.result.javancss.JavancssMethodMetricsBO.class ); // Cobertura Code Coverage measures.put( "cobertura.project", org.squale.squalecommon.enterpriselayer.businessobject.result.cobertura.CoberturaProjectMetricsBO.class ); measures.put( "cobertura.package", org.squale.squalecommon.enterpriselayer.businessobject.result.cobertura.CoberturaPackageMetricsBO.class ); measures.put( "cobertura.class", org.squale.squalecommon.enterpriselayer.businessobject.result.cobertura.CoberturaClassMetricsBO.class ); measures.put( "cobertura.method", org.squale.squalecommon.enterpriselayer.businessobject.result.cobertura.CoberturaMethodMetricsBO.class ); } /** volumetry name for number of code lines */ public static final String VOLUMETRY_NB_CODES_LINES = "volumetry_nb_codes_lines"; /** volumetry name for number of code lines for JSP*/ public static final String VOLUMETRY_NB_CODES_LINES_JSP = "volumetry_nb_codes_lines_JSP"; /** Volumetry name for methods */ public static final String VOLUMETRY_METHODS = "volumetry_methods"; /** Volumetry name for classes */ public static final String VOLUMETRY_CLASSES = "volumetry_classes"; /** * Map metrics name (key) - volumetry name (value). This map links the metrics name of the tool to a generic metric * name (volumetry name) */ private static Properties VOLUMETRY = new Properties(); /** * Fill the map VOLUMETRY with the information from the file : * org/squale/squalecommon/util/mapping/mapping_volumetry_metrics.properties */ static { try { InputStream stream = Mapping.class.getResourceAsStream( "mapping_volumetry_metrics.properties" ); VOLUMETRY.load( stream ); } catch ( IOException e ) { LOG.fatal( MappingMessages.getString( "exception.fatal.loading_file" ) ); } } /** * Obtention de la classe correspondant � une mesure * * @param pMeasure mesure (par exemple ckjm.class) * @return classe correspondante ou null si non trouv�e */ static public Class getMeasureClass( String pMeasure ) { Class result = measures.getClassNameForName( pMeasure ); if ( result == null ) { LOG.error( "Measure '" + pMeasure + "' unknown" ); } return result; } /** * Obtention du nom de la mesure pour une classe de mesure * * @param pMeasureClass classe de mesure * @return nom de la mesure */ static public String getMeasureName( Class pMeasureClass ) { String result = measures.getNameForClass( pMeasureClass ); if ( result == null ) { LOG.error( "Measure class name '" + pMeasureClass.getName() + "' is unknown" ); } return result; } /** * Obtention de la classe pour un composant * * @param pComponent composant * @return classe correspondante */ static public Class getComponentClass( String pComponent ) { Class result = component.getClassNameForName( pComponent ); if ( result == null ) { LOG.error( "Component type '" + pComponent + "' unknown" ); } return result; } /** * Obtention du nom symbolique d'un composant * * @param pComponentClass classe du composant * @return nom symbolique de composant */ static public String getComponentName( Class pComponentClass ) { String result = component.getNameForClass( pComponentClass ); if ( result == null ) { LOG.error( "Component class name '" + pComponentClass + "' is unknown" ); } return result; } /** * Obtention de la classe de la mesure pour une m�trique * * @param pMetric m�trique (par exemple mccabe.class.dit) * @return classe correspondante * @throws IllegalArgumentException si pMetric mal form� */ public static Class getMetricClass( String pMetric ) throws IllegalArgumentException { int index = pMetric.lastIndexOf( '.' ); if ( index < 0 ) { throw new IllegalArgumentException( "Metric name should be named tool.component.name" ); } // Inutile de faire un test suppl�mentaire return getMeasureClass( pMetric.substring( 0, index ) ); } /** * Obtention du getter d'une m�trique La m�thode est recherch�e dans la classe correspondante, la m�thode est du * type getXxxx * * @param pMetric m�trique (par exemple mccabe.class.dit) * @return m�thode d'acc�s � cette m�trique (par exemple McCabeQAClassMetricsBO.getDit) * @throws IllegalArgumentException si pMetric mal form� */ public static Method getMetricGetter( String pMetric ) throws IllegalArgumentException { Method result = null; int index = pMetric.lastIndexOf( '.' ); if ( index < 0 ) { throw new IllegalArgumentException( "Metric name should be named tool.component.name" ); } String measure = pMetric.substring( 0, index ); String metric = pMetric.substring( index + 1 ); // Obtention de la classe Class cl = getMeasureClass( measure ); // Un log d'erreur aura �t� fait par la m�thode // auparavant, inutile d'engorger le log if ( cl != null ) { try { // On forme le nom du getter StringBuffer methodName = new StringBuffer( metric ); // Respect de la norme javabean pour le caract�re en majuscules methodName.setCharAt( 0, Character.toTitleCase( methodName.charAt( 0 ) ) ); methodName.insert( 0, "get" ); result = cl.getMethod( methodName.toString(), null ); } catch ( SecurityException e ) { LOG.error( "Getter not found " + pMetric, e ); } catch ( NoSuchMethodException e ) { LOG.error( "Getter not found " + pMetric, e ); } } return result; } /** * @param pType type du composant recherch� * @return le nom du mapping hibernate correspondant � la classe du composant */ public static String getComponentMappingName( String pType ) { return (String) mappingComponent.get( pType ); } /** * This method return the generic metric name linked to the tool metric name passed in argument. The method return * null if there is no match. * * @param treName The tool metric name * @return The generic metric name linked to the tool metric name */ public static String getVolumetryType( String treName ) { String type = VOLUMETRY.getProperty( treName, "" ); return type; } }