FELIX-4773 : Generated service component xml does not conform to XSD

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1660651 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java
index 3e87158..6c55e1c 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java
@@ -179,7 +179,7 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generateXML(final DescriptionContainer module,
+    private static void generateXML(final DescriptionContainer module,
             final List<ComponentContainer> components,
             final File descriptorFile,
             final Log logger) throws SAXException, IOException, TransformerException {
@@ -192,13 +192,16 @@
         contentHandler.startDocument();
         contentHandler.startPrefixMapping(PREFIX, namespace);
 
+        IOUtils.newline(contentHandler);
         // wrapper element to generate well formed xml if 0 or more than 1 component
+        int startIndent = 0;
         if ( components.size() != 1 ) {
             contentHandler.startElement("", ComponentDescriptorIO.COMPONENTS, ComponentDescriptorIO.COMPONENTS, new AttributesImpl());
             IOUtils.newline(contentHandler);
+            startIndent = 1;
         }
         for (final ComponentContainer component : components) {
-            generateXML(namespace, module, component, contentHandler);
+            generateXML(namespace, module, component, contentHandler, startIndent);
         }
 
         // end wrapper element
@@ -217,11 +220,12 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generateXML(final String namespace,
+    private static void generateXML(final String namespace,
             final DescriptionContainer module,
             final ComponentContainer container,
-            final ContentHandler contentHandler)
-                    throws SAXException {
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final ComponentDescription component = container.getComponentDescription();
 
         final AttributesImpl ai = new AttributesImpl();
@@ -246,22 +250,22 @@
                 IOUtils.addAttribute(ai, COMPONENT_ATTR_CONFIGURATION_PID, component.getConfigurationPid());
             }
         }
-        IOUtils.indent(contentHandler, 1);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(namespace, ComponentDescriptorIO.COMPONENT, ComponentDescriptorIO.COMPONENT_QNAME, ai);
         IOUtils.newline(contentHandler);
-        generateImplementationXML(container, contentHandler);
+        generateImplementationXML(container, contentHandler, indent+1);
         if (container.getServiceDescription() != null) {
-            generateServiceXML(container.getServiceDescription(), contentHandler);
+            generateServiceXML(container.getServiceDescription(), contentHandler, indent+1);
         }
         for (final PropertyDescription property : container.getProperties().values()) {
-            generatePropertyXML(property, contentHandler);
+            generatePropertyXML(property, contentHandler, indent+1);
         }
 
         for (final ReferenceDescription reference : container.getReferences().values()) {
-            generateReferenceXML(component, module, reference, contentHandler);
+            generateReferenceXML(component, module, reference, contentHandler, indent+1);
         }
 
-        IOUtils.indent(contentHandler, 1);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.endElement(namespace, ComponentDescriptorIO.COMPONENT, ComponentDescriptorIO.COMPONENT_QNAME);
         IOUtils.newline(contentHandler);
     }
@@ -273,10 +277,13 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generateImplementationXML(ComponentContainer component, ContentHandler contentHandler) throws SAXException {
+    private static void generateImplementationXML(final ComponentContainer component,
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final AttributesImpl ai = new AttributesImpl();
         IOUtils.addAttribute(ai, IMPLEMENTATION_ATTR_CLASS, component.getClassDescription().getDescribedClass().getName());
-        IOUtils.indent(contentHandler, 2);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.IMPLEMENTATION,
                 ComponentDescriptorIO.IMPLEMENTATION_QNAME, ai);
         contentHandler.endElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.IMPLEMENTATION,
@@ -291,20 +298,21 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generateServiceXML(
+    private static void generateServiceXML(
             final ServiceDescription service,
-            final ContentHandler contentHandler)
-                    throws SAXException {
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final AttributesImpl ai = new AttributesImpl();
         IOUtils.addAttribute(ai, SERVICE_ATTR_FACTORY, String.valueOf(service.isServiceFactory()));
-        IOUtils.indent(contentHandler, 2);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.SERVICE, ComponentDescriptorIO.SERVICE_QNAME, ai);
         if (service.getInterfaces() != null && service.getInterfaces().size() > 0) {
             IOUtils.newline(contentHandler);
             for (final String interf : service.getInterfaces()) {
-                generateServiceXML(interf, contentHandler);
+                generateServiceXML(interf, contentHandler, indent+1);
             }
-            IOUtils.indent(contentHandler, 2);
+            IOUtils.indent(contentHandler, indent);
         }
         contentHandler.endElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.SERVICE, ComponentDescriptorIO.SERVICE_QNAME);
         IOUtils.newline(contentHandler);
@@ -317,11 +325,13 @@
      * @param contentHandler
      * @throws SAXException
      */
-    private static void generateServiceXML(final String interfaceName, final ContentHandler contentHandler)
-            throws SAXException {
+    private static void generateServiceXML(final String interfaceName,
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final AttributesImpl ai = new AttributesImpl();
         IOUtils.addAttribute(ai, INTERFACE_ATTR_NAME, interfaceName);
-        IOUtils.indent(contentHandler, 3);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.INTERFACE, ComponentDescriptorIO.INTERFACE_QNAME,
                 ai);
         contentHandler.endElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.INTERFACE, ComponentDescriptorIO.INTERFACE_QNAME);
@@ -335,7 +345,10 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generatePropertyXML(PropertyDescription property, ContentHandler contentHandler) throws SAXException {
+    private static void generatePropertyXML(final PropertyDescription property,
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final AttributesImpl ai = new AttributesImpl();
         IOUtils.addAttribute(ai, ATTR_NAME, property.getName());
         if ( property.getType() != PropertyType.String && property.getType() != PropertyType.Password) {
@@ -349,13 +362,13 @@
             IOUtils.addAttribute(ai, PROPERTY_ATTR_VALUE, value);
         }
 
-        IOUtils.indent(contentHandler, 2);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.PROPERTY, ComponentDescriptorIO.PROPERTY_QNAME, ai);
         if (property.getMultiValue() != null && property.getMultiValue().length > 0) {
             // generate a new line first
             IOUtils.text(contentHandler, "\n");
             for (int i = 0; i < property.getMultiValue().length; i++) {
-                IOUtils.indent(contentHandler, 3);
+                IOUtils.indent(contentHandler, indent + 1);
                 value = property.getMultiValue()[i];
                 if ( property.getType() == PropertyType.Character || property.getType() == PropertyType.Char ) {
                     value = String.valueOf((int)value.charAt(0));
@@ -363,7 +376,7 @@
                 IOUtils.text(contentHandler, value);
                 IOUtils.newline(contentHandler);
             }
-            IOUtils.indent(contentHandler, 2);
+            IOUtils.indent(contentHandler, indent);
         }
         contentHandler.endElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.PROPERTY, ComponentDescriptorIO.PROPERTY_QNAME);
         IOUtils.newline(contentHandler);
@@ -376,11 +389,12 @@
      * @param contentHandler
      * @throws SAXException
      */
-    protected static void generateReferenceXML(final ComponentDescription component,
+    private static void generateReferenceXML(final ComponentDescription component,
             final DescriptionContainer module,
             final ReferenceDescription reference,
-            final ContentHandler contentHandler)
-                    throws SAXException {
+            final ContentHandler contentHandler,
+            final int indent)
+    throws SAXException {
         final AttributesImpl ai = new AttributesImpl();
         IOUtils.addAttribute(ai, ATTR_NAME, reference.getName());
         IOUtils.addAttribute(ai, INTERFACE_ATTR_NAME, reference.getInterfaceName());
@@ -402,7 +416,7 @@
             }
         }
 
-        IOUtils.indent(contentHandler, 2);
+        IOUtils.indent(contentHandler, indent);
         contentHandler.startElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.REFERENCE, ComponentDescriptorIO.REFERENCE_QNAME,
                 ai);
         contentHandler.endElement(INNER_NAMESPACE_URI, ComponentDescriptorIO.REFERENCE, ComponentDescriptorIO.REFERENCE_QNAME);