]> source.dussan.org Git - sonarqube.git/blob
c4f17972835175afa85b106a0275af494c57fe74
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2017 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.scanner.deprecated.perspectives;
21
22 import com.google.common.collect.Maps;
23 import java.util.Map;
24 import javax.annotation.CheckForNull;
25
26 import org.sonar.api.batch.fs.InputComponent;
27 import org.sonar.api.batch.fs.InputPath;
28 import org.sonar.api.batch.fs.internal.DefaultInputModule;
29 import org.sonar.api.component.Perspective;
30 import org.sonar.api.component.ResourcePerspectives;
31 import org.sonar.api.resources.Resource;
32 import org.sonar.api.resources.ResourceUtils;
33 import org.sonar.core.component.ComponentKeys;
34 import org.sonar.scanner.scan.filesystem.InputComponentStore;
35
36 public class ScannerPerspectives implements ResourcePerspectives {
37
38   private final Map<Class<?>, PerspectiveBuilder<?>> builders = Maps.newHashMap();
39   private final InputComponentStore componentStore;
40   private final DefaultInputModule module;
41
42   public ScannerPerspectives(PerspectiveBuilder[] builders, DefaultInputModule module, InputComponentStore componentStore) {
43     this.componentStore = componentStore;
44     this.module = module;
45
46     for (PerspectiveBuilder builder : builders) {
47       this.builders.put(builder.getPerspectiveClass(), builder);
48     }
49   }
50
51   @Override
52   @CheckForNull
53   public <P extends Perspective> P as(Class<P> perspectiveClass, Resource resource) {
54     InputComponent component = componentStore.getByKey(getComponentKey(resource));
55     if (component != null) {
56       PerspectiveBuilder<P> builder = builderFor(perspectiveClass);
57       return builder.loadPerspective(perspectiveClass, component);
58     }
59     return null;
60   }
61
62   private String getComponentKey(Resource r) {
63     if (ResourceUtils.isProject(r) || /* For technical projects */ResourceUtils.isRootProject(r)) {
64       return r.getKey();
65     } else {
66       return ComponentKeys.createEffectiveKey(module.key(), r);
67     }
68   }
69
70   @Override
71   public <P extends Perspective> P as(Class<P> perspectiveClass, InputPath inputPath) {
72     PerspectiveBuilder<P> builder = builderFor(perspectiveClass);
73     return builder.loadPerspective(perspectiveClass, inputPath);
74   }
75
76   private <T extends Perspective> PerspectiveBuilder<T> builderFor(Class<T> clazz) {
77     PerspectiveBuilder<T> builder = (PerspectiveBuilder<T>) builders.get(clazz);
78     if (builder == null) {
79       throw new PerspectiveNotFoundException("Perspective class is not registered: " + clazz);
80     }
81     return builder;
82   }
83 }