From f9df6c5fff29dadd33b3ddd9b25f25bce57d98ff Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Tue, 28 Mar 2017 12:33:40 +0000
Subject: [PATCH] SSDM-4839: Show new columns in detailed search parameters and
 results

SVN: 37989
---
 .../client/dto/ExternalDataGridColumnIDs.java | 10 ++-
 .../AbstractExternalDataProvider.java         | 72 +++++++++++++++----
 .../bo/datasetlister/ContentCopyRecord.java   | 23 ++++++
 .../bo/datasetlister/DatasetLister.java       | 28 +++++---
 .../bo/datasetlister/DatasetRecord.java       |  6 --
 .../datasetlister/IDatasetListingQuery.java   |  6 ++
 .../search/detailed/IndexFieldNameHelper.java |  2 +-
 .../dto/DataSetAttributeSearchFieldKind.java  |  4 +-
 .../basic/dto/FileSystemContentCopy.java      | 36 ++++++++++
 .../shared/basic/dto/IContentCopy.java        | 13 ++++
 .../shared/basic/dto/UrlContentCopy.java      | 41 ++++++++++-
 .../shared/translator/DataSetTranslator.java  |  2 +-
 .../cisd/openbis/public/common-dictionary.js  |  5 +-
 13 files changed, 210 insertions(+), 38 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
index 4f86d573904..75185f92787 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
@@ -29,6 +29,12 @@ public class ExternalDataGridColumnIDs
 
     public static final String EXTERNAL_DMS_LABEL = "EXTERNAL_DMS_LABEL";
 
+    public static final String EXTERNAL_DMS_ADDRESS = "EXTERNAL_DMS_ADDRESS";
+
+    public static final String LINK_PATH = "LINK_PATH";
+
+    public static final String LINK_HASH = "LINK_HASH";
+
     public static final String DATA_SET_TYPE = "DATA_SET_TYPE";
 
     public static final String CONTAINER_DATASETS = "CONTAINER_DATASETS";
@@ -51,7 +57,7 @@ public class ExternalDataGridColumnIDs
     public static final String EXPERIMENT_TYPE = "EXPERIMENT_TYPE";
 
     public static final String PROJECT = "PROJECT";
-    
+
     public static final String PROJECT_IDENTIFIER = "PROJECT_IDENTIFIER";
 
     public static final String REGISTRATOR = "REGISTRATOR";
@@ -67,7 +73,7 @@ public class ExternalDataGridColumnIDs
     public static final String IS_COMPLETE = "IS_COMPLETE";
 
     public static final String LOCATION = "LOCATION";
-    
+
     public static final String SIZE = "SIZE";
 
     public static final String ARCHIVING_STATUS = "ARCHIVING_STATUS";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
index 96452a9d8ef..bb73111ac64 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
@@ -29,11 +29,14 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDat
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DATA_EXPERIMENT_IDENTIFIER;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DATA_SAMPLE_IDENTIFIER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DMS_ADDRESS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DMS_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DMS_LABEL;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.FILE_FORMAT_TYPE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.IS_COMPLETE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.IS_DELETED;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.LINK_HASH;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.LINK_PATH;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.LOCATION;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.METAPROJECTS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.ORDER_IN_CONTAINERS;
@@ -65,11 +68,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IContentCopy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSetUrl;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -125,6 +126,10 @@ public abstract class AbstractExternalDataProvider extends
         builder.addColumn(DATA_STORE_CODE).hideByDefault();
         builder.addColumn(EXTERNAL_DMS_CODE).withDefaultWidth(150).hideByDefault();
         builder.addColumn(EXTERNAL_DMS_LABEL).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(EXTERNAL_DMS_ADDRESS).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(LINK_PATH).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(LINK_HASH).withDefaultWidth(150).hideByDefault();
+
         builder.addColumn(PERM_ID).hideByDefault();
         builder.addColumn(SHOW_DETAILS_LINK).hideByDefault();
         builder.addColumn(METAPROJECTS);
