Cleaner way to create application node factory. (see javadoc for more details)


git-svn-id: https://svn.apache.org/repos/asf/xalan/java/branches/xslt20@337593 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/xpath_rwapi/.cvsignore b/xpath_rwapi/.cvsignore
new file mode 100644
index 0000000..378eac2
--- /dev/null
+++ b/xpath_rwapi/.cvsignore
@@ -0,0 +1 @@
+build
diff --git a/xpath_rwapi/grammar/etree.xsl b/xpath_rwapi/grammar/etree.xsl
index c5c6e62..d4af66f 100644
--- a/xpath_rwapi/grammar/etree.xsl
+++ b/xpath_rwapi/grammar/etree.xsl
@@ -31,21 +31,17 @@
     /**
      * Node factory for customized parser.  
      */
-    NodeFactory m_nodeFactory;
-
-    /**
-     * Sets the node factory.  
-     * @param nodeFactory to use.
-     */
-    public void setNodeFactory(NodeFactory nodeFactory) {      		
-    	m_nodeFactory = nodeFactory;
-    }
+    private NodeFactory m_nodeFactory;
 
     /**
      * Returns the node factory.  
      * @return NodeFactory
      */
     public NodeFactory getNodeFactory() {
+    	if (m_nodeFactory == null)
+    	{
+    		m_nodeFactory = DefaultNodeFactory.createNodeFactory();
+    	}
     	return m_nodeFactory;
     }
 
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/.cvsignore b/xpath_rwapi/src2/org/apache/xpath/impl/parser/.cvsignore
new file mode 100644
index 0000000..73ff854
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/.cvsignore
@@ -0,0 +1 @@
+xpath-grammar.jj*
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/DefaultNodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
similarity index 65%
rename from xpath_rwapi/src2/org/apache/xpath/impl/DefaultNodeFactory.java
rename to xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
index 01a275e..a5458c5 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/DefaultNodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
@@ -53,98 +53,118 @@
  * information on the Apache Software Foundation, please see
  * <http://www.apache.org/>.
  */
-package org.apache.xpath.impl;
+package org.apache.xpath.impl.parser;
 
-import org.apache.xpath.impl.parser.Node;
-import org.apache.xpath.impl.parser.NodeFactory;
+import org.apache.xpath.impl.FunctionCallImpl;
+import org.apache.xpath.impl.KindTestImpl;
+import org.apache.xpath.impl.LiteralImpl;
+import org.apache.xpath.impl.NameTestImpl;
+import org.apache.xpath.impl.OperatorImpl;
+import org.apache.xpath.impl.PathExprImpl;
+import org.apache.xpath.impl.SequenceTypeImpl;
+import org.apache.xpath.impl.StepExprImpl;
+import org.apache.xpath.impl.VariableImpl;
 
 /**
- * Default implementation for node factory.
+ * Implementation of {@link NodeFactory}. Returns null for each
+ * factory method.
+ * <p>Provides also a way to create a node factory. By now, it tries
+ * to instantiate an user class, by looking at the system property
+ * with the key {@link #FACTORY_PROPERTY}. If its value is a valid 
+ * class name which implements {@link NodeFactory}, then a new 
+ * instance of this class is returned. Otherwise, a singletion of this object 
+ * is returned.
+ 
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
  */
