package com.github.dynamicextensionsalfresco.osgi.spring;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.github.dynamicextensionsalfresco.osgi.ConfigurationValues;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.util.Assert;
/**
* {@link FactoryBean} that combines all the items from multiple Sets into a single Set.
* <p>
* This implementation preserves the original item order.
*
* @author Laurens Fridael
*
* @param <T>
*/
public class ConfigurationValuesFactoryBean<T> implements FactoryBean<ConfigurationValues<T>> {
/* Configuration */
private List<Set<T>> sets;
private ConfigurationValues<T> instance;
/* Main operations */
@Override
public boolean isSingleton() {
return true;
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getObjectType() {
return ConfigurationValues.class;
}
@Override
public ConfigurationValues<T> getObject() throws Exception {
if (instance == null) {
instance = createContainerConfiguration();
}
return instance;
}
/* Utility operations */
protected ConfigurationValues<T> createContainerConfiguration() {
final Set<T> items = new LinkedHashSet<T>(getTotalSize());
for (final Set<T> set : getSets()) {
items.addAll(set);
}
return new ConfigurationValues<T>(items);
}
protected int getTotalSize() {
int totalSize = 0;
for (final Set<T> set : getSets()) {
totalSize += set.size();
}
return totalSize;
}
/* Configuration */
public void setSets(final List<Set<T>> sets) {
Assert.notNull(sets);
this.sets = sets;
}
protected List<Set<T>> getSets() {
return sets;
}
}