You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by mb...@apache.org on 2007/01/10 23:55:00 UTC

svn commit: r495025 - in /jakarta/commons/proper/jxpath/trunk/src: java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java

Author: mbenson
Date: Wed Jan 10 14:54:59 2007
New Revision: 495025

URL: http://svn.apache.org/viewvc?view=rev&rev=495025
Log:
[JXPATH-68] Throw meaningful exception when imminent stack overflow is detected

Added:
    jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java   (with props)
Modified:
    jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java

Modified: jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java?view=diff&rev=495025&r1=495024&r2=495025
==============================================================================
--- jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java (original)
+++ jakarta/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java Wed Jan 10 14:54:59 2007
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.jxpath.ri.model.beans;
 
+import org.apache.commons.jxpath.AbstractFactory;
+import org.apache.commons.jxpath.JXPathAbstractFactoryException;
 import org.apache.commons.jxpath.JXPathContext;
 import org.apache.commons.jxpath.JXPathInvalidAccessException;
 import org.apache.commons.jxpath.ri.QName;
@@ -106,12 +108,15 @@
             return newParent.createAttribute(context, getName());
         }
         else {
+            if (parent instanceof NullPointer && parent.equals(newParent)) {
+                throw createBadFactoryException(context.getFactory());
+            }
             // Consider these two use cases:
             // 1. The parent pointer of NullPropertyPointer is 
             //    a PropertyOwnerPointer other than NullPointer. When we call 
             //    createPath on it, it most likely returns itself. We then
             //    take a PropertyPointer from it and get the PropertyPointer
-            //    to expand the collection for the corresponsing property.
+            //    to expand the collection for the corresponding property.
             //
             // 2. The parent pointer of NullPropertyPointer is a NullPointer.
             //    When we call createPath, it may return a PropertyOwnerPointer
@@ -135,6 +140,9 @@
             return pointer;
         }
         else {
+            if (parent instanceof NullPointer && parent.equals(newParent)) {
+                throw createBadFactoryException(context.getFactory());
+            }
             if (newParent instanceof PropertyOwnerPointer) {
                 PropertyOwnerPointer pop = (PropertyOwnerPointer) newParent;
                 newParent = pop.getPropertyPointer();
@@ -220,5 +228,11 @@
             index = string.indexOf('\"');
         }
         return string;
+    }
+
+    private JXPathAbstractFactoryException createBadFactoryException(AbstractFactory factory) {
+        return new JXPathAbstractFactoryException("Factory " + factory
+                + " reported success creating object for path: " + asPath()
+                + " but object was null.  Terminating to avoid stack recursion.");
     }
 }

Added: jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java?view=auto&rev=495025
==============================================================================
--- jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java (added)
+++ jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java Wed Jan 10 14:54:59 2007
@@ -0,0 +1,68 @@
+/*
+ * 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.beans;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.jxpath.AbstractFactory;
+import org.apache.commons.jxpath.JXPathAbstractFactoryException;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.JXPathException;
+import org.apache.commons.jxpath.Pointer;
+
+/**
+ * Badly-implemented Factory test.  From JIRA JXPATH-68.
+ *
+ * @author Matt Benson
+ * @version $Revision:$ $Date:$
+ */
+public class BadlyImplementedFactoryTest extends TestCase {
+
+    private JXPathContext context;
+
+    /**
+     * Construct a new instance of this test case.
+     *
+     * @param name Name of the test case
+     */
+    public BadlyImplementedFactoryTest(String name) {
+        super(name);
+    }
+
+    public void setUp() {
+        context = JXPathContext.newContext(new HashMap());
+        context.setFactory(new AbstractFactory() {
+            public boolean createObject(JXPathContext context, Pointer pointer, Object parent, String name, int index) {
+                ((Map) parent).put(name, null);
+                return true;
+            }
+        });
+    }
+
+    public void testBadFactoryImplementation() {
+        try {
+            context.createPath("foo/bar");
+            fail("should fail with JXPathException caused by JXPathAbstractFactoryException");
+        } catch (JXPathException e) {
+            assertTrue(e.getCause() instanceof JXPathAbstractFactoryException);
+        }
+    }
+
+}

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

Propchange: jakarta/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/model/beans/BadlyImplementedFactoryTest.java
------------------------------------------------------------------------------
    svn:executable = *



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org