You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by dj...@apache.org on 2010/01/05 20:31:42 UTC

svn commit: r896187 [2/6] - in /geronimo/xbean/trunk/xbean-blueprint: ./ src/main/java/org/apache/xbean/blueprint/ src/main/java/org/apache/xbean/blueprint/context/ src/main/java/org/apache/xbean/blueprint/context/impl/ src/main/java/org/apache/xbean/b...

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,200 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class DocumentationGenerator implements GeneratorPlugin {
+    private final File destFile;
+    private LogFacade log;
+
+    public DocumentationGenerator(File destFile) {
+        this.destFile = destFile;
+    }
+
+    public void generate(NamespaceMapping namespaceMapping) throws IOException {
+        String namespace = namespaceMapping.getNamespace();
+
+        // TODO can only handle 1 schema document so far...
+        File file = new File(destFile.getParentFile(), destFile.getName() + ".html");
+        log.log("Generating HTML documentation file: " + file + " for namespace: " + namespace);
+        PrintWriter out = new PrintWriter(new FileWriter(file));
+        try {
+            generateDocumentation(out, namespaceMapping);
+        } finally {
+            out.close();
+        }
+    }
+
+    private void generateDocumentation(PrintWriter out, NamespaceMapping namespaceMapping) {
+        String namespace = namespaceMapping.getNamespace();
+
+        out.println("<!-- NOTE: this file is autogenerated by Apache XBean -->");
+        out.println("<html>");
+        out.println("<head>");
+        out.println("<title>Schema for namespace: " + namespace + "</title>");
+        out.println("<link rel='stylesheet' href='style.css' type='text/css'>");
+        out.println("<link rel='stylesheet' href='http://activemq.org/style.css' type='text/css'>");
+        out.println("<link rel='stylesheet' href='http://activemq.org/style-xb.css' type='text/css'>");
+        out.println("</head>");
+        out.println();
+        out.println("<body>");
+        out.println();
+
+        generateRootElement(out, namespaceMapping);
+
+        generateElementsSummary(out, namespaceMapping);
+        out.println();
+        out.println();
+
+        generateElementsDetail(out, namespaceMapping);
+
+        out.println();
+        out.println("</body>");
+        out.println("</html>");
+    }
+
+    private void generateRootElement(PrintWriter out, NamespaceMapping namespaceMapping) {
+        ElementMapping rootElement = namespaceMapping.getRootElement();
+        if (rootElement != null) {
+            out.println("<h1>Root Element</h1>");
+            out.println("<table>");
+            out.println("  <tr><th>Element</th><th>Description</th><th>Class</th>");
+            generateElementSummary(out, rootElement);
+            out.println("</table>");
+            out.println();
+        }
+    }
+
+    private void generateElementsSummary(PrintWriter out, NamespaceMapping namespaceMapping) {
+        out.println("<h1>Element Summary</h1>");
+        out.println("<table>");
+        out.println("  <tr><th>Element</th><th>Description</th><th>Class</th>");
+        for (Iterator iter = namespaceMapping.getElements().iterator(); iter.hasNext();) {
+            ElementMapping element = (ElementMapping) iter.next();
+            generateElementSummary(out, element);
+        }
+        out.println("</table>");
+    }
+
+    private void generateElementSummary(PrintWriter out, ElementMapping element) {
+        out.println("  <tr>" +
+                "<td><a href='#" + element.getElementName() + "'>" + element.getElementName() + "</a></td>" +
+                "<td>" + element.getDescription() + "</td>" +
+                "<td>" + element.getClassName() + "</td></tr>");
+    }
+
+    private void generateElementsDetail(PrintWriter out, NamespaceMapping namespaceMapping) {
+        out.println("<h1>Element Detail</h1>");
+        for (Iterator iter = namespaceMapping.getElements().iterator(); iter.hasNext();) {
+            ElementMapping element = (ElementMapping) iter.next();
+            generateHtmlElementDetail(out, namespaceMapping, element);
+        }
+    }
+
+    private void generateHtmlElementDetail(PrintWriter out, NamespaceMapping namespaceMapping, ElementMapping element) {
+        out.println("<h2>Element: <a name='" + element.getElementName() + "'>" + element.getElementName() + "</a></h2>");
+
+        boolean hasAttributes = false;
+        boolean hasElements = false;
+        for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext() && (!hasAttributes || !hasElements);) {
+            AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
+            Type type = attributeMapping.getType();
+            if (namespaceMapping.isSimpleType(type)) {
+                hasAttributes = true;
+            } else {
+                hasElements = true;
+            }
+        }
+
+        if (hasAttributes) {
+            out.println("<table>");
+            out.println("  <tr><th>Attribute</th><th>Type</th><th>Description</th>");
+            for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext();) {
+                AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
+                Type type = attributeMapping.getPropertyEditor() != null ?  Type.newSimpleType(String.class.getName()) : attributeMapping.getType();
+                if (namespaceMapping.isSimpleType(type)) {
+                    out.println("  <tr><td>" + attributeMapping.getAttributeName() + "</td><td>" + Utils.getXsdType(type)
+                            + "</td><td>" + attributeMapping.getDescription() + "</td></tr>");
+                }
+
+            }
+            out.println("</table>");
+        }
+
+        if (hasElements) {
+            out.println("<table>");
+            out.println("  <tr><th>Element</th><th>Type</th><th>Description</th>");
+            for (Iterator iterator = element.getAttributes().iterator(); iterator.hasNext();) {
+                AttributeMapping attributeMapping = (AttributeMapping) iterator.next();
+                Type type = attributeMapping.getType();
+                if (!namespaceMapping.isSimpleType(type)) {
+                    out.print("  <tr><td>" + attributeMapping.getAttributeName() + "</td><td>");
+                    printComplexPropertyTypeDocumentation(out, namespaceMapping, type);
+                    out.println("</td><td>" + attributeMapping.getDescription() + "</td></tr>");
+                }
+            }
+            out.println("</table>");
+        }
+    }
+
+    private void printComplexPropertyTypeDocumentation(PrintWriter out, NamespaceMapping namespaceMapping, Type type) {
+        if (type.isCollection()) {
+            out.print("(");
+        }
+
+        List types;
+        if (type.isCollection()) {
+            types = Utils.findImplementationsOf(namespaceMapping, type.getNestedType());
+        } else {
+            types = Utils.findImplementationsOf(namespaceMapping, type);
+        }
+
+        for (Iterator iterator = types.iterator(); iterator.hasNext();) {
+            ElementMapping element = (ElementMapping) iterator.next();
+            out.print("<a href='#" + element.getElementName() + "'>" + element.getElementName() + "</a>");
+            if (iterator.hasNext()) {
+                out.print(" | ");
+            }
+        }
+        if (types.size() == 0) {
+            out.print("&lt;spring:bean/&gt;");
+        }
+
+        if (type.isCollection()) {
+            out.print(")*");
+        }
+    }
+
+    public LogFacade getLog() {
+        return log;
+    }
+
+    public void setLog(LogFacade log) {
+        this.log = log;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/DocumentationGenerator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,173 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class ElementMapping implements Comparable {
+    private final String namespace;
+    private final String elementName;
+    private final String className;
+    private final String description;
+    private final boolean rootElement;
+    private final String initMethod;
+    private final String destroyMethod;
+    private final String factoryMethod;
+    private final String contentProperty;
+    private final Set attributes;
+    private final Map attributesByName;
+    private final List constructors;
+    private final List flatProperties;
+    private final Map maps;
+    private final Map flatCollections;
+	private final List superClasses;
+	private final HashSet interfaces;
+    
+    public ElementMapping(String namespace, String elementName, String className, String description, 
+            boolean rootElement, String initMethod, String destroyMethod, String factoryMethod, 
+            String contentProperty, Set attributes, List constructors, List flatProperties, Map maps, 
+            Map flatCollections, List superClasses, HashSet interfaces) {
+        this.superClasses = superClasses;
+		this.interfaces = interfaces;
+		if (namespace == null) throw new NullPointerException("namespace");
+        if (elementName == null) throw new NullPointerException("elementName");
+        if (className == null) throw new NullPointerException("className");
+        if (attributes == null) throw new NullPointerException("attributes");
+        if (constructors == null) throw new NullPointerException("constructors");
+
+        this.namespace = namespace;
+        this.elementName = elementName;
+        this.className = className;
+        this.description = description;
+        this.rootElement = rootElement;
+        this.initMethod = initMethod;
+        this.destroyMethod = destroyMethod;
+        this.factoryMethod = factoryMethod;
+        this.contentProperty = contentProperty;
+        this.constructors = constructors;
+        this.attributes = Collections.unmodifiableSet(new TreeSet(attributes));
+        this.maps = Collections.unmodifiableMap(maps);
+        this.flatProperties = Collections.unmodifiableList(flatProperties);
+        this.flatCollections = Collections.unmodifiableMap(flatCollections);
+        
+        Map attributesByName = new HashMap();
+        for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
+            AttributeMapping attribute = (AttributeMapping) iterator.next();
+            attributesByName.put(attribute.getAttributeName(), attribute);
+        }
+        this.attributesByName = Collections.unmodifiableMap(attributesByName);
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public String getElementName() {
+        return elementName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public boolean isRootElement() {
+        return rootElement;
+    }
+
+    public String getInitMethod() {
+        return initMethod;
+    }
+
+    public String getDestroyMethod() {
+        return destroyMethod;
+    }
+
+    public String getFactoryMethod() {
+        return factoryMethod;
+    }
+
+    public String getContentProperty() {
+        return contentProperty;
+    }
+
+    public Set getAttributes() {
+        return attributes;
+    }
+
+    public AttributeMapping getAttribute(String attributeName) {
+        return (AttributeMapping) attributesByName.get(attributeName);
+    }
+
+    public Map getMapMappings() {
+        return maps;
+    }
+
+    public MapMapping getMapMapping(String name) {
+        return (MapMapping) maps.get(name);
+    }
+    
+    public Map getFlatCollections() {
+        return flatCollections;
+    }
+
+    public List getFlatProperties() {
+        return flatProperties;
+    }
+
+    public List getConstructors() {
+        return constructors;
+    }
+
+    public int hashCode() {
+        return elementName.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        if (obj instanceof ElementMapping) {
+            return elementName.equals(((ElementMapping) obj).elementName);
+        }
+        return false;
+    }
+
+    public int compareTo(Object obj) {
+        return elementName.compareTo(((ElementMapping) obj).elementName);
+    }
+
+	public HashSet getInterfaces() {
+		return interfaces;
+	}
+
+	public List getSuperClasses() {
+		return superClasses;
+	}
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ElementMapping.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.io.IOException;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public interface GeneratorPlugin {
+    void generate(NamespaceMapping namespaceMapping) throws IOException;
+    
+	LogFacade getLog();
+	void setLog(LogFacade log);
+
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/GeneratorPlugin.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class InvalidModelException extends RuntimeException {
+    public InvalidModelException(String message) {
+        super(message);
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/InvalidModelException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+public interface LogFacade {
+
+    void log(String message);
+    
+    void log(String message, int level);
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/LogFacade.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+public class MapMapping {
+    private String entryName;
+    private String keyName;
+    private boolean flat;
+    private String dupsMode;
+    private String defaultKey;
+
+    public MapMapping(String entryName, 
+                      String keyName, 
+                      boolean flat, 
+                      String dupsMode, 
+                      String defaultKey) {
+        this.entryName = entryName;
+        this.keyName = keyName;
+        this.flat = flat;
+        this.dupsMode = dupsMode;
+        this.defaultKey = defaultKey;
+    }
+
+    public String getEntryName() {
+        return entryName;
+    }
+
+    public String getKeyName() {
+        return keyName;
+    }
+
+    public boolean isFlat() {
+        return flat;
+    }
+
+    public String getDupsMode() {
+        return dupsMode;
+    }
+
+    public String getDefaultKey() {
+        return defaultKey;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MapMapping.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,154 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.Path;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.StringTokenizer;
+import java.beans.PropertyEditorManager;
+
+/**
+ * An Ant task for executing generating mapping metadata.
+ *
+ * @version $Revision$
+ */
+public class MappingGeneratorTask extends MatchingTask implements LogFacade {
+    private String namespace;
+    private Path srcDir;
+    private String excludedClasses = null;
+    private File destFile = new File("target/classes/schema.xsd");
+    private String metaInfDir = "target/classes/";
+    private String propertyEditorPaths = "org.apache.xbean.blueprint.context.impl";
+
+    public File getDestFile() {
+        return destFile;
+    }
+
+    public void setDestFile(File destFile) {
+        this.destFile = destFile;
+    }
+
+    public String getMetaInfDir() {
+        return metaInfDir;
+    }
+
+    public void setMetaInfDir(String metaInfDir) {
+        this.metaInfDir = metaInfDir;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    public Path getSrcDir() {
+        return srcDir;
+    }
+
+    public void setSrcDir(Path srcDir) {
+        this.srcDir = srcDir;
+    }
+
+    public String getPropertyEditorPaths() {
+        return propertyEditorPaths;
+    }
+
+    public void setPropertyEditorPaths(String propertyEditorPaths) {
+        this.propertyEditorPaths = propertyEditorPaths;
+    }
+
+    public void execute() throws BuildException {
+        if (namespace == null) {
+            throw new BuildException("'namespace' must be specified");
+        }
+        if (srcDir == null) {
+            throw new BuildException("'srcDir' must be specified");
+        }
+        if (destFile == null) {
+            throw new BuildException("'destFile' must be specified");
+        }
+
+        if (propertyEditorPaths != null) {
+            List editorSearchPath = new LinkedList(Arrays.asList(PropertyEditorManager.getEditorSearchPath()));
+            StringTokenizer paths = new StringTokenizer(propertyEditorPaths, " ,");
+            editorSearchPath.addAll(Collections.list(paths));
+            PropertyEditorManager.setEditorSearchPath((String[]) editorSearchPath.toArray(new String[editorSearchPath.size()]));
+        }
+
+        ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+        try {
+            String[] excludedClasses = null;
+            if (this.excludedClasses != null) {
+                excludedClasses = this.excludedClasses.split(" *, *");
+            }
+            MappingLoader mappingLoader = new QdoxMappingLoader(namespace, getFiles(srcDir), excludedClasses);
+
+            GeneratorPlugin[] plugins = new GeneratorPlugin[]{
+                new XmlMetadataGenerator(metaInfDir, destFile),
+                new DocumentationGenerator(destFile),
+                new XsdGenerator(destFile)
+            };
+
+            // load the mappings
+            Set namespaces = mappingLoader.loadNamespaces();
+            if (namespaces.isEmpty()) {
+                System.out.println("Warning: no namespaces found!");
+            }
+
+            // generate the files
+            for (Iterator iterator = namespaces.iterator(); iterator.hasNext();) {
+                NamespaceMapping namespaceMapping = (NamespaceMapping) iterator.next();
+                for (int i = 0; i < plugins.length; i++) {
+                    GeneratorPlugin plugin = plugins[i];
+                    plugin.setLog(this);
+                    plugin.generate(namespaceMapping);
+                }
+            }
+
+            log("...done.");
+        } catch (Exception e) {
+            throw new BuildException(e);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldCL);
+        }
+    }
+
+    private File[] getFiles(Path path) {
+        if (path == null) {
+            return null;
+        }
+        String[] paths = path.list();
+        File[] files = new File[paths.length];
+        for (int i = 0; i < files.length; i++) {
+            files[i] = new File(paths[i]).getAbsoluteFile();
+        }
+        return files;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingGeneratorTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public interface MappingLoader {
+    Set<NamespaceMapping> loadNamespaces() throws IOException;
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/MappingLoader.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class NamespaceMapping implements Comparable {
+    private final String namespace;
+    private final Set elements;
+    private final Map elementsByName;
+    private final ElementMapping rootElement;
+
+    public NamespaceMapping(String namespace, Set elements, ElementMapping rootElement) {
+        this.namespace = namespace;
+        this.elements = Collections.unmodifiableSet(new TreeSet(elements));
+        this.rootElement = rootElement;
+
+        Map elementsByName = new HashMap();
+        for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
+            ElementMapping elementMapping = (ElementMapping) iterator.next();
+            elementsByName.put(elementMapping.getElementName(), elementMapping);
+        }
+        this.elementsByName = Collections.unmodifiableMap(elementsByName);
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public Set getElements() {
+        return elements;
+    }
+
+    public ElementMapping getElement(String elementName) {
+        return (ElementMapping) elementsByName.get(elementName);
+    }
+
+    public ElementMapping getRootElement() {
+        return rootElement;
+    }
+
+    public int hashCode() {
+        return namespace.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        if (obj instanceof NamespaceMapping) {
+            return namespace.equals(((NamespaceMapping) obj).namespace);
+        }
+        return false;
+    }
+
+    public int compareTo(Object obj) {
+        return namespace.compareTo(((NamespaceMapping) obj).namespace);
+    }
+
+    private final HashMap checkedTypes = new HashMap();
+
+    public boolean isSimpleType(Type type) {
+        Boolean b = (Boolean) checkedTypes.get(type);
+        if (b == null){
+            b = Utils.isSimpleType(type)? Boolean.TRUE: Boolean.FALSE;
+            checkedTypes.put(type, b);
+        }
+        return b.booleanValue();
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/NamespaceMapping.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ParameterMapping {
+    private final String name;
+    private final Type type;
+
+    public ParameterMapping(String name, Type type) {
+        this.name = name;
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Type getType() {
+        return type;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/ParameterMapping.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,567 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.BeanProperty;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.JavaSource;
+import com.thoughtworks.qdox.model.Type;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class QdoxMappingLoader implements MappingLoader {
+    public static final String XBEAN_ANNOTATION = "org.apache.xbean.XBean";
+    public static final String PROPERTY_ANNOTATION = "org.apache.xbean.Property";
+    public static final String INIT_METHOD_ANNOTATION = "org.apache.xbean.InitMethod";
+    public static final String DESTROY_METHOD_ANNOTATION = "org.apache.xbean.DestroyMethod";
+    public static final String FACTORY_METHOD_ANNOTATION = "org.apache.xbean.FactoryMethod";
+    public static final String MAP_ANNOTATION = "org.apache.xbean.Map";
+    public static final String FLAT_PROPERTY_ANNOTATION = "org.apache.xbean.Flat";
+    public static final String FLAT_COLLECTION_ANNOTATION = "org.apache.xbean.FlatCollection";
+    public static final String ELEMENT_ANNOTATION = "org.apache.xbean.Element";
+
+    private static final Log log = LogFactory.getLog(QdoxMappingLoader.class);
+    private final String defaultNamespace;
+    private final File[] srcDirs;
+    private final String[] excludedClasses;
+    private Type collectionType;
+
+    public QdoxMappingLoader(String defaultNamespace, File[] srcDirs, String[] excludedClasses) {
+        this.defaultNamespace = defaultNamespace;
+        this.srcDirs = srcDirs;
+        this.excludedClasses = excludedClasses;
+    }
+
+    public String getDefaultNamespace() {
+        return defaultNamespace;
+    }
+
+    public File[] getSrcDirs() {
+        return srcDirs;
+    }
+
+    public Set<NamespaceMapping> loadNamespaces() throws IOException {
+        JavaDocBuilder builder = new JavaDocBuilder();
+
+        log.debug("Source directories: ");
+
+        for (File sourceDirectory : srcDirs) {
+            if (!sourceDirectory.isDirectory() && !sourceDirectory.toString().endsWith(".jar")) {
+                log.warn("Specified source directory isn't a directory or a jar file: '" + sourceDirectory.getAbsolutePath() + "'.");
+            }
+            log.debug(" - " + sourceDirectory.getAbsolutePath());
+
+            getSourceFiles(sourceDirectory, excludedClasses, builder);
+        }
+
+        collectionType = builder.getClassByName("java.util.Collection").asType();
+        return loadNamespaces(builder);
+    }
+
+    private Set<NamespaceMapping> loadNamespaces(JavaDocBuilder builder) {
+        // load all of the elements
+        List<ElementMapping> elements = loadElements(builder);
+
+        // index the elements by namespace and find the root element of each namespace
+        Map<String, Set<ElementMapping>> elementsByNamespace = new HashMap<String, Set<ElementMapping>>();
+        Map<String, ElementMapping> namespaceRoots = new HashMap<String, ElementMapping>();
+        for (ElementMapping element : elements) {
+            String namespace = element.getNamespace();
+            Set<ElementMapping> namespaceElements = elementsByNamespace.get(namespace);
+            if (namespaceElements == null) {
+                namespaceElements = new HashSet<ElementMapping>();
+                elementsByNamespace.put(namespace, namespaceElements);
+            }
+            namespaceElements.add(element);
+            if (element.isRootElement()) {
+                if (namespaceRoots.containsKey(namespace)) {
+                    log.info("Multiple root elements found for namespace " + namespace);
+                }
+                namespaceRoots.put(namespace, element);
+            }
+        }
+
+        // build the NamespaceMapping objects
+        Set<NamespaceMapping> namespaces = new TreeSet<NamespaceMapping>();
+        for (Map.Entry<String, Set<ElementMapping>> entry : elementsByNamespace.entrySet()) {
+            String namespace = entry.getKey();
+            Set namespaceElements = entry.getValue();
+            ElementMapping rootElement = namespaceRoots.get(namespace);
+            NamespaceMapping namespaceMapping = new NamespaceMapping(namespace, namespaceElements, rootElement);
+            namespaces.add(namespaceMapping);
+        }
+        return Collections.unmodifiableSet(namespaces);
+    }
+
+    private List<ElementMapping> loadElements(JavaDocBuilder builder) {
+        JavaSource[] javaSources = builder.getSources();
+        List<ElementMapping> elements = new ArrayList<ElementMapping>();
+        for (JavaSource javaSource : javaSources) {
+            if (javaSource.getClasses().length == 0) {
+                log.info("No Java Classes defined in: " + javaSource.getURL());
+            } else {
+                JavaClass[] classes = javaSource.getClasses();
+                for (JavaClass javaClass : classes) {
+                    ElementMapping element = loadElement(builder, javaClass);
+                    if (element != null && !javaClass.isAbstract()) {
+                        elements.add(element);
+                    } else {
+                        log.debug("No XML annotation found for type: " + javaClass.getFullyQualifiedName());
+                    }
+                }
+            }
+        }
+        return elements;
+    }
+
+    private ElementMapping loadElement(JavaDocBuilder builder, JavaClass javaClass) {
+        DocletTag xbeanTag = javaClass.getTagByName(XBEAN_ANNOTATION);
+        if (xbeanTag == null) {
+            return null;
+        }
+
+        String element = getElementName(javaClass, xbeanTag);
+        String description = getProperty(xbeanTag, "description");
+        if (description == null) {
+            description = javaClass.getComment();
+
+        }
+        String namespace = getProperty(xbeanTag, "namespace", defaultNamespace);
+        boolean root = getBooleanProperty(xbeanTag, "rootElement");
+        String contentProperty = getProperty(xbeanTag, "contentProperty");
+        String factoryClass = getProperty(xbeanTag, "factoryClass");
+
+        Map<String, MapMapping> mapsByPropertyName = new HashMap<String, MapMapping>();
+        List<String> flatProperties = new ArrayList<String>();
+        Map<String, String> flatCollections = new HashMap<String, String>();
+        Set<AttributeMapping> attributes = new HashSet<AttributeMapping>();
+        Map<String, AttributeMapping> attributesByPropertyName = new HashMap<String, AttributeMapping>();
+
+        for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
+            BeanProperty[] beanProperties = jClass.getBeanProperties();
+            for (BeanProperty beanProperty : beanProperties) {
+                // we only care about properties with a setter
+                if (beanProperty.getMutator() != null) {
+                    AttributeMapping attributeMapping = loadAttribute(beanProperty, "");
+                    if (attributeMapping != null) {
+                        attributes.add(attributeMapping);
+                        attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
+                    }
+                    JavaMethod acc = beanProperty.getAccessor();
+                    if (acc != null) {
+                        DocletTag mapTag = acc.getTagByName(MAP_ANNOTATION);
+                        if (mapTag != null) {
+                            MapMapping mm = new MapMapping(
+                                    mapTag.getNamedParameter("entryName"),
+                                    mapTag.getNamedParameter("keyName"),
+                                    Boolean.valueOf(mapTag.getNamedParameter("flat")),
+                                    mapTag.getNamedParameter("dups"),
+                                    mapTag.getNamedParameter("defaultKey"));
+                            mapsByPropertyName.put(beanProperty.getName(), mm);
+                        }
+
+                        DocletTag flatColTag = acc.getTagByName(FLAT_COLLECTION_ANNOTATION);
+                        if (flatColTag != null) {
+                            String childName = flatColTag.getNamedParameter("childElement");
+                            if (childName == null)
+                                throw new InvalidModelException("Flat collections must specify the childElement attribute.");
+                            flatCollections.put(beanProperty.getName(), childName);
+                        }
+
+                        DocletTag flatPropTag = acc.getTagByName(FLAT_PROPERTY_ANNOTATION);
+                        if (flatPropTag != null) {
+                            flatProperties.add(beanProperty.getName());
+                        }
+                    }
+                }
+            }
+        }
+
+        String initMethod = null;
+        String destroyMethod = null;
+        String factoryMethod = null;
+        for (JavaClass jClass = javaClass; jClass != null; jClass = jClass.getSuperJavaClass()) {
+            JavaMethod[] methods = javaClass.getMethods();
+            for (JavaMethod method : methods) {
+                if (method.isPublic() && !method.isConstructor()) {
+                    if (initMethod == null && method.getTagByName(INIT_METHOD_ANNOTATION) != null) {
+                        initMethod = method.getName();
+                    }
+                    if (destroyMethod == null && method.getTagByName(DESTROY_METHOD_ANNOTATION) != null) {
+                        destroyMethod = method.getName();
+                    }
+                    if (factoryMethod == null && method.getTagByName(FACTORY_METHOD_ANNOTATION) != null) {
+                        factoryMethod = method.getName();
+                    }
+
+                }
+            }
+        }
+
+        List<List<ParameterMapping>> constructorArgs = new ArrayList<List<ParameterMapping>>();
+        JavaMethod[] methods = javaClass.getMethods();
+        for (JavaMethod method : methods) {
+            JavaParameter[] parameters = method.getParameters();
+            if (isValidConstructor(factoryMethod, method, parameters)) {
+                List<ParameterMapping> args = new ArrayList<ParameterMapping>(parameters.length);
+                for (JavaParameter parameter : parameters) {
+                    AttributeMapping attributeMapping = attributesByPropertyName.get(parameter.getName());
+                    if (attributeMapping == null) {
+                        attributeMapping = loadParameter(parameter);
+
+                        attributes.add(attributeMapping);
+                        attributesByPropertyName.put(attributeMapping.getPropertyName(), attributeMapping);
+                    }
+                    args.add(new ParameterMapping(attributeMapping.getPropertyName(), toMappingType(parameter.getType(), null)));
+                }
+                constructorArgs.add(Collections.unmodifiableList(args));
+            }
+        }
+
+        HashSet<String> interfaces = new HashSet<String>();
+        interfaces.addAll(getFullyQualifiedNames(javaClass.getImplementedInterfaces()));
+
+        JavaClass actualClass = javaClass;
+        if (factoryClass != null) {
+            JavaClass clazz = builder.getClassByName(factoryClass);
+            if (clazz != null) {
+                log.info("Detected factory: using " + factoryClass + " instead of " + javaClass.getFullyQualifiedName());
+                actualClass = clazz;
+            } else {
+                log.info("Could not load class built by factory: " + factoryClass);
+            }
+        }
+
+        ArrayList<String> superClasses = new ArrayList<String>();
+        JavaClass p = actualClass;
+        if (actualClass != javaClass) {
+            superClasses.add(actualClass.getFullyQualifiedName());
+        }
+        while (true) {
+            JavaClass s = p.getSuperJavaClass();
+            if (s == null || s.equals(p) || "java.lang.Object".equals(s.getFullyQualifiedName())) {
+                break;
+            }
+            p = s;
+            superClasses.add(p.getFullyQualifiedName());
+            interfaces.addAll(getFullyQualifiedNames(p.getImplementedInterfaces()));
+        }
+
+        return new ElementMapping(namespace,
+                element,
+                javaClass.getFullyQualifiedName(),
+                description,
+                root,
+                initMethod,
+                destroyMethod,
+                factoryMethod,
+                contentProperty,
+                attributes,
+                constructorArgs,
+                flatProperties,
+                mapsByPropertyName,
+                flatCollections,
+                superClasses,
+                interfaces);
+    }
+
+    private List<String> getFullyQualifiedNames(JavaClass[] implementedInterfaces) {
+        ArrayList<String> l = new ArrayList<String>();
+        for (JavaClass implementedInterface : implementedInterfaces) {
+            l.add(implementedInterface.getFullyQualifiedName());
+        }
+        return l;
+    }
+
+    private String getElementName(JavaClass javaClass, DocletTag tag) {
+        String elementName = getProperty(tag, "element");
+        if (elementName == null) {
+            String className = javaClass.getFullyQualifiedName();
+            int index = className.lastIndexOf(".");
+            if (index > 0) {
+                className = className.substring(index + 1);
+            }
+            // strip off "Bean" from a spring factory bean
+            if (className.endsWith("FactoryBean")) {
+                className = className.substring(0, className.length() - 4);
+            }
+            elementName = Utils.decapitalise(className);
+        }
+        return elementName;
+    }
+
+    private AttributeMapping loadAttribute(BeanProperty beanProperty, String defaultDescription) {
+        DocletTag propertyTag = getPropertyTag(beanProperty);
+
+        if (getBooleanProperty(propertyTag, "hidden")) {
+            return null;
+        }
+
+        String attribute = getProperty(propertyTag, "alias", beanProperty.getName());
+        String attributeDescription = getAttributeDescription(beanProperty, propertyTag, defaultDescription);
+        String defaultValue = getProperty(propertyTag, "default");
+        boolean fixed = getBooleanProperty(propertyTag, "fixed");
+        boolean required = getBooleanProperty(propertyTag, "required");
+        String nestedType = getProperty(propertyTag, "nestedType");
+        String propertyEditor = getProperty(propertyTag, "propertyEditor");
+
+        return new AttributeMapping(attribute,
+                beanProperty.getName(),
+                attributeDescription,
+                toMappingType(beanProperty.getType(), nestedType),
+                defaultValue,
+                fixed,
+                required,
+                propertyEditor);
+    }
+
+    private static DocletTag getPropertyTag(BeanProperty beanProperty) {
+        JavaMethod accessor = beanProperty.getAccessor();
+        if (accessor != null) {
+            DocletTag propertyTag = accessor.getTagByName(PROPERTY_ANNOTATION);
+            if (propertyTag != null) {
+                return propertyTag;
+            }
+        }
+        JavaMethod mutator = beanProperty.getMutator();
+        if (mutator != null) {
+            DocletTag propertyTag = mutator.getTagByName(PROPERTY_ANNOTATION);
+            if (propertyTag != null) {
+                return propertyTag;
+            }
+        }
+        return null;
+    }
+
+    private String getAttributeDescription(BeanProperty beanProperty, DocletTag propertyTag, String defaultDescription) {
+        String description = getProperty(propertyTag, "description");
+        if (description != null && description.trim().length() > 0) {
+            return description.trim();
+        }
+
+        JavaMethod accessor = beanProperty.getAccessor();
+        if (accessor != null) {
+            description = accessor.getComment();
+            if (description != null && description.trim().length() > 0) {
+                return description.trim();
+            }
+        }
+
+        JavaMethod mutator = beanProperty.getMutator();
+        if (mutator != null) {
+            description = mutator.getComment();
+            if (description != null && description.trim().length() > 0) {
+                return description.trim();
+            }
+        }
+        return defaultDescription;
+    }
+
+    private AttributeMapping loadParameter(JavaParameter parameter) {
+        String parameterName = parameter.getName();
+        String parameterDescription = getParameterDescription(parameter);
+
+        // first attempt to load the attribute from the java beans accessor methods
+        JavaClass javaClass = parameter.getParentMethod().getParentClass();
+        BeanProperty beanProperty = javaClass.getBeanProperty(parameterName);
+        if (beanProperty != null) {
+            AttributeMapping attributeMapping = loadAttribute(beanProperty, parameterDescription);
+            // if the attribute mapping is null, the property was tagged as hidden and this is an error
+            if (attributeMapping == null) {
+                throw new InvalidModelException("Hidden property usage: " +
+                        "The construction method " + toMethodLocator(parameter.getParentMethod()) +
+                        " can not use a hidded property " + parameterName);
+            }
+            return attributeMapping;
+        }
+
+        // create an attribute solely based on the parameter information
+        return new AttributeMapping(parameterName,
+                parameterName,
+                parameterDescription,
+                toMappingType(parameter.getType(), null),
+                null,
+                false,
+                false,
+                null);
+    }
+
+    private String getParameterDescription(JavaParameter parameter) {
+        String parameterName = parameter.getName();
+        DocletTag[] tags = parameter.getParentMethod().getTagsByName("param");
+        for (DocletTag tag : tags) {
+            if (tag.getParameters()[0].equals(parameterName)) {
+                String parameterDescription = tag.getValue().trim();
+                if (parameterDescription.startsWith(parameterName)) {
+                    parameterDescription = parameterDescription.substring(parameterName.length()).trim();
+                }
+                return parameterDescription;
+            }
+        }
+        return null;
+    }
+
+    private boolean isValidConstructor(String factoryMethod, JavaMethod method, JavaParameter[] parameters) {
+        if (!method.isPublic() || parameters.length == 0) {
+            return false;
+        }
+
+        if (factoryMethod == null) {
+            return method.isConstructor();
+        } else {
+            return method.getName().equals(factoryMethod);
+        }
+    }
+
+    private static String getProperty(DocletTag propertyTag, String propertyName) {
+        return getProperty(propertyTag, propertyName, null);
+    }
+
+    private static String getProperty(DocletTag propertyTag, String propertyName, String defaultValue) {
+        String value = null;
+        if (propertyTag != null) {
+            value = propertyTag.getNamedParameter(propertyName);
+        }
+        if (value == null) {
+            return defaultValue;
+        }
+        return value;
+    }
+
+    private boolean getBooleanProperty(DocletTag propertyTag, String propertyName) {
+        return toBoolean(getProperty(propertyTag, propertyName));
+    }
+
+    private static boolean toBoolean(String value) {
+        if (value != null) {
+            return Boolean.valueOf(value);
+        }
+        return false;
+    }
+
+    private org.apache.xbean.blueprint.generator.Type toMappingType(Type type, String nestedType) {
+        try {
+            if (type.isArray()) {
+                return org.apache.xbean.blueprint.generator.Type.newArrayType(type.getValue(), type.getDimensions());
+            } else if (type.isA(collectionType)) {
+                if (nestedType == null) nestedType = "java.lang.Object";
+                return org.apache.xbean.blueprint.generator.Type.newCollectionType(type.getValue(),
+                        org.apache.xbean.blueprint.generator.Type.newSimpleType(nestedType));
+            }
+        } catch (Throwable t) {
+            log.debug("Could not load type mapping", t);
+        }
+        return org.apache.xbean.blueprint.generator.Type.newSimpleType(type.getValue());
+    }
+
+    private static String toMethodLocator(JavaMethod method) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(method.getParentClass().getFullyQualifiedName());
+        if (!method.isConstructor()) {
+            buf.append(".").append(method.getName());
+        }
+        buf.append("(");
+        JavaParameter[] parameters = method.getParameters();
+        for (int i = 0; i < parameters.length; i++) {
+            JavaParameter parameter = parameters[i];
+            if (i > 0) {
+                buf.append(", ");
+            }
+            buf.append(parameter.getName());
+        }
+        buf.append(") : ").append(method.getLineNumber());
+        return buf.toString();
+    }
+
+    private static void getSourceFiles(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException {
+        if (base.isDirectory()) {
+            listAllFileNames(base, "", excludedClasses, builder);
+        } else {
+            listAllJarEntries(base, excludedClasses, builder);
+        }
+    }
+
+    private static void listAllFileNames(File base, String prefix, String[] excludedClasses, JavaDocBuilder builder) throws IOException {
+        if (!base.canRead() || !base.isDirectory()) {
+            throw new IllegalArgumentException(base.getAbsolutePath());
+        }
+        File[] hits = base.listFiles();
+        for (File hit : hits) {
+            String name = prefix.equals("") ? hit.getName() : prefix + "/" + hit.getName();
+            if (hit.canRead() && !isExcluded(name, excludedClasses)) {
+                if (hit.isDirectory()) {
+                    listAllFileNames(hit, name, excludedClasses, builder);
+                } else if (name.endsWith(".java")) {
+                    builder.addSource(hit);
+                }
+            }
+        }
+    }
+
+    private static void listAllJarEntries(File base, String[] excludedClasses, JavaDocBuilder builder) throws IOException {
+        JarFile jarFile = new JarFile(base);
+        for (Enumeration entries = jarFile.entries(); entries.hasMoreElements(); ) {
+            JarEntry entry = (JarEntry) entries.nextElement();
+            String name = entry.getName();
+            if (name.endsWith(".java") && !isExcluded(name, excludedClasses) && !name.endsWith("/package-info.java")) {
+                builder.addSource(new URL("jar:" + base.toURL().toString() + "!/" + name));
+            }
+        }
+    }
+
+    private static boolean isExcluded(String sourceName, String[] excludedClasses) {
+        if (excludedClasses == null) {
+            return false;
+        }
+
+        String className = sourceName;
+        if (sourceName.endsWith(".java")) {
+            className = className.substring(0, className.length() - ".java".length());
+        }
+        className = className.replace('/', '.');
+        for (String excludedClass : excludedClasses) {
+            if (className.equals(excludedClass)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/QdoxMappingLoader.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @version $Revision$
+ */
+public class SchemaGenerator {
+    private final MappingLoader mappingLoader;
+    private final GeneratorPlugin[] plugins;
+    private final LogFacade log;
+
+    public SchemaGenerator(LogFacade log, MappingLoader mappingLoader, GeneratorPlugin[] plugins) {
+        this.log = log;
+        this.mappingLoader = mappingLoader;
+        this.plugins = plugins;
+    }
+
+    public void generate() throws IOException {
+        Set namespaces = mappingLoader.loadNamespaces();
+        if (namespaces.isEmpty()) {
+            log.log("Warning: no namespaces found!");
+        }
+
+        for (Iterator iterator = namespaces.iterator(); iterator.hasNext();) {
+            NamespaceMapping namespaceMapping = (NamespaceMapping) iterator.next();
+            for (int i = 0; i < plugins.length; i++) {
+                GeneratorPlugin plugin = plugins[i];
+                plugin.generate(namespaceMapping);
+            }
+        }
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/SchemaGenerator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,102 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Collections;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public class Type {
+    private final String name;
+    private final Type nestedType;
+    private final boolean primitive;
+
+    public static Type newSimpleType(String name) {
+        if (name == null) throw new NullPointerException("type");
+        if (name.indexOf("[") >= 0 || name.indexOf("]") >= 0) {
+            throw new IllegalArgumentException("Name can not contain '[' or ']' " + name);
+        }
+        return new Type(name, null);
+    }
+
+    public static Type newArrayType(String type, int dimensions) {
+        if (type == null) throw new NullPointerException("type");
+        if (dimensions < 1) throw new IllegalArgumentException("dimensions must be atleast one");
+        StringBuffer buf = new StringBuffer(type.length() + (dimensions * 2));
+        buf.append(type);
+        for (int i = 0; i < dimensions; i ++) {
+            buf.append("[]");
+        }
+        return new Type(buf.toString(), newSimpleType(type));
+    }
+
+    public static Type newCollectionType(String collectionType, Type elementType) {
+        if (collectionType == null) throw new NullPointerException("collectionType");
+        if (elementType == null) throw new NullPointerException("elementType");
+        return new Type(collectionType, elementType);
+    }
+
+    private Type(String name, Type nestedType) {
+        this.name = name;
+        this.nestedType = nestedType;
+        primitive = (nestedType == null) && primitives.contains(name);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Type getNestedType() {
+        return nestedType;
+    }
+
+    public boolean isCollection() {
+        return nestedType != null;
+    }
+
+    public boolean isPrimitive() {
+        return primitive;
+    }
+
+    public int hashCode() {
+        return super.hashCode();
+    }
+
+    public boolean equals(Object obj) {
+        return super.equals(obj);
+    }
+
+    private static final Set primitives;
+
+    static {
+        Set set = new HashSet();
+        set.add("boolean");
+        set.add("byte");
+        set.add("char");
+        set.add("short");
+        set.add("int");
+        set.add("long");
+        set.add("float");
+        set.add("double");
+        primitives = Collections.unmodifiableSet(set);
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Type.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java?rev=896187&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java (added)
+++ geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java Tue Jan  5 19:31:05 2010
@@ -0,0 +1,140 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.xbean.blueprint.generator;
+
+import java.beans.PropertyEditor;
+import java.beans.PropertyEditorManager;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * @author Dain Sundstrom
+ * @version $Id$
+ * @since 1.0
+ */
+public final class Utils {
+    public static final String XBEAN_ANNOTATION = "org.apache.xbean.XBean";
+    public static final String PROPERTY_ANNOTATION = "org.apache.xbean.Property";
+
+    private Utils() {
+    }
+
+    public static String decapitalise(String value) {
+        if (value == null || value.length() == 0) {
+            return value;
+        }
+        return value.substring(0, 1).toLowerCase() + value.substring(1);
+    }
+
+    public static boolean isSimpleType(Type type) {
+        if (type.isPrimitive()) {
+            return true;
+        }
+        if (type.isCollection()) {
+            return false;
+        }
+
+        String name = type.getName();
+        if (name.equals("java.lang.Class") ||
+                name.equals("javax.xml.namespace.QName")) {
+            return true;
+        }
+        return hasPropertyEditor(name);
+    }
+
+    private static boolean hasPropertyEditor(String type) {
+        Class theClass;
+        try {
+            theClass = loadClass(type);
+            // lets see if we can find a property editor for this type
+            PropertyEditor editor = PropertyEditorManager.findEditor(theClass);
+            return editor != null;
+        } catch (Throwable e) {
+            System.out.println("Warning, could not load class: " + type + ": " + e);
+            return false;
+        }
+    }
+
+    /**
+     * Attempts to load the class on the current thread context class loader or
+     * the class loader which loaded us
+     */
+    private static Class loadClass(String name) throws ClassNotFoundException {
+        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+        if (contextClassLoader != null) {
+            try {
+                return contextClassLoader.loadClass(name);
+            } catch (ClassNotFoundException e) {
+            }
+        }
+        return Utils.class.getClassLoader().loadClass(name);
+    }
+
+    public static String getXsdType(Type type) {
+        String name = type.getName();
+        String xsdType = (String) XSD_TYPES.get(name);
+        if (xsdType == null) {
+            xsdType = "xs:string";
+        }
+        return xsdType;
+    }
+
+    public static final Map XSD_TYPES;
+
+    static {
+        // TODO check these XSD types are right...
+        Map map = new HashMap();
+        map.put(String.class.getName(), "xs:string");
+        map.put(Boolean.class.getName(), "xs:boolean");
+        map.put(boolean.class.getName(), "xs:boolean");
+        map.put(Byte.class.getName(), "xs:byte");
+        map.put(byte.class.getName(), "xs:byte");
+        map.put(Short.class.getName(), "xs:short");
+        map.put(short.class.getName(), "xs:short");
+        map.put(Integer.class.getName(), "xs:integer");
+        map.put(int.class.getName(), "xs:integer");
+        map.put(Long.class.getName(), "xs:long");
+        map.put(long.class.getName(), "xs:long");
+        map.put(Float.class.getName(), "xs:float");
+        map.put(float.class.getName(), "xs:float");
+        map.put(Double.class.getName(), "xs:double");
+        map.put(double.class.getName(), "xs:double");
+        map.put(java.util.Date.class.getName(), "xs:date");
+        map.put(java.sql.Date.class.getName(), "xs:date");
+        map.put("javax.xml.namespace.QName", "xs:QName");
+        XSD_TYPES = Collections.unmodifiableMap(map);
+    }
+
+    public static List findImplementationsOf(NamespaceMapping namespaceMapping, Type type) {
+        List elements = new ArrayList();
+        String nestedTypeName = type.getName();
+        for (Iterator iter = namespaceMapping.getElements().iterator(); iter.hasNext();) {
+            ElementMapping element = (ElementMapping) iter.next();
+            if (element.getClassName().equals(nestedTypeName) ||
+                element.getInterfaces().contains(nestedTypeName) ||
+                element.getSuperClasses().contains(nestedTypeName)) 
+            {
+                elements.add(element);
+            }
+        }
+        return elements;
+    }
+}

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/xbean/trunk/xbean-blueprint/src/main/java/org/apache/xbean/blueprint/generator/Utils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain