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.batch;
021
022 import org.apache.commons.configuration.Configuration;
023 import org.apache.commons.lang.StringUtils;
024 import org.sonar.api.batch.bootstrap.ProjectReactor;
025 import org.sonar.batch.bootstrap.BootstrapModule;
026 import org.sonar.batch.bootstrap.Module;
027 import org.sonar.batch.bootstrapper.Reactor;
028
029 import java.util.Iterator;
030 import java.util.Properties;
031
032 public final class Batch {
033
034 private Module bootstrapModule;
035
036 public Batch(ProjectReactor reactor, Object... bootstrapperComponents) {
037 this.bootstrapModule = new BootstrapModule(reactor, bootstrapperComponents).init();
038 }
039
040 /**
041 * @deprecated since 2.9 because commons-configuration is replaced by ProjectDefinition#properties. Used by Ant Task 1.1
042 */
043 @Deprecated
044 public Batch(Configuration configuration, Object... bootstrapperComponents) {//NOSONAR configuration is not needed
045 // because it's already included in ProjectDefinition.
046 this.bootstrapModule = new BootstrapModule(extractProjectReactor(bootstrapperComponents), bootstrapperComponents).init();
047 }
048
049 static ProjectReactor extractProjectReactor(Object[] components) {
050 Reactor deprecatedReactor = null;
051 for (Object component : components) {
052 if (component instanceof ProjectReactor) {
053 return (ProjectReactor) component;
054 }
055 if (component instanceof Reactor) {
056 deprecatedReactor = (Reactor) component;
057 }
058 }
059
060 if (deprecatedReactor == null) {
061 throw new IllegalArgumentException("Project reactor is not defined");
062 }
063 return deprecatedReactor.toProjectReactor();
064 }
065
066 /**
067 * Used by Gradle 1.0
068 *
069 * @deprecated in version 2.12
070 */
071 @Deprecated
072 public static Batch create(ProjectReactor projectReactor, Configuration configuration, Object... bootstrapperComponents) {
073 if (configuration != null) {
074 projectReactor.getRoot().setProperties(convertToProperties(configuration));
075 }
076 return new Batch(projectReactor, bootstrapperComponents);
077 }
078
079 static Properties convertToProperties(Configuration configuration) {
080 Properties props = new Properties();
081 Iterator keys = configuration.getKeys();
082 while (keys.hasNext()) {
083 String key = (String) keys.next();
084 // Configuration#getString() automatically splits strings by comma separator.
085 String value = StringUtils.join(configuration.getStringArray(key), ",");
086 props.setProperty(key, value);
087 }
088 return props;
089 }
090
091 /**
092 * for unit tests
093 */
094 Batch(Module bootstrapModule) {
095 this.bootstrapModule = bootstrapModule;
096 }
097
098 public void execute() {
099 try {
100 bootstrapModule.start();
101 } finally {
102 bootstrapModule.stop();
103 }
104 }
105 }