001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 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.batch.bootstrapper;
021
022 import com.google.common.collect.Lists;
023 import org.sonar.api.batch.bootstrap.ProjectReactor;
024 import org.sonar.batch.bootstrap.BootstrapModule;
025 import org.sonar.batch.bootstrap.Module;
026
027 import java.util.Arrays;
028 import java.util.List;
029 import java.util.Map;
030
031 /**
032 * Entry point for batch bootstrappers.
033 *
034 * @since 2.14
035 */
036 public final class Batch {
037
038 private LoggingConfiguration logging;
039 private List components;
040 private ProjectReactor projectReactor;
041
042 private Batch(Builder builder) {
043 components = Lists.newArrayList();
044 components.addAll(builder.components);
045 components.add(builder.environment);
046 projectReactor = builder.projectReactor;
047 if (builder.isEnableLoggingConfiguration()) {
048 logging = LoggingConfiguration.create().setProperties((Map) projectReactor.getRoot().getProperties());
049 }
050 }
051
052 public LoggingConfiguration getLoggingConfiguration() {
053 return logging;
054 }
055
056 public Batch execute() {
057 configureLogging();
058 startBatch();
059 return this;
060 }
061
062 private void configureLogging() {
063 if (logging != null) {
064 logging.configure();
065 }
066 }
067
068 private void startBatch() {
069 Module bootstrapModule = new BootstrapModule(projectReactor, components.toArray(new Object[components.size()])).init();
070 try {
071 bootstrapModule.start();
072 } finally {
073 try {
074 bootstrapModule.stop();
075 } catch (Exception e) {
076 // never throw exceptions in a finally block
077 }
078 }
079 }
080
081
082 public static Builder builder() {
083 return new Builder();
084 }
085
086 public static final class Builder {
087 private ProjectReactor projectReactor;
088 private EnvironmentInformation environment;
089 private List components = Lists.newArrayList();
090 private boolean enableLoggingConfiguration = true;
091
092 private Builder() {
093 }
094
095 public Builder setProjectReactor(ProjectReactor projectReactor) {
096 this.projectReactor = projectReactor;
097 return this;
098 }
099
100 public Builder setEnvironment(EnvironmentInformation env) {
101 this.environment = env;
102 return this;
103 }
104
105 public Builder setComponents(List l) {
106 this.components = l;
107 return this;
108 }
109
110 public Builder addComponents(Object... components) {
111 this.components.addAll(Arrays.asList(components));
112 return this;
113 }
114
115 public Builder addComponent(Object component) {
116 this.components.add(component);
117 return this;
118 }
119
120 public boolean isEnableLoggingConfiguration() {
121 return enableLoggingConfiguration;
122 }
123
124 /**
125 * Logback is configured by default. It can be disabled, but n this case the batch bootstrapper must provide its
126 * own implementation of SLF4J.
127 */
128 public Builder setEnableLoggingConfiguration(boolean b) {
129 this.enableLoggingConfiguration = b;
130 return this;
131 }
132
133 public Batch build() {
134 if (projectReactor == null) {
135 throw new IllegalStateException("ProjectReactor is not set");
136 }
137 if (environment == null) {
138 throw new IllegalStateException("EnvironmentInfo is not set");
139 }
140 if (components == null) {
141 throw new IllegalStateException("Batch components are not set");
142 }
143 return new Batch(this);
144 }
145 }
146 }