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