diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java index 6b7ac145edef66da85ba51d41a4e2a4c480f6d1b..49a0a348a00ce235d7ee93c92a6f01c9d7601559 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.cifs; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -26,9 +27,9 @@ import org.alfresco.jlan.util.WildCard; import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.ftplet.FtpFile; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.DSSFileSystemView; +import ch.systemsx.cisd.openbis.dss.generic.server.ftp.NonExistingFtpFile; /** * @author Franz-Josef Elmer @@ -39,7 +40,8 @@ public class DSSFileSearchContext extends SearchContext private int index; - public DSSFileSearchContext(DSSFileSystemView view, String normalizedSearchPath, int fileAttributes, Cache cache) + public DSSFileSearchContext(DSSFileSystemView view, String normalizedSearchPath, int fileAttributes, + Cache cache) throws FileNotFoundException { String[] pathStr = FileName.splitPath(normalizedSearchPath, java.io.File.separatorChar); try @@ -47,7 +49,7 @@ public class DSSFileSearchContext extends SearchContext if (pathStr[1] != null && WildCard.containsWildcards(pathStr[1])) { WildCard wildCard = new WildCard(pathStr[1], true); - FtpFile directory = view.getFile(pathStr[0], cache); + FtpFile directory = getFile(view, pathStr[0], cache); List<FtpFile> list = directory.listFiles(); for (FtpFile file : list) { @@ -58,7 +60,7 @@ public class DSSFileSearchContext extends SearchContext } } else { - FtpFile file = view.getFile(normalizedSearchPath, cache); + FtpFile file = getFile(view, normalizedSearchPath, cache); if (matches(null, fileAttributes, file)) { files.add(file); @@ -66,10 +68,21 @@ public class DSSFileSearchContext extends SearchContext } } catch (FtpException ex) { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); + throw new FileNotFoundException("Invalid search path '" + normalizedSearchPath + "'. Reason: " + ex); } } + private FtpFile getFile(DSSFileSystemView view, String path, Cache cache) throws FtpException + { + FtpFile file = view.getFile(path, cache); + if (file instanceof NonExistingFtpFile) + { + throw new FtpException(file.getAbsolutePath() + " doesn't exist. Reason: " + + ((NonExistingFtpFile) file).getErrorMessage()); + } + return file; + } + private boolean matches(WildCard wildcardOrNull, int fileAttributes, FtpFile file) { return wildcardOrNull == null || wildcardOrNull.matchesPattern(file.getName()); 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 f365c5e084d96c2eebad464b72f32bc4b74611b5..2146a1bbbe46514b00a2d08bc6da07bc56065866 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 @@ -82,8 +82,7 @@ public class DataSetCifsView implements DiskInterface @Override public DeviceContext createContext(String shareName, ConfigElement args) throws DeviceContextException { - operationLog.info("create context for share " + shareName); - System.out.println(Utils.render(args)); + operationLog.info("create context for share " + shareName + ": " + Utils.render(args)); FtpPathResolverConfig resolverConfig = new FtpPathResolverConfig(CifsServerConfig.getServerProperties()); resolverConfig.logStartupInfo("CIFS"); pathResolverRegistry = new FtpPathResolverRegistry(resolverConfig); @@ -147,15 +146,22 @@ public class DataSetCifsView implements DiskInterface @Override public int fileExists(SrvSession sess, TreeConnection tree, String name) { - FtpFile file = getFile(createView(sess), name); - if (file == null) + try { - return FileStatus.NotExist; - } else if (file.isDirectory()) + FtpFile file = getFile(createView(sess), name); + if (file == null || file instanceof NonExistingFtpFile) + { + return FileStatus.NotExist; + } else if (file.isDirectory()) + { + return FileStatus.DirectoryExists; + } + return FileStatus.FileExists; + } catch (Exception ex) { - return FileStatus.DirectoryExists; + operationLog.debug("File doesn't exist. Reason: " + ex); + return FileStatus.NotExist; } - return FileStatus.FileExists; } @Override @@ -167,30 +173,37 @@ public class DataSetCifsView implements DiskInterface @Override public NetworkFile openFile(SrvSession sess, TreeConnection tree, FileOpenParams params) throws IOException { - final String fullPath = normalizePath(params.getFullPath()); String path = normalizePath(params.getPath()); DSSFileSystemView view = createView(sess); - FtpFile file = getFile(view, fullPath); - if (file instanceof NonExistingFtpFile) - { - NonExistingFtpFile nonExistingFtpFile = (NonExistingFtpFile) file; - throw new FileNotFoundException(path + " does not exist. Reason: " + nonExistingFtpFile.getErrorMessage()); - } - NetworkFile networkFile = new CifsFile(file); - - networkFile.setAttributes(FileAttribute.ReadOnly); - networkFile.setCreationDate(file.getLastModified()); - networkFile.setModifyDate(file.getLastModified()); - networkFile.setFullName(params.getPath()); - networkFile.setFileId(fullPath.hashCode()); - if (file.isDirectory()) + try { - networkFile.setAttributes(FileAttribute.Directory| FileAttribute.ReadOnly); - } else + FtpFile file = getFile(view, path); + if (file instanceof NonExistingFtpFile) + { + NonExistingFtpFile nonExistingFtpFile = (NonExistingFtpFile) file; + throw new FileNotFoundException(path + " does not exist. Reason: " + nonExistingFtpFile.getErrorMessage()); + } + operationLog.info("Open file '" + path + "'."); + NetworkFile networkFile = new CifsFile(file); + + networkFile.setAttributes(FileAttribute.ReadOnly); + networkFile.setCreationDate(file.getLastModified()); + networkFile.setModifyDate(file.getLastModified()); + networkFile.setFullName(params.getPath()); + networkFile.setFileId(path.hashCode()); + if (file.isDirectory()) + { + networkFile.setAttributes(FileAttribute.Directory | FileAttribute.ReadOnly); + } else + { + networkFile.setFileSize(file.getSize()); + } + return networkFile; + } catch (Exception ex) { - networkFile.setFileSize(file.getSize()); + operationLog.debug("Can not open file '" + path + "'. Reason: " + ex); + throw new IOException("Can not open file '" + path + "'. Reason: " + ex, ex); } - return networkFile; } @Override diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java index a441db913e2b8555402a750a662733d623d1a677..48ffa03f1dbe6fb9c68fac19e07c5cfe211f324c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java @@ -34,6 +34,7 @@ import org.apache.ftpserver.ftplet.FtpFile; import org.apache.log4j.Logger; import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; +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.utilities.SystemTimeProvider; @@ -169,7 +170,10 @@ public class DSSFileSystemView implements FileSystemView String message = String.format("Error while resolving FTP path '%s' : %s", path, realThrowable.getMessage()); - operationLog.error(message, realThrowable); + if (realThrowable instanceof UserFailureException == false) + { + operationLog.error(message, realThrowable); + } throw new FtpException(message); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java index 3b06e3a6b4d8791045b32e46212685469ae673c4..0d4bec20d1b077d59c42dedfbd70d4ede31ae306 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java @@ -39,11 +39,17 @@ public class FtpFileFactory */ public static FtpFile createFtpFile(String dataSetCode, String path, IHierarchicalContentNode contentNode, IHierarchicalContent content, - IHierarchicalContentNodeFilter childrenFilter) + IHierarchicalContentNodeFilter childrenFilter, Cache cache) { - return new FtpFileImpl(dataSetCode, path, contentNode.getRelativePath(), - contentNode.isDirectory(), getSize(contentNode), getLastModified(contentNode), - content, childrenFilter); + FtpFile file = cache.getFile(path); + if (file == null) + { + file = new FtpFileImpl(dataSetCode, path, contentNode.getRelativePath(), + contentNode.isDirectory(), getSize(contentNode), getLastModified(contentNode), + content, childrenFilter, cache); + cache.putFile(file, path); + } + return file; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java index 12647c92b19221519e038e56a74206a56483c85c..518e66315f5b77c7f560d945292d755b9ec19246 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java @@ -22,10 +22,7 @@ import java.util.Collections; import java.util.EnumSet; import java.util.List; -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.server.ISessionTokenProvider; import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; @@ -45,9 +42,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi */ public class FtpPathResolverContext implements ISessionTokenProvider { - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - FtpPathResolverContext.class); - private final String sessionToken; private final IServiceForDataStoreServer service; @@ -135,25 +129,18 @@ public class FtpPathResolverContext implements ISessionTokenProvider Experiment experiment = cache.getExperiment(experimentId); if (experiment == null) { - try - { - ExperimentIdentifier experimentIdentifier = - new ExperimentIdentifierFactory(experimentId).createIdentifier(); - - List<Experiment> result = - service.listExperiments(sessionToken, - Collections.singletonList(experimentIdentifier), - new ExperimentFetchOptions()); - experiment = result.isEmpty() ? null : result.get(0); - if (experiment != null) - { - cache.putExperiment(experiment); - } - } catch (Exception ex) + ExperimentIdentifier experimentIdentifier = + new ExperimentIdentifierFactory(experimentId).createIdentifier(); + List<Experiment> result = + service.listExperiments(sessionToken, + Collections.singletonList(experimentIdentifier), + new ExperimentFetchOptions()); + if (result.isEmpty()) { - operationLog.info("Error in experiment identifier '" + experimentId + "': " + ex); - return null; + throw new UserFailureException("Unknown experiment '" + experimentIdentifier + "'."); } + experiment = result.get(0); + cache.putExperiment(experiment); } return experiment; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java index 20488dac561475a49227a045d34c0f9692d81344..afa1268a46eeaf057f0b1d12c9ed8bdfde3993d9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java @@ -106,6 +106,7 @@ public class FtpFileEvaluationContext private IHierarchicalContent createHierarchicalContent(AbstractExternalData dataSet) { + System.err.println("create content for " + dataSet.getCode()); return contentProvider.asContent(dataSet); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java index 1a501aabde23cf87c50677f295d80f270b3e4206..f09b402c0c6b0c8bcbf32aead9a37853a5f56372 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.ftp.resolver; import java.io.IOException; import java.io.InputStream; +import java.sql.Date; import java.util.ArrayList; import java.util.List; @@ -28,6 +29,7 @@ import ch.systemsx.cisd.openbis.common.io.hierarchical_content.HierarchicalConte import ch.systemsx.cisd.openbis.common.io.hierarchical_content.IHierarchicalContentNodeFilter; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode; +import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpFileFactory; @@ -52,15 +54,18 @@ public class FtpFileImpl extends AbstractFtpFile private IHierarchicalContent content; + private final Cache cache; + public FtpFileImpl(String dataSetCode, String path, String pathInDataSet, boolean isDirectory, long size, long lastModified, IHierarchicalContent content, - IHierarchicalContentNodeFilter childrenFilter) + IHierarchicalContentNodeFilter childrenFilter, Cache cache) { super(path); this.dataSetCode = dataSetCode; this.pathInDataSet = pathInDataSet; this.isDirectory = isDirectory; this.size = size; + this.cache = cache; setLastModified(lastModified); this.content = content; this.childrenFilter = childrenFilter; @@ -149,7 +154,7 @@ public class FtpFileImpl extends AbstractFtpFile absolutePath + FtpConstants.FILE_SEPARATOR + childNode.getName(); FtpFile childFile = FtpFileFactory.createFtpFile(dataSetCode, childPath, childNode, - content, childrenFilter); + content, childrenFilter, cache); result.add(childFile); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java index b587fa751411cd52de9f40d490759210f2522128..7c59dd686207e8d1d555bc8a7a3256530e869883 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; import org.apache.commons.lang.StringUtils; +import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.ftplet.FtpFile; import ch.systemsx.cisd.common.exceptions.UserFailureException; @@ -56,6 +57,14 @@ public class ProjectFolderResolver implements IFtpPathResolver @Override public FtpFile resolve(final String path, final FtpPathResolverContext resolverContext) { + ProjectIdentifier identifier = parseProjectIdentifier(path); + IServiceForDataStoreServer service = resolverContext.getService(); + String sessionToken = resolverContext.getSessionToken(); + Project project = service.tryGetProject(sessionToken, identifier); + if (project == null) + { + throw new UserFailureException("Unknown project '" + identifier + "'."); + } AbstractFtpFolder file = new AbstractFtpFolder(path) { @Override @@ -73,28 +82,13 @@ public class ProjectFolderResolver implements IFtpPathResolver return result; } }; - ProjectIdentifier identifier = parseProjectIdentifier(path); - if (identifier != null) - { - IServiceForDataStoreServer service = resolverContext.getService(); - String sessionToken = resolverContext.getSessionToken(); - Project project = service.tryGetProject(sessionToken, identifier); - if (project != null) - { - file.setLastModified(project.getModificationDate().getTime()); - } - } + file.setLastModified(project.getModificationDate().getTime()); return file; } - private List<Experiment> listExperiments(String projectIdentifier, - FtpPathResolverContext context) + private List<Experiment> listExperiments(String projectIdentifier, FtpPathResolverContext context) { ProjectIdentifier identifier = parseProjectIdentifier(projectIdentifier); - if (identifier == null) - { - return Collections.emptyList(); - } IServiceForDataStoreServer service = context.getService(); String sessionToken = context.getSessionToken(); return service.listExperimentsForProjects(sessionToken, @@ -103,13 +97,7 @@ public class ProjectFolderResolver implements IFtpPathResolver private ProjectIdentifier parseProjectIdentifier(String projectIdentifier) { - try - { - return new ProjectIdentifierFactory(projectIdentifier).createIdentifier(); - } catch (UserFailureException ex) - { - return null; - } + return new ProjectIdentifierFactory(projectIdentifier).createIdentifier(); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java index 9957b8b14c5d3bfbf46c486bf902211a567e575f..37a7c2745ca09ff9e989245476db955c1c0ee693 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java @@ -21,6 +21,7 @@ import java.util.List; import org.apache.ftpserver.ftplet.FtpFile; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverContext; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.IFtpPathResolver; @@ -50,6 +51,13 @@ public class SpaceFolderResolver implements IFtpPathResolver public FtpFile resolve(final String path, final FtpPathResolverContext resolverContext) { final String spaceCode = removeStartingSlash(path); + String sessionToken = resolverContext.getSessionToken(); + IServiceForDataStoreServer service = resolverContext.getService(); + Space space = service.tryGetSpace(sessionToken, new SpaceIdentifier(spaceCode)); + if (space == null) + { + throw new UserFailureException("Unknown space '" + spaceCode + "'."); + } AbstractFtpFolder file = new AbstractFtpFolder(path) { @Override @@ -81,13 +89,7 @@ public class SpaceFolderResolver implements IFtpPathResolver return result; } }; - String sessionToken = resolverContext.getSessionToken(); - IServiceForDataStoreServer service = resolverContext.getService(); - Space space = service.tryGetSpace(sessionToken, new SpaceIdentifier(spaceCode)); - if (space != null) - { - file.setLastModified(space.getModificationDate().getTime()); - } + file.setLastModified(space.getModificationDate().getTime()); return file; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java index 9121bbad61688e0581b7942383fbd0cd47960275..9e04d7cd1bf9a4f7445851e5ef6b8398c197a5cc 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java @@ -39,6 +39,7 @@ import ch.systemsx.cisd.common.string.Template; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.IHierarchicalContentNodeFilter; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent; import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode; +import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpFileFactory; import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverConfig; @@ -121,6 +122,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, IHierarchicalContentNode rootNode = getDataSetFileListRoot(dataSet, hierarchicalContent); List<IHierarchicalContentNode> childNodes = rootNode.getChildNodes(); + Cache cache = resolverContext.getCache(); for (IHierarchicalContentNode childNode : childNodes) { IHierarchicalContentNodeFilter fileFilter = getFileFilter(dataSet); @@ -128,7 +130,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, { result.add(FtpFileFactory.createFtpFile(dataSet.getCode(), absolutePath + FtpConstants.FILE_SEPARATOR + childNode.getName(), childNode, - hierarchicalContent, fileFilter)); + hierarchicalContent, fileFilter, cache)); } } } finally @@ -243,10 +245,9 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, if (fileNamePresent) { FtpFileEvaluationContext evalContext = evaluateDataSetPaths(resolverContext, dataSets); - try { - return extractMatchingFile(path, experimentId, evalContext); + return extractMatchingFile(path, experimentId, resolverContext.getCache(), evalContext); } finally { evalContext.close(); @@ -314,7 +315,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, return null; } - private FtpFile extractMatchingFile(String path, String experimentId, + private FtpFile extractMatchingFile(String path, String experimentId, Cache cache, FtpFileEvaluationContext evalContext) { final EvaluatedElement matchingElement = @@ -337,8 +338,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, if (contentNodeOrNull != null && fileFilter.accept(contentNodeOrNull)) { return FtpFileFactory.createFtpFile(dataSet.getCode(), path, contentNodeOrNull, - content, - fileFilter); + content, fileFilter, cache); } else { return FtpPathResolverRegistry.getNonExistingFile(path, "Resource '" @@ -435,11 +435,11 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, } } - private List<FtpFile> createFtpFilesFromEvaluationResult( - ISessionTokenProvider sessionTokenProvider, + private List<FtpFile> createFtpFilesFromEvaluationResult(FtpPathResolverContext context, final String parentPath, FtpFileEvaluationContext evalResult) { ArrayList<FtpFile> result = new ArrayList<FtpFile>(); + Cache cache = context.getCache(); for (EvaluatedElement evalElement : evalResult.getEvalElements()) { IHierarchicalContentNodeFilter fileFilter = getFileFilter(evalElement.dataSet); @@ -448,13 +448,10 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, String childPath = parentPath + FtpConstants.FILE_SEPARATOR + evalElement.evaluatedTemplate; String dataSetCode = evalElement.dataSet.getCode(); - IHierarchicalContentProvider getContentProvider = - getContentProvider(sessionTokenProvider); - + IHierarchicalContent content = evalResult.getHierarchicalContent(evalElement.dataSet); FtpFile childFtpFile = - FtpFileFactory.createFtpFile(dataSetCode, childPath, - evalElement.contentNode, - getContentProvider.asContent(evalElement.dataSet), fileFilter); + FtpFileFactory.createFtpFile(dataSetCode, childPath, evalElement.contentNode, + content, fileFilter, cache); result.add(childFtpFile); } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java index 1d5c934fb23fcde6d5a52e5faa4130a32dcf3f7a..76157d84de413e80e65a31f6ac7f1c003adaadb6 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java @@ -27,7 +27,6 @@ import java.util.Collections; import java.util.Date; import java.util.EnumSet; import java.util.List; -import java.util.Properties; import org.apache.commons.io.IOUtils; import org.apache.ftpserver.ftplet.FtpFile; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java index cf7dfbb91789c6ef1e565d36b81c7543d3780e46..3be2a21633a0b82fee05e5a40e6ae5049ade0c50 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java @@ -1668,7 +1668,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD } @Override - @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER }) + @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER }) public Space tryGetSpace(String sessionToken, @AuthorizationGuard(guardClass = ExistingSpaceIdentifierPredicate.class) SpaceIdentifier spaceIdentifier) { @@ -1689,7 +1689,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD } @Override - @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER }) + @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER }) public Project tryGetProject(String sessionToken, @AuthorizationGuard(guardClass = ExistingSpaceIdentifierPredicate.class) ProjectIdentifier projectIdentifier) {