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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]