package com.github.dynamicextensionsalfresco.osgi.spring; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.ArrayList; import java.util.List; import com.github.dynamicextensionsalfresco.osgi.ServiceDefinition; import com.github.dynamicextensionsalfresco.osgi.ServiceDefinitionEditor; import org.apache.commons.collections.list.AbstractLinkedList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.core.io.Resource; /** * {@link FactoryBean} for creating a List of {@link ServiceDefinition}s from a text file. * * @author Laurens Fridael * */ public class ServiceDefinitionConfigurationFactoryBean extends AbstractConfigurationFileFactoryBean<List<ServiceDefinition>> { private final Logger logger = LoggerFactory.getLogger(getClass()); /* State */ private List<ServiceDefinition> serviceDefinitions; /* Operations */ @SuppressWarnings("unchecked") @Override public Class<? extends List<ServiceDefinition>> getObjectType() { return (Class<? extends List<ServiceDefinition>>) (Class<?>) List.class; } @Override public boolean isSingleton() { return true; } @Override public List<ServiceDefinition> getObject() throws IOException { if (serviceDefinitions == null) { serviceDefinitions = createServiceDefinitions(); } return serviceDefinitions; } /* Utility operations */ protected List<ServiceDefinition> createServiceDefinitions() throws IOException { final List<ServiceDefinition> serviceDefinitions = new ArrayList<ServiceDefinition>(); final ServiceDefinitionEditor serviceDefinitionEditor = new ServiceDefinitionEditor(); for (final Resource configuration : resolveConfigurations()) { final LineNumberReader in = new LineNumberReader(new InputStreamReader(configuration.getInputStream())); for (String line; (line = in.readLine()) != null;) { line = line.trim(); if (line.isEmpty() || line.startsWith("#")) { // Skip empty lines and comments. continue; } try { serviceDefinitionEditor.setAsText(line); final ServiceDefinition serviceDefinition = (ServiceDefinition) serviceDefinitionEditor.getValue(); serviceDefinitions.add(serviceDefinition); } catch (final IllegalArgumentException e) { logger.warn("Could not parse SystemPackage configuration line: {}", e.getMessage()); } } } return serviceDefinitions; } }