All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mockit.internal.startup.StartupConfiguration Maven / Gradle / Ivy

/*
 * Copyright (c) 2006-2014 Rogério Liesenfeld
 * This file is subject to the terms of the MIT license (see LICENSE.txt).
 */
package mockit.internal.startup;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.Map.Entry;

final class StartupConfiguration
{
   private static final Iterable NO_VALUES = Collections.emptyList();

   private final Properties config;
   final Iterable externalTools;
   final Iterable mockClasses;

   StartupConfiguration() throws IOException
   {
      config = new Properties();

      loadJMockitPropertiesFilesFromClasspath();
      loadJMockitPropertiesIntoSystemProperties();

      externalTools = getMultiValuedProperty("jmockit-tools");
      mockClasses = getMultiValuedProperty("jmockit-mocks");
   }

   private void loadJMockitPropertiesFilesFromClasspath() throws IOException
   {
      Enumeration allFiles = Thread.currentThread().getContextClassLoader().getResources("jmockit.properties");
      int numFiles = 0;

      while (allFiles.hasMoreElements()) {
         URL url = allFiles.nextElement();
         InputStream propertiesFile = url.openStream();

         if (numFiles == 0) {
            try { config.load(propertiesFile); } finally { propertiesFile.close(); }
         }
         else {
            Properties properties = new Properties();
            try { properties.load(propertiesFile); } finally { propertiesFile.close(); }
            addPropertyValues(properties);
         }

         numFiles++;
      }
   }

   private void addPropertyValues(Properties propertiesToAdd)
   {
      for (Entry propertyToAdd : propertiesToAdd.entrySet()) {
         Object key = propertyToAdd.getKey();
         String valueToAdd = (String) propertyToAdd.getValue();
         String existingValue = (String) config.get(key);
         String newValue;

         if (existingValue == null || existingValue.length() == 0) {
            newValue = valueToAdd;
         }
         else {
            newValue = existingValue + ' ' + valueToAdd;
         }

         config.put(key, newValue);
      }
   }

   private void loadJMockitPropertiesIntoSystemProperties()
   {
      Properties systemProperties = System.getProperties();

      for (Entry prop : config.entrySet()) {
         String key = (String) prop.getKey();
         String name = key.startsWith("jmockit-") ? key : "jmockit-" + key;

         if (!systemProperties.containsKey(name)) {
            systemProperties.put(name, prop.getValue());
         }
      }
   }

   private Iterable getMultiValuedProperty(String key)
   {
      String commaOrSpaceSeparatedValues = System.getProperty(key);
      
      if (commaOrSpaceSeparatedValues == null) {
         return NO_VALUES;
      }

      List allValues = Arrays.asList(commaOrSpaceSeparatedValues.split("\\s*,\\s*|\\s+"));
      Set uniqueValues = new HashSet(allValues);
      uniqueValues.remove("");

      return uniqueValues;
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy