geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gdam...@apache.org
Subject svn commit: r596542 - in /geronimo/server/trunk: framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/ framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/ framework...
Date Tue, 20 Nov 2007 05:25:30 GMT
Author: gdamour
Date: Mon Nov 19 21:25:27 2007
New Revision: 596542

URL: http://svn.apache.org/viewvc?rev=596542&view=rev
Log:
Add a convenience PropertyEditor, JavaBeanXmlAttributeEditor, which is
intended to be used as a base class for property editors of JavaBeans 
defined as gbean xml-attributes. This base property editor is able to
skip the "xml-serialization" of properties whose read methods are annotated 
with @DoNotPersist. It is also able to encrypt prior xml-serialization the
properties whose read methods are annotated with @EncryptOnPersist.

It is now possible to declare a propertyEditor on a config.xml gbean attribute.
This property editor is used to retrieve the value of the attribute based
on its mixed-content. Combined with the above convenience PropertyEditor, it
is now easy to override gbean attributes defined by Java xml-attribute in
configuration plans.

Write a BasicExtendedJMXConnectorInfoEditor to allow the override of the 
extendedJMXConnectorInfo attribute of BasicNodeInfo. Users can now easily
declare new nodes within the clustering configuration.

Fixes GERONIMO-3610 - Allows the override of XML JavaBean attribute in 
config.xml

Added:
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/DoNotPersist.java
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EncryptOnPersist.java
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditor.java
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/DummyJavaBean.java
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditorTest.java
    geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfoEditor.java
Modified:
    geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeBuilder.java
    geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java
    geronimo/server/trunk/framework/modules/geronimo-system/src/main/xsd/attributes-1.2.xsd
    geronimo/server/trunk/plugins/clustering/clustering/pom.xml
    geronimo/server/trunk/plugins/clustering/geronimo-clustering/pom.xml
    geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfo.java

