Repository: systemml
Updated Branches:
  refs/heads/master 7ae1b1c4c -> 3fd8e495e


[SYSTEMML-1806] fix for DMLConfig#setText


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/3fd8e495
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/3fd8e495
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/3fd8e495

Branch: refs/heads/master
Commit: 3fd8e495e26ba70eed22bf16c51a7bf69474c1c3
Parents: 7ae1b1c
Author: Nakul Jindal <naku...@gmail.com>
Authored: Wed Jul 26 14:24:53 2017 -0700
Committer: Nakul Jindal <naku...@gmail.com>
Committed: Wed Jul 26 14:24:53 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/sysml/conf/DMLConfig.java   | 71 ++++++++++----------
 .../org/apache/sysml/test/unit/UtilsTest.java   | 60 +++++++++++++++++
 2 files changed, 97 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/3fd8e495/src/main/java/org/apache/sysml/conf/DMLConfig.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/conf/DMLConfig.java 
b/src/main/java/org/apache/sysml/conf/DMLConfig.java
index a6a4b5e..415bb57 100644
--- a/src/main/java/org/apache/sysml/conf/DMLConfig.java
+++ b/src/main/java/org/apache/sysml/conf/DMLConfig.java
@@ -22,6 +22,7 @@ package org.apache.sysml.conf;
 import java.io.ByteArrayInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.StringWriter;
 import java.util.HashMap;
 import java.util.Map;
@@ -45,6 +46,7 @@ import org.apache.sysml.runtime.DMLRuntimeException;
 import org.apache.sysml.runtime.io.IOUtilFunctions;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
@@ -97,6 +99,8 @@ public class DMLConfig
 
     private String _fileName = null;
        private Element _xmlRoot = null;
