Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 47810 invoked from network); 1 Mar 2010 08:14:04 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 1 Mar 2010 08:14:04 -0000 Received: (qmail 88818 invoked by uid 500); 28 Feb 2010 18:47:25 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 88767 invoked by uid 500); 28 Feb 2010 18:47:25 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 88760 invoked by uid 99); 28 Feb 2010 18:47:25 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 28 Feb 2010 18:47:25 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 28 Feb 2010 18:47:23 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 47EE5238897F; Sun, 28 Feb 2010 18:47:01 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r917247 - in /commons/proper/jxpath/trunk/src: java/org/apache/commons/jxpath/ java/org/apache/commons/jxpath/ri/ java/org/apache/commons/jxpath/ri/model/ java/org/apache/commons/jxpath/ri/model/beans/ test/org/apache/commons/jxpath/ri/ Date: Sun, 28 Feb 2010 18:47:01 -0000 To: commits@commons.apache.org From: mbenson@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100228184701.47EE5238897F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mbenson Date: Sun Feb 28 18:47:00 2010 New Revision: 917247 URL: http://svn.apache.org/viewvc?rev=917247&view=rev Log: [JXPATH-131] Exception handling Added: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java (with props) commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java (with props) Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/JXPathContext.java commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java Added: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java?rev=917247&view=auto ============================================================================== --- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java (added) +++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java Sun Feb 28 18:47:00 2010 @@ -0,0 +1,30 @@ +/* + * 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; + +/** + * Exception handler interface. Actually handles Throwables. + * @since 1.4 + */ +public interface ExceptionHandler { + /** + * Handle an encountered Throwable. + * @param t to handle + * @param ptr specific context + */ + void handle(Throwable t, Pointer ptr); +} Propchange: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ExceptionHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/JXPathContext.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/JXPathContext.java?rev=917247&r1=917246&r2=917247&view=diff ============================================================================== --- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/JXPathContext.java (original) +++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/JXPathContext.java Sun Feb 28 18:47:00 2010 @@ -944,4 +944,13 @@ "Namespace registration is not implemented by " + getClass()); } + /** + * Set the ExceptionHandler used by this context, if any. + * @param exceptionHandler to set + * @since 1.4 + */ + public void setExceptionHandler(ExceptionHandler exceptionHandler) { + throw new UnsupportedOperationException( + "ExceptionHandler registration is not implemented by " + getClass()); + } } Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java?rev=917247&r1=917246&r2=917247&view=diff ============================================================================== --- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java (original) +++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java Sun Feb 28 18:47:00 2010 @@ -28,6 +28,7 @@ import java.util.Map.Entry; import org.apache.commons.jxpath.CompiledExpression; +import org.apache.commons.jxpath.ExceptionHandler; import org.apache.commons.jxpath.Function; import org.apache.commons.jxpath.Functions; import org.apache.commons.jxpath.JXPathContext; @@ -802,6 +803,15 @@ } /** + * {@inheritDoc} + */ + public void setExceptionHandler(ExceptionHandler exceptionHandler) { + if (rootPointer instanceof NodePointer) { + ((NodePointer) rootPointer).setExceptionHandler(exceptionHandler); + } + } + + /** * Checks if existenceCheckClass exists on the class path. If so, allocates * an instance of the specified class, otherwise returns null. * @param className to instantiate Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java?rev=917247&r1=917246&r2=917247&view=diff ============================================================================== --- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java (original) +++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java Sun Feb 28 18:47:00 2010 @@ -20,6 +20,7 @@ import java.util.Locale; import org.apache.commons.jxpath.AbstractFactory; +import org.apache.commons.jxpath.ExceptionHandler; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.JXPathException; import org.apache.commons.jxpath.NodeSet; @@ -44,6 +45,9 @@ */ public abstract class NodePointer implements Pointer { + /** Serialization version */ + private static final long serialVersionUID = 8117201322861007777L; + /** Whole collection index. */ public static final int WHOLE_COLLECTION = Integer.MIN_VALUE; @@ -55,6 +59,7 @@ private boolean attribute = false; private NamespaceResolver namespaceResolver; + private ExceptionHandler exceptionHandler; private transient Object rootNode; /** @@ -806,6 +811,39 @@ } /** + * Set the exceptionHandler of this NodePointer. + * @param exceptionHandler the ExceptionHandler to set + */ + public void setExceptionHandler(ExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + } + + /** + * Handle a Throwable using an installed ExceptionHandler, if available. + * Public to facilitate calling for RI support; not truly intended for public consumption. + * @param t to handle + * @param originator context + */ + public void handle(Throwable t, NodePointer originator) { + if (exceptionHandler != null) { + exceptionHandler.handle(t, originator); + return; + } + if (parent != null) { + parent.handle(t, originator); + } + } + + /** + * Handle a Throwable using an installed ExceptionHandler, if available. + * Public to facilitate calling for RI support; not truly intended for public consumption. + * @param t to handle + */ + public void handle(Throwable t) { + handle(t, this); + } + + /** * Return a string escaping single and double quotes. * @param string string to treat * @return string with any necessary changes made. Modified: commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java?rev=917247&r1=917246&r2=917247&view=diff ============================================================================== --- commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java (original) +++ commons/proper/jxpath/trunk/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java Sun Feb 28 18:47:00 2010 @@ -120,8 +120,8 @@ try { return propertyNodePointer.getValuePointer(); } - catch (Throwable ex) { - // @todo: should this exception be reported in any way? + catch (Throwable t) { + propertyNodePointer.handle(t); NullPropertyPointer npp = new NullPropertyPointer( propertyNodePointer.getImmediateParentPointer()); @@ -318,7 +318,7 @@ length = propertyNodePointer.getLength(); // TBD: cache length } catch (Throwable t) { - // @todo: should this exception be reported in any way? + propertyNodePointer.handle(t); length = 0; } return length; Added: commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java URL: http://svn.apache.org/viewvc/commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java?rev=917247&view=auto ============================================================================== --- commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java (added) +++ commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java Sun Feb 28 18:47:00 2010 @@ -0,0 +1,90 @@ +/* + * 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; + +import org.apache.commons.jxpath.ExceptionHandler; +import org.apache.commons.jxpath.JXPathContext; +import org.apache.commons.jxpath.JXPathTestCase; +import org.apache.commons.jxpath.Pointer; + +/** + * Test simple ExceptionHandler. + */ +public class ExceptionHandlerTest extends JXPathTestCase { + public static class Bar { + public Object getBaz() { + throw new IllegalStateException("baz unavailable"); + } + } + + private JXPathContext context; + private Bar bar = new Bar(); + + public void setUp() throws Exception { + context = JXPathContext.newContext(this); + context.setExceptionHandler(new ExceptionHandler() { + + public void handle(Throwable t, Pointer ptr) { + if (t instanceof Error) { + throw (Error) t; + } + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new RuntimeException(t); + } + }); + } + + public Object getFoo() { + throw new IllegalStateException("foo unavailable"); + } + + public void testHandleFoo() throws Exception { + try { + context.getValue("foo"); + fail("expected Throwable"); + } catch (Throwable t) { + while (t != null) { + if ("foo unavailable".equals(t.getMessage())) { + return; + } + t = t.getCause(); + } + fail("expected \"foo unavailable\" in throwable chain"); + } + } + + public void testHandleBarBaz() throws Exception { + try { + context.getValue("bar/baz"); + fail("expected Throwable"); + } catch (Throwable t) { + while (t != null) { + if ("baz unavailable".equals(t.getMessage())) { + return; + } + t = t.getCause(); + } + fail("expected \"baz unavailable\" in throwable chain"); + } + } + + public Bar getBar() { + return bar; + } +} Propchange: commons/proper/jxpath/trunk/src/test/org/apache/commons/jxpath/ri/ExceptionHandlerTest.java ------------------------------------------------------------------------------ svn:eol-style = native