From 053ac6f0f69cbe0b6b2ea6f557737c1223e57d96 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 14 Feb 2011 15:10:52 +0000
Subject: [PATCH] [LMS-2036] display links as entity identifiers; handle
 missing entities

SVN: 19937
---
 .../client/application/ui/TypedTableGrid.java |  6 +-
 .../ui/TypedTableGridColumnDefinitionUI.java  |  1 +
 .../EntityInformationProvider.java            | 93 +++++++++++++++++++
 .../openbis/generic/shared/ResourceNames.java | 11 ++-
 .../shared/basic/dto/EntityTableCell.java     | 22 ++++-
 .../EntityLinkElementTranslator.java          | 42 +++++++++
 .../IEntityInformationProvider.java           | 28 ++++++
 .../ScriptUtilityFactory.java                 | 31 ++++++-
 .../SimpleTableModelBuilderAdaptor.java       | 36 ++++---
 9 files changed, 240 insertions(+), 30 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/managed_property/EntityInformationProvider.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/EntityLinkElementTranslator.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IEntityInformationProvider.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
index e15e9415313..aefca7defd0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
@@ -130,6 +130,10 @@ public abstract class TypedTableGrid<T extends ISerializable>
             if (value instanceof EntityTableCell)
             {
                 EntityTableCell entityTableCell = (EntityTableCell) value;
+                if (entityTableCell.isMissing())
+                {
+                    return null; 
+                }
                 String permId = entityTableCell.getPermId();
                 if (entityTableCell.getEntityKind() == EntityKind.MATERIAL)
                 {
@@ -229,7 +233,7 @@ public abstract class TypedTableGrid<T extends ISerializable>
                 String id = header.getId();
                 if (listenerLinkGenerators.containsKey(id))
                 {
-                    definitions.setGridCellRendererFor(id, createInternalLinkCellRenderer());
+                    definitions.setGridCellRendererFor(id, LinkRenderer.createLinkRenderer(true));
                 } else
                 {
                     final GridCellRenderer<BaseEntityModel<?>> specificRendererOrNull =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
index aab1285b3a8..26a0d7e5b8a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
@@ -80,6 +80,7 @@ public class TypedTableGridColumnDefinitionUI<T extends ISerializable> extends
         {
             return null;
         }
+        // TODO
         final ISerializableComparable value = entity.getValues().get(header.getIndex());
         final T objectOrNull = entity.getObjectOrNull();
         return objectOrNull == null ? null : linkGeneratorOrNull.tryGetLink(objectOrNull, value);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/managed_property/EntityInformationProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/managed_property/EntityInformationProvider.java
new file mode 100644
index 00000000000..e16f819943f
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/managed_property/EntityInformationProvider.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2011 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.generic.server.business.bo.managed_property;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.systemsx.cisd.openbis.generic.shared.ResourceNames;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.EntityLinkElementTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IEntityInformationProvider;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IEntityLinkElement;
+
+/**
+ * @author Piotr Buczek
+ */
+@Component(value = ResourceNames.ENTITY_INFORMATION_PROVIDER)
+public class EntityInformationProvider implements IEntityInformationProvider
+{
+    @Autowired
+    private IDAOFactory daoFactory;
+
+    public String getIdentifier(EntityKind entityKind, String permId)
+    {
+        IIdentifierHolder identifierHolderOrNull = null;
+        switch (entityKind)
+        {
+            case EXPERIMENT:
+                identifierHolderOrNull = daoFactory.getExperimentDAO().tryGetByPermID(permId);
+                break;
+            case SAMPLE:
+                identifierHolderOrNull = daoFactory.getSampleDAO().tryToFindByPermID(permId);
+                break;
+            case DATA_SET:
+                identifierHolderOrNull =
+                        daoFactory.getExternalDataDAO().tryToFindDataSetByCode(permId);
+                break;
+            case MATERIAL:
+                MaterialIdentifier idOrNull = MaterialIdentifier.tryParseIdentifier(permId);
+                if (idOrNull == null)
+                {
+                    return null;
+                } else
+                {
+                    final MaterialPE materialOrNull =
+                            daoFactory.getMaterialDAO().tryFindMaterial(idOrNull);
+                    if (materialOrNull == null)
+                    {
+                        return null;
+                    } else
+                    {
+                        identifierHolderOrNull = new IIdentifierHolder()
+                            {
+
+                                public String getIdentifier()
+                                {
+                                    return new MaterialIdentifier(materialOrNull.getCode(),
+                                            materialOrNull.getEntityType().getCode()).print();
+                                }
+                            };
+                    }
+                }
+        }
+        return identifierHolderOrNull == null ? null : identifierHolderOrNull.getIdentifier();
+    }
+
+    public String getIdentifier(IEntityLinkElement entityLink)
+    {
+        final EntityKind entityKind =
+                EntityLinkElementTranslator.translate(entityLink.getEntityLinkKind());
+        final String permId = entityLink.getPermId();
+        return getIdentifier(entityKind, permId);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ResourceNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ResourceNames.java
index 15c6fd3395a..df5c19a4bdc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ResourceNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ResourceNames.java
@@ -37,18 +37,23 @@ public final class ResourceNames
             "generic-data-set-type-slave-server-plugin";
 
     public final static String GENERIC_DATA_SET_SERVER_PLUGIN = "generic-data-set-server-plugin";
-    
+
     public final static String SAMPLE_PLUGIN_REGISTRY = "sample-plugin-registry";
-    
+
     public final static String DATA_SET_PLUGIN_REGISTRY = "data-set-plugin-registry";
 
+    public final static String MANAGED_PROPERTY_SCRIPT_UTILITY_FACTORY =
+            "managed-property-script-utility-factory";
+
+    public final static String ENTITY_INFORMATION_PROVIDER = "entity-information-provider";
+
     private ResourceNames()
     {
         // Can not be instantiated.
     }
 
     public final static String ETL_SERVICE = "etl-service";
-    
+
     public final static String ETL_SERVICE_URL = "/rmi-etl";
 
     public final static String COMMON_SERVICE = "common-service";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
index 4e6b89a0bc8..30210340a1e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
-
 /**
  * Table cell for an entity link.
  * 
@@ -24,13 +23,22 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
  */
 public class EntityTableCell implements ISerializableComparable
 {
+    private static final String MISSING_ENTITY_SUFFIX = " (missing)";
+
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
     private EntityKind entityKind;
 
     private String permId;
 
+    private String identifierOrNull; // 'null' when entity is missing
+
     public EntityTableCell(EntityKind entityKind, String permId)
+    {
+        this(entityKind, permId, permId);
+    }
+
+    public EntityTableCell(EntityKind entityKind, String permId, String identifierOrNull)
     {
         if (entityKind == null)
         {
@@ -42,6 +50,7 @@ public class EntityTableCell implements ISerializableComparable
         }
         this.entityKind = entityKind;
         this.permId = permId;
+        this.identifierOrNull = identifierOrNull;
     }
 
     public int compareTo(ISerializableComparable o)
@@ -59,6 +68,11 @@ public class EntityTableCell implements ISerializableComparable
         return permId;
     }
 
+    public boolean isMissing()
+    {
+        return identifierOrNull == null;
+    }
+
     @Override
     public int hashCode()
     {
@@ -76,14 +90,14 @@ public class EntityTableCell implements ISerializableComparable
         {
             return false;
         }
-        EntityTableCell cell = (EntityTableCell) obj;
-        return getPermId().equals(cell.getPermId());
+        EntityTableCell otherCell = (EntityTableCell) obj;
+        return entityKind.equals(otherCell.entityKind) && permId.equals(otherCell.permId);
     }
 
     @Override
     public String toString()
     {
-        return getPermId().toString();
+        return isMissing() ? String.valueOf(permId) + MISSING_ENTITY_SUFFIX : identifierOrNull;
     }
 
     // ---------------------------
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/EntityLinkElementTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/EntityLinkElementTranslator.java
new file mode 100644
index 00000000000..2453015b705
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/EntityLinkElementTranslator.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 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.generic.shared.managed_property;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.EntityLinkElementKind;
+
+/**
+ * @author Piotr Buczek
+ */
+public class EntityLinkElementTranslator
+{
+    public static EntityKind translate(EntityLinkElementKind linkElementKind)
+    {
+        switch (linkElementKind)
+        {
+            case DATA_SET:
+                return EntityKind.DATA_SET;
+            case EXPERIMENT:
+                return EntityKind.EXPERIMENT;
+            case MATERIAL:
+                return EntityKind.MATERIAL;
+            case SAMPLE:
+                return EntityKind.SAMPLE;
+        }
+        return null; // won't happen
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IEntityInformationProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IEntityInformationProvider.java
new file mode 100644
index 00000000000..2333d91646c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IEntityInformationProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2011 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.generic.shared.managed_property;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+
+/**
+ * @author Piotr Buczek
+ */
+public interface IEntityInformationProvider
+{
+    /** @return identifier of entity with given kind and permid, <code>null</code> if such entity doesn't exist */
+    String getIdentifier(EntityKind entityKind, String permId); 
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ScriptUtilityFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ScriptUtilityFactory.java
index b9afe6eef59..a58bc5c8708 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ScriptUtilityFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ScriptUtilityFactory.java
@@ -1,5 +1,10 @@
 package ch.systemsx.cisd.openbis.generic.shared.managed_property;
 
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import ch.systemsx.cisd.openbis.generic.shared.ResourceNames;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.ValidationException;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IElement;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IElementFactory;
@@ -9,10 +14,11 @@ import ch.systemsx.cisd.openbis.generic.shared.managed_property.structured.Eleme
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.structured.XmlStructuredPropertyConverter;
 
 /**
- * This utility class with function to be used by jython scripts for managed properties.
+ * This is a utility class with functions to be used by Jython scripts for managed properties.
  * <p>
  * All public methods of this class are part of the Managed Properties API.
  */
+@Component(value = ResourceNames.MANAGED_PROPERTY_SCRIPT_UTILITY_FACTORY)
 public class ScriptUtilityFactory
 {
     private static final IElementFactory ELEMENT_FACTORY_INSTANCE = new ElementFactory();
@@ -20,12 +26,32 @@ public class ScriptUtilityFactory
     private static final IStructuredPropertyConverter STRUCTURED_PROPERTY_CONVERTER_INSTANCE =
             new XmlStructuredPropertyConverter(ELEMENT_FACTORY_INSTANCE);
 
+    // initialized by spring
+    private static IEntityInformationProvider entityInformationProvider;
+
+    public IEntityInformationProvider getEntityInformationProvider()
+    {
+        return entityInformationProvider;
+    }
+
+    // @Autowired
+    @Resource(name = ResourceNames.ENTITY_INFORMATION_PROVIDER)
+    public void setEntityInformationProvider(IEntityInformationProvider entityInformationProvider)
+    {
+        ScriptUtilityFactory.entityInformationProvider = entityInformationProvider;
+    }
+
+    private ScriptUtilityFactory()
+    {
+
+    }
+
     /**
      * Creates a table builder.
      */
     public static ISimpleTableModelBuilderAdaptor createTableBuilder()
     {
-        return SimpleTableModelBuilderAdaptor.create();
+        return SimpleTableModelBuilderAdaptor.create(entityInformationProvider);
     }
 
     /**
@@ -53,4 +79,5 @@ public class ScriptUtilityFactory
     {
         return STRUCTURED_PROPERTY_CONVERTER_INSTANCE;
     }
+
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/SimpleTableModelBuilderAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/SimpleTableModelBuilderAdaptor.java
index e5d14ef43bf..d9510a6c800 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/SimpleTableModelBuilderAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/SimpleTableModelBuilderAdaptor.java
@@ -21,7 +21,6 @@ import java.util.Date;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.EntityLinkElementKind;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IEntityLinkElement;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IRowBuilderAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.ISimpleTableModelBuilderAdaptor;
@@ -42,14 +41,20 @@ public class SimpleTableModelBuilderAdaptor implements ISimpleTableModelBuilderA
 
     private final SimpleTableModelBuilder builder;
 
-    public static SimpleTableModelBuilderAdaptor create()
+    private final IEntityInformationProvider entityInformationProvider;
+
+    public static SimpleTableModelBuilderAdaptor create(
+            IEntityInformationProvider entityInformationProvider)
     {
-        return new SimpleTableModelBuilderAdaptor(new SimpleTableModelBuilder(true));
+        return new SimpleTableModelBuilderAdaptor(new SimpleTableModelBuilder(true),
+                entityInformationProvider);
     }
 
-    private SimpleTableModelBuilderAdaptor(SimpleTableModelBuilder builder)
+    private SimpleTableModelBuilderAdaptor(SimpleTableModelBuilder builder,
+            IEntityInformationProvider entityInformationProvider)
     {
         this.builder = builder;
+        this.entityInformationProvider = entityInformationProvider;
     }
 
     //
@@ -110,8 +115,11 @@ public class SimpleTableModelBuilderAdaptor implements ISimpleTableModelBuilderA
 
                 private EntityTableCell asTableCell(IEntityLinkElement value)
                 {
-                    return new EntityTableCell(convert(value.getEntityLinkKind()),
-                            value.getPermId());
+                    final EntityKind entityKind =
+                            EntityLinkElementTranslator.translate(value.getEntityLinkKind());
+                    final String permId = value.getPermId();
+                    final String identifierOrNull = tryExtractIdentifier(entityKind, permId);
+                    return new EntityTableCell(entityKind, permId, identifierOrNull);
                 }
 
             };
@@ -127,20 +135,8 @@ public class SimpleTableModelBuilderAdaptor implements ISimpleTableModelBuilderA
         builder.addFullRow(values);
     }
 
-    private static EntityKind convert(EntityLinkElementKind linkElementKind)
+    private String tryExtractIdentifier(EntityKind entityKind, String permId)
     {
-        switch (linkElementKind)
-        {
-            case DATA_SET:
-                return EntityKind.DATA_SET;
-            case EXPERIMENT:
-                return EntityKind.EXPERIMENT;
-            case MATERIAL:
-                return EntityKind.MATERIAL;
-            case SAMPLE:
-                return EntityKind.SAMPLE;
-        }
-        return null; // won't happen
+        return entityInformationProvider.getIdentifier(entityKind, permId);
     }
-
 }
-- 
GitLab