001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2011 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.plugins.squid.bridges; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.sonar.api.batch.SensorContext; 024 import org.sonar.api.batch.SquidUtils; 025 import org.sonar.api.resources.JavaFile; 026 import org.sonar.api.resources.JavaPackage; 027 import org.sonar.api.resources.Project; 028 import org.sonar.api.resources.Resource; 029 import org.sonar.java.api.JavaClass; 030 import org.sonar.java.api.JavaMethod; 031 import org.sonar.squid.Squid; 032 import org.sonar.squid.api.*; 033 import org.sonar.squid.indexer.QueryByMeasure; 034 import org.sonar.squid.indexer.QueryByType; 035 import org.sonar.squid.measures.Metric; 036 037 import java.util.Collection; 038 import java.util.HashMap; 039 040 public final class ResourceIndex extends HashMap<SourceCode, Resource> { 041 042 private static final long serialVersionUID = -918346378374943773L; 043 044 public ResourceIndex loadSquidResources(Squid squid, SensorContext context, Project project) { 045 loadSquidProject(squid, project); 046 loadSquidPackages(squid, context); 047 loadSquidFiles(squid, context); 048 loadSquidClasses(squid, context); 049 loadSquidMethods(squid, context); 050 return this; 051 } 052 053 private void loadSquidProject(Squid squid, Project project) { 054 put(squid.getProject(), project); 055 } 056 057 private void loadSquidPackages(Squid squid, SensorContext context) { 058 Collection<SourceCode> packages = squid.search(new QueryByType(SourcePackage.class)); 059 for (SourceCode squidPackage : packages) { 060 JavaPackage sonarPackage = SquidUtils.convertJavaPackageKeyFromSquidFormat(squidPackage.getKey()); 061 context.index(sonarPackage); 062 put(squidPackage, context.getResource(sonarPackage)); // resource is reloaded to get the id 063 } 064 } 065 066 private void loadSquidFiles(Squid squid, SensorContext context) { 067 Collection<SourceCode> files = squid.search(new QueryByType(SourceFile.class)); 068 for (SourceCode squidFile : files) { 069 JavaFile sonarFile = SquidUtils.convertJavaFileKeyFromSquidFormat(squidFile.getKey()); 070 JavaPackage sonarPackage = (JavaPackage) get(squidFile.getParent(SourcePackage.class)); 071 context.index(sonarFile, sonarPackage); 072 put(squidFile, context.getResource(sonarFile)); // resource is reloaded to get the id 073 } 074 } 075 076 private void loadSquidClasses(Squid squid, SensorContext context) { 077 Collection<SourceCode> classes = squid.search(new QueryByType(SourceClass.class), new QueryByMeasure(Metric.CLASSES, QueryByMeasure.Operator.GREATER_THAN_EQUALS, 1)); 078 for (SourceCode squidClass : classes) { 079 JavaFile sonarFile = (JavaFile) get(squidClass.getParent(SourceFile.class)); 080 JavaClass sonarClass = new JavaClass.Builder() 081 .setName(convertClassKey(squidClass.getKey())) 082 .setFromLine(squidClass.getStartAtLine()) 083 .setToLine(squidClass.getEndAtLine()) 084 .create(); 085 context.index(sonarClass, sonarFile); 086 put(squidClass, sonarClass); 087 } 088 } 089 090 private void loadSquidMethods(Squid squid, SensorContext context) { 091 Collection<SourceCode> methods = squid.search(new QueryByType(SourceMethod.class)); 092 for (SourceCode squidMethod : methods) { 093 SourceClass squidClass = squidMethod.getParent(SourceClass.class); 094 JavaClass sonarClass = (JavaClass) get(squidClass); 095 if (sonarClass != null) { 096 JavaMethod sonarMethod = new JavaMethod.Builder() 097 .setClass(sonarClass) 098 .setSignature(squidMethod.getName()) 099 .setFromLine(squidMethod.getStartAtLine()) 100 .setToLine(squidMethod.getEndAtLine()) 101 .setAccessor(squidMethod.getInt(Metric.ACCESSORS) > 0) 102 .create(); 103 104 context.index(sonarMethod, sonarClass); 105 put(squidMethod, sonarMethod); 106 } 107 } 108 } 109 110 static String convertClassKey(String squidClassKey) { 111 return StringUtils.replace(squidClassKey, "/", "."); 112 } 113 114 }