From 770e8cb7e1b1c510cfdd63691f32adb23e557abe Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Tue, 28 Mar 2017 13:59:14 +0000
Subject: [PATCH] SSDM-4839: Show information message instead of error in
 dataset detail view when there's no file metadata stored in pathinfo db.

SVN: 37992
---
 .../server/DatasetDownloadServlet.java        | 35 ++++++++++++++-
 .../generic/server/HTMLMessageRenderer.java   | 44 +++++++++++++++++++
 .../dss/generic/server/IMessageRenderer.java  | 22 ++++++++++
 .../dss/generic/server/IRendererFactory.java  |  2 +
 .../server/PlainTextRendererFactory.java      | 21 +++++++++
 .../server/SimpleHTMLRendererFactory.java     |  7 +++
 .../client/application/util/DataSetUtils.java |  6 +++
 .../bo/datasetlister/ContentCopyRecord.java   |  2 +
 .../bo/datasetlister/DatasetLister.java       |  3 ++
 .../datasetlister/IDatasetListingQuery.java   |  2 +-
 10 files changed, 141 insertions(+), 3 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/HTMLMessageRenderer.java
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IMessageRenderer.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
index 0b84f41b893..8e299d9b5c8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
@@ -72,6 +72,8 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
 
     static final String DISABLE_LINKS = "disableLinks";
 
+    static final String IS_LINK_DATASET = "is_link_data";
+
     private static String DOWNLOAD_URL;
 
     static void setDownloadUrl(String downloadUrl)
@@ -121,10 +123,13 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
 
         private final boolean forceReferrerDomainOnEmptyDownloadURL;
 
+        private final boolean isLinkData;
+
         public RequestParams(String dataSetCode, String pathInfo, String sessionIdOrNull,
                 String urlPrefixWithDataset, String displayMode, boolean autoResolve,
                 String mainDataSetPathOrNull, String mainDataSetPatternOrNull,
-                boolean forceAutoResolve, boolean disableLinks, String referrerDomain, boolean forceReferrerDomainOnEmptyDownloadURL)
+                boolean forceAutoResolve, boolean disableLinks, String referrerDomain, boolean forceReferrerDomainOnEmptyDownloadURL,
+                boolean isLinkData)
         {
             this.dataSetCode = dataSetCode;
             this.pathInfo = pathInfo;
@@ -138,6 +143,7 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
             this.disableLinks = disableLinks;
             this.referrerDomain = referrerDomain;
             this.forceReferrerDomainOnEmptyDownloadURL = forceReferrerDomainOnEmptyDownloadURL;
+            this.isLinkData = isLinkData;
         }
 
         public boolean isAutoResolve()
@@ -200,6 +206,11 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
             return forceReferrerDomainOnEmptyDownloadURL;
         }
 
+        public boolean isLinkData()
+        {
+            return isLinkData;
+        }
+
     }
 
     @Override
@@ -207,9 +218,11 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
             throws ServletException, IOException
     {
         IRendererFactory rendererFactory = null;
+        boolean isLinkData = false;
         try
         {
             RequestParams requestParams = parseRequestURL(request, DATA_STORE_SERVER_WEB_APPLICATION_NAME);
+            isLinkData = requestParams.isLinkData();
             rendererFactory = createRendererFactory(requestParams.getDisplayMode());
 
             HttpSession session = tryGetOrCreateSession(request, requestParams.tryGetSessionId());
@@ -232,12 +245,16 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
             if (!isPathInfoEnabled)
             {
                 printEmptyPage(rendererFactory, request, response);
+            } else if (isLinkData)
+            {
+                printMessage("No content information is stored with this linked dataset.", rendererFactory, response);
             } else
             {
                 printError(rendererFactory, request, response, e);
             }
 
         }
+
     }
 
     private void printResponse(final HttpServletResponse response,
@@ -381,9 +398,11 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
         }
         //
 
+        boolean isLinkData = request.getParameter(IS_LINK_DATASET).equals("true");
+
         return new RequestParams(dataSetCode, pathInfo, sessionIDOrNull, urlPrefixWithDataset,
                 displayMode, autoResolve, mainDataSetPathOrNull, mainDataSetPatternOrNull,
-                forceAutoResolve, disableLinks, referrerDomain, forceReferrerDomainOnEmptyDownloadURL);
+                forceAutoResolve, disableLinks, referrerDomain, forceReferrerDomainOnEmptyDownloadURL, isLinkData);
     }
 
     private static String getDisplayMode(HttpServletRequest request)
@@ -405,6 +424,18 @@ public class DatasetDownloadServlet extends AbstractDatasetDownloadServlet
         writer.close();
     }
 
