You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2006/10/27 04:09:34 UTC

svn commit: r468233 - in /geronimo/server/trunk/modules/geronimo-system/src/main: java/org/apache/geronimo/system/configuration/ java/org/apache/geronimo/system/plugin/ resources/META-INF/schema/

Author: jdillon
Date: Thu Oct 26 19:09:34 2006
New Revision: 468233

URL: http://svn.apache.org/viewvc?view=rev&rev=468233
Log:
(GERONIMO-2525) Allow mixed content in attributes

Added:
    geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/attributes-1.1.xsd
      - copied, changed from r454011, geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/local-attributes-1.1.xsd
Removed:
    geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/local-attributes-1.1.xsd
Modified:
    geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java
    geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java
    geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
    geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/plugins-1.1.xsd

Modified: geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java?view=diff&rev=468233&r1=468232&r2=468233
==============================================================================
--- geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java (original)
+++ geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/GBeanOverride.java Thu Oct 26 19:09:34 2006
@@ -21,6 +21,7 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Serializable;
+import java.io.StringReader;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -31,6 +32,9 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.geronimo.common.propertyeditor.PropertyEditors;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.gbean.AbstractNameQuery;
@@ -39,12 +43,14 @@
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.ReferencePatterns;
 import org.apache.geronimo.kernel.InvalidGBeanException;
+import org.apache.geronimo.kernel.util.XmlUtil;
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.util.EncryptionManager;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
 
 /**
  * @version $Rev$ $Date$
@@ -126,8 +132,7 @@
 
             // Check to see if there is a value attribute
             if (attribute.hasAttribute("value")) {
-                setAttribute(attributeName, (String) EncryptionManager
-                        .decrypt(attribute.getAttribute("value")));
+                setAttribute(attributeName, (String) EncryptionManager.decrypt(attribute.getAttribute("value")));
                 continue;
             }
 
@@ -146,8 +151,7 @@
                 setClearAttribute(attributeName);
                 continue;
             }
-            String attributeValue = (String) EncryptionManager
-                    .decrypt(rawAttribute);
+            String attributeValue = (String) EncryptionManager.decrypt(rawAttribute);
 
             setAttribute(attributeName, attributeValue);
         }
@@ -350,7 +354,8 @@
             String value = (String) entry.getValue();
             if (value == null) {
                 setNullAttribute(name);
-            } else {
+            }
+            else {
                 if (getNullAttribute(name)) {
                     nullAttributes.remove(name);
                 }
@@ -360,10 +365,39 @@
                 Element attribute = doc.createElement("attribute");
                 attribute.setAttribute("name", name);
                 gbean.appendChild(attribute);
-                if (value.length() == 0)
+                if (value.length() == 0) {
                     attribute.setAttribute("value", "");
-                else
-                    attribute.appendChild(doc.createTextNode(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();
+
+                        // 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);
+                    }
+                }
             }
         }
 
@@ -393,17 +427,20 @@
             Element reference = doc.createElement("reference");
             reference.setAttribute("name", name);
             gbean.appendChild(reference);
+
             Set patternSet;
             if (patterns.isResolved()) {
                 patternSet = Collections.singleton(new AbstractNameQuery(patterns.getAbstractName()));
             } else {
                 patternSet = patterns.getPatterns();
             }
+
             for (Iterator patternIterator = patternSet.iterator(); patternIterator.hasNext();) {
                 AbstractNameQuery pattern = (AbstractNameQuery) patternIterator.next();
                 Element pat = doc.createElement("pattern");
                 reference.appendChild(pat);
                 Artifact artifact = pattern.getArtifact();
+
                 if (artifact != null) {
                     if (artifact.getGroupId() != null) {
                         Element group = doc.createElement("groupId");
@@ -426,18 +463,19 @@
                         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);
                 }
-//                out.print(pattern.toString());
             }
         }
 
@@ -448,6 +486,7 @@
             reference.setAttribute("name", name);
             gbean.appendChild(reference);
         }
+
         return gbean;
     }
 

Modified: geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java?view=diff&rev=468233&r1=468232&r2=468233
==============================================================================
--- geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java (original)
+++ geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java Thu Oct 26 19:09:34 2006
@@ -79,13 +79,13 @@
  * @version $Rev$ $Date$
  */
 public class LocalAttributeManager implements PluginAttributeStore, PersistentConfigurationList, GBeanLifecycle {
-    private final static Log log = LogFactory.getLog(LocalAttributeManager.class);
+    private static final Log log = LogFactory.getLog(LocalAttributeManager.class);
 
-    private final static String CONFIG_FILE_PROPERTY = "org.apache.geronimo.config.file";
+    private static final String CONFIG_FILE_PROPERTY = "org.apache.geronimo.config.file";
 
-    private final static String BACKUP_EXTENSION = ".bak";
-    private final static String TEMP_EXTENSION = ".working";
-    private final static int SAVE_BUFFER_MS = 5000;
+    private static final String BACKUP_EXTENSION = ".bak";
+    private static final String TEMP_EXTENSION = ".working";
+    private static final int SAVE_BUFFER_MS = 5000;
 
     private final ServerInfo serverInfo;
     private final String configFile;
@@ -382,12 +382,8 @@
             dFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                                  "http://www.w3.org/2001/XMLSchema");
             
