FELIX-1225 : factoryPid attribute of Designate elements for metatype data is not set

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@798540 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr-annotations/src/main/java/org/apache/felix/scr/annotations/Component.java b/scr-annotations/src/main/java/org/apache/felix/scr/annotations/Component.java
index 6efb369..7c4c84e 100644
--- a/scr-annotations/src/main/java/org/apache/felix/scr/annotations/Component.java
+++ b/scr-annotations/src/main/java/org/apache/felix/scr/annotations/Component.java
@@ -108,6 +108,12 @@
     boolean createPid() default true;
 
     /**
+     * Set the metatype factory pid property (only for non factory components).
+     * @since 1.0
+     */
+    boolean getMetatypeFactoryPid() default false;
+
+    /**
      * The configuration policy
      * @since 1.0
      */
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/Constants.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/Constants.java
index 41f625f..ca9bd35 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/Constants.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/Constants.java
@@ -56,6 +56,8 @@
 
     public static final String COMPONENT_CREATE_PID = "create-pid";
 
+    public static final String COMPONENT_SET_METATYPE_FACTORY_PID = "set-metatype-factory-pid";
+
     // The component configuration policy (V1.1)
     public static final String COMPONENT_CONFIG_POLICY = "policy";
     public static final String COMPONENT_CONFIG_POLICY_OPTIONAL = "optional";
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
index 09615ca..0144763 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
@@ -367,7 +367,7 @@
         // set implementation
         component.setImplementation(new Implementation(description.getName()));
 
-        final OCD ocd = this.doComponent(componentTag, component, metaData);
+        final OCD ocd = this.doComponent(componentTag, component, metaData, iLog);
 
         boolean inherited = getBoolean(componentTag, Constants.COMPONENT_INHERIT, true);
         this.doServices(description.getTagsByName(Constants.SERVICE, inherited), component, description);
@@ -443,7 +443,8 @@
      * @param tag
      * @param component
      */
-    protected OCD doComponent(JavaTag tag, Component component, MetaData metaData) {
+    protected OCD doComponent(JavaTag tag, Component component, MetaData metaData,
+            final IssueLog iLog) {
 
         // check if this is an abstract definition
         final String abstractType = tag.getNamedParameter(Constants.COMPONENT_ABSTRACT);
@@ -513,8 +514,17 @@
             final Designate designate = new Designate();
             metaData.addDesignate(designate);
             designate.setPid(component.getName());
-            if (component.getFactory() != null) {
-                designate.setFactoryPid( component.getFactory() );
+
+            // factory pid
+            final String setFactoryPidValue = tag.getNamedParameter(Constants.COMPONENT_SET_METATYPE_FACTORY_PID);
+            final boolean setFactoryPid = setFactoryPidValue != null &&
+                ("yes".equalsIgnoreCase(setFactoryPidValue) || "true".equalsIgnoreCase(setFactoryPidValue));
+            if ( setFactoryPid ) {
+                if ( component.getFactory() == null ) {
+                    designate.setFactoryPid( component.getName() );
+                } else {
+                    iLog.addWarning("Component factory " + component.getName() + " should not set metatype factory pid.");
+                }
             }
             // designate.object
             final MTObject mtobject = new MTObject();
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/ComponentTag.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/ComponentTag.java
index cacee15..6854589 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/ComponentTag.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/ComponentTag.java
@@ -94,6 +94,10 @@
                 return Util.getEnumValue(annotation, "policy", ConfigurationPolicy.class, Component.class, false);
             }
 
+            public boolean getMetatypeFactoryPid() {
+                return Util.getBooleanValue(annotation, "getMetatypeFactoryPid", Component.class);
+            }
+
             public Class<? extends java.lang.annotation.Annotation> annotationType() {
                 return null;
             }
@@ -114,6 +118,8 @@
         map.put(Constants.COMPONENT_DESCRIPTION, emptyToNull(this.annotation.description()));
         map.put(Constants.COMPONENT_ENABLED, String.valueOf(this.annotation.enabled()));
         map.put(Constants.COMPONENT_FACTORY, emptyToNull(this.annotation.factory()));
+        map.put(Constants.COMPONENT_SET_METATYPE_FACTORY_PID, String.valueOf(this.annotation.getMetatypeFactoryPid()));
+
         // FELIX-593: immediate attribute does not default to true all the
         // times hence we only set it if declared in the tag
         if ( this.sourceAnnotation.getNamedParameter("immediate") != null) {