You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by db...@apache.org on 2007/05/31 05:53:45 UTC

svn commit: r543043 - in /geronimo/xbean/trunk/xbean-reflect/src: main/java/org/apache/xbean/recipe/ test/java/org/apache/xbean/recipe/

Author: dblevins
Date: Wed May 30 20:53:44 2007
New Revision: 543043

URL: http://svn.apache.org/viewvc?view=rev&rev=543043
Log:
Support for private properties hidden by identically named child properties

Added:
    geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Child.java
    geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/HiddenPropertiesTest.java
    geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Parent.java
Modified:
    geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java

Modified: geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java?view=diff&rev=543043&r1=543042&r2=543043
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java (original)
+++ geronimo/xbean/trunk/xbean-reflect/src/main/java/org/apache/xbean/recipe/ObjectRecipe.java Wed May 30 20:53:44 2007
@@ -593,6 +593,26 @@
         if (propertyName == null) throw new NullPointerException("name is null");
         if (propertyName.length() == 0) throw new IllegalArgumentException("name is an empty string");
 
+        if (propertyName.contains("/")){
+            String[] strings = propertyName.split("/");
+            if (strings == null || strings.length != 2) throw new IllegalArgumentException("badly formed <class>/<attribute> property name: " + propertyName);
+
+            String className = strings[0];
+            propertyName = strings[1];
+
+            boolean found = false;
+            while(!typeClass.equals(Object.class) && !found){
+                if (typeClass.getName().equals(className)){
+                    found = true;
+                    break;
+                } else {
+                    typeClass = typeClass.getSuperclass();
+                }
+            }
+
+            if (!found) throw new MissingAccessorException("Type not assignable to class: " + className, -1);
+        }
+
         String setterName = "set" + Character.toUpperCase(propertyName.charAt(0));
         if (propertyName.length() > 0) {
             setterName += propertyName.substring(1);
@@ -713,6 +733,26 @@
         int matchLevel = 0;
         MissingAccessorException missException = null;
 
+        if (propertyName.contains("/")){
+            String[] strings = propertyName.split("/");
+            if (strings == null || strings.length != 2) throw new IllegalArgumentException("badly formed <class>/<attribute> property name: " + propertyName);
+
+            String className = strings[0];
+            propertyName = strings[1];
+
+            boolean found = false;
+            while(!typeClass.equals(Object.class) && !found){
+                if (typeClass.getName().equals(className)){
+                    found = true;
+                    break;
+                } else {
+                    typeClass = typeClass.getSuperclass();
+                }
+            }
+
+            if (!found) throw new MissingAccessorException("Type not assignable to class: " + className, -1);
+        }
+        
         List<Field> fields = new ArrayList<Field>(Arrays.asList(typeClass.getDeclaredFields()));
         Class parent = typeClass.getSuperclass();
         while (parent != null){

Added: geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Child.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Child.java?view=auto&rev=543043
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Child.java (added)
+++ geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Child.java Wed May 30 20:53:44 2007
@@ -0,0 +1,45 @@
+/**
+ * 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.xbean.recipe;
+
+import java.net.URL;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Child extends Parent {
+
+    private String childColor;
+    private String name;
+    private URL website;
+
+    public String getChildColor() {
+        return childColor;
+    }
+
+    public void setColor(String color) {
+        this.childColor = color;
+    }
+
+    public String getChildName() {
+        return name;
+    }
+
+    public URL getWebsite() {
+        return website;
+    }
+}

Added: geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/HiddenPropertiesTest.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/HiddenPropertiesTest.java?view=auto&rev=543043
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/HiddenPropertiesTest.java (added)
+++ geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/HiddenPropertiesTest.java Wed May 30 20:53:44 2007
@@ -0,0 +1,49 @@
+/**
+ * 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.xbean.recipe;
+
+import junit.framework.TestCase;
+
+import java.net.URL;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HiddenPropertiesTest extends TestCase {
+
+    public void test() throws Exception {
+        ObjectRecipe recipe = new ObjectRecipe(Child.class);
+        recipe.setProperty("age", 10);
+        recipe.setProperty("website", "http://foo.com");
+        recipe.setProperty(Child.class.getName()+"/name", "TheChild");
+        recipe.setProperty(Parent.class.getName()+"/name", "TheParent");
+        recipe.setProperty(Child.class.getName()+"/color", "Red");
+        recipe.setProperty(Parent.class.getName()+"/color", "Blue");
+
+        recipe.allow(Option.FIELD_INJECTION);
+        recipe.allow(Option.PRIVATE_PROPERTIES);
+
+        Child child = (Child) recipe.create();
+
+        assertEquals("Child.getChildName()", "TheChild", child.getChildName());
+        assertEquals("Child.getParentName()", "TheParent", child.getParentName());
+        assertEquals("Child.getChildColor()", "Red", child.getChildColor());
+        assertEquals("Child.getParentColor()", "Blue", child.getParentColor());
+        assertEquals("Child.getWebsite()", new URL("http://foo.com"), child.getWebsite());
+        assertEquals("Child.getAge()", 10, child.getAge());
+    }
+}

Added: geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Parent.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Parent.java?view=auto&rev=543043
==============================================================================
--- geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Parent.java (added)
+++ geronimo/xbean/trunk/xbean-reflect/src/test/java/org/apache/xbean/recipe/Parent.java Wed May 30 20:53:44 2007
@@ -0,0 +1,43 @@
+/**
+ * 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.xbean.recipe;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Parent {
+
+    private String parentColor;
+    private String name;
+    private int age;
+
+    public String getParentColor() {
+        return parentColor;
+    }
+
+    private void setColor(String color) {
+        this.parentColor = color;
+    }
+
+    public String getParentName() {
+        return name;
+    }
+
+    public int getAge() {
+        return age;
+    }
+}