aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2016-03-17 17:05:56 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2016-03-18 09:35:05 +0100
commitcfcbe278f7ced12599d898d50f3fe68bfbf95155 (patch)
tree5b4116ad08a8ba87ffc5bf9f159a431b9609b48f /sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java
parent38ce80934961773a9a35ec0401994b3d726597dc (diff)
downloadsonarqube-cfcbe278f7ced12599d898d50f3fe68bfbf95155.tar.gz
sonarqube-cfcbe278f7ced12599d898d50f3fe68bfbf95155.zip
Rename batch into scanner
Diffstat (limited to 'sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java')
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java274
1 files changed, 274 insertions, 0 deletions
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java b/sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java
new file mode 100644
index 00000000000..d5d3da13087
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/batch/bootstrapper/Batch.java
@@ -0,0 +1,274 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * 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
+ * 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.bootstrapper;
+
+import org.sonar.api.utils.MessageException;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.picocontainer.annotations.Nullable;
+import org.sonar.batch.bootstrap.GlobalContainer;
+
+/**
+ * Entry point for sonar-runner 2.1.
+ *
+ * @since 2.14
+ */
+public final class Batch {
+
+ private boolean started = false;
+ private LoggingConfiguration loggingConfig;
+ private List<Object> components;
+ private Map<String, String> bootstrapProperties = Maps.newHashMap();
+ private GlobalContainer bootstrapContainer;
+
+ private Batch(Builder builder) {
+ components = Lists.newArrayList();
+ components.addAll(builder.components);
+ if (builder.environment != null) {
+ components.add(builder.environment);
+ }
+ if (builder.bootstrapProperties != null) {
+ bootstrapProperties.putAll(builder.bootstrapProperties);
+ }
+ if (builder.isEnableLoggingConfiguration()) {
+ loggingConfig = new LoggingConfiguration(builder.environment).setProperties(bootstrapProperties);
+
+ if (builder.logOutput != null) {
+ loggingConfig.setLogOutput(builder.logOutput);
+ }
+ }
+ }
+
+ public LoggingConfiguration getLoggingConfiguration() {
+ return loggingConfig;
+ }
+
+ /**
+ * @deprecated since 4.4 use {@link #start()}, {@link #executeTask(Map)} and then {@link #stop()}
+ */
+ @Deprecated
+ public synchronized Batch execute() {
+ configureLogging();
+ start();
+ boolean threw = true;
+ try {
+ executeTask(bootstrapProperties);
+ threw = false;
+ } finally {
+ doStop(threw);
+ }
+
+ return this;
+ }
+
+ /**
+ * @since 4.4
+ */
+ public synchronized Batch start() {
+ return start(false);
+ }
+
+ public synchronized Batch start(boolean preferCache) {
+ if (started) {
+ throw new IllegalStateException("Batch is already started");
+ }
+
+ configureLogging();
+ try {
+ bootstrapContainer = GlobalContainer.create(bootstrapProperties, components, preferCache);
+ bootstrapContainer.startComponents();
+ } catch (RuntimeException e) {
+ throw handleException(e);
+ }
+ this.started = true;
+
+ return this;
+ }
+
+ /**
+ * @since 4.4
+ */
+ public Batch executeTask(Map<String, String> analysisProperties, Object... components) {
+ checkStarted();
+ configureTaskLogging(analysisProperties);
+ try {
+ bootstrapContainer.executeTask(analysisProperties, components);
+ } catch (RuntimeException e) {
+ throw handleException(e);
+ }
+ return this;
+ }
+
+ /**
+ * @since 5.2
+ */
+ public Batch executeTask(Map<String, String> analysisProperties, IssueListener issueListener) {
+ checkStarted();
+ configureTaskLogging(analysisProperties);
+ try {
+ bootstrapContainer.executeTask(analysisProperties, components, issueListener);
+ } catch (RuntimeException e) {
+ throw handleException(e);
+ }
+ return this;
+ }
+
+ private void checkStarted() {
+ if (!started) {
+ throw new IllegalStateException("Batch is not started. Unable to execute task.");
+ }
+ }
+
+ private RuntimeException handleException(RuntimeException t) {
+ if (loggingConfig.isVerbose()) {
+ return t;
+ }
+
+ for (Throwable y : Throwables.getCausalChain(t)) {
+ if (y instanceof MessageException) {
+ return (MessageException) y;
+ }
+ }
+
+ return t;
+ }
+
+ /**
+ * @since 5.2
+ */
+ public Batch syncProject(String projectKey) {
+ checkStarted();
+ bootstrapContainer.syncProject(projectKey, true);
+ return this;
+ }
+
+ /**
+ * @since 4.4
+ */
+ public synchronized void stop() {
+ doStop(false);
+ }
+
+ private void doStop(boolean swallowException) {
+ checkStarted();
+ configureLogging();
+ try {
+ bootstrapContainer.stopComponents(swallowException);
+ } catch (RuntimeException e) {
+ throw handleException(e);
+ }
+ this.started = false;
+ }
+
+ private void configureLogging() {
+ if (loggingConfig != null) {
+ loggingConfig.setProperties(bootstrapProperties);
+ LoggingConfigurator.apply(loggingConfig);
+ }
+ }
+
+ private void configureTaskLogging(Map<String, String> taskProperties) {
+ if (loggingConfig != null) {
+ loggingConfig.setProperties(taskProperties, bootstrapProperties);
+ LoggingConfigurator.apply(loggingConfig);
+ }
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static final class Builder {
+ private Map<String, String> bootstrapProperties;
+ private EnvironmentInformation environment;
+ private List<Object> components = Lists.newArrayList();
+ private boolean enableLoggingConfiguration = true;
+ private LogOutput logOutput;
+
+ private Builder() {
+ }
+
+ public Builder setEnvironment(EnvironmentInformation env) {
+ this.environment = env;
+ return this;
+ }
+
+ public Builder setComponents(List<Object> l) {
+ this.components = l;
+ return this;
+ }
+
+ public Builder setLogOutput(@Nullable LogOutput logOutput) {
+ this.logOutput = logOutput;
+ return this;
+ }
+
+ /**
+ * @deprecated since 3.7 use {@link #setBootstrapProperties(Map)}
+ */
+ @Deprecated
+ public Builder setGlobalProperties(Map<String, String> globalProperties) {
+ this.bootstrapProperties = globalProperties;
+ return this;
+ }
+
+ public Builder setBootstrapProperties(Map<String, String> bootstrapProperties) {
+ this.bootstrapProperties = bootstrapProperties;
+ return this;
+ }
+
+ public Builder addComponents(Object... components) {
+ Collections.addAll(this.components, components);
+ return this;
+ }
+
+ public Builder addComponent(Object component) {
+ this.components.add(component);
+ return this;
+ }
+
+ public boolean isEnableLoggingConfiguration() {
+ return enableLoggingConfiguration;
+ }
+
+ /**
+ * Logback is configured by default. It can be disabled, but n this case the batch bootstrapper must provide its
+ * own implementation of SLF4J.
+ */
+ public Builder setEnableLoggingConfiguration(boolean b) {
+ this.enableLoggingConfiguration = b;
+ return this;
+ }
+
+ public Batch build() {
+ if (components == null) {
+ throw new IllegalStateException("Batch components are not set");
+ }
+ return new Batch(this);
+ }
+ }
+}