@@ -141,20 +146,35 @@ public abstract class AbstractExternalDataProvider extends
                 builder.column(CODE).addEntityLink(dataSet, dataSet.getCode());
 
                 LinkDataSet linkDataSet = dataSet.tryGetAsLinkDataSet();
-                if (linkDataSet != null)
+                if (linkDataSet != null && linkDataSet.getCopies() != null)
                 {
-                    LinkTableCell externalCodeCell = new LinkTableCell();
-                    externalCodeCell.setText(linkDataSet.getExternalCode());
-                    externalCodeCell.setUrl(new LinkDataSetUrl(linkDataSet).toString());
-                    externalCodeCell.setOpenInNewWindow(true);
-                    builder.column(EXTERNAL_CODE).addValue(externalCodeCell);
-
-                    ExternalDataManagementSystem externalDms =
-                            linkDataSet.getExternalDataManagementSystem();
-                    if (externalDms != null)
+                    if (linkDataSet.getCopies().size() > 0)
                     {
-                        builder.column(EXTERNAL_DMS_CODE).addString(externalDms.getCode());
-                        builder.column(EXTERNAL_DMS_LABEL).addString(externalDms.getLabel());
+                        String dmsCodes = "";
+                        String dmsLabels = "";
+                        String dmsAddresses = "";
+                        String externalCodes = "";
+                        String paths = "";
+                        String hashes = "";
+
+                        for (IContentCopy copy : linkDataSet.getCopies())
+                        {
+                            dmsCodes += copy.getExternalDMSCode() + ", ";
+                            dmsLabels += copy.getExternalDMSLabel() + ", ";
+                            dmsAddresses += copy.getExternalDMSAddress() + ", ";
+
+                            externalCodes += emptyOnNull(copy.getExternalCode());
+                            paths += emptyOnNull(copy.getPath());
+                            hashes += emptyOnNull(copy.getCommitHash());
+                        }
+
+                        builder.column(EXTERNAL_DMS_CODE).addString(strip(dmsCodes));
+                        builder.column(EXTERNAL_DMS_LABEL).addString(strip(dmsLabels));
+                        builder.column(EXTERNAL_DMS_ADDRESS).addString(strip(dmsAddresses));
+
+                        builder.column(EXTERNAL_CODE).addString(strip(externalCodes));
+                        builder.column(LINK_PATH).addString(strip(paths));
+                        builder.column(LINK_HASH).addString(strip(hashes));
                     }
                 }
 
@@ -239,6 +259,28 @@ public abstract class AbstractExternalDataProvider extends
         return builder.getModel();
     }
 
+    private String emptyOnNull(String value)
+    {
+        if (value == null)
+        {
+            return "";
+        } else
+        {
+            return value + ", ";
+        }
+    }
+
+    private String strip(String value)
+    {
+        if (value.length() > 2)
+        {
+            return value.substring(0, value.length() - 2);
+        } else
+        {
+            return value;
+        }
+    }
+
     private void addProject(TypedTableModelBuilder<AbstractExternalData> builder, Project project)
     {
         if (project != null)
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
new file mode 100644
index 00000000000..563ce2b237d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/ContentCopyRecord.java
@@ -0,0 +1,23 @@
+package ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister;
+
+import ch.rinn.restrictions.Private;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.common.CodeRecord;
+
+/**
+ * A record object representing one row of the content_copies table.
+ */
+@Private
+public class ContentCopyRecord extends CodeRecord
+{
+    public String edms_code;
+
+    public String edms_label;
+
+    public String edms_address;
+
+    public String external_code;
+
+    public String path;
+
+    public String hash;
+}
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 dfec3ec8d35..90fec95f37b 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
@@ -74,6 +74,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystemType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileSystemContentCopy;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IContentCopy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
@@ -82,9 +84,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UrlContentCopy;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataStoreTranslator;
-
 import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
 import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
@@ -356,7 +358,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             result.put(sample, new ArrayList<AbstractExternalData>());
             sampleIDs.add(sample.getId());
         }
