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 d5ebe72798381412e5d3855062768222840f26aa..f86218d500fdfe1ace1d6a94cec6955c9a72bc44 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 @@ -193,6 +193,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver, IHierarchicalContentNodeFilter fileFilter = getFileFilter(evaluationResult.dataSet); IHierarchicalContentProvider provider = ServiceProvider.getHierarchicalContentProvider(); IHierarchicalContent content = provider.asContent(evaluationResult.dataSet.getCode()); + // FIXME use content.close() - otherwise data set will be locked until timeout IHierarchicalContentNode contentNode = content.getNode(relativePath); if (fileFilter.accept(contentNode)) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java index cee6bfab0746b58d14c64f1fda7d94dae9d586fe..3d55302a1d96d80eab1e2503846f6c2e192c7dfa 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java @@ -67,7 +67,6 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider public IHierarchicalContent asContent(String dataSetCode) { - // this is temporary implementation - it shouldn't access openBIS after LMS-2172 is done ExternalData externalData = openbisService.tryGetDataSet(dataSetCode); if (externalData == null) { @@ -84,7 +83,6 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider public IHierarchicalContent asContent(final IDatasetLocation datasetLocation) { - // this is temporary implementation - it should access DB instead of filesystem // IHierarchicalContent.close() should be called to unlock the dataset directoryProvider.getShareIdManager().lock(datasetLocation.getDataSetCode()); File dataSetDirectory = directoryProvider.getDataSetDirectory(datasetLocation); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java index ebd106ed5f9cb936ee94a79ebec39b0180d3723b..ddee350b6a9a6cf4ae67a2c599dd1c0329d02e85 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java @@ -23,6 +23,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; /** * A provider of {@link IHierarchicalContent} for given data set. + * <p> + * <b>NOTE</b>{@link IHierarchicalContent#close()} needs to be called to release resources when + * working with the content is done. Otherwise data set may e.g. remain locked in its share until + * timeout occurs. * * @author Piotr Buczek * @author Chandrasekhar Ramakrishnan @@ -30,11 +34,25 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; public interface IHierarchicalContentProvider { + /** + * <b>NOTE:</b> if possible use {@link #asContent(IDatasetLocation)} which doesn't need to + * retrieve information from DB + * + * @return {@link IHierarchicalContent} for the specified data set + */ IHierarchicalContent asContent(String dataSetCode); + /** + * @return {@link IHierarchicalContent} for the specified data set + */ IHierarchicalContent asContent(IDatasetLocation datasetLocation); - // NOTE: the data set file is assumed to be locked when this method is called + /** + * <b>NOTE:</b> the data set is assumed to be locked when this method is called + * + * @param datasetDirectory the directory file of the data set + * @return {@link IHierarchicalContent} for the specified data set + */ IHierarchicalContent asContent(File datasetDirectory); }