Merge pull request #21 from rmannibucau/rmannibucau/support-multiple-servicepid

enable to have a String[] for service.pid
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java b/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
index 57f7ce9..f1e331f 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
@@ -13,22 +13,6 @@
  */
 package org.apache.winegrower.service;
 
-import static java.util.Collections.list;
-import static java.util.Optional.ofNullable;
-import static java.util.stream.Collectors.groupingBy;
-import static java.util.stream.Collectors.toList;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.stream.Stream;
-
 import org.apache.winegrower.Ripener;
 import org.apache.winegrower.api.InjectedService;
 import org.apache.winegrower.deployer.BundleContextImpl;
@@ -56,6 +40,22 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Stream;
+
+import static java.util.Collections.list;
+import static java.util.Optional.ofNullable;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.toList;
+
 // holder of all services
 public class OSGiServices {
     private static final Logger LOGGER = LoggerFactory.getLogger(OSGiServices.class);
@@ -248,29 +248,13 @@
         final Object pid = serviceProperties.get(Constants.SERVICE_PID);
         if (pid != null) {
             final ConfigurationAdmin configurationAdmin = framework.getConfigurationAdmin();
-            final String pidStr = String.valueOf(pid);
-            try {
-                final Configuration configuration = configurationAdmin.getConfiguration(pidStr);
-                ofNullable(configuration.getProperties())
-                        .ifPresent(prop -> list(prop.keys())
-                                .forEach(key -> serviceProperties.put(key, configuration.getProperties().get(key))));
-            } catch (final IOException e) {
-                LOGGER.warn(e.getMessage());
-            }
+            asStream(pid).forEach(it -> initConfiguration(serviceProperties, configurationAdmin, it));
         }
 
         final Object factoryPid = serviceProperties.get("service.factoryPid");
         if (factoryPid != null) {
             final ConfigurationAdmin configurationAdmin = framework.getConfigurationAdmin();
-            final String pidStr = String.valueOf(factoryPid);
-            try {
-                final Configuration configuration = configurationAdmin.createFactoryConfiguration(pidStr);
-                ofNullable(configuration.getProperties())
-                        .ifPresent(prop -> list(prop.keys())
-                                .forEach(key -> serviceProperties.put(key, configuration.getProperties().get(key))));
-            } catch (final IOException e) {
-                LOGGER.warn(e.getMessage());
-            }
+            asStream(factoryPid).forEach(it -> initFactoryConfiguration(serviceProperties, configurationAdmin, it));
         }
 
         services.add(registration);
@@ -298,6 +282,42 @@
         return registration;
     }
 
+    private Stream<String> asStream(final Object value) {
+        if (String[].class.isInstance(value)) {
+            return Stream.of(String[].class.cast(value));
+        }
+        if (Collection.class.isInstance(value)) {
+            return Collection.class.cast(value).stream().map(String::valueOf);
+        }
+        return Stream.of(String.valueOf(value));
+    }
+
+    public void initFactoryConfiguration(final Hashtable<String, Object> serviceProperties,
+                                         final ConfigurationAdmin configurationAdmin,
+                                         final String pidStr) {
+        try {
+            final Configuration configuration = configurationAdmin.createFactoryConfiguration(pidStr);
+            ofNullable(configuration.getProperties())
+                    .ifPresent(prop -> list(prop.keys())
+                            .forEach(key -> serviceProperties.put(key, configuration.getProperties().get(key))));
+        } catch (final IOException e) {
+            LOGGER.warn(e.getMessage());
+        }
+    }
+
+    public void initConfiguration(final Hashtable<String, Object> serviceProperties,
+                                  final ConfigurationAdmin configurationAdmin,
+                                  final String pid) {
+        try {
+            final Configuration configuration = configurationAdmin.getConfiguration(pid);
+            ofNullable(configuration.getProperties())
+                    .ifPresent(prop -> list(prop.keys())
+                            .forEach(key -> serviceProperties.put(key, configuration.getProperties().get(key))));
+        } catch (final IOException e) {
+            LOGGER.warn(e.getMessage());
+        }
+    }
+
     private void fireEvent(final ServiceRegistration<?> reg, final ServiceEvent event) {
         final List<ServiceListenerDefinition> listeners = getListeners(reg);
         final Collection<ServiceReference<EventListenerHook>> eventListenerHooks = hooks.getEventListenerHooks();