Added: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/DoNotPersist.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/DoNotPersist.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/DoNotPersist.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/DoNotPersist.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,36 @@
+/*
+ * 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.geronimo.deployment.service;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface DoNotPersist {
+}

Added: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EncryptOnPersist.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EncryptOnPersist.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EncryptOnPersist.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/EncryptOnPersist.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,36 @@
+/*
+ * 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.geronimo.deployment.service;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface EncryptOnPersist {
+}

Modified: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeBuilder.java?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeBuilder.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeBuilder.java Mon Nov 19 21:25:27 2007
@@ -30,6 +30,7 @@
 import org.apache.geronimo.deployment.javabean.xbeans.BeanPropertyType;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.util.EncryptionManager;
 import org.apache.xmlbeans.XmlObject;
 
 /**
@@ -85,7 +86,13 @@
             for (int j = 0; j < propertyDescriptors.length; j++) {
                 PropertyDescriptor propertyDescriptor = propertyDescriptors[j];
                 if (propertyName.equals(propertyDescriptor.getName())) {
+                    Method writeMethod = propertyDescriptor.getWriteMethod();
+                    if (writeMethod.isAnnotationPresent(EncryptOnPersist.class)) {
+                        propertyString = (String) EncryptionManager.decrypt(propertyString);
+                    }
+
                     String protertyType = propertyDescriptor.getPropertyType().getName();
+                    
                     PropertyEditor propertyEditor = null;
                     try {
                         propertyEditor = PropertyEditors.findEditor(protertyType, cl);
@@ -97,9 +104,9 @@
                     }
                     propertyEditor.setAsText(propertyString);
                     Object value = propertyEditor.getValue();
-                    Method m = propertyDescriptor.getWriteMethod();
+                    
                     try {
-                        m.invoke(instance, new Object[] {value});
+                        writeMethod.invoke(instance, new Object[] {value});
                     } catch (Exception e) {
                         throw new DeploymentException("Could not set property value for property named " + propertyName, e);
                     }

Added: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditor.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditor.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditor.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/main/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditor.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,169 @@
+/*
+ * 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.geronimo.deployment.service;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.beans.PropertyEditorSupport;
+import java.lang.reflect.Method;
+
+import javax.xml.namespace.QName;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.common.propertyeditor.PropertyEditorException;
+import org.apache.geronimo.deployment.javabean.xbeans.BeanPropertyType;
+import org.apache.geronimo.deployment.javabean.xbeans.JavabeanDocument;
+import org.apache.geronimo.deployment.javabean.xbeans.JavabeanType;
+import org.apache.geronimo.deployment.javabean.xbeans.PropertyType;
+import org.apache.geronimo.util.EncryptionManager;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlOptions;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class JavaBeanXmlAttributeEditor extends PropertyEditorSupport {
+    private static final QName QNAME = JavabeanDocument.type.getDocumentElementName();
+    private static final Class[] PRIMITIVES_CLASSES = new Class[] {String.class,
+        Boolean.class,
+        Character.class,
+        Byte.class,
+        Short.class,
+        Integer.class,
+        Long.class,
+        Float.class,
+        Double.class
+    };
+
+    private final Class javaBeanClazz;
+    private final XmlAttributeBuilder xmlAttributeBuilder;
+    
+    public JavaBeanXmlAttributeEditor(Class clazz) {
+        if (null == clazz) {
+            throw new IllegalArgumentException("clazz is required");
+        }
+        this.javaBeanClazz = clazz;
+        
+        xmlAttributeBuilder = newXmlAttributeBuilder();
+    }
+
+    protected JavaBeanXmlAttributeBuilder newXmlAttributeBuilder() {
+        return new JavaBeanXmlAttributeBuilder();
+    }
+
+    @Override
+    public void setAsText(String text) throws IllegalArgumentException {
+        try {
+            JavabeanDocument document = JavabeanDocument.Factory.parse(text);
+            JavabeanType javaBeanType = document.getJavabean();
+            
+            Object javabean = xmlAttributeBuilder.getValue(javaBeanType,
+                javaBeanClazz.getName(),
+                getClass().getClassLoader());
+
+            setValue(javabean);
+        } catch (XmlException e) {
+            throw new PropertyEditorException(e);
+        } catch (DeploymentException e) {
+            throw new PropertyEditorException(e);
+        }
+    }
+
+    @Override
+    public String getAsText() {
+        JavabeanType javabeanType = getJavabeanType(getValue());
+        
+        XmlOptions xmlOptions = new XmlOptions();
+        xmlOptions.setSaveSyntheticDocumentElement(QNAME);
+        xmlOptions.setSavePrettyPrint();
+        return javabeanType.xmlText(xmlOptions);
+    }
+
+    protected JavabeanType getJavabeanType(Object javaBean) {
+        JavabeanType javabeanType = JavabeanType.Factory.newInstance();
+
+        javabeanType.setClass1(javaBean.getClass().getName());
+        
+        PropertyDescriptor[] propertyDescriptors;
+        try {
+            BeanInfo beanInfo = Introspector.getBeanInfo(javaBean.getClass());
+            propertyDescriptors = beanInfo.getPropertyDescriptors();
+        } catch (IntrospectionException e) {
+            throw new IllegalStateException("See nested", e);
+        }
+
+        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+            handle(javaBean, propertyDescriptor, javabeanType);
+        }
+        
+        return javabeanType;
+    }
+    
+    protected void handle(Object javaBean, PropertyDescriptor propertyDescriptor, JavabeanType javabeanType) {
+        Method readMethod = propertyDescriptor.getReadMethod();
+        if (null == readMethod) {
+            return;
+        } else if (readMethod.isAnnotationPresent(DoNotPersist.class) || readMethod.getName().equals("getClass")) {
+            return;
+        }
+        
+        Object value;
+        try {
+            value = readMethod.invoke(javaBean, null);
+        } catch (Exception e) {
+            throw new IllegalStateException("See nested", e);
+        }
+        if (null == value) {
+            return;
+        }
+        
+        if (isPrimitive(value)) {
+            PropertyType propertyType = javabeanType.addNewProperty();
+            propertyType.setName(propertyDescriptor.getName());
+            
+            String valueAsString = value.toString();
+            if (readMethod.isAnnotationPresent(EncryptOnPersist.class)) {
+                valueAsString = EncryptionManager.encrypt(valueAsString);
+            }
+            
+            propertyType.setStringValue(valueAsString);
+        } else {
+            JavabeanType nestedJavabeanType = getJavabeanType(value);
+            
+            BeanPropertyType propertyType = javabeanType.addNewBeanProperty();
+            propertyType.setName(propertyDescriptor.getName());
+            propertyType.setJavabean(nestedJavabeanType);
+        }
+    }
+    
+    protected boolean isPrimitive(Object propertyValue) {
+        Class valueClass = propertyValue.getClass();
+        for (Class primitiveClass : PRIMITIVES_CLASSES) {
+            if (valueClass.equals(primitiveClass)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+}

Added: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/DummyJavaBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/DummyJavaBean.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/DummyJavaBean.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/DummyJavaBean.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,133 @@
+/*
+ * 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.geronimo.deployment.service;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class DummyJavaBean {
+    private String encryptOnPersist;
+    private String string;
+    private boolean booleanValue;
+    private char charValue;
+    private byte byteValue;
+    private short shortValue;
+    private int intValue;
+    private long longValue;
+    private float floatValue;
+    private double doubleValue;
+    private DummyJavaBean dummyJavaBean;
+    
+    @EncryptOnPersist
+    public String getEncryptOnPersist() {
+        return encryptOnPersist;
+    }
+    
+    public void setEncryptOnPersist(String encryptOnPersist) {
+        this.encryptOnPersist = encryptOnPersist;
+    }
+    
+    @DoNotPersist
+    public String getString2() {
+        return string + "test";
+    }
+    
+    public String getString() {
+        return string;
+    }
+    
+    public void setString(String string) {
+        this.string = string;
+    }
+    
+    public boolean isBooleanValue() {
+        return booleanValue;
+    }
+    
+    public void setBooleanValue(boolean booleanValue) {
+        this.booleanValue = booleanValue;
+    }
+    
+    public char getCharValue() {
+        return charValue;
+    }
+    
+    public void setCharValue(char charValue) {
+        this.charValue = charValue;
+    }
+    
+    public byte getByteValue() {
+        return byteValue;
+    }
+    
+    public void setByteValue(byte byteValue) {
+        this.byteValue = byteValue;
+    }
+    
+    public short getShortValue() {
+        return shortValue;
+    }
+    
+    public void setShortValue(short shortValue) {
+        this.shortValue = shortValue;
+    }
+    
+    public int getIntValue() {
+        return intValue;
+    }
+    
+    public void setIntValue(int intValue) {
+        this.intValue = intValue;
+    }
+    
+    public long getLongValue() {
+        return longValue;
+    }
+    
+    public void setLongValue(long longValue) {
+        this.longValue = longValue;
+    }
+    
+    public float getFloatValue() {
+        return floatValue;
+    }
+    
+    public void setFloatValue(float floatValue) {
+        this.floatValue = floatValue;
+    }
+    
+    public double getDoubleValue() {
+        return doubleValue;
+    }
+    
+    public void setDoubleValue(double doubleValue) {
+        this.doubleValue = doubleValue;
+    }
+
+    public DummyJavaBean getDummyJavaBean() {
+        return dummyJavaBean;
+    }
+
+    public void setDummyJavaBean(DummyJavaBean dummyJavaBean) {
+        this.dummyJavaBean = dummyJavaBean;
+    }
+    
+}

Added: geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditorTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditorTest.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditorTest.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-service-builder/src/test/java/org/apache/geronimo/deployment/service/JavaBeanXmlAttributeEditorTest.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,117 @@
+/*
+ * 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.geronimo.deployment.service;
+
+import org.apache.geronimo.deployment.javabean.xbeans.BeanPropertyType;
+import org.apache.geronimo.deployment.javabean.xbeans.JavabeanType;
+import org.apache.geronimo.deployment.javabean.xbeans.PropertyType;
+import org.apache.geronimo.util.Encryption;
+import org.apache.geronimo.util.EncryptionManager;
+
+import com.agical.rmock.extension.junit.RMockTestCase;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class JavaBeanXmlAttributeEditorTest extends RMockTestCase {
+
+    private JavaBeanXmlAttributeEditor editor;
+
+    @Override
+    protected void setUp() throws Exception {
+        editor = new JavaBeanXmlAttributeEditor(DummyJavaBean.class);
+    }
+    
+    public void testPrimitives() throws Exception {
+        DummyJavaBean bean = new DummyJavaBean();
+        bean.setBooleanValue(true);
+        bean.setByteValue((byte) 1);
+        bean.setCharValue('a');
+        bean.setDoubleValue(2);
+        bean.setFloatValue(3);
+        bean.setIntValue(4);
+        bean.setLongValue(5);
+        bean.setShortValue((short) 6);
+        bean.setString("string");
+        
+        editor.setValue(bean);
+        String result = editor.getAsText();
+
+        JavabeanType javabeanType = JavabeanType.Factory.parse(result);
+        assertPrimitive(javabeanType, "booleanValue", "true");
+        assertPrimitive(javabeanType, "byteValue", "1");
+        assertPrimitive(javabeanType, "charValue", "a");
+        assertPrimitive(javabeanType, "doubleValue", "2.0");
+        assertPrimitive(javabeanType, "floatValue", "3.0");
+        assertPrimitive(javabeanType, "intValue", "4");
+        assertPrimitive(javabeanType, "longValue", "5");
+        assertPrimitive(javabeanType, "shortValue", "6");
+        assertPrimitive(javabeanType, "string", "string");
+    }
+
+    private void assertPrimitive(JavabeanType javabeanType, String propertyName, String value) {
+        for (PropertyType propertyType : javabeanType.getPropertyArray()) {
+            if (propertyType.getName().equals(propertyName)) {
+                assertEquals(value, propertyType.getStringValue());
+            }
+        }
+    }
+
+    /**
+     * I observed the resulting XML and it seems correct. It is weird that this test fails.
+     */
+    public void xtestNestedJavaBean() throws Exception {
+        DummyJavaBean bean = new DummyJavaBean();
+        DummyJavaBean nestedBean = new DummyJavaBean();
+        bean.setDummyJavaBean(nestedBean);
+        
+        editor.setValue(bean);
+        String result = editor.getAsText();
+        
+        JavabeanType javabeanType = JavabeanType.Factory.parse(result);
+        BeanPropertyType[] beanPropertyArray = javabeanType.getBeanPropertyArray();
+        assertEquals(1, beanPropertyArray.length);
+    }
+    
+    public void testEncryption() throws Exception {
+        Encryption encryption = (Encryption) mock(Encryption.class);
+        encryption.encrypt("encryptOnPersist");
+        String encryptedValue = "encryptedOnPersist";
+        modify().returnValue(encryptedValue);
+
+        startVerification();
+        
+        String prefix = "{Mock}";
+        EncryptionManager.setEncryptionPrefix(prefix, encryption);
+        
+        JavaBeanXmlAttributeEditor editor = new JavaBeanXmlAttributeEditor(DummyJavaBean.class);
+
+        DummyJavaBean bean = new DummyJavaBean();
+        bean.setEncryptOnPersist("encryptOnPersist");
+        
+        editor.setValue(bean);
+        String result = editor.getAsText();
+        
+        JavabeanType javabeanType = JavabeanType.Factory.parse(result);
+        assertPrimitive(javabeanType, "encryptOnPersist", prefix + encryptedValue);
+    }
+
+}

