You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by dm...@apache.org on 2003/06/17 03:39:52 UTC
cvs commit: jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans BeanPropertyPointer.java
dmitri 2003/06/16 18:39:51
Modified: jxpath/src/java/org/apache/commons/jxpath/util
ValueUtils.java
jxpath/src/test/org/apache/commons/jxpath/ri/model/beans
BeanModelTest.java
jxpath/src/java/org/apache/commons/jxpath/ri/model/beans
BeanPropertyPointer.java
Added: jxpath/src/test/org/apache/commons/jxpath/ri/model/beans
TestIndexedPropertyBean.java
Log:
Added support for indexed properties that don't have
a method that returns the whole collection.
Revision Changes Path
1.16 +54 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/util/ValueUtils.java
Index: ValueUtils.java
===================================================================
RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/util/ValueUtils.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- ValueUtils.java 11 Mar 2003 00:59:34 -0000 1.15
+++ ValueUtils.java 17 Jun 2003 01:39:51 -0000 1.16
@@ -64,6 +64,7 @@
import java.beans.IndexedPropertyDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
@@ -86,6 +87,7 @@
*/
public class ValueUtils {
private static Map dynamicPropertyHandlerMap = new HashMap();
+ private static final int UNKNOWN_LENGTH_MAX_COUNT = 16000;
/**
* Returns true if the object is an array or a Collection
@@ -131,6 +133,42 @@
return 0;
}
+
+ /**
+ * If there is a regular non-indexed read method for this property,
+ * uses this method to obtain the collection and then returns its
+ * length.
+ * Otherwise, attempts to guess the length of the collection by
+ * calling the indexed get method repeatedly. The method is supposed
+ * to throw an exception if the index is out of bounds.
+ */
+ public static int getIndexedPropertyLength(
+ Object object,
+ IndexedPropertyDescriptor pd)
+ {
+ if (pd.getReadMethod() != null) {
+ return getLength(getValue(object, pd));
+ }
+
+ Method readMethod = pd.getIndexedReadMethod();
+ if (readMethod == null) {
+ throw new JXPathException(
+ "No indexed read method for property " + pd.getName());
+ }
+
+ for (int i = 0; i < UNKNOWN_LENGTH_MAX_COUNT; i++) {
+ try {
+ readMethod.invoke(object, new Object[] { new Integer(i)});
+ }
+ catch (Throwable t) {
+ return i;
+ }
+ }
+
+ throw new JXPathException(
+ "Cannot determine the length of the indexed property "
+ + pd.getName());
+ }
/**
* Returns the length of the supplied collection. If the supplied object
@@ -422,8 +460,19 @@
bean,
new Object[] { new Integer(index)});
}
+ }
+ catch (InvocationTargetException ex) {
+ Throwable t =
+ ((InvocationTargetException) ex).getTargetException();
+ if (t instanceof ArrayIndexOutOfBoundsException) {
+ return null;
+ }
+
+ throw new JXPathException(
+ "Cannot access property: " + propertyDescriptor.getName(),
+ t);
}
- catch (Exception ex) {
+ catch (Throwable ex) {
throw new JXPathException(
"Cannot access property: " + propertyDescriptor.getName(),
ex);
@@ -461,7 +510,6 @@
}
}
catch (Exception ex) {
- ex.printStackTrace();
throw new RuntimeException(
"Cannot access property: "
+ propertyDescriptor.getName()
1.5 +17 -4 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/beans/BeanModelTest.java
Index: BeanModelTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/beans/BeanModelTest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- BeanModelTest.java 11 Mar 2003 00:59:38 -0000 1.4
+++ BeanModelTest.java 17 Jun 2003 01:39:51 -0000 1.5
@@ -65,6 +65,7 @@
import junit.framework.TestSuite;
import org.apache.commons.jxpath.AbstractFactory;
+import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.TestBean;
import org.apache.commons.jxpath.ri.model.BeanModelTestCase;
@@ -99,5 +100,17 @@
protected AbstractFactory getAbstractFactory() {
return new TestBeanFactory();
}
+
+ public void testIndexedProperty() {
+ JXPathContext context =
+ JXPathContext.newContext(null, new TestIndexedPropertyBean());
+
+ assertXPathValueAndPointer(
+ context,
+ "indexed[1]",
+ new Integer(0),
+ "/indexed[1]");
+ }
+
}
1.1 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/beans/TestIndexedPropertyBean.java
Index: TestIndexedPropertyBean.java
===================================================================
/*
* $Header: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/beans/TestIndexedPropertyBean.java,v 1.1 2003/06/17 01:39:51 dmitri Exp $
* $Revision: 1.1 $
* $Date: 2003/06/17 01:39:51 $
*
* ====================================================================
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, Plotnix, Inc,
* <http://www.plotnix.com/>.
* For more information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.jxpath.ri.model.beans;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.jxpath.util.ValueUtils;
/**
* Test bean for JUnit tests of indexed property handling.
*
* @author Dmitri Plotnikov
* @version $Revision: 1.1 $ $Date: 2003/06/17 01:39:51 $
*/
public class TestIndexedPropertyBean {
public int getIndexed(int i) {
if (i >= 2) {
throw new ArrayIndexOutOfBoundsException(i);
}
return i;
}
}
1.14 +25 -10 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/BeanPropertyPointer.java
Index: BeanPropertyPointer.java
===================================================================
RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/BeanPropertyPointer.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- BeanPropertyPointer.java 11 Mar 2003 00:59:24 -0000 1.13
+++ BeanPropertyPointer.java 17 Jun 2003 01:39:51 -0000 1.14
@@ -61,6 +61,7 @@
*/
package org.apache.commons.jxpath.ri.model.beans;
+import java.beans.IndexedPropertyDescriptor;
import java.beans.PropertyDescriptor;
import org.apache.commons.jxpath.JXPathBeanInfo;
@@ -84,6 +85,8 @@
private static final Object UNINITIALIZED = new Object();
private Object baseValue = UNINITIALIZED;
private Object value = UNINITIALIZED;
+
+ private static final int UNKNOWN_LENGTH_MAX_COUNT = 10000;
public BeanPropertyPointer(NodePointer parent, JXPathBeanInfo beanInfo) {
super(parent);
@@ -174,15 +177,17 @@
*/
public Object getImmediateNode() {
if (value == UNINITIALIZED) {
- Object baseValue = getBaseValue();
if (index == WHOLE_COLLECTION) {
- value = baseValue;
- }
- else if (value != null && index >= 0 && index < getLength()) {
- value = ValueUtils.getValue(baseValue, index);
+ value = getBaseValue();
}
else {
- value = null;
+ PropertyDescriptor pd = getPropertyDescriptor();
+ if (pd == null) {
+ value = null;
+ }
+ else {
+ value = ValueUtils.getValue(getBean(), pd, index);
+ }
}
}
return value;
@@ -198,6 +203,10 @@
return false;
}
+ if (pd instanceof IndexedPropertyDescriptor) {
+ return true;
+ }
+
int hint = ValueUtils.getCollectionHint(pd.getPropertyType());
if (hint == -1) {
return false;
@@ -218,6 +227,12 @@
PropertyDescriptor pd = getPropertyDescriptor();
if (pd == null) {
return 1;
+ }
+
+ if (pd instanceof IndexedPropertyDescriptor) {
+ return ValueUtils.getIndexedPropertyLength(
+ getBean(),
+ (IndexedPropertyDescriptor) pd);
}
int hint = ValueUtils.getCollectionHint(pd.getPropertyType());
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org