Author: kylem Date: Tue Jan 4 15:30:48 2005 New Revision: 124170 URL: http://svn.apache.org/viewcvs?view=rev&rev=124170 Log: Initial checkpoint of work towards support for XML-based persistance of Controls using the java.beans.XMLEncoder persistence framework included as part of the JDK. Includes a PersistenceDelegate implementation for Controls that has optimized support for encoding all instance-level properties, as well as any relationship to an AnnotatedElementMap (i.e. field or class level annotations). Still to be done are persistance of any associated impl, its nested controls, and reconstruction of listener relationships.
Added: incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java Modified: incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo Modified: incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java&r1=124169&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java (original) +++ incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BaseMap.java Tue Jan 4 15:30:48 2005 @@ -139,6 +139,15 @@ } /** + * Returns a delegate base property map from which values will be derived if not found within + * the local property map. + */ + public PropertyMap getDelegateMap() + { + return _delegateMap; + } + + /** * Returns the property value specified by 'key' within this map. */ public Object getProperty(PropertyKey key) Modified: incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java&r1=124169&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java (original) +++ incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/BeanPropertyMap.java Tue Jan 4 15:30:48 2005 @@ -24,6 +24,7 @@ import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.HashSet; +import java.util.Set; import java.util.Iterator; @@ -174,6 +175,13 @@ // return super.containsPropertySet(propertySet); } + + /** + * Returns the set of PropertyKeys that are locally set in this property map. Note: + * this <b>does not</b> include any properties that might be set as a result of + * property lookup delegation. + */ + public Set<PropertyKey> getPropertyKeys() { return _properties.keySet(); } // local default annotation value, only set if annot constructor form is used Annotation _annot; Modified: incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java&r1=124169&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java (original) +++ incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyKey.java Tue Jan 4 15:30:48 2005 @@ -105,6 +105,11 @@ public int hashCode() { return _hashCode; } + public String toString() + { + return "PropertyKey: " + _propertySet.getName() + "." + _propertyName; + } + public Class<? extends Annotation> getPropertySet() { return _propertySet; } public String getPropertyName() { return _propertyName; } public Class getPropertyType() { return _propertyType; } Modified: incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java&r1=124169&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java (original) +++ incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/properties/PropertyMap.java Tue Jan 4 15:30:48 2005 @@ -49,6 +49,12 @@ public void setDelegateMap(PropertyMap delegateMap); /** + * Returns a delegate base property map from which values will be derived if not found within + * the local property map. + */ + public PropertyMap getDelegateMap(); + + /** * Sets the property specifed by 'key' within this map. */ public void setProperty(PropertyKey key, Object value); Modified: incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r1=124169&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java (original) +++ incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java Tue Jan 4 15:30:48 2005 @@ -658,7 +658,7 @@ /** * Returns the property map containing the properties for the bean */ - /* package */ PropertyMap getPropertyMap() + /* package */ BeanPropertyMap getPropertyMap() { return _properties; } @@ -889,7 +889,7 @@ /** * Contains the per-instance properties set for this ControlBean. */ - private PropertyMap _properties; + private BeanPropertyMap _properties; /** END unsynchronized fields */ Added: incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java?view=auto&rev=124170 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java Tue Jan 4 15:30:48 2005 @@ -0,0 +1,180 @@ +package org.apache.beehive.controls.runtime.bean; +/* + * Copyright 2004 The Apache Software Foundation. + * + * Licensed 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. + * + * $Header:$ + */ + +import java.beans.BeanInfo; +import java.beans.DefaultPersistenceDelegate; +import java.beans.Encoder; +import java.beans.Expression; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PersistenceDelegate; +import java.beans.PropertyDescriptor; +import java.beans.Statement; +import java.util.Set; + +import org.apache.beehive.controls.api.ControlException; +import org.apache.beehive.controls.api.properties.AnnotatedElementMap; +import org.apache.beehive.controls.api.properties.BeanPropertyMap; +import org.apache.beehive.controls.api.properties.PropertyKey; +import org.apache.beehive.controls.api.properties.PropertyMap; + +/** + * The ControlPersistenceDelegate class supports the XML persistance of Control JavaBeans by + * implementing the <code>java.beans.PersistenceDelegate</b> API, and overriding the default + * persistance algorithm based upon the runtime structure for Controls. + * <p> + * The ControlPersistanceDelegate class implements optimized property persistence based upon the + * fact that the ControlBean already has a map containing all non-default property state. Rather + * than using the standard (and slower) algorithm of comparing the encoding instance against a + * 'clean' instance, the delegate can simply retrieve the map and persist the values contained + * within it. + * <p> + * <b>STILL TO BE IMPLEMENTED ARE SUPPORT FOR LISTENER, IMPL INSTANCE, AND NESTED CONTROL + * ENCODING<b> + */ +public class ControlPersistenceDelegate extends DefaultPersistenceDelegate +{ + /** + * The AnnotatedElementMapPersistenceDelegate is an XMLEncoder PersistenceDelegate for + * the <code>org.apache.beehive.controls.api.properties.AnnotatedElementMap</code> + * class. + */ + private class AnnotatedElementMapPersistenceDelegate extends PersistenceDelegate + { + protected Expression instantiate(Object oldInstance, Encoder out) + { + AnnotatedElementMap aem = (AnnotatedElementMap)oldInstance; + return new Expression(aem, aem.getClass(), "new", + new Object [] { aem.getAnnotatedElement() }); + } + } + + protected Expression instantiate(Object oldInstance, Encoder out) + { + System.err.println("ControlPersistenceDelegate instantiate(): " + oldInstance); + ControlBean control = (ControlBean)oldInstance; + + // + // See if the ControlBean has any associated PropertyMap in its delegation chain + // that was derived from an AnnotatedElement so this relationship (and any associated + // external config delegates) will be restored as part of the decoding process. + // + // BUGBUG: What about a user-created PropertyMap that was passed into the constructor? + // + AnnotatedElementMap aem = null; + PropertyMap pMap = control.getPropertyMap(); + while (pMap != null) + { + if (pMap instanceof AnnotatedElementMap) + { + aem = (AnnotatedElementMap)pMap; + + // + // Ensure that there is a persistance delegate for the map + // + out.setPersistenceDelegate(AnnotatedElementMap.class, + new AnnotatedElementMapPersistenceDelegate()); + break; + } + + pMap = pMap.getDelegateMap(); + } + + + // + // Create a constructor that that uses the following form: + // new <BeanClass>(ControlBeanContext cbc, String id, PropertyMap map) + // The context is set to null, so the current active container context will be + // used, the id will be the ID of the original control and the map will be + // any AnnotatedElementMap that was passed into the original constructor. + // + return new Expression(control, control.getClass(), "new", + new Object [] {null, control.getLocalID(), aem}); + } + + /** + * PersistenceDelegate.initialize() + */ + protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) + { + System.err.println("ControlPersistenceDelegate initialize(): " + oldInstance); + + // + // Get the bean and associated beanInfo for the source instance + // + ControlBean control = (ControlBean)oldInstance; + BeanInfo beanInfo; + try + { + beanInfo = Introspector.getBeanInfo(control.getClass()); + } + catch (IntrospectionException ie) + { + throw new ControlException("Unable to locate BeanInfo", ie); + } + //super.initialize(type, control, newInstance, out); + + // + // The default implementation of property persistance will use BeanInfo to incrementally + // compare oldInstance property values to newInstance property values. Because the + // bean instance PropertyMap holds only the values that have been modified, this process + // can be optimized by directly writing out only the properties found in the map. + // + BeanPropertyMap beanMap = control.getPropertyMap(); + PropertyDescriptor [] propDescriptors = beanInfo.getPropertyDescriptors(); + for (PropertyKey pk : beanMap.getPropertyKeys()) + { + // + // Locate the PropertyDescriptor for the modified property, and use it to write + // the property value to the encoder stream + // + String propName = pk.getPropertyName(); + boolean found = false; + for (int i = 0; i < propDescriptors.length; i++) + { + if (propName.equals(propDescriptors[i].getName())) + { + found = true; + + // Only write the property if it is not flagged as transient + Object transientVal = propDescriptors[i].getValue("transient"); + if (transientVal == null || transientVal.equals(Boolean.FALSE)) + { + out.writeStatement( + new Statement(oldInstance, + propDescriptors[i].getWriteMethod().getName(), + new Object [] {beanMap.getProperty(pk)})); + } + } + } + if (found == false) + { + throw new ControlException("Unknown property in bean PropertyMap: " + pk); + } + } + } + + /** + * PersistenceDelegate.writeObject() + */ + public void writeObject(Object oldInstance, Encoder out) + { + super.writeObject(oldInstance, out); + } +} Modified: incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm&r1=124169&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm (original) +++ incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm Tue Jan 4 15:30:48 2005 @@ -63,6 +63,7 @@ import java.util.HashMap; import org.apache.beehive.controls.api.ControlException; +import org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate; public class ${bean.shortName}BeanInfo #if ($intf.superClass) @@ -90,6 +91,16 @@ bd.setName("$bean.shortName"); bd.setDisplayName("$bean.shortName"); #end + + // + // The org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate class + // implements the XMLDecode delegation model for all Control JavaBean types. It + // provides optimized XML persistance based upon the Control runtime architecture. + // The 'persistenceDelegate' attribute of a BeanDescriptor is used by XMLEncoder to + // locate a delegate for a particular JavaBean type. + // + bd.setValue("persistenceDelegate", new ControlPersistenceDelegate()); + return bd; } Modified: incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java&r1=124169&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java (original) +++ incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/ControlIntrospector.java Tue Jan 4 15:30:48 2005 @@ -160,17 +160,24 @@ SortedSet<String> sortedNames = new TreeSet<String>(); while (attrNames.hasMoreElements()) sortedNames.add(attrNames.nextElement()); - printf("<attributes>"); + printf("<attributes>\n"); indent(); { for (String attrName: sortedNames) { + // Convert the attribute value to a String, but drop any object ID + // that is going to fail an equivalence comparison + String attrValue = featureDesc.getValue(attrName).toString(); + int atIndex = attrValue.indexOf('@'); + if (atIndex > 0) + attrValue = attrValue.substring(0, atIndex+1); + printf("<attribute name=\"%s\" value=\"%s\">\n", - attrName, featureDesc.getValue(attrName.toString())); + attrName, attrValue); } } unindent(); - printf("</attributes>"); + printf("</attributes>\n"); } } unindent(); Modified: incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo&r1=124169&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo (original) +++ incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo Tue Jan 4 15:30:48 2005 @@ -8,6 +8,9 @@ <short-description> </short-description> + <attributes> + <attribute name="persistenceDelegate" value="org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate@"> + </attributes> </feature-descriptor> <bean-class> org.apache.beehive.controls.test.controls.beaninfo.InfoTestBean Modified: incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo&r1=124169&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo (original) +++ incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo Tue Jan 4 15:30:48 2005 @@ -8,6 +8,9 @@ <short-description> Ext1Bean </short-description> + <attributes> + <attribute name="persistenceDelegate" value="org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate@"> + </attributes> </feature-descriptor> <bean-class> org.apache.beehive.controls.test.controls.inherit.Ext1Bean Modified: incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo&r1=124169&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo (original) +++ incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo Tue Jan 4 15:30:48 2005 @@ -8,6 +8,9 @@ <short-description> Ext2Bean </short-description> + <attributes> + <attribute name="persistenceDelegate" value="org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate@"> + </attributes> </feature-descriptor> <bean-class> org.apache.beehive.controls.test.controls.inherit.Ext2Bean Modified: incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo&r1=124169&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo (original) +++ incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo Tue Jan 4 15:30:48 2005 @@ -8,6 +8,9 @@ <short-description> Intf1Bean </short-description> + <attributes> + <attribute name="persistenceDelegate" value="org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate@"> + </attributes> </feature-descriptor> <bean-class> org.apache.beehive.controls.test.controls.inherit.Intf1Bean Modified: incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo?view=diff&rev=124170&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo&r1=124169&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo&r2=124170 ============================================================================== --- incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo (original) +++ incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo Tue Jan 4 15:30:48 2005 @@ -8,6 +8,9 @@ <short-description> Intf2Bean </short-description> + <attributes> + <attribute name="persistenceDelegate" value="org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate@"> + </attributes> </feature-descriptor> <bean-class> org.apache.beehive.controls.test.controls.inherit.Intf2Bean
