package org.carlspring.strongbox.booters;
import org.carlspring.strongbox.resource.ConfigurationResourceResolver;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;
/**
* @author mtodorov
*/
@Component("resourcesBooter")
public class ResourcesBooter
{
private static final Logger logger = LoggerFactory.getLogger(ResourcesBooter.class);
private PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
@PostConstruct
public void execute()
throws IOException
{
copyConfigurationFilesFromClasspath("etc/conf");
copyConfigurationFilesFromClasspath("META-INF/spring");
copyConfigurationFilesFromClasspath("META-INF/properties");
}
public Resource[] getConfigurationResourcesFromClasspath(String resourcesBasedir)
throws IOException
{
return resolver.getResources("classpath*:" + resourcesBasedir + "/**/*");
}
public Resource[] getResourcesExistingOnClasspathOnly(Resource[] resources)
throws IOException
{
List<Resource> diff = new ArrayList<>();
for (Resource resource : resources)
{
logger.debug(resource.getURL().toString());
if (resource.getURL().toString().startsWith("jar:file:"))
{
diff.add(resource);
}
}
return diff.toArray(new Resource[diff.size()]);
}
public void copyConfigurationFilesFromClasspath(String resourcesBasedir)
throws IOException
{
final Resource[] resources = getResourcesExistingOnClasspathOnly(getConfigurationResourcesFromClasspath(resourcesBasedir));
final File configDir = new File(ConfigurationResourceResolver.getHomeDirectory() + "/" + resourcesBasedir);
if (!configDir.exists())
{
//noinspection ResultOfMethodCallIgnored
configDir.mkdirs();
}
for (Resource resource : resources)
{
File destFile = new File(configDir, resource.getFilename());
FileUtils.copyInputStreamToFile(resource.getInputStream(), destFile);
}
}
public PathMatchingResourcePatternResolver getResolver()
{
return resolver;
}
public void setResolver(PathMatchingResourcePatternResolver resolver)
{
this.resolver = resolver;
}
}