Author: pderop
Date: Thu Nov 10 22:43:09 2016
New Revision: 1769219

URL: http://svn.apache.org/viewvc?rev=1769219&view=rev
Log:
FELIX-5406: DM lambda fluent service properties don't support dots.

Added:
    
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
Modified:
    
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java

Added: 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java?rev=1769219&view=auto
==============================================================================
--- 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
 (added)
+++ 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FELIX5406_FluentPropertyWithDotTest.java
 Thu Nov 10 22:43:09 2016
@@ -0,0 +1,85 @@
+/*
+ * 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.felix.dm.lambda.itest;
+
+import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
+
+import java.util.Map;
+
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Assert;
+
+/**
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class FELIX5406_FluentPropertyWithDotTest extends TestBase {
+    private final Ensure m_ensure = new Ensure();
+
+       public void testFluentServiceProperty() {
+        final DependencyManager dm = getDM();
+        
+        component(dm, comp -> 
comp.factory(ProviderImpl::new).provides(Provider.class, foo -> "bar"));
+        component(dm, comp -> comp.impl(new Consumer("foo", "bar"))
+                       .withSvc(Provider.class, svc -> 
svc.filter("(foo=bar)").required().add(Consumer::bind)));
+        
+        m_ensure.waitForStep(1,  5000);
+       }
+       
+       public void testFluentServicePropertyWithDot() {
+        final DependencyManager dm = getDM();
+        
+        component(dm, comp -> 
comp.factory(ProviderImpl::new).provides(Provider.class, foo_bar -> "zoo"));
+        component(dm, comp -> comp.impl(new Consumer("foo.bar", "zoo"))
+                       .withSvc(Provider.class, svc -> 
svc.filter("(foo.bar=zoo)").required().add(Consumer::bind)));
+        
+        m_ensure.waitForStep(1,  5000);
+       }
+       
+       public void testFluentServicePropertyWithUnderscore() {
+        final DependencyManager dm = getDM();
+        
+        component(dm, comp -> 
comp.factory(ProviderImpl::new).provides(Provider.class, foo__bar -> "zoo"));
+        component(dm, comp -> comp.impl(new Consumer("foo_bar", "zoo"))
+                       .withSvc(Provider.class, svc -> 
svc.filter("(foo_bar=zoo)").required().add(Consumer::bind)));
+        
+        m_ensure.waitForStep(1,  5000);
+       }
+
+       interface Provider {            
+       }
+       
+       public class ProviderImpl implements Provider {                         
+       }
+
+       public class Consumer {
+               private final String m_key;
+               private final String m_value;
+
+               Consumer(String key, String value) {
+                       m_key = key;
+                       m_value = value;
+               }
+               
+               void bind(Provider provider, Map<String, Object> properties) {
+            Assert.assertEquals(m_value, properties.get(m_key));
+            m_ensure.step(1);
+               }
+       }
+       
+}

Modified: 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java?rev=1769219&r1=1769218&r2=1769219&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
 Thu Nov 10 22:43:09 2016
@@ -247,7 +247,7 @@ public class ComponentBuilderImpl implem
                        throw new IllegalArgumentException("arg0 property name 
not supported"); 
                }
                Object value = property.apply(name);
-               props.put(name, value);
+               props.put(convertDots(name), value);
        });
         m_properties = props;
         return this;
@@ -659,4 +659,21 @@ public class ComponentBuilderImpl implem
             throw new IllegalStateException("Can't mix factory method name and 
factory method reference");
         }
     }
+    
+    private String convertDots(String propertyName) {
+        StringBuilder sb = new StringBuilder(propertyName);
+        // replace "__" by "_" or "_" by ".": foo_bar -> foo.bar; foo__BAR_zoo 
-> foo_BAR.zoo
+        for (int i = 0; i < sb.length(); i ++) {
+            if (sb.charAt(i) == '_') {
+                if (i < (sb.length() - 1) && sb.charAt(i+1) == '_') {
+                    // replace foo__bar -> foo_bar
+                    sb.replace(i, i+2, "_");
+                } else {
+                    // replace foo_bar -> foo.bar
+                    sb.replace(i, i+1, ".");
+                }
+            }
+        }
+        return sb.toString();
+    }
 }


Reply via email to