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.core.config;
021    
022    import org.apache.commons.configuration.Configuration;
023    import org.apache.commons.io.FileUtils;
024    import org.apache.commons.io.IOUtils;
025    import org.apache.commons.lang.StringUtils;
026    import org.apache.commons.lang.text.StrSubstitutor;
027    import org.sonar.api.database.DatabaseSession;
028    import org.sonar.api.database.configuration.Property;
029    import org.sonar.api.database.model.ResourceModel;
030    import org.sonar.jpa.session.DatabaseSessionFactory;
031    
032    import java.io.File;
033    import java.io.FileInputStream;
034    import java.io.IOException;
035    import java.io.InputStream;
036    import java.util.*;
037    
038    /**
039     * @since 2.12
040     */
041    public final class ConfigurationUtils {
042    
043      private ConfigurationUtils() {
044      }
045    
046      public static void copyProperties(Properties from, Map<String, String> to) {
047        for (Map.Entry<Object, Object> entry : from.entrySet()) {
048          String key = (String) entry.getKey();
049          to.put(key, entry.getValue().toString());
050        }
051      }
052    
053      public static Properties openProperties(File file) throws IOException {
054        FileInputStream input = FileUtils.openInputStream(file);
055        return readInputStream(input);
056      }
057    
058      /**
059       * Note that the input stream is closed in this method.
060       */
061      public static Properties readInputStream(InputStream input) throws IOException {
062        try {
063          Properties p = new Properties();
064          p.load(input);
065          return p;
066    
067        } finally {
068          IOUtils.closeQuietly(input);
069        }
070      }
071    
072      public static Properties interpolateEnvVariables(Properties properties) {
073        return interpolateVariables(properties, System.getenv());
074      }
075    
076      public static Properties interpolateVariables(Properties properties, Map<String, String> variables) {
077        Properties result = new Properties();
078        Enumeration keys = properties.keys();
079        while (keys.hasMoreElements()) {
080          String key = (String) keys.nextElement();
081          String value = (String) properties.get(key);
082          String interpolatedValue = StrSubstitutor.replace(value, variables, "${env:", "}");
083          result.setProperty(key, interpolatedValue);
084        }
085        return result;
086      }
087    
088      public static List<Property> getProjectProperties(DatabaseSessionFactory dbFactory, String moduleKey, String branch) {
089        final String completeKey;
090        if (StringUtils.isNotBlank(branch)) {
091          completeKey = String.format("%s:%s", moduleKey, branch);
092        } else {
093          completeKey = moduleKey;
094        }
095        DatabaseSession session = prepareDbSession(dbFactory);
096        ResourceModel resource = session.getSingleResult(ResourceModel.class, "key", completeKey);
097        if (resource != null) {
098          return session
099              .createQuery("from " + Property.class.getSimpleName() + " p where p.resourceId=:resourceId and p.userId is null")
100              .setParameter("resourceId", resource.getId())
101              .getResultList();
102    
103        }
104        return Collections.emptyList();
105      }
106    
107      public static List<Property> getGeneralProperties(DatabaseSessionFactory dbFactory) {
108        DatabaseSession session = prepareDbSession(dbFactory);
109        return session
110            .createQuery("from " + Property.class.getSimpleName() + " p where p.resourceId is null and p.userId is null")
111            .getResultList();
112    
113      }
114    
115      private static DatabaseSession prepareDbSession(DatabaseSessionFactory dbFactory) {
116        DatabaseSession session = dbFactory.getSession();
117        // Ugly workaround before the move to myBatis
118        // Session is not up-to-date when Ruby on Rails inserts new rows in its own transaction. Seems like
119        // Hibernate keeps a cache...
120        session.commit();
121        return session;
122      }
123    
124      public static void copyToCommonsConfiguration(Map<String,String> input, Configuration commonsConfig) {
125        // update deprecated configuration
126        commonsConfig.clear();
127        for (Map.Entry<String, String> entry : input.entrySet()) {
128          String key = entry.getKey();
129          commonsConfig.setProperty(key, entry.getValue());
130        }
131      }
132    }