-        List<AbstractExternalData> rootDataSets = listBySampleIds(sampleIDs, 
+        List<AbstractExternalData> rootDataSets = listBySampleIds(sampleIDs,
                 EnumSet.of(DataSetFetchOption.BASIC, DataSetFetchOption.PROPERTIES));
         addChildren(rootDataSets);
         for (AbstractExternalData dataSet : rootDataSets)
@@ -397,7 +399,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
         if (childIDs.isEmpty() == false)
         {
-            List<AbstractExternalData> children = listByDatasetIds(childIDs, 
+            List<AbstractExternalData> children = listByDatasetIds(childIDs,
                     EnumSet.of(DataSetFetchOption.BASIC, DataSetFetchOption.PROPERTIES));
             for (AbstractExternalData child : children)
             {
@@ -1009,7 +1011,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             }
         }
     }
-    
+
     private void enrichWithContainers(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         Set<Long> containersNotLoaded = new HashSet<Long>();
@@ -1182,14 +1184,22 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
         convertStandardAttributes(linkDataSet, record);
 
-        if (record.edms_id != null)
+        List<ContentCopyRecord> copyRecords = query.getContentCopiesOf(record.id);
+        List<IContentCopy> copies = new ArrayList<>();
+        for (ContentCopyRecord copyRecord : copyRecords)
         {
-
-            linkDataSet.setExternalDataManagementSystem(externalDataManagementSystems
-                    .get(record.edms_id));
-            linkDataSet.setExternalCode(record.external_code);
+            if (copyRecord.external_code != null)
+            {
+                copies.add(new UrlContentCopy(copyRecord.edms_code, copyRecord.edms_label, copyRecord.edms_address, 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.setCopies(copies);
+
         return linkDataSet;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetRecord.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetRecord.java
index 3a0415314aa..9b0810933e8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetRecord.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetRecord.java
@@ -66,11 +66,5 @@ public class DatasetRecord extends CodeRecord
 
     public Boolean storage_confirmation;
 
-    // link data set
-
-    public Long edms_id;
-
-    public String external_code;
-
     public Boolean is_post_registered;
 }
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 95831ed008d..528846f0a1f 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,4 +355,10 @@ 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, "
+            + " 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}")
+    public List<ContentCopyRecord> getContentCopiesOf(long id);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
index ecc51545ada..8f9fcd7e9fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
@@ -175,7 +175,7 @@ class IndexFieldNameHelper
             case EXTERNAL_DMS_LABEL:
                 return SearchFieldConstants.PREFIX_CONTENT_COPY + SearchFieldConstants.PREFIX_EXTERNAL_DMS + SearchFieldConstants.LABEL;
 
-            case ADDRESS:
+            case EXTERNAL_DMS_ADDRESS:
                 return SearchFieldConstants.PREFIX_CONTENT_COPY + SearchFieldConstants.PREFIX_EXTERNAL_DMS + SearchFieldConstants.ADDRESS;
 
             case EXTERNAL_CODE:
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetAttributeSearchFieldKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetAttributeSearchFieldKind.java
index 8b52936fdbf..0a976ead398 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetAttributeSearchFieldKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetAttributeSearchFieldKind.java
@@ -85,13 +85,13 @@ public enum DataSetAttributeSearchFieldKind implements Serializable, IAttributeS
 
     EXTERNAL_DMS_LABEL("External DMS label"),
 
-    ADDRESS("Link address"),
+    EXTERNAL_DMS_ADDRESS("External DMS address"),
 
     EXTERNAL_CODE("Link external code"),
 
     PATH("Link path"),
 
-    COMMIT_HASH("Link git commit hash");
+    COMMIT_HASH("Link commit hash");
 
     private final String description;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/FileSystemContentCopy.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/FileSystemContentCopy.java
index a12824bb63f..349f679ab71 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/FileSystemContentCopy.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/FileSystemContentCopy.java
@@ -50,4 +50,40 @@ public class FileSystemContentCopy implements IContentCopy
             return "External DMS: " + labelString + "</br>Host: " + host + "<br/>Directory: " + directory + path + "<br>Commit hash:" + hash;
         }
     }
+
+    @Override
+    public String getExternalDMSCode()
+    {
+        return this.code;
+    }
+
+    @Override
+    public String getExternalDMSLabel()
+    {
+        return this.label;
+    }
+
+    @Override
+    public String getExternalDMSAddress()
+    {
+        return this.host;
+    }
+
+    @Override
+    public String getPath()
+    {
+        return this.path;
+    }
+
+    @Override
+    public String getCommitHash()
+    {
+        return this.hash;
+    }
+
+    @Override
+    public String getExternalCode()
+    {
+        return null;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IContentCopy.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IContentCopy.java
index e76bdd68129..87c1bad8b30 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IContentCopy.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IContentCopy.java
@@ -4,5 +4,18 @@ import java.io.Serializable;
 
 public interface IContentCopy extends Serializable
 {
+
+    String getExternalDMSCode();
+
+    String getExternalDMSLabel();
+
+    String getExternalDMSAddress();
+
+    String getPath();
+
+    String getCommitHash();
+
+    String getExternalCode();
+
     String getLocation();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UrlContentCopy.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UrlContentCopy.java
index 32b28dc2000..3cd2e15f0d8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UrlContentCopy.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UrlContentCopy.java
@@ -10,11 +10,14 @@ public class UrlContentCopy implements IContentCopy
 
     private String url;
 
-    public UrlContentCopy(String code, String label, String url)
+    private String externalCode;
+
+    public UrlContentCopy(String code, String label, String url, String externalCode)
     {
         this.code = code;
         this.label = label;
         this.url = url;
+        this.externalCode = externalCode;
     }
 
     public UrlContentCopy()
@@ -35,4 +38,40 @@ public class UrlContentCopy implements IContentCopy
 
         return "External DMS: " + labelString + "</br>Link: <a class=\"gwt-Anchor\" href=\"" + url + "\" target=\"_blank\" \">" + url + "</a><br>";
     }
+
+    @Override
+    public String getExternalDMSCode()
+    {
+        return this.code;
+    }
+
+    @Override
+    public String getExternalDMSLabel()
+    {
+        return this.label;
+    }
+
+    @Override
+    public String getExternalDMSAddress()
+    {
+        return this.url;
+    }
+
+    @Override
+    public String getPath()
+    {
+        return null;
+    }
+
+    @Override
+    public String getCommitHash()
+    {
+        return null;
+    }
+
+    @Override
+    public String getExternalCode()
+    {
+        return this.externalCode;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index 8069f75bc67..6a86562b006 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -361,7 +361,7 @@ public class DataSetTranslator
             } else
             {
                 translatedCopy = new UrlContentCopy(edms.getCode(), edms.getLabel(),
-                        address.replaceAll(Pattern.quote("${") + ".*" + Pattern.quote("}"), copy.getExternalCode()));
+                        address.replaceAll(Pattern.quote("${") + ".*" + Pattern.quote("}"), copy.getExternalCode()), copy.getExternalCode());
             }
             translatedCopies.add(translatedCopy);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index df7fba8de11..85c9cf91b8e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -843,9 +843,12 @@ var common = {
  confirm_dataset_upload_comment_field: "Comment",
  confirm_dataset_upload_user_field: "CIFEX user",
  confirm_dataset_upload_password_field: "CIFEX password",
- external_code: "External Code",
+ external_code: "Link External Code",
  external_dms_code: "External DMS Code",
  external_dms_label: "External DMS Label",
+ external_dms_address: "External DMS Address",
+ link_path: "Link Path",
+ link_hash: "Link Commit Hash",
  
  //
  // Data Set Viewer
-- 
GitLab