Author: mbenson
Date: Wed Jul 18 13:22:16 2007
New Revision: 557381

URL: http://svn.apache.org/viewvc?view=rev&rev=557381
Log:
[JXPATH-96] use NodePointerFactory for VariablePointers

Added:
    
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
   (with props)
Modified:
    
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java

Modified: 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java?view=diff&rev=557381&r1=557380&r2=557381
==============================================================================
--- 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java
 (original)
+++ 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java
 Wed Jul 18 13:22:16 2007
@@ -37,7 +37,6 @@
 import org.apache.commons.jxpath.JXPathNotFoundException;
 import org.apache.commons.jxpath.JXPathTypeConversionException;
 import org.apache.commons.jxpath.Pointer;
-import org.apache.commons.jxpath.Variables;
 import org.apache.commons.jxpath.ri.axes.InitialContext;
 import org.apache.commons.jxpath.ri.axes.RootContext;
 import org.apache.commons.jxpath.ri.compiler.Expression;
@@ -46,7 +45,7 @@
 import org.apache.commons.jxpath.ri.compiler.TreeCompiler;
 import org.apache.commons.jxpath.ri.model.NodePointer;
 import org.apache.commons.jxpath.ri.model.NodePointerFactory;
-import org.apache.commons.jxpath.ri.model.VariablePointer;
+import org.apache.commons.jxpath.ri.model.VariablePointerFactory;
 import org.apache.commons.jxpath.ri.model.beans.BeanPointerFactory;
 import org.apache.commons.jxpath.ri.model.beans.CollectionPointerFactory;
 import org.apache.commons.jxpath.ri.model.container.ContainerPointerFactory;
@@ -72,12 +71,13 @@
     private static Map compiled = new HashMap();
     private static int cleanupCount = 0;
 
-    private static Vector nodeFactories = new Vector();
+    private static final Vector nodeFactories = new Vector();
     private static NodePointerFactory nodeFactoryArray[] = null;
     static {
         nodeFactories.add(new CollectionPointerFactory());
         nodeFactories.add(new BeanPointerFactory());
         nodeFactories.add(new DynamicPointerFactory());
+        nodeFactories.add(new VariablePointerFactory());
 
         // DOM  factory is only registered if DOM support is on the classpath
         Object domFactory = allocateConditionally(
@@ -618,26 +618,8 @@
     }
 
     public NodePointer getVariablePointer(QName name) {
-        String varName = name.toString();
-        JXPathContext varCtx = this;
-        Variables vars = null;
-        while (varCtx != null) {
-            vars = varCtx.getVariables();
-            if (vars.isDeclaredVariable(varName)) {
-                break;
-            }
-            varCtx = varCtx.getParentContext();
-            vars = null;
-        }
-        if (vars != null) {
-            return new VariablePointer(vars, name);
-        }
-        else {
-            // The variable is not declared, but we will create
-            // a pointer anyway in case the user want to set, rather
-            // than get, the value of the variable.
-            return new VariablePointer(name);
-        }
+        return NodePointer.newNodePointer(name, VariablePointerFactory
+                .contextWrapper(this), getLocale());
     }
 
     public Function getFunction(QName functionName, Object[] parameters) {

Added: 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java?view=auto&rev=557381
==============================================================================
--- 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
 (added)
+++ 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
 Wed Jul 18 13:22:16 2007
@@ -0,0 +1,99 @@
+/*
+ * 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.commons.jxpath.ri.model;
+
+import java.util.Locale;
+
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.Variables;
+import org.apache.commons.jxpath.ri.QName;
+
+/**
+ * NodePointerFactory to create VariablePointers.
+ * @author Matt Benson
+ * @since JXPath 1.3
+ * @version $Revision$ $Date$
+ */
+public class VariablePointerFactory implements NodePointerFactory {
+    public static final int VARIABLE_POINTER_FACTORY_ORDER = 890;
+
+    /**
+     * Node value wrapper to trigger a VariablePointerFactory.
+     */
+    public static class VariableContextWrapper {
+        final JXPathContext context;
+
+        private VariableContextWrapper(JXPathContext context) {
+            this.context = context;
+        }
+    }
+
+    /**
+     * VariableContextWrapper factory method.
+     * @param context the JXPathContext to wrap.
+     * @return VariableContextWrapper.
+     */
+    public static VariableContextWrapper contextWrapper(JXPathContext context) 
{
+        return new VariableContextWrapper(context);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see 
org.apache.commons.jxpath.ri.model.NodePointerFactory#createNodePointer(org.apache.commons.jxpath.ri.QName,
+     *      java.lang.Object, java.util.Locale)
+     */
+    public NodePointer createNodePointer(QName name, Object object,
+            Locale locale) {
+        if (object instanceof VariableContextWrapper) {
+            JXPathContext varCtx = ((VariableContextWrapper) object).context;
+            while (varCtx != null) {
+                Variables vars = varCtx.getVariables();
+                if (vars.isDeclaredVariable(name.toString())) {
+                    return new VariablePointer(vars, name);
+                }
+                varCtx = varCtx.getParentContext();
+            }
+            // The variable is not declared, but we will create
+            // a pointer anyway in case the user wants to set, rather
+            // than get, the value of the variable.
+            return new VariablePointer(name);
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see 
org.apache.commons.jxpath.ri.model.NodePointerFactory#createNodePointer(org.apache.commons.jxpath.ri.model.NodePointer,
+     *      org.apache.commons.jxpath.ri.QName, java.lang.Object)
+     */
+    public NodePointer createNodePointer(NodePointer parent, QName name,
+            Object object) {
+        return createNodePointer(name, object, null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.jxpath.ri.model.NodePointerFactory#getOrder()
+     */
+    public int getOrder() {
+        return VARIABLE_POINTER_FACTORY_ORDER;
+    }
+
+}

Propchange: 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/VariablePointerFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to