diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java index 68dd8c49db186ba72955d68e3fbe656c78e72103..8b3c81e2be11c953fd6605455c3e850caffda1dc 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.cifs; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.Properties; import org.alfresco.jlan.server.SrvSession; import org.alfresco.jlan.server.auth.ClientInfo; @@ -50,7 +51,6 @@ import ch.systemsx.cisd.openbis.dss.generic.server.ftp.DSSFileSystemView; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverConfig; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.IFtpPathResolverRegistry; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.NonExistingFtpFile; -import ch.systemsx.cisd.openbis.dss.generic.server.ftp.v3.V3FtpPathResolverRegistry; import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; @@ -91,10 +91,11 @@ public class DataSetCifsView implements DiskInterface public DeviceContext createContext(String shareName, ConfigElement args) throws DeviceContextException { operationLog.info("create context for share " + shareName + ": " + Utils.render(args)); - FtpPathResolverConfig resolverConfig = new FtpPathResolverConfig(CifsServerConfig.getServerProperties()); + Properties serverProperties = CifsServerConfig.getServerProperties(); + FtpPathResolverConfig resolverConfig = new FtpPathResolverConfig(serverProperties); resolverConfig.logStartupInfo("CIFS"); - // pathResolverRegistry = new FtpPathResolverRegistry(resolverConfig); - pathResolverRegistry = new V3FtpPathResolverRegistry(resolverConfig); + + pathResolverRegistry = resolverConfig.getResolverRegistry(); return new DiskDeviceContext(shareName); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverConfig.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverConfig.java index e553f1105b93772109fc8a929e5c952875c8d454..54a36fddf970d7e179cfaa7e6d0fba37c551fb2e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverConfig.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverConfig.java @@ -19,38 +19,40 @@ package ch.systemsx.cisd.openbis.dss.generic.server.ftp; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Properties; import java.util.Map.Entry; +import java.util.Properties; import org.apache.log4j.Logger; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.properties.ExtendedProperties; import ch.systemsx.cisd.common.properties.PropertyUtils; +import ch.systemsx.cisd.openbis.dss.generic.server.ftp.v3.V3FtpPathResolverRegistry; /** - * - * * @author Franz-Josef Elmer */ public class FtpPathResolverConfig { final static String DATASET_DISPLAY_TEMPLATE_KEY = "dataset.display.template"; - + final static String SHOW_PARENTS_AND_CHILDREN_KEY = "dataset.show-parents-and-children"; - + final static String DATASET_FILELIST_SUBPATH_KEY = "dataset.filelist.subpath."; final static String DATASET_FILELIST_FILTER_KEY = "dataset.filelist.filter."; - + + final static String PATH_RESOLVER_KEY = "resolver-class"; + private static final String DEFAULT_DATASET_TEMPLATE = "${dataSetCode}"; - + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, FtpPathResolverConfig.class); - + private boolean showParentsAndChildren; - + private String dataSetDisplayTemplate = ""; private Map<String /* dataset type */, String /* path */> fileListSubPaths = @@ -59,12 +61,16 @@ public class FtpPathResolverConfig private Map<String /* dataset type */, String /* filter pattern */> fileListFilters = new HashMap<String, String>(); + private final String resolverClass; + public FtpPathResolverConfig(Properties props) { dataSetDisplayTemplate = PropertyUtils.getProperty(props, DATASET_DISPLAY_TEMPLATE_KEY, DEFAULT_DATASET_TEMPLATE); showParentsAndChildren = PropertyUtils.getBoolean(props, SHOW_PARENTS_AND_CHILDREN_KEY, false); + resolverClass = PropertyUtils.getProperty(props, PATH_RESOLVER_KEY, V3FtpPathResolverRegistry.class.getCanonicalName()); + ExtendedProperties fileListSubPathProps = ExtendedProperties.getSubset(props, DATASET_FILELIST_SUBPATH_KEY, true); for (Object key : fileListSubPathProps.keySet()) @@ -84,7 +90,7 @@ public class FtpPathResolverConfig fileListFilters.put(dataSetType, filter); } } - + public String getDataSetDisplayTemplate() { return dataSetDisplayTemplate; @@ -104,7 +110,7 @@ public class FtpPathResolverConfig { return Collections.unmodifiableMap(fileListFilters); } - + public void logStartupInfo(String serverType) { operationLog.info(serverType + " Server data set display template : " + dataSetDisplayTemplate); @@ -124,6 +130,33 @@ public class FtpPathResolverConfig + "set type '%s' : '%s'", serverType, filterEntry.getKey(), filterEntry.getValue()); operationLog.info(message); } + } + public IFtpPathResolverRegistry getResolverRegistry() + { + try + { + Class<?> clazz = Class.forName(resolverClass); + Object instance = clazz.newInstance(); + IFtpPathResolverRegistry registry = (IFtpPathResolverRegistry) instance; + registry.initialize(this); + operationLog.info("Succesfully initialized path resolver of type " + registry.getClass().getName()); + return registry; + } catch (ClassNotFoundException ex) + { + throw new UserFailureException("Failed to create PathResolverRegistry. Couldn't find class " + resolverClass, ex); + } catch (InstantiationException ex) + { + throw new UserFailureException("Failed to create PathResolverRegistry. Couldn't instantiate object of a class " + resolverClass, ex); + } catch (IllegalAccessException ex) + { + throw new UserFailureException("Failed to create PathResolverRegistry. Couldn't instantiate object of a class " + resolverClass, ex); + } catch (ClassCastException ex) + { + throw new UserFailureException("Failed to create PathResolverRegistry. Couldn't cast object of a class " + resolverClass + " to " + + IFtpPathResolverRegistry.class.getName(), + ex); + } } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverRegistry.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverRegistry.java index 8f92344672f9ba3beda06abca53721948f8e244d..92ab079277b377fba8e6913ca30382fb29b88137 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverRegistry.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverRegistry.java @@ -46,7 +46,8 @@ public class FtpPathResolverRegistry implements IFtpPathResolverRegistry /** * initializes the registry with all known {@link IFtpPathResolver}-s. */ - public FtpPathResolverRegistry(FtpPathResolverConfig config) + @Override + public void initialize(FtpPathResolverConfig config) { pathResolvers.add(new RootFolderResolver()); pathResolvers.add(new SpaceFolderResolver()); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpServer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpServer.java index 8fd9eb20ceb88ed64b29214d951ecffb1bfac9e5..2a46bac0650e4c3ee2c97efcfa29aa4667df3b85 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpServer.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpServer.java @@ -77,7 +77,6 @@ import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.properties.PropertyParametersUtil; import ch.systemsx.cisd.common.utilities.SystemTimeProvider; -import ch.systemsx.cisd.openbis.dss.generic.server.ftp.v3.V3FtpPathResolverRegistry; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DssPropertyParametersUtil; import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; @@ -121,8 +120,7 @@ public class FtpServer implements FileSystemFactory, org.apache.sshd.server.File DssPropertyParametersUtil.loadServiceProperties(), "ftp.server", true).getProperties(); this.config = new FtpServerConfig(ftpProperties); FtpPathResolverConfig resolverConfig = new FtpPathResolverConfig(ftpProperties); - this.pathResolverRegistry = new V3FtpPathResolverRegistry(resolverConfig); - // this.pathResolverRegistry = new FtpPathResolverRegistry(resolverConfig); + this.pathResolverRegistry = resolverConfig.getResolverRegistry(); if (config.isStartServer()) { @@ -239,7 +237,6 @@ public class FtpServer implements FileSystemFactory, org.apache.sshd.server.File return s; } - @SuppressWarnings("unchecked") private List<NamedFactory<Command>> creatSubsystemFactories() { return Arrays.<NamedFactory<Command>> asList(new SftpSubsystem.Factory()); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/IFtpPathResolverRegistry.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/IFtpPathResolverRegistry.java index 54357d21990029ac85b70c4eeeeaec06c1f57d69..a68d0081fc813a97ece994a9b09e60788216e91a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/IFtpPathResolverRegistry.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/IFtpPathResolverRegistry.java @@ -24,6 +24,11 @@ import org.apache.ftpserver.ftplet.FtpFile; public interface IFtpPathResolverRegistry { + /** + * Method called once to initialize object + */ + void initialize(FtpPathResolverConfig config); + /** * Returns an {@link FtpFile} for <var>path</var>. * <p> diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3FtpPathResolverRegistry.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3FtpPathResolverRegistry.java index 41e76ba56aa34bc120c15c4b24f1ab5e166cb021..19adef5b9648e87ad4c42186cb7796bd5ef16f43 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3FtpPathResolverRegistry.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/v3/V3FtpPathResolverRegistry.java @@ -19,15 +19,12 @@ package ch.systemsx.cisd.openbis.dss.generic.server.ftp.v3; import org.apache.ftpserver.ftplet.FtpFile; import org.apache.log4j.Logger; -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverConfig; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverContext; -import ch.systemsx.cisd.openbis.dss.generic.server.ftp.IFtpPathResolver; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.IFtpPathResolverRegistry; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.v3.file.V3FtpNonExistingFile; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; /** * A registry of ftp resolvers. It keeps the style of old-style resolver regisrty, but actually only calls itself root resolver. @@ -40,19 +37,8 @@ public class V3FtpPathResolverRegistry implements IFtpPathResolverRegistry private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, V3FtpPathResolverRegistry.class); - private IApplicationServerApi v3api; - - public IApplicationServerApi getV3api() - { - if (v3api == null) - v3api = ServiceProvider.getV3ApplicationService(); - return v3api; - } - - /** - * initializes the registry with all known {@link IFtpPathResolver}-s. - */ - public V3FtpPathResolverRegistry(FtpPathResolverConfig config) + @Override + public void initialize(FtpPathResolverConfig config) { }