FELIX-3641 :  Option to generate separate descriptor files 

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1379343 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
index 7fbe7dd..ccbf25a 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
@@ -19,6 +19,7 @@
 package org.apache.felix.scrplugin.xml;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -88,10 +89,24 @@
             final File mtFile = new File(mtDir, options.getMetaTypeName());
 
             if (metatypeCount > 0) {
-                logger.info("Generating " + metatypeCount + " MetaType Descriptors to " + mtFile);
-                mtFile.getParentFile().mkdirs();
-                MetaTypeIO.write(module, mtFile);
-                return Collections.singletonList(parentDir.getName() + '/' + mtDir.getName() + '/' + mtFile.getName());
+                mtDir.mkdirs();
+
+                final List<String> fileNames = new ArrayList<String>();
+                if ( options.isGenerateSeparateDescriptors() ) {
+                    for(final ComponentContainer component : module.getComponents() ) {
+                        if ( component.getMetatypeContainer() != null ) {
+                            final File file = new File(mtDir, component.getClassDescription().getDescribedClass().getName() + ".xml");
+                            logger.info("Generating 1 MetaType Descriptor in " + file);
+                            MetaTypeIO.write(module, Collections.singletonList(component), file);
+                            fileNames.add(parentDir.getName() + '/' + mtDir.getName() + '/' + file.getName());
+                        }
+                    }
+                } else {
+                    logger.info("Generating " + metatypeCount + " MetaType Descriptors in " + mtFile);
+                    MetaTypeIO.write(module, module.getComponents(), mtFile);
+                    fileNames.add(parentDir.getName() + '/' + mtDir.getName() + '/' + mtFile.getName());
+                }
+                return fileNames;
             }
             if (mtFile.exists()) {
                 mtFile.delete();
@@ -105,15 +120,6 @@
         return null;
     }
 
-    private static void write(final DescriptionContainer metaData, final File file)
-    throws SCRDescriptorException {
-        try {
-            generateXML(metaData, IOUtils.getSerializer(file));
-        } catch (final SAXException e) {
-            throw new SCRDescriptorException("Unable to generate xml", file.toString(), e);
-        }
-    }
-
     /**
      * Generate the xml top level element and start streaming
      * the meta data.
@@ -121,29 +127,35 @@
      * @param contentHandler
      * @throws SAXException
      */
-    private static void generateXML(final DescriptionContainer metaData, final ContentHandler contentHandler)
-    throws SAXException {
-        contentHandler.startDocument();
-        contentHandler.startPrefixMapping(PREFIX, NAMESPACE_URI);
+    private static void write(final DescriptionContainer metaData, final List<ComponentContainer> components, final File file)
+    throws SCRDescriptorException {
+        try {
+            final ContentHandler contentHandler = IOUtils.getSerializer(file);
 
-        final AttributesImpl ai = new AttributesImpl();
-        IOUtils.addAttribute(ai, "localization", MetaTypeService.METATYPE_DOCUMENTS_LOCATION + "/metatype");
+            contentHandler.startDocument();
+            contentHandler.startPrefixMapping(PREFIX, NAMESPACE_URI);
 
-        contentHandler.startElement(NAMESPACE_URI, METADATA_ELEMENT, METADATA_ELEMENT_QNAME, ai);
-        IOUtils.newline(contentHandler);
+            final AttributesImpl ai = new AttributesImpl();
+            IOUtils.addAttribute(ai, "localization", MetaTypeService.METATYPE_DOCUMENTS_LOCATION + "/metatype");
 
-        for(final ComponentContainer comp : metaData.getComponents()) {
-            if ( comp.getMetatypeContainer() != null ) {
-                generateOCDXML(comp.getMetatypeContainer(), contentHandler);
-                generateDesignateXML(comp.getMetatypeContainer(), contentHandler);
+            contentHandler.startElement(NAMESPACE_URI, METADATA_ELEMENT, METADATA_ELEMENT_QNAME, ai);
+            IOUtils.newline(contentHandler);
+
+            for(final ComponentContainer comp : metaData.getComponents()) {
+                if ( comp.getMetatypeContainer() != null ) {
+                    generateOCDXML(comp.getMetatypeContainer(), contentHandler);
+                    generateDesignateXML(comp.getMetatypeContainer(), contentHandler);
+                }
             }
-        }
 
-        // end wrapper element
-        contentHandler.endElement(NAMESPACE_URI, METADATA_ELEMENT, METADATA_ELEMENT_QNAME);
-        IOUtils.newline(contentHandler);
-        contentHandler.endPrefixMapping(PREFIX);
-        contentHandler.endDocument();
+            // end wrapper element
+            contentHandler.endElement(NAMESPACE_URI, METADATA_ELEMENT, METADATA_ELEMENT_QNAME);
+            IOUtils.newline(contentHandler);
+            contentHandler.endPrefixMapping(PREFIX);
+            contentHandler.endDocument();
+        } catch (final SAXException e) {
+            throw new SCRDescriptorException("Unable to generate xml", file.toString(), e);
+        }
     }
 
     private static void generateOCDXML(final MetatypeContainer ocd, final ContentHandler contentHandler)