+    private void printMessage(String message, IRendererFactory rendererFactory,
+            final HttpServletResponse response) throws IOException
+    {
+        response.setContentType(rendererFactory.getContentType());
+        PrintWriter writer = response.getWriter();
+        IMessageRenderer renderer = rendererFactory.createMessageRenderer();
+        renderer.setWriter(writer);
+        renderer.printMessage(message);
+        writer.flush();
+        writer.close();
+    }
+
     private void printError(IRendererFactory rendererFactory, final HttpServletRequest request,
             final HttpServletResponse response, Exception exception) throws IOException
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/HTMLMessageRenderer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/HTMLMessageRenderer.java
new file mode 100644
index 00000000000..49869814810
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/HTMLMessageRenderer.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.server;
+
+import java.io.PrintWriter;
+
+/**
+ * {@link IErrorRenderer} displaying error as HTML page.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class HTMLMessageRenderer implements IMessageRenderer
+{
+    private PrintWriter writer;
+
+    @Override
+    public void setWriter(PrintWriter writer)
+    {
+        this.writer = writer;
+    }
+
+    @Override
+    public void printMessage(String message)
+    {
+        writer.println("<html><body>");
+        writer.println(message);
+        writer.println("</body></html>");
+    }
+
+}
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IMessageRenderer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IMessageRenderer.java
new file mode 100644
index 00000000000..2144f9249ec
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IMessageRenderer.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.server;
+
+public interface IMessageRenderer extends IWriterInjector
+{
+    public void printMessage(String message);
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IRendererFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IRendererFactory.java
index fcac3d3b4c2..db7cff56c5a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IRendererFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IRendererFactory.java
@@ -28,4 +28,6 @@ public interface IRendererFactory
     public IDirectoryRenderer createDirectoryRenderer(RenderingContext context);
 
     public IErrorRenderer createErrorRenderer();
+
+    public IMessageRenderer createMessageRenderer();
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/PlainTextRendererFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/PlainTextRendererFactory.java
index eb742c2f2c4..b436b33ad94 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/PlainTextRendererFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/PlainTextRendererFactory.java
@@ -100,4 +100,25 @@ public class PlainTextRendererFactory implements IRendererFactory
         }
 
     }
+
+    @Override
+    public IMessageRenderer createMessageRenderer()
+    {
+        return new IMessageRenderer()
+            {
+                private PrintWriter writer;
+
+                @Override
+                public void printMessage(String message)
+                {
+                    writer.println(message);
+                }
+
+                @Override
+                public void setWriter(PrintWriter writer)
+                {
+                    this.writer = writer;
+                }
+            };
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SimpleHTMLRendererFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SimpleHTMLRendererFactory.java
index 63d6ee7d116..531b38fd05d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SimpleHTMLRendererFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SimpleHTMLRendererFactory.java
@@ -41,4 +41,11 @@ public class SimpleHTMLRendererFactory implements IRendererFactory
         return new HTMLErrorRenderer();
     }
 
+    @Override
+    public IMessageRenderer createMessageRenderer()
+    {
+        return new HTMLMessageRenderer();
+
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
index 18af6508026..df7d7a86dbf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
@@ -21,6 +21,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericVie
 import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 
 /**
  * @author Franz-Josef Elmer
@@ -37,6 +38,8 @@ public class DataSetUtils
 
     private static final String DISABLE_LINKS = "disableLinks";
 
+    private static final String IS_LINK_DATASET = "is_link_data";
+
     public static String createDataViewUrl(AbstractExternalData dataSet, GenericViewModel model,
             String modeOrNull, boolean autoResolve, boolean disableLinks)
     {
@@ -64,6 +67,9 @@ public class DataSetUtils
                         .getMainDataSetPath());
             }
         }
+
+        methodWithParameters.addParameter(IS_LINK_DATASET, DataSetKind.LINK.equals(dataSet.getDataSetKind()));
+
         String url = methodWithParameters.toString();
         return url;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java
index 563ce2b237d..5efef24a85a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java
@@ -20,4 +20,6 @@ public class ContentCopyRecord extends CodeRecord
     public String path;
 
     public String hash;
+
+    public Long edms_id;
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
index 90fec95f37b..cbc9ec145c2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
@@ -1191,11 +1191,14 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             if (copyRecord.external_code != null)
             {
                 copies.add(new UrlContentCopy(copyRecord.edms_code, copyRecord.edms_label, copyRecord.edms_address, copyRecord.external_code));
+                linkDataSet.setExternalCode(copyRecord.external_code);
             } else
             {
                 copies.add(new FileSystemContentCopy(copyRecord.edms_code, copyRecord.edms_label, copyRecord.edms_address, copyRecord.edms_address,
                         copyRecord.hash, copyRecord.path));
             }
+            linkDataSet.setExternalDataManagementSystem(externalDataManagementSystems
+                    .get(copyRecord.edms_id));
         }
 
         linkDataSet.setCopies(copies);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
index 528846f0a1f..e22e87f4773 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java
@@ -355,7 +355,7 @@ public interface IDatasetListingQuery extends BaseQuery, IPropertyListingQuery
                     LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<MetaProjectWithEntityId> getMetaprojects(LongSet entityIds, Long userId);
 
-    @Select(sql = "SELECT edms.code AS edms_code, edms.label AS edms_label, edms.address AS edms_address, "
+    @Select(sql = "SELECT edms.id AS edms_id, edms.code AS edms_code, edms.label AS edms_label, edms.address AS edms_address, "
             + " cc.external_code AS external_code, cc.path as path, cc.git_commit_hash AS hash "
             + " FROM content_copies cc, external_data_management_systems edms "
             + " WHERE cc.edms_id = edms.id AND cc.data_id = ?{1}")
-- 
GitLab