diff options
31 files changed, 446 insertions, 68 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelPluginRepository.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelPluginRepository.java index c23cbb881a9..0b04cd571f9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelPluginRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelPluginRepository.java @@ -22,17 +22,18 @@ package org.sonar.server.debt; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; +import org.picocontainer.Startable; +import org.sonar.api.Plugin; +import org.sonar.api.server.ServerSide; +import org.sonar.core.platform.PluginInfo; +import org.sonar.core.platform.PluginRepository; + import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Collections; import java.util.Map; -import org.picocontainer.Startable; -import org.sonar.api.SonarPlugin; -import org.sonar.api.server.ServerSide; -import org.sonar.core.platform.PluginInfo; -import org.sonar.core.platform.PluginRepository; import static com.google.common.collect.Lists.newArrayList; @@ -89,7 +90,7 @@ public class DebtModelPluginRepository implements Startable { contributingPluginKeyToClassLoader.put(DEFAULT_MODEL, getClass().getClassLoader()); for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) { String pluginKey = pluginInfo.getKey(); - SonarPlugin plugin = pluginRepository.getPluginInstance(pluginKey); + Plugin plugin = pluginRepository.getPluginInstance(pluginKey); ClassLoader classLoader = plugin.getClass().getClassLoader(); if (classLoader.getResource(getXMLFilePath(pluginKey)) != null) { contributingPluginKeyToClassLoader.put(pluginKey, classLoader); diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java b/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java index 392f1b8ae6a..8f7cb251897 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java @@ -21,19 +21,21 @@ package org.sonar.server.platform; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; -import java.io.File; -import java.io.IOException; -import javax.annotation.Nullable; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.picocontainer.Startable; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.platform.ServerFileSystem; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; +import javax.annotation.Nullable; + +import java.io.File; +import java.io.IOException; + /** * Ruby on Rails requires the files to be on filesystem but not in Java classpath (JAR). This component extracts * all the needed files from plugins and copy them to $SONAR_HOME/temp @@ -60,7 +62,7 @@ public class RailsAppsDeployer implements Startable { for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) { String pluginKey = pluginInfo.getKey(); - SonarPlugin plugin = pluginRepository.getPluginInstance(pluginKey); + Plugin plugin = pluginRepository.getPluginInstance(pluginKey); try { deployRailsApp(appsDir, pluginKey, plugin.getClass().getClassLoader()); } catch (Exception e) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java index f7f35e3c8e2..1bd64568383 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java @@ -24,7 +24,7 @@ import com.google.common.collect.ListMultimap; import java.util.Map; import org.sonar.api.Extension; import org.sonar.api.ExtensionProvider; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.server.ServerSide; import org.sonar.api.utils.AnnotationUtils; import org.sonar.core.platform.ComponentContainer; @@ -49,7 +49,7 @@ public class ServerExtensionInstaller { for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) { try { String pluginKey = pluginInfo.getKey(); - SonarPlugin plugin = pluginRepository.getPluginInstance(pluginKey); + Plugin plugin = pluginRepository.getPluginInstance(pluginKey); container.addExtension(pluginInfo, plugin); for (Object extension : plugin.getExtensions()) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java index e0da2f5fc37..ea29ff323f7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java @@ -37,7 +37,7 @@ import java.util.Set; import javax.annotation.Nonnull; import org.apache.commons.io.FileUtils; import org.picocontainer.Startable; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.platform.Server; import org.sonar.api.platform.ServerUpgradeStatus; import org.sonar.api.utils.MessageException; @@ -83,7 +83,7 @@ public class ServerPluginRepository implements PluginRepository, Startable { // following fields are available after startup private final Map<String, PluginInfo> pluginInfosByKeys = new HashMap<>(); - private final Map<String, SonarPlugin> pluginInstancesByKeys = new HashMap<>(); + private final Map<String, Plugin> pluginInstancesByKeys = new HashMap<>(); public ServerPluginRepository(Server server, ServerUpgradeStatus upgradeStatus, DefaultServerFileSystem fs, PluginLoader loader) { @@ -348,8 +348,8 @@ public class ServerPluginRepository implements PluginRepository, Startable { } @Override - public SonarPlugin getPluginInstance(String key) { - SonarPlugin plugin = pluginInstancesByKeys.get(key); + public Plugin getPluginInstance(String key) { + Plugin plugin = pluginInstancesByKeys.get(key); if (plugin == null) { throw new IllegalArgumentException(format("Plugin [%s] does not exist", key)); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java index 68890ed20da..cbc4aeee1a3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java @@ -27,7 +27,7 @@ import java.util.List; import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.config.License; import org.sonar.api.config.PropertyDefinitions; import org.sonar.api.config.Settings; @@ -285,7 +285,7 @@ public final class JRubyFacade { } public Object getComponentByClassname(String pluginKey, String className) { - SonarPlugin plugin = get(PluginRepository.class).getPluginInstance(pluginKey); + Plugin plugin = get(PluginRepository.class).getPluginInstance(pluginKey); try { Class componentClass = plugin.getClass().getClassLoader().loadClass(className); return get(componentClass); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.0.jar b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.0.jar Binary files differindex e6ba8a4cc4b..1ca2ea2d1f6 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.0.jar +++ b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.0.jar diff --git a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.1.jar b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.1.jar Binary files differindex 59fc4bcfc75..c814e8a5176 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.1.jar +++ b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-decoy-plugin-1.1.jar diff --git a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-foo-plugin-1.0.jar b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-foo-plugin-1.0.jar Binary files differindex 4e58b7f8b58..9d608e08281 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-foo-plugin-1.0.jar +++ b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/PluginsWsMediumTest/sonar-foo-plugin-1.0.jar diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProfileLoader.java b/sonar-batch/src/main/java/org/sonar/batch/ProfileLoader.java new file mode 100644 index 00000000000..bc00a1c1a31 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/ProfileLoader.java @@ -0,0 +1,38 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch; + +import org.sonar.api.config.Settings; +import org.sonar.api.profiles.RulesProfile; + +/** + * This interface is implemented by the views plugin!! + * + * @deprecated in 4.2 + */ +@Deprecated +public interface ProfileLoader { + + /** + * Loads quality profile for specified project. + */ + RulesProfile load(Settings settings); + +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java index 8bc7ba788eb..b6744b5ff4a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java @@ -19,18 +19,21 @@ */ package org.sonar.batch.bootstrap; +import com.google.common.io.Files; + import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; -import com.google.common.io.Files; + import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; + import org.apache.commons.lang.CharUtils; import org.apache.commons.lang.StringUtils; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; @@ -79,7 +82,7 @@ public class BatchPluginInstaller implements PluginInstaller { * @see org.sonar.batch.mediumtest.BatchMediumTester */ @Override - public Map<String, SonarPlugin> installLocals() { + public Map<String, Plugin> installLocals() { return Collections.emptyMap(); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java index bba8bea0ab2..bf1d7d12519 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginRepository.java @@ -21,14 +21,15 @@ package org.sonar.batch.bootstrap; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; -import java.util.Collection; -import java.util.Map; import org.picocontainer.Startable; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginLoader; import org.sonar.core.platform.PluginRepository; +import java.util.Collection; +import java.util.Map; + /** * Orchestrates the installation and loading of plugins */ @@ -37,7 +38,7 @@ public class BatchPluginRepository implements PluginRepository, Startable { private final PluginInstaller installer; private final PluginLoader loader; - private Map<String, SonarPlugin> pluginInstancesByKeys; + private Map<String, Plugin> pluginInstancesByKeys; private Map<String, PluginInfo> infosByKeys; public BatchPluginRepository(PluginInstaller installer, PluginLoader loader) { @@ -51,7 +52,7 @@ public class BatchPluginRepository implements PluginRepository, Startable { pluginInstancesByKeys = Maps.newHashMap(loader.load(infosByKeys)); // this part is only used by tests - for (Map.Entry<String, SonarPlugin> entry : installer.installLocals().entrySet()) { + for (Map.Entry<String, Plugin> entry : installer.installLocals().entrySet()) { String pluginKey = entry.getKey(); infosByKeys.put(pluginKey, new PluginInfo(pluginKey)); pluginInstancesByKeys.put(pluginKey, entry.getValue()); @@ -80,8 +81,8 @@ public class BatchPluginRepository implements PluginRepository, Startable { } @Override - public SonarPlugin getPluginInstance(String key) { - SonarPlugin instance = pluginInstancesByKeys.get(key); + public Plugin getPluginInstance(String key) { + Plugin instance = pluginInstancesByKeys.get(key); Preconditions.checkState(instance != null, String.format("Plugin [%s] does not exist", key)); return instance; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java index d0860693004..aa4f22e4e1e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java @@ -20,9 +20,11 @@ package org.sonar.batch.bootstrap; import java.util.List; + import javax.annotation.Nullable; + import org.sonar.api.ExtensionProvider; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.batch.bootstrapper.EnvironmentInformation; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginInfo; @@ -49,7 +51,7 @@ public class ExtensionInstaller { // plugin extensions for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) { - SonarPlugin plugin = pluginRepository.getPluginInstance(pluginInfo.getKey()); + Plugin plugin = pluginRepository.getPluginInstance(pluginInfo.getKey()); for (Object extension : plugin.getExtensions()) { doInstall(container, matcher, pluginInfo, extension); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalContainer.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalContainer.java index db806c103c9..882aa173e48 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalContainer.java @@ -26,8 +26,10 @@ import org.sonar.batch.rule.RulesProvider; import java.util.List; import java.util.Map; + import org.sonar.api.CoreProperties; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; +import org.sonar.api.utils.Durations; import org.sonar.api.utils.System2; import org.sonar.api.utils.UriReader; import org.sonar.batch.index.CachesManager; @@ -44,6 +46,8 @@ import org.sonar.batch.repository.ServerIssuesLoader; import org.sonar.batch.repository.user.UserRepository; import org.sonar.batch.scan.ProjectScanContainer; import org.sonar.core.config.Logback; +import org.sonar.core.i18n.DefaultI18n; +import org.sonar.core.i18n.RuleI18nManager; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginClassloaderFactory; import org.sonar.core.platform.PluginInfo; @@ -83,7 +87,7 @@ public class GlobalContainer extends ComponentContainer { BatchPluginPredicate.class, ExtensionInstaller.class, - CachesManager.class, + CachesManager.class, GlobalMode.class, GlobalSettings.class, new RulesProvider(), @@ -97,6 +101,9 @@ public class GlobalContainer extends ComponentContainer { new PersistentCacheProvider(), new WSLoaderGlobalProvider(), System2.INSTANCE, + DefaultI18n.class, + Durations.class, + RuleI18nManager.class, new GlobalRepositoriesProvider(), UserRepository.class); addIfMissing(BatchPluginInstaller.class, PluginInstaller.class); @@ -121,7 +128,7 @@ public class GlobalContainer extends ComponentContainer { private void installPlugins() { PluginRepository pluginRepository = getComponentByType(PluginRepository.class); for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) { - SonarPlugin instance = pluginRepository.getPluginInstance(pluginInfo.getKey()); + Plugin instance = pluginRepository.getPluginInstance(pluginInfo.getKey()); addExtension(pluginInfo, instance); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PluginInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PluginInstaller.java index dac66e617f0..e1213cfbe13 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PluginInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PluginInstaller.java @@ -19,11 +19,12 @@ */ package org.sonar.batch.bootstrap; -import java.util.Map; -import org.sonar.api.SonarPlugin; import org.sonar.api.batch.BatchSide; +import org.sonar.api.Plugin; import org.sonar.core.platform.PluginInfo; +import java.util.Map; + @BatchSide public interface PluginInstaller { @@ -38,5 +39,5 @@ public interface PluginInstaller { * Used only by tests. * @see org.sonar.batch.mediumtest.BatchMediumTester */ - Map<String, SonarPlugin> installLocals(); + Map<String, Plugin> installLocals(); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/compute/package-info.java b/sonar-batch/src/main/java/org/sonar/batch/compute/package-info.java new file mode 100644 index 00000000000..7fd21f3ba7c --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/compute/package-info.java @@ -0,0 +1,24 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +@ParametersAreNonnullByDefault +package org.sonar.batch.compute; + +import javax.annotation.ParametersAreNonnullByDefault; + diff --git a/sonar-batch/src/main/java/org/sonar/batch/debt/package-info.java b/sonar-batch/src/main/java/org/sonar/batch/debt/package-info.java new file mode 100644 index 00000000000..98d74a000ac --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/debt/package-info.java @@ -0,0 +1,23 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +@ParametersAreNonnullByDefault +package org.sonar.batch.debt; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/sonar-batch/src/main/java/org/sonar/batch/deprecated/ResourceFilters.java b/sonar-batch/src/main/java/org/sonar/batch/deprecated/ResourceFilters.java new file mode 100644 index 00000000000..f60713506d7 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/deprecated/ResourceFilters.java @@ -0,0 +1,49 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.deprecated; + +import com.google.common.base.Joiner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.batch.ResourceFilter; + +/** + * @since 1.12 + */ +public class ResourceFilters { + + public ResourceFilters(ResourceFilter[] filters) { + this(LoggerFactory.getLogger(ResourceFilters.class), filters); + } + + public ResourceFilters() { + // perfect + } + + ResourceFilters(Logger logger, ResourceFilter[] filters) { + check(logger, filters); + } + + private void check(Logger logger, ResourceFilter[] filters) { + if (filters.length > 0) { + logger.warn("ResourceFilters are not supported since version 4.2: " + Joiner.on(", ").join(filters)); + } + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/Data.java b/sonar-batch/src/main/java/org/sonar/batch/index/Data.java new file mode 100644 index 00000000000..aa47c04e799 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/index/Data.java @@ -0,0 +1,28 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.index; + +import java.io.Serializable; + +public interface Data extends Serializable { + + String writeString(); + +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/ResourceNotPersistedException.java b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceNotPersistedException.java new file mode 100644 index 00000000000..1cf29c6fd76 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceNotPersistedException.java @@ -0,0 +1,34 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.index; + +import org.sonar.api.resources.Resource; +import org.sonar.api.utils.SonarException; + +/** + * @since 2.6 + */ +public final class ResourceNotPersistedException extends SonarException { + + public ResourceNotPersistedException(Resource resource) { + super(resource.toString()); + } + +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/StringData.java b/sonar-batch/src/main/java/org/sonar/batch/index/StringData.java new file mode 100644 index 00000000000..6a88b5979b2 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/index/StringData.java @@ -0,0 +1,40 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.index; + +public class StringData implements Data { + private String data = null; + + public StringData() { + } + + public StringData(String s) { + this.data = s; + } + + public String data() { + return data; + } + + @Override + public String writeString() { + return data; + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/FakePluginInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/FakePluginInstaller.java index f7544d2956b..cbd837c66c9 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/FakePluginInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/FakePluginInstaller.java @@ -19,24 +19,25 @@ */ package org.sonar.batch.mediumtest; +import org.sonar.api.Plugin; +import org.sonar.batch.bootstrap.PluginInstaller; +import org.sonar.core.platform.PluginInfo; + import java.io.File; import java.util.HashMap; import java.util.Map; -import org.sonar.api.SonarPlugin; -import org.sonar.batch.bootstrap.PluginInstaller; -import org.sonar.core.platform.PluginInfo; public class FakePluginInstaller implements PluginInstaller { private final Map<String, PluginInfo> infosByKeys = new HashMap<>(); - private final Map<String, SonarPlugin> instancesByKeys = new HashMap<>(); + private final Map<String, Plugin> instancesByKeys = new HashMap<>(); public FakePluginInstaller add(String pluginKey, File jarFile) { infosByKeys.put(pluginKey, PluginInfo.create(jarFile)); return this; } - public FakePluginInstaller add(String pluginKey, SonarPlugin instance) { + public FakePluginInstaller add(String pluginKey, Plugin instance) { instancesByKeys.put(pluginKey, instance); return this; } @@ -47,7 +48,7 @@ public class FakePluginInstaller implements PluginInstaller { } @Override - public Map<String, SonarPlugin> installLocals() { + public Map<String, Plugin> installLocals() { return instancesByKeys; } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java index 039da7d57e0..1363134d449 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java @@ -35,6 +35,7 @@ import org.sonar.batch.bootstrap.ExtensionInstaller; import org.sonar.batch.bootstrap.ExtensionMatcher; import org.sonar.batch.bootstrap.ExtensionUtils; import org.sonar.batch.deprecated.DeprecatedSensorContext; +import org.sonar.batch.deprecated.ResourceFilters; import org.sonar.batch.deprecated.perspectives.BatchPerspectives; import org.sonar.batch.events.EventBus; import org.sonar.batch.index.DefaultIndex; @@ -146,6 +147,7 @@ public class ModuleScanContainer extends ComponentContainer { BatchExtensionDictionnary.class, IssueFilters.class, CoverageExclusions.class, + ResourceFilters.class, // rules ModuleQProfiles.class, diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java index 5f260785615..2adf1b31452 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginRepositoryTest.java @@ -21,7 +21,7 @@ package org.sonar.batch.bootstrap; import com.google.common.collect.ImmutableMap; import org.junit.Test; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginLoader; @@ -42,7 +42,7 @@ public class BatchPluginRepositoryTest { public void install_and_load_plugins() { PluginInfo info = new PluginInfo("squid"); ImmutableMap<String, PluginInfo> infos = ImmutableMap.of("squid", info); - SonarPlugin instance = mock(SonarPlugin.class); + Plugin instance = mock(Plugin.class); when(loader.load(infos)).thenReturn(ImmutableMap.of("squid", instance)); when(installer.installRemotes()).thenReturn(infos); @@ -53,7 +53,7 @@ public class BatchPluginRepositoryTest { assertThat(underTest.getPluginInstance("squid")).isSameAs(instance); underTest.stop(); - verify(loader).unload(anyCollectionOf(SonarPlugin.class)); + verify(loader).unload(anyCollectionOf(Plugin.class)); } @Test diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java index 68fd361319e..aef314012ca 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ExtensionInstallerTest.java @@ -19,19 +19,21 @@ */ package org.sonar.batch.bootstrap; -import java.util.Arrays; -import java.util.List; import org.apache.commons.lang.ClassUtils; import org.junit.Before; import org.junit.Test; import org.sonar.api.BatchExtension; import org.sonar.api.ExtensionProvider; +import org.sonar.api.Plugin; import org.sonar.api.SonarPlugin; import org.sonar.api.batch.SupportedEnvironment; import org.sonar.batch.bootstrapper.EnvironmentInformation; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginInfo; +import java.util.Arrays; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -41,7 +43,7 @@ public class ExtensionInstallerTest { GlobalMode mode; BatchPluginRepository pluginRepository = mock(BatchPluginRepository.class); - private static SonarPlugin newPluginInstance(final Object... extensions) { + private static Plugin newPluginInstance(final Object... extensions) { return new SonarPlugin() { public List getExtensions() { return Arrays.asList(extensions); diff --git a/sonar-batch/src/test/java/org/sonar/batch/deprecated/ResourceFiltersTest.java b/sonar-batch/src/test/java/org/sonar/batch/deprecated/ResourceFiltersTest.java new file mode 100644 index 00000000000..0a4ad891ce7 --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/deprecated/ResourceFiltersTest.java @@ -0,0 +1,47 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.deprecated; + +import org.junit.Test; +import org.slf4j.Logger; +import org.sonar.api.batch.ResourceFilter; + +import static org.mockito.Matchers.startsWith; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +public class ResourceFiltersTest { + @Test + public void warn_on_resource_filters() { + Logger logger = mock(Logger.class); + ResourceFilter[] filters = {mock(ResourceFilter.class)}; + new ResourceFilters(logger, filters); + verify(logger).warn(startsWith("ResourceFilters are not supported since version 4.2")); + + // verify that the standard constructor does not fail + new ResourceFilters(filters); + } + + @Test + public void ok_if_no_resource_filters() { + // just for verify that it does not fail. Should check that no warning is logged. + new ResourceFilters(); + } +} diff --git a/sonar-core/src/main/java/org/sonar/core/i18n/I18nClassloader.java b/sonar-core/src/main/java/org/sonar/core/i18n/I18nClassloader.java index 2aebd74e24e..4020f09ffaf 100644 --- a/sonar-core/src/main/java/org/sonar/core/i18n/I18nClassloader.java +++ b/sonar-core/src/main/java/org/sonar/core/i18n/I18nClassloader.java @@ -24,7 +24,7 @@ import com.google.common.collect.Lists; import java.net.URL; import java.net.URLClassLoader; import java.util.List; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; @@ -71,7 +71,7 @@ class I18nClassloader extends URLClassLoader { // there may be duplicated classloaders in the list. List<ClassLoader> list = Lists.newArrayList(); for (PluginInfo info : pluginRepository.getPluginInfos()) { - SonarPlugin plugin = pluginRepository.getPluginInstance(info.getKey()); + Plugin plugin = pluginRepository.getPluginInstance(info.getKey()); list.add(plugin.getClass().getClassLoader()); } list.add(I18nClassloader.class.getClassLoader()); diff --git a/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java b/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java index 9d2aa844adb..c3a28428141 100644 --- a/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java +++ b/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java @@ -26,7 +26,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.SystemUtils; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.utils.log.Loggers; import org.sonar.updatecenter.common.Version; @@ -59,7 +59,7 @@ public class PluginLoader { this.classloaderFactory = classloaderFactory; } - public Map<String, SonarPlugin> load(Map<String, PluginInfo> infoByKeys) { + public Map<String, Plugin> load(Map<String, PluginInfo> infoByKeys) { Collection<PluginClassloaderDef> defs = defineClassloaders(infoByKeys); Map<PluginClassloaderDef, ClassLoader> classloaders = classloaderFactory.create(defs); return instantiatePluginClasses(classloaders); @@ -113,9 +113,9 @@ public class PluginLoader { * @throws IllegalStateException if at least one plugin can't be correctly loaded */ @VisibleForTesting - Map<String, SonarPlugin> instantiatePluginClasses(Map<PluginClassloaderDef, ClassLoader> classloaders) { + Map<String, Plugin> instantiatePluginClasses(Map<PluginClassloaderDef, ClassLoader> classloaders) { // instantiate plugins - Map<String, SonarPlugin> instancesByPluginKey = new HashMap<>(); + Map<String, Plugin> instancesByPluginKey = new HashMap<>(); for (Map.Entry<PluginClassloaderDef, ClassLoader> entry : classloaders.entrySet()) { PluginClassloaderDef def = entry.getKey(); ClassLoader classLoader = entry.getValue(); @@ -125,7 +125,7 @@ public class PluginLoader { String pluginKey = mainClassEntry.getKey(); String mainClass = mainClassEntry.getValue(); try { - instancesByPluginKey.put(pluginKey, (SonarPlugin) classLoader.loadClass(mainClass).newInstance()); + instancesByPluginKey.put(pluginKey, (Plugin) classLoader.loadClass(mainClass).newInstance()); } catch (UnsupportedClassVersionError e) { throw new IllegalStateException(String.format("The plugin [%s] does not support Java %s", pluginKey, SystemUtils.JAVA_VERSION_TRIMMED), e); @@ -138,8 +138,8 @@ public class PluginLoader { return instancesByPluginKey; } - public void unload(Collection<SonarPlugin> plugins) { - for (SonarPlugin plugin : plugins) { + public void unload(Collection<Plugin> plugins) { + for (Plugin plugin : plugins) { ClassLoader classLoader = plugin.getClass().getClassLoader(); if (classLoader instanceof Closeable && classLoader != classloaderFactory.baseClassloader()) { try { diff --git a/sonar-core/src/main/java/org/sonar/core/platform/PluginRepository.java b/sonar-core/src/main/java/org/sonar/core/platform/PluginRepository.java index 836523abce8..8457d391f9c 100644 --- a/sonar-core/src/main/java/org/sonar/core/platform/PluginRepository.java +++ b/sonar-core/src/main/java/org/sonar/core/platform/PluginRepository.java @@ -20,7 +20,7 @@ package org.sonar.core.platform; import java.util.Collection; -import org.sonar.api.SonarPlugin; +import org.sonar.api.Plugin; import org.sonar.api.batch.BatchSide; import org.sonar.api.server.ServerSide; @@ -38,7 +38,7 @@ public interface PluginRepository { /** * @return the instance of {@link Plugin} for the given plugin key. Never return null. */ - SonarPlugin getPluginInstance(String key); + Plugin getPluginInstance(String key); boolean hasPlugin(String key); } diff --git a/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java b/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java index 6242956e496..fbeae3a2483 100644 --- a/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java +++ b/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java @@ -29,6 +29,7 @@ import org.assertj.core.data.MapEntry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.sonar.api.Plugin; import org.sonar.api.SonarPlugin; import org.sonar.updatecenter.common.Version; @@ -50,7 +51,7 @@ public class PluginLoaderTest { PluginClassloaderDef def = new PluginClassloaderDef("fake"); def.addMainClass("fake", FakePlugin.class.getName()); - Map<String, SonarPlugin> instances = loader.instantiatePluginClasses(ImmutableMap.of(def, getClass().getClassLoader())); + Map<String, Plugin> instances = loader.instantiatePluginClasses(ImmutableMap.of(def, getClass().getClassLoader())); assertThat(instances).containsOnlyKeys("fake"); assertThat(instances.get("fake")).isInstanceOf(FakePlugin.class); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java b/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java new file mode 100644 index 00000000000..23f5021d3fb --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java @@ -0,0 +1,64 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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 (at your option) any later version. + * + * SonarQube 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api; + +import java.util.List; + +/** + * A plugin is a group of extensions. See <code>org.sonar.api.Extension</code> interface to browse + * available extension points. + * <p>The manifest property <code>Plugin-Class</code> must declare the name of the implementation class. + * It is automatically set by sonar-packaging-maven-plugin when building plugins.</p> + * <p>Implementation must declare a public constructor with no-parameters.</p> + * + * @see org.sonar.api.Extension + * @since 1.10 + * @deprecated in 2.8. Use {@link SonarPlugin} instead. + */ +@Deprecated +public interface Plugin { + + /** + * Unique key within sonar plugins + * @deprecated since 2.2. The key must be set in the manifest. + */ + @Deprecated + String getKey(); + + /** + * Descriptive name + * @deprecated since 2.2. The name must be set in the manifest. + */ + @Deprecated + String getName(); + + /** + * description of the plugin, can contains html or ruby code + * @deprecated since 2.2. The description must be set in the manifest. + */ + @Deprecated + String getDescription(); + + /** + * Classes of the implemented extensions. + */ + List getExtensions(); + +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/SonarPlugin.java b/sonar-plugin-api/src/main/java/org/sonar/api/SonarPlugin.java index 6253c7a4cc0..31f2f349abe 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/SonarPlugin.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/SonarPlugin.java @@ -19,8 +19,6 @@ */ package org.sonar.api; -import java.util.List; - /** * Plugin entry-point used to declare its extensions (see {@link org.sonar.api.Extension}. * <p/> @@ -29,12 +27,22 @@ import java.util.List; * * @since 2.8 */ -public abstract class SonarPlugin { +public abstract class SonarPlugin implements Plugin { - /** - * Classes of the implemented extensions. - */ - public abstract List getExtensions(); + @Override + public final String getKey() { + throw new UnsupportedOperationException(); + } + + @Override + public final String getName() { + throw new UnsupportedOperationException(); + } + + @Override + public final String getDescription() { + throw new UnsupportedOperationException(); + } /** * Returns a string representation of the plugin, suitable for debugging purposes only. |