package com.opensymphony.xwork2.util.fs;
import com.opensymphony.xwork2.FileManager;
import com.opensymphony.xwork2.FileManagerFactory;
import com.opensymphony.xwork2.XWorkConstants;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import java.util.HashSet;
import java.util.Set;
/**
* Default implementation
*/
public class DefaultFileManagerFactory implements FileManagerFactory {
private static final Logger LOG = LoggerFactory.getLogger(DefaultFileManagerFactory.class);
private boolean reloadingConfigs;
private FileManager systemFileManager;
private Container container;
@Inject(value = "system")
public void setFileManager(FileManager fileManager) {
this.systemFileManager = fileManager;
}
@Inject
public void setContainer(Container container) {
this.container = container;
}
@Inject(value = XWorkConstants.RELOAD_XML_CONFIGURATION, required = false)
public void setReloadingConfigs(String reloadingConfigs) {
this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs);
}
public FileManager getFileManager() {
FileManager fileManager = lookupFileManager();
if (fileManager != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Using FileManager implementation [#0]", fileManager.getClass().getSimpleName());
}
fileManager.setReloadingConfigs(reloadingConfigs);
return fileManager;
}
if (LOG.isDebugEnabled()) {
LOG.debug("Using default implementation of FileManager provided under name [system]: #0", systemFileManager.getClass().getSimpleName());
}
systemFileManager.setReloadingConfigs(reloadingConfigs);
return systemFileManager;
}
private FileManager lookupFileManager() {
Set<String> names = container.getInstanceNames(FileManager.class);
if (LOG.isDebugEnabled()) {
LOG.debug("Found following implementations of FileManager interface: #0", names.toString());
}
Set<FileManager> internals = new HashSet<FileManager>();
Set<FileManager> users = new HashSet<FileManager>();
for (String fmName : names) {
FileManager fm = container.getInstance(FileManager.class, fmName);
if (fm.internal()) {
internals.add(fm);
} else {
users.add(fm);
}
}
for (FileManager fm : users) {
if (fm.support()) {
if (LOG.isDebugEnabled()) {
LOG.debug("Using FileManager implementation [#0]", fm.getClass().getSimpleName());
}
return fm;
}
}
if (LOG.isDebugEnabled()) {
LOG.debug("No user defined FileManager, looking up for internal implementations!");
}
for (FileManager fm : internals) {
if (fm.support()) {
return fm;
}
}
return null;
}
}