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();
+ }
}