From f48875d87246d59675bc30368fe59902d56c6fc8 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Wed, 9 Feb 2011 19:25:35 +0000
Subject: [PATCH] minor: incorporated API improvement suggestions from Piotr
 (discovered in a hands-on session with Manuel)

SVN: 19844
---
 .../shared/managed_property/api/IElement.java | 12 +++++++---
 .../managed_property/structured/Element.java  | 18 +++++++++++++-
 .../XmlStructuredPropertyConverter.java       | 19 ++++++++++-----
 .../openbis/generic/shared/util/XmlUtils.java |  6 ++++-
 .../structured/ElementFactoryTest.java        | 24 ++++++++++++++++++-
 .../XmlStructuredPropertyConverterTest.java   |  2 +-
 6 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/api/IElement.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/api/IElement.java
index 48ecdb9c32f..d2aff9f6329 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/api/IElement.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/api/IElement.java
@@ -37,13 +37,19 @@ public interface IElement
      * @return the element's name.
      */
     String getName();
-    
+
     /**
-     * @return the value of an attribute or NULL if the attribute is not defined for this
-     *         {@link IElement}
+     * @return the value of an attribute
+     * @throws IllegalArgumentException if the attribute is not defined for this {@link IElement}
      */
     String getAttribute(String key);
 
+    /**
+     * @return the value of an attribute or <code>defaultValue</code> if the attribute is not
+     *         defined for this {@link IElement}
+     */
+    String getAttribute(String key, String defaultValue);
+
     /**
      * The "Data" field is intended for a chunk raw data that can be attached to an element
      * instance. This might be useful in scenarios where
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/Element.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/Element.java
index 75955a2ac0b..b7c50c2d5a2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/Element.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/Element.java
@@ -56,7 +56,23 @@ public class Element implements IElement
 
     public String getAttribute(String key)
     {
-        return attributes.get(key);
+        String value = attributes.get(key);
+        if (value == null)
+        {
+            String error = String.format("Attribute '%s' does not exist.", key);
+            throw new IllegalArgumentException(error);
+        }
+        return value;
+    }
+
+    public String getAttribute(String key, String defaultValue)
+    {
+        String value = attributes.get(key);
+        if (value == null)
+        {
+            value = defaultValue;
+        }
+        return value;
     }
 
     public String getData()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverter.java
index a9cf79fc4b2..80f880171a8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverter.java
@@ -129,10 +129,15 @@ public class XmlStructuredPropertyConverter implements IStructuredPropertyConver
                 {
                     IElement child = transformFromDOM(domChild);
                     children.add(child);
-                } else if (domChild.getNodeType() == Node.CDATA_SECTION_NODE)
+                } else if (domChild.getNodeType() == Node.TEXT_NODE)
                 {
-                    String textContext = domChild.getNodeValue();
-                    result.setData(textContext);
+
+                    String textContent = domChild.getNodeValue().trim();
+                    textContent = StringEscapeUtils.unescapeXml(textContent);
+                    if (false == StringUtils.isBlank(textContent))
+                    {
+                        result.setData(textContent);
+                    }
                 }
             }
 
@@ -201,10 +206,12 @@ public class XmlStructuredPropertyConverter implements IStructuredPropertyConver
     private void transformDataToDOM(IElement element, Document document, Node node)
     {
         // text data
-        if (StringUtils.isBlank(element.getData()) == false)
+        String data = element.getData();
+        if (StringUtils.isBlank(data) == false)
         {
-            Node cdataNode = document.createCDATASection(element.getData());
-            node.appendChild(cdataNode);
+            String escapedXmlContent = StringEscapeUtils.escapeXml(data);
+            Node textNode = document.createTextNode(escapedXmlContent);
+            node.appendChild(textNode);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/XmlUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/XmlUtils.java
index 4d54b49110a..0ff5311f35b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/XmlUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/XmlUtils.java
@@ -60,6 +60,9 @@ public class XmlUtils
 
     public static String XSLT_XSD_FILE_RESOURCE = "/schema-for-xslt20.xsd";
 
+    /** indentation to be used when serializing to xml. */
+    public static final Integer INDENTATION = 2;
+    
     /**
      * Parse given string as XML {@link Document}.
      * 
@@ -89,10 +92,11 @@ public class XmlUtils
         try
         {
             TransformerFactory transfac = TransformerFactory.newInstance();
+            transfac.setAttribute("indent-number", INDENTATION);
             Transformer trans = transfac.newTransformer();
             trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
             trans.setOutputProperty(OutputKeys.INDENT, "yes");
-
+            trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", INDENTATION.toString());
             StringWriter sw = new StringWriter();
             trans.transform(new DOMSource(document), new StreamResult(sw));
             return sw.toString();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/ElementFactoryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/ElementFactoryTest.java
index 887af227840..9ae3503ffbb 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/ElementFactoryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/ElementFactoryTest.java
@@ -19,8 +19,8 @@ package ch.systemsx.cisd.openbis.generic.shared.managed_property.structured;
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IElement;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.api.IElementFactory;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.structured.ElementFactory;
 
 /**
  * error test cases for {@link ElementFactory}.
@@ -52,4 +52,26 @@ public class ElementFactoryTest extends AssertJUnit
         factory.createElement("Material");
 
     }
+
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void testGetNonExistentAttribute()
+    {
+        IElement element = factory.createElement("test");
+        element.getAttribute("non-existent");
+    }
+
+    @Test
+    public void testGetAttributeWithDefaultValue()
+    {
+        IElement element = factory.createElement("test");
+
+        String existentAttribute = "attr";
+        String value = "value";
+        element.addAttribute(existentAttribute, value);
+
+        String defaultValue = "def_value";
+        assertEquals(value, element.getAttribute(existentAttribute, defaultValue));
+        assertEquals(defaultValue, element.getAttribute("non-existent", defaultValue));
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverterTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverterTest.java
index ae6abfd80fb..62397dd95bd 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverterTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/XmlStructuredPropertyConverterTest.java
@@ -42,7 +42,7 @@ public class XmlStructuredPropertyConverterTest extends AssertJUnit
         List<IElement> elements =
                 Arrays.asList(
                         factory.createElement("testname").addAttribute("attr1", "value1")
-                                .addAttribute("attr2", "value2"),
+                                .addAttribute("attr2", "value2").setData("dummy&<>data"),
                         factory.createSampleLink("permIdSample").addAttribute("sampleAttrKey",
                                 "sampleAttrVal"),
                         factory.createMaterialLink("materialCode", "typeCode").addAttribute(
-- 
GitLab