| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with this |
| * work for additional information regarding copyright ownership. The ASF |
| * licenses this file to You under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package org.apache.sling.testing.junit.rules.instance.util; |
| |
| import org.apache.sling.testing.clients.instance.InstanceConfiguration; |
| import org.apache.sling.testing.clients.instance.InstanceSetup; |
| import org.junit.runner.Description; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.util.*; |
| |
| public class ConfigurationPool { |
| |
| private static final Logger LOG = LoggerFactory.getLogger(ConfigurationPool.class); |
| |
| private static final List<InstanceConfiguration> configurations = initialConfigurations(); |
| |
| private static final Set<Integer> takenConfigurations = new HashSet<Integer>(); |
| |
| private static final Map<Description, Set<Integer>> takenConfigurationsByDescription = new HashMap<Description, Set<Integer>>(); |
| |
| private static List<InstanceConfiguration> initialConfigurations() { |
| |
| LOG.info("Reading initial configurations from the system properties"); |
| |
| List<InstanceConfiguration> configurationsFromPlugin = InstanceSetup.get().getConfigurations(); |
| |
| if (!configurationsFromPlugin.isEmpty()) { |
| |
| LOG.info("Found {} instance configuration(s) from the system properties", configurationsFromPlugin.size()); |
| |
| return configurationsFromPlugin; |
| } |
| |
| LOG.info("No instance configurations found from the system properties"); |
| |
| List<InstanceConfiguration> configurations = new ArrayList<InstanceConfiguration>(); |
| |
| return configurations; |
| } |
| |
| public List<InstanceConfiguration> getConfigurations() { |
| return new ArrayList<InstanceConfiguration>(configurations); |
| } |
| |
| public boolean isTaken(int configurationIndex) { |
| synchronized (ConfigurationPool.class) { |
| return takenConfigurations.contains(configurationIndex); |
| } |
| } |
| |
| public InstanceConfiguration takeConfiguration(Description description, int configurationIndex) { |
| synchronized (ConfigurationPool.class) { |
| if (isTaken(configurationIndex)) { |
| throw new IllegalStateException("Requested configuration is already taken"); |
| } |
| |
| Set<Integer> indices = takenConfigurationsByDescription.get(description); |
| |
| if (indices == null) { |
| indices = new HashSet<Integer>(); |
| } |
| |
| indices.add(configurationIndex); |
| |
| LOG.debug("Test {} took configuration with index {}", description, configurationIndex); |
| |
| takenConfigurationsByDescription.put(description, indices); |
| |
| takenConfigurations.add(configurationIndex); |
| |
| return configurations.get(configurationIndex); |
| } |
| } |
| |
| public void returnConfiguration(Description description, int configurationIndex) { |
| synchronized (ConfigurationPool.class) { |
| if (!isTaken(configurationIndex)) { |
| throw new IllegalStateException("Returned configuration is not taken by anyone"); |
| } |
| |
| Set<Integer> indices = takenConfigurationsByDescription.get(description); |
| |
| if (indices == null) { |
| throw new IllegalStateException("The test didn't take any configuration"); |
| } |
| |
| if (!indices.contains(configurationIndex)) { |
| throw new IllegalStateException("The returned configuration was not taken by the test"); |
| } |
| |
| indices.remove(configurationIndex); |
| |
| LOG.debug("Test {} returned configuration with index {}", description, configurationIndex); |
| |
| if (indices.isEmpty()) { |
| takenConfigurationsByDescription.remove(description); |
| } |
| |
| takenConfigurations.remove(configurationIndex); |
| } |
| } |
| |
| public Integer addAndTakeConfiguration(Description description, InstanceConfiguration configuration) { |
| synchronized (ConfigurationPool.class) { |
| configurations.add(configuration); |
| |
| Integer index = configurations.size() - 1; |
| |
| takeConfiguration(description, index); |
| |
| return index; |
| } |
| } |
| |
| } |