package org.carlspring.strongbox.configuration;
import org.carlspring.strongbox.xml.parsers.GenericParser;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.core.io.Resource;
/**
* @author mtodorov
*/
public abstract class AbstractConfigurationManager<T>
{
private static final Logger logger = LoggerFactory.getLogger(AbstractConfigurationManager.class);
protected ServerConfiguration configuration;
@Inject
protected ConfigurationRepository configurationRepository;
private String configurationPath;
private GenericParser<T> parser;
public AbstractConfigurationManager(Class... classes)
{
parser = new GenericParser<>(classes);
}
@PostConstruct
public synchronized void init()
throws IOException, JAXBException
{
this.configuration = configurationRepository.getConfiguration();
logger.info("Loading Strongbox configuration from OrientDB...");
if (configuration == null)
{
throw new BeanCreationException("Unable to load configuration from db");
}
}
public synchronized void store()
throws IOException, JAXBException
{
store(configuration);
}
public synchronized void store(ServerConfiguration configuration)
throws IOException, JAXBException
{
try
{
Configuration configurationCasted = (Configuration) configuration;
configurationRepository.updateConfiguration(configurationCasted);
}
catch (ClassCastException e)
{
logger.error(configuration.getClass().getName() + " is not supported", e);
}
catch (Exception e)
{
logger.error("Unable to store", e);
}
}
public synchronized void store(ServerConfiguration configuration,
String file)
throws IOException, JAXBException
{
//noinspection unchecked
parser.store((T) configuration, file);
}
/**
* Override this in your implementation with a cast.
*/
public ServerConfiguration getConfiguration()
{
return configuration;
}
public void setConfiguration(ServerConfiguration configuration)
{
this.configuration = configuration;
}
public String getConfigurationPath()
{
return configurationPath;
}
public void setConfigurationPath(String configurationPath)
{
this.configurationPath = configurationPath;
}
public abstract Resource getConfigurationResource()
throws IOException;
}