Support compilation using JDK 1.4 compiler

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@579694 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-obr-plugin/pom.xml b/maven-obr-plugin/pom.xml
index 6f8e3e7..6bef516 100644
--- a/maven-obr-plugin/pom.xml
+++ b/maven-obr-plugin/pom.xml
@@ -59,7 +59,7 @@
     <dependency>
       <groupId>xerces</groupId>
       <artifactId>xercesImpl</artifactId>
-      <version>2.4.0</version>
+      <version>2.8.1</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
index a3de7b2..017fe08 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
@@ -337,7 +337,7 @@
                 m_logger.error("the obr.xml file seems to be invalid in a \"require\" tag (one or more attributes are missing)");

                 // e.printStackTrace();

             }

-            newRequireNode.setValue(node.getTextContent());

+            newRequireNode.setValue(XmlHelper.getTextContent(node));

             m_resourceBundle.addRequire(newRequireNode);

         } else if (node.getNodeName().compareTo("capability") == 0) {

             Capability newCapability = new Capability();

diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
index 1f516f2..ec2f890 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
@@ -255,8 +255,8 @@
         if (!this.isValid()) { return null; }

         String path = PathFile.uniformSeparator(getAbsoluteFilename());

         if (File.separatorChar == '\\') { 

-        	path = path.replace("\\", "/");

-        	path = path.replace(" ", "%20");

+        	path = path.replace('\\', '/');

+        	path = path.replaceAll(" ", "%20");

         }

 

         URI uri = null;

@@ -467,6 +467,8 @@
 

     }

 

+    private static final String REGEXP_BACKSLASH = "\\\\";

+

     /**

      * replace all '\' by '\\' in the given string.

      * @param path string where replace the search pattern

@@ -475,7 +477,7 @@
     public static String doubleSeparator(String path) {

         // double the '\' in the path

         if (path != null && File.separatorChar == '\\') {

-            return path.replace("\\", "\\\\");

+            return path.replaceAll(REGEXP_BACKSLASH, REGEXP_BACKSLASH + REGEXP_BACKSLASH);

         } else {

             return null;

         }

diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
index d46e463..8e90d47 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
@@ -167,7 +167,7 @@
         require.setAttribute("extend", this.getExtend());

         require.setAttribute("multiple", this.getMultiple());

         require.setAttribute("optional", this.getOptional());

-        require.setTextContent(this.getValue());

+        XmlHelper.setTextContent(require,this.getValue());

 

         return require;

     }

diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
index 7a3744c..29a164d 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
@@ -265,24 +265,24 @@
         resource.setAttribute("uri", this.getUri());

         resource.setAttribute("version", this.getVersion());

 

-        description.setTextContent(this.getDescription());

+        XmlHelper.setTextContent(description,this.getDescription());

         resource.appendChild(description);

 

-        size.setTextContent(this.getSize());

+        XmlHelper.setTextContent(size,this.getSize());

         resource.appendChild(size);

 

         if (this.getDocumentation() != null) {

-            documentation.setTextContent(this.getDocumentation());

+            XmlHelper.setTextContent(documentation,this.getDocumentation());

             resource.appendChild(documentation);

         }

 

         if (this.getSource() != null) {

-            source.setTextContent(this.getSource());

+            XmlHelper.setTextContent(source,this.getSource());

             resource.appendChild(source);

         }

 

         if (this.getLicense() != null) {

-            license.setTextContent(this.getLicense());

+            XmlHelper.setTextContent(license, this.getLicense());

             resource.appendChild(license);

         }

 

diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java
new file mode 100644
index 0000000..78ae9ad
--- /dev/null
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.felix.sandbox.obr.plugin;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Provide XML helper methods to support pre-Java5 runtimes
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class XmlHelper
+{
+    /**
+     * based on public Java5 javadoc of org.w3c.dom.Node.getTextContent method
+     */
+    public static String getTextContent( Node node )
+    {
+        switch( node.getNodeType() ) {
+        case Node.ELEMENT_NODE:
+        case Node.ATTRIBUTE_NODE:
+        case Node.ENTITY_NODE:
+        case Node.ENTITY_REFERENCE_NODE:
+        case Node.DOCUMENT_FRAGMENT_NODE:
+            return mergeTextContent( node.getChildNodes() );
+        case Node.TEXT_NODE:
+        case Node.CDATA_SECTION_NODE:
+        case Node.COMMENT_NODE:
+        case Node.PROCESSING_INSTRUCTION_NODE:
+            return node.getNodeValue();
+        case Node.DOCUMENT_NODE:
+        case Node.DOCUMENT_TYPE_NODE:
+        case Node.NOTATION_NODE:
+        default:
+            return null;
+        }
+    }
+
+    /**
+     * based on the following quote from public Java5 javadoc of org.w3c.dom.Node.getTextContent method:
+     * 
+     * "concatenation of the textContent attribute value of every child node, excluding COMMENT_NODE and
+     * PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the node has no children"
+     */
+    private static String mergeTextContent( NodeList nodes )
+    {
+        StringBuffer buf = new StringBuffer();
+        for( int i = 0; i < nodes.getLength(); i++ )
+        {
+            Node n = nodes.item( i );
+            final String text;
+
+            switch( n.getNodeType() ) {
+            case Node.COMMENT_NODE:
+            case Node.PROCESSING_INSTRUCTION_NODE:
+                text = null;
+                break;
+            default:
+                text = getTextContent( n );
+                break;
+            }
+
+            if( text != null )
+            {
+                buf.append( text );
+            }
+        }
+        return buf.toString();
+    }
+
+    /**
+     * based on public Java5 javadoc of org.w3c.dom.Node.setTextContent method
+     */
+    public static void setTextContent( Node node, final String text )
+    {
+        while( node.hasChildNodes() )
+        {
+            node.removeChild( node.getFirstChild() );
+        }
+
+        if( text != null && text.length() > 0 )
+        {
+            Node textNode = node.getOwnerDocument().createTextNode( text );
+            node.appendChild( textNode );
+        }
+    }
+}