-            //
-            // TODO: Change to latest attributes schema
-            //
-            
             dFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
-                                 LocalAttributeManager.class.getResourceAsStream("/META-INF/schema/local-attributes-1.1.xsd"));
+                                 LocalAttributeManager.class.getResourceAsStream("/META-INF/schema/attributes-1.1.xsd"));
 
             DocumentBuilder builder = dFactory.newDocumentBuilder();
             builder.setErrorHandler(new ErrorHandler() {
@@ -489,7 +485,7 @@
         dFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                              "http://www.w3.org/2001/XMLSchema");
         dFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
-                             LocalAttributeManager.class.getResourceAsStream("/META-INF/schema/local-attributes-1.1.xsd"));
+                             LocalAttributeManager.class.getResourceAsStream("/META-INF/schema/attributes-1.1.xsd"));
 
         OutputStream output = null;
         try {
@@ -498,7 +494,7 @@
             TransformerFactory xfactory = XmlUtil.newTransformerFactory();
             Transformer xform = xfactory.newTransformer();
             xform.setOutputProperty(OutputKeys.INDENT, "yes");
-            xform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+            xform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
             output = new BufferedOutputStream(new FileOutputStream(file));
 
             // use a FileOutputStream instead of a File on the StreamResult 

Modified: geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java?view=diff&rev=468233&r1=468232&r2=468233
==============================================================================
--- geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java (original)
+++ geronimo/server/trunk/modules/geronimo-system/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java Thu Oct 26 19:09:34 2006
@@ -1251,7 +1251,7 @@
                              "http://www.w3.org/2001/XMLSchema");
         factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
                              new InputStream[]{
-                                     PluginInstallerGBean.class.getResourceAsStream("/META-INF/schema/local-attributes-1.1.xsd"),
+                                     PluginInstallerGBean.class.getResourceAsStream("/META-INF/schema/attributes-1.1.xsd"),
                                      PluginInstallerGBean.class.getResourceAsStream("/META-INF/schema/plugins-1.1.xsd"),
                              }
         );

Copied: geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/attributes-1.1.xsd (from r454011, geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/local-attributes-1.1.xsd)
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/attributes-1.1.xsd?view=diff&rev=468233&p1=geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/local-attributes-1.1.xsd&r1=454011&p2=geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/attributes-1.1.xsd&r2=468233
==============================================================================
--- geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/local-attributes-1.1.xsd (original)
+++ geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/attributes-1.1.xsd Thu Oct 26 19:09:34 2006
@@ -26,10 +26,9 @@
 
     <xsd:annotation>
         <xsd:documentation>
-            <![CDATA[
             The definition of the XML format for storing manageable attribute values.
             Should look like this:
-
+            <![CDATA[
             <attributes>
                 <module name="mygroup/mycomponent/1.1/jar">
                     <gbean name="MyNetworkService">
@@ -69,14 +68,12 @@
     <xsd:complexType name="gbeanType">
         <xsd:annotation>
             <xsd:documentation>
-                <![CDATA[
                 Note that the name attribute for a gbean element may hold
                 either the full GBeanName, or only the value for the
                 "name=" portion of the GBeanName.  If there are multiple
                 GBeans in the module with manageable attributes and
                 the same "name=" portion of the GBeanName, then all must be
                 listed and all must be listed with a full GBeanName.
-                ]]>
             </xsd:documentation>
         </xsd:annotation>
         <xsd:choice minOccurs="0" maxOccurs="unbounded">
@@ -89,15 +86,24 @@
     </xsd:complexType>
 
     <xsd:complexType name="attributeType">
-        <xsd:simpleContent>
-            <xsd:extension base="xsd:string">
+        <xsd:annotation>
+            <xsd:documentation>
+                Provides the definition of a single named attribute.  Attributes are mixed type
+                and can include simple text and elements.
+            </xsd:documentation>
+        </xsd:annotation>
+        <xsd:complexContent mixed="true">
+            <xsd:restriction base="xsd:anyType">
+                <xsd:sequence>
+                    <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+                </xsd:sequence>
                 <xsd:attribute name="name" use="required"/>
                 <xsd:attribute name="null" use="optional"/>
                 <xsd:attribute name="value" use="optional"/>
-            </xsd:extension>
-        </xsd:simpleContent>
+            </xsd:restriction>
+        </xsd:complexContent>
     </xsd:complexType>
-
+    
     <xsd:complexType name="referenceType">
         <xsd:sequence>
             <xsd:element name="pattern" minOccurs="0" maxOccurs="unbounded">

Modified: geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/plugins-1.1.xsd
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/plugins-1.1.xsd?view=diff&rev=468233&r1=468232&r2=468233
==============================================================================
--- geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/plugins-1.1.xsd (original)
+++ geronimo/server/trunk/modules/geronimo-system/src/main/resources/META-INF/schema/plugins-1.1.xsd Thu Oct 26 19:09:34 2006
@@ -26,7 +26,7 @@
         >
 
     <xs:import namespace="http://geronimo.apache.org/xml/ns/attributes-1.1"
-               schemaLocation="local-attributes-1.1.xsd"/>
+               schemaLocation="attributes-1.1.xsd"/>
 
     <xs:annotation>
         <xs:documentation>