+       private DocumentBuilder _documentBuilder = null;
+       private Document _document = null;
        
        static
        {
@@ -130,7 +134,7 @@ public class DMLConfig
        {
                
        }
-       
+
        public DMLConfig(String fileName) 
                throws ParseException, FileNotFoundException
        {
@@ -169,25 +173,32 @@ public class DMLConfig
         */
        private void parseConfig () throws ParserConfigurationException, 
SAXException, IOException 
        {
-               DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
-               factory.setIgnoringComments(true); //ignore XML comments
-               DocumentBuilder builder = factory.newDocumentBuilder();
-               Document domTree = null;
+               DocumentBuilder builder = getDocumentBuilder();
+               _document = null;
                if( _fileName.startsWith("hdfs:") || 
_fileName.startsWith("gpfs:")
                        || IOUtilFunctions.isObjectStoreFileScheme(new 
Path(_fileName)) )
                {
                        Path configFilePath = new Path(_fileName);
                        FileSystem DFS = 
IOUtilFunctions.getFileSystem(configFilePath);
-            domTree = builder.parse(DFS.open(configFilePath));  
+                       _document = builder.parse(DFS.open(configFilePath));
                }
                else  // config from local file system
                {
-                       domTree = builder.parse(_fileName);
+                       _document = builder.parse(_fileName);
                }
-               
-               _xmlRoot = domTree.getDocumentElement();                
+
+               _xmlRoot = _document.getDocumentElement();
        }
-       
+
+       private DocumentBuilder getDocumentBuilder() throws 
ParserConfigurationException {
+               if (_documentBuilder == null) {
+                       DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
+                       factory.setIgnoringComments(true); //ignore XML comments
+                       _documentBuilder = factory.newDocumentBuilder();
+               }
+               return _documentBuilder;
+       }
+
        /**
         * Method to get string value of a configuration parameter
         * Handles processing of configuration parameters 
@@ -242,21 +253,7 @@ public class DMLConfig
                return textVal;
        }
        
-       /**
-        * Method to update the string value of an element identified by a tag 
name
-        * @param element the DOM element
-        * @param tagName the tag name
-        * @param newTextValue the new string value
-        */
-       private static void setTextValue(Element element, String tagName, 
String newTextValue) {
-               
-               NodeList list = element.getElementsByTagName(tagName);
-               if (list != null && list.getLength() > 0) {
-                       Element elem = (Element) list.item(0);
-                       elem.getFirstChild().setNodeValue(newTextValue);        
-               }
-       }
-       
+
        /**
         * Method to update the key value
         * @param paramName parameter name
@@ -264,17 +261,23 @@ public class DMLConfig
         * @throws DMLRuntimeException if DMLRuntimeException occurs
         */
        public void setTextValue(String paramName, String paramValue) throws 
DMLRuntimeException {
-               if(_xmlRoot != null)
-                       DMLConfig.setTextValue(_xmlRoot, paramName, paramValue);
-               else {
-                       DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
-                       factory.setIgnoringComments(true); //ignore XML comments
-                       DocumentBuilder builder;
+               if(_xmlRoot != null) {
+                       NodeList list = 
_xmlRoot.getElementsByTagName(paramName);
+                       if (list != null && list.getLength() > 0) {
+                               Element elem = (Element) list.item(0);
+                               elem.getFirstChild().setNodeValue(paramValue);
+                       } else {
+                               Node value = 
_document.createTextNode(paramValue);
+                               Node element = 
_document.createElement(paramName);
+                               element.appendChild(value);
+                               _xmlRoot.appendChild(element);
+                       }
+               } else {
                        try {
-                               builder = factory.newDocumentBuilder();
+                               DocumentBuilder builder = getDocumentBuilder();
                                String configString = "<root><" + paramName + 
">"+paramValue+"</" + paramName + "></root>";
-                               Document domTree = builder.parse(new 
ByteArrayInputStream(configString.getBytes("UTF-8")));
-                               _xmlRoot = domTree.getDocumentElement();
+                               _document = builder.parse(new 
ByteArrayInputStream(configString.getBytes("UTF-8")));
+                               _xmlRoot = _document.getDocumentElement();
                        } catch (Exception e) {
                                throw new DMLRuntimeException("Unable to set 
config value", e);
                        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/3fd8e495/src/test/java/org/apache/sysml/test/unit/UtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/unit/UtilsTest.java 
b/src/test/java/org/apache/sysml/test/unit/UtilsTest.java
index b5dccd0..02c96a0 100644
--- a/src/test/java/org/apache/sysml/test/unit/UtilsTest.java
+++ b/src/test/java/org/apache/sysml/test/unit/UtilsTest.java
@@ -20,8 +20,15 @@
 package org.apache.sysml.test.unit;
 
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.Arrays;
 
+import org.apache.sysml.conf.DMLConfig;
+import org.apache.sysml.parser.ParseException;
+import org.apache.sysml.runtime.DMLRuntimeException;
 import org.apache.sysml.runtime.instructions.gpu.context.GPUContextPool;
 import org.junit.Assert;
 import org.junit.Test;
@@ -75,4 +82,57 @@ public class UtilsTest {
        public void testParseListStringFail4() {
                GPUContextPool.parseListString("-1-4", 6);
        }
+
+
+       @Test
+       public void testDMLConfig1() throws DMLRuntimeException{
+               DMLConfig dmlConfig = new DMLConfig();
+               dmlConfig.setTextValue("A", "a");
+               dmlConfig.setTextValue("B", "b");
+               dmlConfig.setTextValue("C", "2");
+               dmlConfig.setTextValue("D", "5");
+               dmlConfig.setTextValue("E", "5.01");
+
+               Assert.assertEquals("a", dmlConfig.getTextValue("A"));
+               Assert.assertEquals("b", dmlConfig.getTextValue("B"));
+               Assert.assertEquals(2, dmlConfig.getIntValue("C"));
+               Assert.assertEquals(5, dmlConfig.getIntValue("D"));
+               Assert.assertEquals(5.01, dmlConfig.getDoubleValue("E"), 1e-15);
+
+               dmlConfig.setTextValue("E", "a");
+               Assert.assertEquals("a", dmlConfig.getTextValue("E"));
+       }
+
+
+
+       @Test
+       public void testDMLConfig2() throws DMLRuntimeException, IOException, 
ParseException {
+
+               String testStr = "<root>"
+                               + "<A>a</A>"
+                               + "<B>b</B>"
+                               + "<C>2</C>"
+                               + "<D>5</D>"
+                               + "<E>5.01</E>"
+                               + "</root>";
+               File temp = File.createTempFile("tempfile", null);
+               BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
+               bw.write(testStr);
+               bw.close();
+
+               DMLConfig dmlConfig = new DMLConfig(temp.getAbsolutePath());
+
+               Assert.assertEquals("a", dmlConfig.getTextValue("A"));
+               Assert.assertEquals("b", dmlConfig.getTextValue("B"));
+               Assert.assertEquals(2, dmlConfig.getIntValue("C"));
+               Assert.assertEquals(5, dmlConfig.getIntValue("D"));
+               Assert.assertEquals(5.01, dmlConfig.getDoubleValue("E"), 1e-15);
+
+               dmlConfig.setTextValue("E", "a");
+               Assert.assertEquals("a", dmlConfig.getTextValue("E"));
+       }
+
+
+
+
 }

Reply via email to