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 */
020package org.sonar.server.platform;
021
022import com.google.common.annotations.VisibleForTesting;
023import org.apache.commons.configuration.Configuration;
024import org.sonar.api.CoreProperties;
025import org.sonar.api.config.PropertyDefinitions;
026import org.sonar.api.config.Settings;
027import org.sonar.core.config.ConfigurationUtils;
028import org.sonar.core.properties.PropertiesDao;
029import org.sonar.core.properties.PropertyDto;
030
031import javax.servlet.ServletContext;
032import java.io.File;
033import java.util.List;
034import java.util.Properties;
035
036/**
037 * Load settings in the following order (the last override the first) :
038 * <ol>
039 * <li>general settings persisted in database</li>
040 * <li>file $SONAR_HOME/conf/sonar.properties</li>
041 * <li>environment variables</li>
042 * <li>system properties</li>
043 * </ol>
044 *
045 * @since 2.12
046 */
047public class ServerSettings extends Settings {
048
049  public static final String DEPLOY_DIR = "sonar.web.deployDir";
050
051  private PropertiesDao propertiesDao;
052  private Configuration deprecatedConfiguration;
053  private File deployDir;
054
055  public ServerSettings(PropertyDefinitions definitions, Configuration deprecatedConfiguration, ServletContext servletContext) {
056    super(definitions);
057    this.deprecatedConfiguration = deprecatedConfiguration;
058    this.deployDir = getDeployDir(servletContext);
059    load();
060  }
061
062  ServerSettings(PropertyDefinitions definitions, Configuration deprecatedConfiguration, File deployDir, File sonarHome) {
063    super(definitions);
064    this.deprecatedConfiguration = deprecatedConfiguration;
065    this.deployDir = deployDir;
066    load(sonarHome);
067  }
068
069  public ServerSettings activateDatabaseSettings(PropertiesDao dao) {
070    return activateDatabaseSettings(dao, SonarHome.getHome());
071  }
072
073  @VisibleForTesting
074  ServerSettings activateDatabaseSettings(PropertiesDao dao, File sonarHome) {
075    this.propertiesDao = dao;
076    load(sonarHome);
077    return this;
078  }
079
080  private ServerSettings load() {
081    return load(SonarHome.getHome());
082  }
083
084  private ServerSettings load(File sonarHome) {
085    clear();
086    setProperty(CoreProperties.SONAR_HOME, sonarHome.getAbsolutePath());
087    setProperty(DEPLOY_DIR, deployDir.getAbsolutePath());
088
089    // order is important : the last override the first
090    loadDatabaseSettings();
091    loadPropertiesFile(sonarHome);
092    addEnvironmentVariables();
093    addSystemProperties();
094
095    // update deprecated configuration
096    ConfigurationUtils.copyToCommonsConfiguration(properties, deprecatedConfiguration);
097
098    return this;
099  }
100
101  private void loadDatabaseSettings() {
102    if (propertiesDao != null) {
103      List<PropertyDto> dpProps = propertiesDao.selectGlobalProperties();
104      for (PropertyDto dbProp : dpProps) {
105        setProperty(dbProp.getKey(), dbProp.getValue());
106      }
107    }
108  }
109
110  private void loadPropertiesFile(File sonarHome) {
111    File propertiesFile = new File(sonarHome, "conf/sonar.properties");
112    if (!propertiesFile.isFile() || !propertiesFile.exists()) {
113      throw new IllegalStateException("Properties file does not exist: " + propertiesFile);
114    }
115
116    try {
117      Properties p = ConfigurationUtils.openProperties(propertiesFile);
118      p = ConfigurationUtils.interpolateEnvVariables(p);
119      addProperties(p);
120    } catch (Exception e) {
121      throw new IllegalStateException("Fail to load configuration file: " + propertiesFile, e);
122    }
123  }
124
125  static File getDeployDir(ServletContext servletContext) {
126    String dirname = servletContext.getRealPath("/deploy/");
127    if (dirname == null) {
128      throw new IllegalArgumentException("Web app directory not found : /deploy/");
129    }
130    File dir = new File(dirname);
131    if (!dir.exists()) {
132      throw new IllegalArgumentException("Web app directory does not exist: " + dir);
133    }
134    return dir;
135  }
136}