-public class DefaultNodeFactory implements NodeFactory {
+public class DefaultNodeFactory implements NodeFactory 
+{
 
+	final static public String FACTORY_PROPERTY_KEY = "org.apache.xpath.impl.parser.NodeFactory";
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createFunctionCallNode()
-	 */
+	final static private NodeFactory DEFAULT_NODE_FACTORY = new DefaultNodeFactory();
+
+	static protected NodeFactory createNodeFactory()
+	{
+		String cn = System.getProperty(FACTORY_PROPERTY_KEY);
+		NodeFactory result;
+		if (cn != null)
+		{
+			try
+			{
+				Class c = Class.forName(cn);
+				
+				result = (NodeFactory) c.newInstance();
+			} catch (ClassNotFoundException e)
+			{
+				result = DEFAULT_NODE_FACTORY;
+			} catch (InstantiationException e)
+			{
+				result = DEFAULT_NODE_FACTORY;
+			} catch (IllegalAccessException e)
+			{
+				result = DEFAULT_NODE_FACTORY;
+			} catch (ClassCastException e)
+			{
+				result = DEFAULT_NODE_FACTORY;
+			}
+		}
+		else
+		{
+			result = DEFAULT_NODE_FACTORY;
+		}
+		
+		return result;
+	}
+
+	// Implements NodeFactory
+
 	public FunctionCallImpl createFunctionCallNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createKindTestNode(int)
-	 */
 	public KindTestImpl createKindTestNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createLiteralNode(int)
-	 */
 	public LiteralImpl createLiteralNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createNameTestNode()
-	 */
 	public NameTestImpl createNameTestNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createNode(int)
-	 */
 	public Node createNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createOperatorNode(int)
-	 */
 	public OperatorImpl createOperatorNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createPathNode()
-	 */
 	public PathExprImpl createPathNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createStepNode()
-	 */
 	public StepExprImpl createStepNode(int id) {
 		return null;
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createVarNameNode()
-	 */
 	public VariableImpl createVarNameNode(int id) {
 		return null;
 	}
-
-	/* (non-Javadoc)
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createSequenceTypeNode(int)
-	 */
+	
 	public SequenceTypeImpl createSequenceTypeNode(int id) {
 		return null;
 
 	}
 
-	/* (non-Javadoc)
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createCastAsNode(int)
-	 */
 	public SequenceTypeImpl createCastAsNode(int id) {
 		return null;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.apache.xpath.impl.parser.NodeFactory#createTreatAsNode(int)
-	 */
 	public SequenceTypeImpl createTreatAsNode(int id) {
 		return null;
 	}
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
index dd1c69b..64830dc 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
@@ -69,6 +69,7 @@
 /**
  * Applications which want to generate their own AST need to implement this
  * interface.
+ * <p></p>
  *
  * @see org.apache.xpath.impl.parser.XPathTreeConstants
  */
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
index c7b1192..a9984b6 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
@@ -5,7 +5,6 @@
 import org.apache.xpath.impl.CastOrTreatAsExprImpl;
 import org.apache.xpath.impl.CastableAsExprImpl;
 import org.apache.xpath.impl.ConditionalExprImpl;
-import org.apache.xpath.impl.DefaultNodeFactory;
 import org.apache.xpath.impl.ExpressionFactoryImpl;
 import org.apache.xpath.impl.ForAndQuantifiedExprImpl;
 import org.apache.xpath.impl.FunctionCallImpl;
@@ -27,23 +26,25 @@
 {
     public static boolean PRODUCE_RAW_TREE = false;
     
-    final static private NodeFactory DEFAULT_NODE_FACTORY = new DefaultNodeFactory();
-    
-    /**
-     * List of child nodes
-     */
-    protected Node[] m_children; 
+	static ExpressionFactory m_exprFact = new ExpressionFactoryImpl();
+
+    protected Node[] m_children; // to remove
     
     protected int id; // to remove
 
+	protected static ExpressionFactory getExpressionFactory()
+	{
+		return m_exprFact;
+	}
+
+	// Constructors
+
     protected SimpleNode()
     {
     }
 
     /**
      * Creates a new SimpleNode object.
-     *
-     * @param i DOCUMENT ME!
      */
     public SimpleNode(int i)
     {
@@ -52,30 +53,12 @@
 
     /**
      * Creates a new SimpleNode object.
-     *
-     * @param p DOCUMENT ME!
-     * @param i DOCUMENT ME!
      */
     public SimpleNode(XPath p, int i)
     {
         this(i);
     }
 
-	static ExpressionFactory m_exprFact = new ExpressionFactoryImpl();
-
-	protected static ExpressionFactory getExpressionFactory()
-	{
-		return m_exprFact;
-	}
-
-    /**
-     * DOCUMENT ME!
-     *
-     * @param p DOCUMENT ME!
-     * @param id DOCUMENT ME!
-     *
-     * @return DOCUMENT ME!
-     */
     public static Node jjtCreate(XPath p, int id)
     {
         if (PRODUCE_RAW_TREE)
@@ -84,8 +67,7 @@
         }
 
         Node newNode;
-        NodeFactory nodeFactory = (p.m_nodeFactory == null)
-            ? DEFAULT_NODE_FACTORY : p.m_nodeFactory;
+        NodeFactory nodeFactory = p.getNodeFactory();
 
         switch (id)
         {
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPath.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPath.java
index d6b3fdd..dd15824 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPath.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPath.java
@@ -13,21 +13,17 @@
     /**
      * Node factory for customized parser.  
      */
-    NodeFactory m_nodeFactory;
-
-    /**
-     * Sets the node factory.  
-     * @param nodeFactory to use.
-     */
-    public void setNodeFactory(NodeFactory nodeFactory) {
-        m_nodeFactory = nodeFactory;
-    }
+    private NodeFactory m_nodeFactory;
 
     /**
      * Returns the node factory.  
      * @return NodeFactory
      */
     public NodeFactory getNodeFactory() {
+        if (m_nodeFactory == null)
+        {
+                m_nodeFactory = DefaultNodeFactory.createNodeFactory();
+        }
         return m_nodeFactory;
     }
 
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathTreeConstants.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathTreeConstants.java
index 021fff0..cb57907 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathTreeConstants.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathTreeConstants.java
@@ -1,4 +1,4 @@
-/* Generated By:JJTree: Do not edit this line. F:/projets/xml-xalan-xslt20/xml-xalan/java/xpath_rwapi/src2/org/apache/xpath/impl/parser\XPathTreeConstants.java */
+/* Generated By:JJTree: Do not edit this line. D:/projects/xml-xalan-xslt20/xpath_rwapi/src2/org/apache/xpath/impl/parser\XPathTreeConstants.java */
 
 package org.apache.xpath.impl.parser;
 
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathVisitor.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathVisitor.java
index 32c5e3a..e23b828 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathVisitor.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/XPathVisitor.java
@@ -1,4 +1,4 @@
-/* Generated By:JJTree: Do not edit this line. F:/projets/xml-xalan-xslt20/xml-xalan/java/xpath_rwapi/src2/org/apache/xpath/impl/parser\XPathVisitor.java */
+/* Generated By:JJTree: Do not edit this line. D:/projects/xml-xalan-xslt20/xpath_rwapi/src2/org/apache/xpath/impl/parser\XPathVisitor.java */
 
 package org.apache.xpath.impl.parser;