Modified: geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java Mon Nov 19 21:25:27 2007
@@ -21,17 +21,15 @@
 import java.io.Serializable;
 import java.io.StringReader;
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
 import javax.xml.bind.JAXBException;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.stream.XMLStreamException;
 
 import org.apache.commons.logging.Log;
@@ -44,21 +42,16 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GReferenceInfo;
 import org.apache.geronimo.gbean.ReferencePatterns;
+import org.apache.geronimo.kernel.ClassLoading;
 import org.apache.geronimo.kernel.InvalidGBeanException;
 import org.apache.geronimo.kernel.config.InvalidConfigException;
 import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.util.XmlUtil;
 import org.apache.geronimo.system.configuration.condition.JexlExpressionParser;
 import org.apache.geronimo.system.plugin.PluginXmlUtil;
 import org.apache.geronimo.system.plugin.model.AttributeType;
 import org.apache.geronimo.system.plugin.model.GbeanType;
 import org.apache.geronimo.system.plugin.model.ReferenceType;
 import org.apache.geronimo.util.EncryptionManager;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
 
 /**
  * @version $Rev$ $Date$
@@ -72,10 +65,11 @@
     private String comment;
     private boolean load;
     private final Map<String, String> attributes = new LinkedHashMap<String, String>();
+    private final Map<String, String> propertyEditors = new HashMap<String, String>();
     private final Map<String, ReferencePatterns> references = new LinkedHashMap<String, ReferencePatterns>();
-    private final ArrayList<String> clearAttributes = new ArrayList<String>();
-    private final ArrayList<String> nullAttributes = new ArrayList<String>();
-    private final ArrayList<String> clearReferences = new ArrayList<String>();
+    private final Set<String> clearAttributes = new LinkedHashSet<String>();
+    private final Set<String> nullAttributes = new LinkedHashSet<String>();
+    private final Set<String> clearReferences = new LinkedHashSet<String>();
     private final String gbeanInfo;
     private final JexlExpressionParser expressionParser;
 
@@ -106,6 +100,7 @@
         this.load = original.load;
         this.comment = original.getComment();
         this.attributes.putAll(original.attributes);
+        this.propertyEditors.putAll(original.propertyEditors);
         this.references.putAll(original.references);
         this.clearAttributes.addAll(original.clearAttributes);
         this.nullAttributes.addAll(original.nullAttributes);
@@ -182,6 +177,12 @@
         for (Object o : gbean.getAttributeOrReference()) {
             if (o instanceof AttributeType) {
                 AttributeType attr = (AttributeType) o;
+
+                String propertyEditor = attr.getPropertyEditor();
+                if (null != propertyEditor) {
+                    propertyEditors.put(attr.getName(), propertyEditor);
+                }
+                
                 if (attr.isNull()) {
                     getNullAttributes().add(attr.getName());
                 } else {
@@ -268,47 +269,44 @@
         return attributes.get(attributeName);
     }
 
-    public ArrayList<String> getClearAttributes() {
+    public Set<String> getClearAttributes() {
         return clearAttributes;
     }
 
-    public ArrayList<String> getNullAttributes() {
+    public Set<String> getNullAttributes() {
         return nullAttributes;
     }
 
-    public boolean getNullAttribute(String attributeName) {
+    public boolean isNullAttribute(String attributeName) {
         return nullAttributes.contains(attributeName);
     }
 
-    public boolean getClearAttribute(String attributeName) {
+    public boolean isClearAttribute(String attributeName) {
         return clearAttributes.contains(attributeName);
     }
 
-    public ArrayList<String> getClearReferences() {
+    public Set<String> getClearReferences() {
         return clearReferences;
     }
 
-    public boolean getClearReference(String referenceName) {
+    public boolean isClearReference(String referenceName) {
         return clearReferences.contains(referenceName);
     }
 
     public void setClearAttribute(String attributeName) {
-        if (!clearAttributes.contains(attributeName))
-            clearAttributes.add(attributeName);
+        clearAttributes.add(attributeName);
     }
 
     public void setNullAttribute(String attributeName) {
-        if (!nullAttributes.contains(attributeName))
-            nullAttributes.add(attributeName);
+        nullAttributes.add(attributeName);
     }
 
     public void setClearReference(String referenceName) {
-        if (!clearReferences.contains(referenceName))
-            clearReferences.add(referenceName);
+        clearReferences.add(referenceName);
     }
 
     public void setAttribute(String attributeName, Object attributeValue, String attributeType, ClassLoader classLoader) throws InvalidAttributeException {
-        String stringValue = getAsText(attributeValue, attributeType, classLoader);
+        String stringValue = getAsText(attributeName, attributeValue, attributeType, classLoader);
         setAttribute(attributeName, stringValue);
     }
 
@@ -319,7 +317,7 @@
             attributes.put(attributeName, attributeValue);
         }
     }
-
+    
     public Map<String, ReferencePatterns> getReferences() {
         return references;
     }
@@ -353,21 +351,16 @@
 
         //Clear attributes
         for (String attribute : getClearAttributes()) {
-            if (getClearAttribute(attribute)) {
-                data.clearAttribute(attribute);
-            }
+            data.clearAttribute(attribute);
         }
 
         //Null attributes
         for (String attribute : getNullAttributes()) {
-            if (getNullAttribute(attribute)) {
-                data.setAttribute(attribute, null);
-            }
+            data.setAttribute(attribute, null);
         }
 
         // set references
         for (Map.Entry<String, ReferencePatterns> entry : getReferences().entrySet()) {
-
             String referenceName = entry.getKey();
             GReferenceInfo referenceInfo = gbeanInfo.getReference(referenceName);
             if (referenceInfo == null) {
@@ -381,9 +374,7 @@
 
         //Clear references
         for (String reference : getClearReferences()) {
-            if (getClearReference(reference)) {
-                data.clearReference(reference);
-            }
+            data.clearReference(reference);
         }
 
         return true;
@@ -394,18 +385,33 @@
             return null;
         }
         value = substituteVariables(attribute.getName(), value);
-        try {
-            PropertyEditor editor = PropertyEditors.findEditor(attribute.getType(), classLoader);
+        PropertyEditor editor = loadPropertyEditor(attribute, classLoader);
+        editor.setAsText(value);
+        log.debug("Setting value for " + configurationName + "/" + gbeanName + "/" + attribute.getName() + " to value " + value);
+        return editor.getValue();
+    }
+
+    protected PropertyEditor loadPropertyEditor(GAttributeInfo attribute, ClassLoader classLoader) {
+        String propertyEditor = propertyEditors.get(attribute.getName());
+        if (null == propertyEditor) {
+            PropertyEditor editor;
+            try {
+                editor = PropertyEditors.findEditor(attribute.getType(), classLoader);
+            } catch (ClassNotFoundException e) {
+                log.error("Unable to load attribute type " + attribute.getType());
+                return null;
+            }
             if (editor == null) {
                 log.debug("Unable to parse attribute of type " + attribute.getType() + "; no editor found");
-                return null;
             }
-            editor.setAsText(value);
-            log.debug("Setting value for " + configurationName + "/" + gbeanName + "/" + attribute.getName() + " to value " + value);
-            return editor.getValue();
-        } catch (ClassNotFoundException e) {
-            log.error("Unable to load attribute type " + attribute.getType());
-            return null;
+            return editor;
+        } else {
+            try {
+                Class propertyEditorClass = classLoader.loadClass(propertyEditor);
+                return (PropertyEditor) propertyEditorClass.newInstance();
+            } catch (Exception ex) {
+                throw new IllegalStateException("Cannot load property editor [" + propertyEditor + "]", ex);
+            }
         }
     }
 
@@ -449,7 +455,7 @@
             if (value == null) {
                 setNullAttribute(name);
             } else {
-                if (getNullAttribute(name)) {
+                if (isNullAttribute(name)) {
                     nullAttributes.remove(name);
                 }
                 if (name.toLowerCase().indexOf("password") > -1) {
@@ -465,6 +471,10 @@
                 try {
                     AttributeType attribute = PluginXmlUtil.loadAttribute(reader);
                     attribute.setName(name);
+                    String editorClass = propertyEditors.get(name);
+                    if (null != editorClass) {
+                        attribute.setPropertyEditor(editorClass);
+                    }
                     gbean.getAttributeOrReference().add(attribute);
                 } catch (Exception e) {
                     log.error("Could not serialize attribute " + name + " in gbean " + gbeanName + ", value: " + value, e);
@@ -543,188 +553,27 @@
         return gbean;
     }
 
-    public Element writeXml(Document doc, Element parent) {
-        String gbeanName;
-        if (name instanceof String) {
-            gbeanName = (String) name;
-        } else {
-            gbeanName = name.toString();
-        }
-
-        Element gbean = doc.createElement("gbean");
-        parent.appendChild(gbean);
-        gbean.setAttribute("name", gbeanName);
-        if (gbeanInfo != null) {
-            gbean.setAttribute("gbeanInfo", gbeanInfo);
-        }
-        if (!load) {
-            gbean.setAttribute("load", "false");
-        }
-
-        // attributes
-        for (Map.Entry<String, String> entry : attributes.entrySet()) {
-            String name = entry.getKey();
-            String value = entry.getValue();
-            if (value == null) {
-                setNullAttribute(name);
-            } else {
-                if (getNullAttribute(name)) {
-                    nullAttributes.remove(name);
-                }
-                if (name.toLowerCase().indexOf("password") > -1) {
-                    value = EncryptionManager.encrypt(value);
-                }
-                Element attribute = doc.createElement("attribute");
-                attribute.setAttribute("name", name);
-                gbean.appendChild(attribute);
-                if (value.length() == 0) {
-                    attribute.setAttribute("value", "");
-                } else {
-                    try {
-                        //
-                        // NOTE: Construct a new document to handle mixed content attribute values
-                        //       then add nodes which are children of the first node.  This allows
-                        //       value to be XML or text.
-                        //
-
-                        DocumentBuilderFactory factory = XmlUtil.newDocumentBuilderFactory();
-                        DocumentBuilder builder = factory.newDocumentBuilder();
-
-                        /**
-                         * if there was a value such as jdbc url with &amp; then when that value was oulled
-                         * from the config.xml the &amp; would have been replaced/converted to '&', we need to check
-                         * and change it back because an & would create a parse exception.
-                         */
-                        value = value.replaceAll("&(?!amp;)", "&amp;");
-
-//                        String unsubstitutedValue = unsubstitutedAttributes.get(name);
-//                        if (unsubstitutedValue != null) {
-//                            log.debug("writeXML attribute " + name
-//                                    + " using raw value "
-//                                    + unsubstitutedValue
-//                                    + " instead of cooked value "
-//                                    + value + ".");
-//                            value = unsubstitutedValue;
-//                        }
-
-                        // Wrap value in an element to be sure we can handle xml or text values
-                        String xml = "<fragment>" + value + "</fragment>";
-                        InputSource input = new InputSource(new StringReader(xml));
-                        Document fragment = builder.parse(input);
-
-                        Node root = fragment.getFirstChild();
-                        NodeList children = root.getChildNodes();
-                        for (int i = 0; i < children.getLength(); i++) {
-                            Node child = children.item(i);
-
-                            // Import the child (and its children) into the new document
-                            child = doc.importNode(child, true);
-                            attribute.appendChild(child);
-                        }
-                    }
-                    catch (Exception e) {
-                        throw new RuntimeException("Failed to write attribute value fragment: " + e.getMessage(), e);
-                    }
-                }
-            }
-        }
-
-        // cleared attributes
-        for (String name : clearAttributes) {
-            Element attribute = doc.createElement("attribute");
-            gbean.appendChild(attribute);
-            attribute.setAttribute("name", name);
-        }
-
-        // Null attributes
-        for (String name : nullAttributes) {
-            Element attribute = doc.createElement("attribute");
-            gbean.appendChild(attribute);
-            attribute.setAttribute("name", name);
-            attribute.setAttribute("null", "true");
-        }
-
-        // references
-        for (Map.Entry<String, ReferencePatterns> entry : references.entrySet()) {
-            String name = entry.getKey();
-            ReferencePatterns patterns = entry.getValue();
-
-            Element reference = doc.createElement("reference");
-            reference.setAttribute("name", name);
-            gbean.appendChild(reference);
-
-            Set<AbstractNameQuery> patternSet;
-            if (patterns.isResolved()) {
-                patternSet = Collections.singleton(new AbstractNameQuery(patterns.getAbstractName()));
-            } else {
-                patternSet = patterns.getPatterns();
-            }
-
-            for (AbstractNameQuery pattern : patternSet) {
-                Element pat = doc.createElement("pattern");
-                reference.appendChild(pat);
-                Artifact artifact = pattern.getArtifact();
-
-                if (artifact != null) {
-                    if (artifact.getGroupId() != null) {
-                        Element group = doc.createElement("groupId");
-                        group.appendChild(doc.createTextNode(artifact.getGroupId()));
-                        pat.appendChild(group);
-                    }
-                    if (artifact.getArtifactId() != null) {
-                        Element art = doc.createElement("artifactId");
-                        art.appendChild(doc.createTextNode(artifact.getArtifactId()));
-                        pat.appendChild(art);
-                    }
-                    if (artifact.getVersion() != null) {
-                        Element version = doc.createElement("version");
-                        version.appendChild(doc.createTextNode(artifact.getVersion().toString()));
-                        pat.appendChild(version);
-                    }
-                    if (artifact.getType() != null) {
-                        Element type = doc.createElement("type");
-                        type.appendChild(doc.createTextNode(artifact.getType()));
-                        pat.appendChild(type);
-                    }
-                }
-
-                Map nameMap = pattern.getName();
-                if (nameMap.get("module") != null) {
-                    Element module = doc.createElement("module");
-                    module.appendChild(doc.createTextNode(nameMap.get("module").toString()));
-                    pat.appendChild(module);
-                }
-
-                if (nameMap.get("name") != null) {
-                    Element patName = doc.createElement("name");
-                    patName.appendChild(doc.createTextNode(nameMap.get("name").toString()));
-                    pat.appendChild(patName);
-                }
-            }
-        }
-
-        // cleared references
-        for (String name : clearReferences) {
-            Element reference = doc.createElement("reference");
-            reference.setAttribute("name", name);
-            gbean.appendChild(reference);
-        }
-
-        return gbean;
-    }
-
-    public static String getAsText(Object value, String type, ClassLoader classLoader) throws InvalidAttributeException {
+    protected String getAsText(String attributeName, Object value, String type, ClassLoader classLoader) throws InvalidAttributeException {
         try {
-            String attributeStringValue = null;
-            if (value != null) {
-                PropertyEditor editor = PropertyEditors.findEditor(type, classLoader);
-                if (editor == null) {
+            if (null == value || value instanceof String) {
+                return (String) value;
+            }
+            
+            Class typeClass = ClassLoading.loadClass(type, classLoader);
+            PropertyEditor editor = PropertyEditors.findEditor(value.getClass());
+            if (null == editor) {
+                editor = PropertyEditors.findEditor(typeClass);
+                if (null == editor) {
                     throw new InvalidAttributeException("Unable to format attribute of type " + type + "; no editor found");
                 }
-                editor.setValue(value);
-                attributeStringValue = editor.getAsText();
             }
-            return attributeStringValue;
+            
+            if (!type.equals(value.getClass().getName()) && !typeClass.isPrimitive()) {
+                propertyEditors.put(attributeName, editor.getClass().getName());
+            }
+
+            editor.setValue(value);
+            return editor.getAsText();
         } catch (ClassNotFoundException e) {
             //todo: use the Configuration's ClassLoader to load the attribute, if this ever becomes an issue
             throw (InvalidAttributeException) new InvalidAttributeException("Unable to store attribute type " + type).initCause(e);

Modified: geronimo/server/trunk/framework/modules/geronimo-system/src/main/xsd/attributes-1.2.xsd
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-system/src/main/xsd/attributes-1.2.xsd?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-system/src/main/xsd/attributes-1.2.xsd (original)
+++ geronimo/server/trunk/framework/modules/geronimo-system/src/main/xsd/attributes-1.2.xsd Mon Nov 19 21:25:27 2007
@@ -183,6 +183,19 @@
                         </xsd:documentation>
                     </xsd:annotation>
                 </xsd:attribute>
+                <xsd:attribute name="propertyEditor" use="optional" type="xsd:string">
+                    <xsd:annotation>
+                        <xsd:documentation>
+                            The propertyEditor attribute defines the property editor class
+                            to be used to get the value of this attribute based on its
+                            string representation.
+                            
+                            If no editor is specified, then the type of the attribute, as
+                            declared by GBeanAttribute, is used to find a propertyEditor
+                            through the standard JavaBean search strategy.
+                        </xsd:documentation>
+                    </xsd:annotation>
+                </xsd:attribute>
                 <!--<xsd:attribute name="value" use="optional">-->
                     <!--<xsd:annotation>-->
                         <!--<xsd:documentation>-->

Modified: geronimo/server/trunk/plugins/clustering/clustering/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/clustering/clustering/pom.xml?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/clustering/clustering/pom.xml (original)
+++ geronimo/server/trunk/plugins/clustering/clustering/pom.xml Mon Nov 19 21:25:27 2007
@@ -39,27 +39,28 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.geronimo.configs</groupId>
-            <artifactId>j2ee-server</artifactId>
+            <artifactId>geronimo-gbean-deployer</artifactId>
             <version>${version}</version>
             <type>car</type>
         </dependency>
 
         <dependency>
             <groupId>org.apache.geronimo.configs</groupId>
-            <artifactId>j2ee-security</artifactId>
+            <artifactId>j2ee-server</artifactId>
             <version>${version}</version>
             <type>car</type>
         </dependency>
 
         <dependency>
-            <groupId>org.apache.geronimo.modules</groupId>
-            <artifactId>geronimo-clustering</artifactId>
+            <groupId>org.apache.geronimo.configs</groupId>
+            <artifactId>j2ee-security</artifactId>
             <version>${version}</version>
+            <type>car</type>
         </dependency>
 
         <dependency>
             <groupId>org.apache.geronimo.modules</groupId>
-            <artifactId>geronimo-deploy-config</artifactId>
+            <artifactId>geronimo-clustering</artifactId>
             <version>${version}</version>
         </dependency>
 

Modified: geronimo/server/trunk/plugins/clustering/geronimo-clustering/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/clustering/geronimo-clustering/pom.xml?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/clustering/geronimo-clustering/pom.xml (original)
+++ geronimo/server/trunk/plugins/clustering/geronimo-clustering/pom.xml Mon Nov 19 21:25:27 2007
@@ -50,6 +50,12 @@
             <artifactId>geronimo-jmx-remoting</artifactId>
             <version>${version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>${pom.groupId}</groupId>
+            <artifactId>geronimo-service-builder</artifactId>
+            <version>${version}</version>
+        </dependency>
     </dependencies>
     
 </project>

Modified: geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfo.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfo.java?rev=596542&r1=596541&r2=596542&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfo.java (original)
+++ geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfo.java Mon Nov 19 21:25:27 2007
@@ -22,6 +22,9 @@
 import java.io.Serializable;
 import java.net.InetSocketAddress;
 
+import org.apache.geronimo.deployment.service.DoNotPersist;
+import org.apache.geronimo.deployment.service.EncryptOnPersist;
+
 /**
  *
  * @version $Rev:$ $Date:$
@@ -39,6 +42,7 @@
         return host;
     }
 
+    @DoNotPersist
     public InetSocketAddress getListenAddress() {
         return new InetSocketAddress(host, port);
     }
@@ -71,6 +75,7 @@
         this.urlPath = urlPath;
     }
 
+    @EncryptOnPersist
     public String getPassword() {
         return password;
     }

Added: geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfoEditor.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfoEditor.java?rev=596542&view=auto
==============================================================================
--- geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfoEditor.java (added)
+++ geronimo/server/trunk/plugins/clustering/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/config/BasicExtendedJMXConnectorInfoEditor.java Mon Nov 19 21:25:27 2007
@@ -0,0 +1,34 @@
+/*
+ * 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.geronimo.clustering.config;
+
+import org.apache.geronimo.deployment.service.JavaBeanXmlAttributeEditor;
+
+/**
+ *
+ * @version $Rev:$ $Date:$
+ */
+public class BasicExtendedJMXConnectorInfoEditor extends JavaBeanXmlAttributeEditor {
+
+    public BasicExtendedJMXConnectorInfoEditor() {
+        super(BasicExtendedJMXConnectorInfo.class);
+    }
+
+}



Mime
View raw message