You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by al...@apache.org on 2017/02/04 11:02:53 UTC
svn commit: r1781654 - in
/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src:
main/java/org/apache/aries/blueprint/plugin/handlers/pax/
main/java/org/apache/aries/blueprint/plugin/model/
test/java/org/apache/aries/blueprint/plugin/ test/java/org/...
Author: alien11689
Date: Sat Feb 4 11:02:53 2017
New Revision: 1781654
URL: http://svn.apache.org/viewvc?rev=1781654&view=rev
Log:
[ARIES-1677] Create typed service properties via annotations
Added:
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/ServiceProperty.java
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceWithTypedParameters.java
Modified:
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceHandler.java
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceProviderHandler.java
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Blueprint.java
aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceHandler.java?rev=1781654&r1=1781653&r2=1781654&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceHandler.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceHandler.java Sat Feb 4 11:02:53 2017
@@ -42,20 +42,7 @@ public class OsgiServiceHandler implemen
final Class<?> clazz = getClass(annotatedElement);
contextEnricher.addBean(id, getClass(annotatedElement));
- contextEnricher.addBlueprintContentWriter("osgiService/" + clazz.getName() + "/" + id, new XmlWriter() {
- @Override
- public void write(XMLStreamWriter writer) throws XMLStreamException {
- writer.writeEmptyElement("reference");
- writer.writeAttribute("id", id);
- writer.writeAttribute("interface", clazz.getName());
- if (serviceFilter.filter != null && !"".equals(serviceFilter.filter)) {
- writer.writeAttribute("filter", serviceFilter.filter);
- }
- if (serviceFilter.compName != null && !"".equals(serviceFilter.compName)) {
- writer.writeAttribute("component-name", serviceFilter.compName);
- }
- }
- });
+ contextEnricher.addBlueprintContentWriter(getWriterId(id, clazz), getXmlWriter(id, clazz, serviceFilter));
return id;
}
@@ -65,7 +52,12 @@ public class OsgiServiceHandler implemen
final String id = name != null ? name : generateReferenceId(clazz, serviceFilter);
contextEnricher.addBean(id, clazz);
- contextEnricher.addBlueprintContentWriter("osgiService/" + clazz.getName() + "/" + id, new XmlWriter() {
+ contextEnricher.addBlueprintContentWriter(getWriterId(id, clazz), getXmlWriter(id, clazz, serviceFilter));
+ return id;
+ }
+
+ private XmlWriter getXmlWriter(final String id, final Class<?> clazz, final ServiceFilter serviceFilter) {
+ return new XmlWriter() {
@Override
public void write(XMLStreamWriter writer) throws XMLStreamException {
writer.writeEmptyElement("reference");
@@ -78,8 +70,11 @@ public class OsgiServiceHandler implemen
writer.writeAttribute("component-name", serviceFilter.compName);
}
}
- });
- return id;
+ };
+ }
+
+ private String getWriterId(String id, Class<?> clazz) {
+ return "osgiService/" + clazz.getName() + "/" + id;
}
private Class<?> getClass(AnnotatedElement annotatedElement) {
@@ -111,7 +106,7 @@ public class OsgiServiceHandler implemen
return prefix + suffix;
}
- protected static String getBeanNameFromSimpleName(String name) {
+ private static String getBeanNameFromSimpleName(String name) {
return name.substring(0, 1).toLowerCase() + name.substring(1, name.length());
}
@@ -137,10 +132,10 @@ public class OsgiServiceHandler implemen
}
private static class ServiceFilter {
- final public String filter;
- final public String compName;
+ final String filter;
+ final String compName;
- public ServiceFilter(String filterValue) {
+ ServiceFilter(String filterValue) {
if (filterValue == null || filterValue.isEmpty()) {
filter = null;
compName = null;
Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceProviderHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceProviderHandler.java?rev=1781654&r1=1781653&r2=1781654&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceProviderHandler.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/OsgiServiceProviderHandler.java Sat Feb 4 11:02:53 2017
@@ -31,10 +31,9 @@ import org.ops4j.pax.cdi.api.Property;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.lang.reflect.AnnotatedElement;
+import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
public class OsgiServiceProviderHandler implements BeanAnnotationHandler<OsgiServiceProvider> {
@@ -56,21 +55,18 @@ public class OsgiServiceProviderHandler
final List<String> interfaceNames = extractServiceInterfaces(serviceProvider);
- final Map<String, String> propertiesAsMap = extractProperties(properties);
+ final List<ServiceProperty> serviceProperties = extractProperties(properties);
contextEnricher.addBlueprintContentWriter("OsgiServiceProvider/" + annotatedElement + "/" + id, new XmlWriter() {
@Override
public void write(XMLStreamWriter writer) throws XMLStreamException {
- writeService(writer, propertiesAsMap, interfaceNames, id);
+ writeService(writer, serviceProperties, interfaceNames, id);
}
});
}
- private void writeService(XMLStreamWriter writer, Map<String, String> propertiesAsMap, List<String> interfaceNames, String id) throws XMLStreamException {
- // If there are no properties to write and only one service attribute (either
- // interface="MyServiceInterface" or auto-export="interfaces") then create an
- // empty element
- boolean writeEmptyElement = propertiesAsMap.isEmpty() && interfaceNames.size() < 2;
+ private void writeService(XMLStreamWriter writer, List<ServiceProperty> serviceProperties, List<String> interfaceNames, String id) throws XMLStreamException {
+ boolean writeEmptyElement = serviceProperties.isEmpty() && interfaceNames.size() < 2;
if (writeEmptyElement) {
writer.writeEmptyElement("service");
} else {
@@ -86,9 +82,9 @@ public class OsgiServiceProviderHandler
writeInterfacesElement(writer, interfaceNames);
}
- if (!propertiesAsMap.isEmpty()) {
- writeRanking(writer, propertiesAsMap);
- writeProperties(writer, propertiesAsMap);
+ if (!serviceProperties.isEmpty()) {
+ writeRanking(writer, serviceProperties);
+ writeProperties(writer, serviceProperties);
}
if (!writeEmptyElement) {
@@ -96,14 +92,14 @@ public class OsgiServiceProviderHandler
}
}
- private static Map<String, String> extractProperties(Properties properties) {
- Map<String, String> propertiesAsMap = new HashMap<>();
+ private static List<ServiceProperty> extractProperties(Properties properties) {
+ List<ServiceProperty> serviceProperties = new ArrayList<>();
if (properties != null) {
for (Property property : properties.value()) {
- propertiesAsMap.put(property.name(), property.value());
+ serviceProperties.add(new ServiceProperty(property.name(), property.value()));
}
}
- return propertiesAsMap;
+ return serviceProperties;
}
private static List<String> extractServiceInterfaces(OsgiServiceProvider serviceProvider) {
@@ -124,24 +120,24 @@ public class OsgiServiceProviderHandler
writer.writeEndElement();
}
- private void writeRanking(XMLStreamWriter writer, Map<String, String> propertiesAsMap) throws XMLStreamException {
- if (propertiesAsMap.containsKey("service.ranking")) {
- try {
- Integer ranking = Integer.parseInt(propertiesAsMap.get("service.ranking"));
- writer.writeAttribute("ranking", ranking.toString());
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException("service.ranking property must be an integer!");
+ private void writeRanking(XMLStreamWriter writer, List<ServiceProperty> serviceProperties) throws XMLStreamException {
+ for (ServiceProperty serviceProperty : serviceProperties) {
+ if ("service.ranking".equals(serviceProperty.name)) {
+ try {
+ Integer ranking = Integer.parseInt(serviceProperty.getSingleValue());
+ writer.writeAttribute("ranking", ranking.toString());
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("service.ranking property must be an integer!");
+ }
}
}
}
- private void writeProperties(XMLStreamWriter writer, Map<String, String> properties) throws XMLStreamException {
+ private void writeProperties(XMLStreamWriter writer, List<ServiceProperty> serviceProperties) throws XMLStreamException {
writer.writeStartElement("service-properties");
- for (Map.Entry<String, String> property : properties.entrySet()) {
- if (!SPECIAL_PROPERTIES.contains(property.getKey())) {
- writer.writeEmptyElement("entry");
- writer.writeAttribute("key", property.getKey());
- writer.writeAttribute("value", property.getValue());
+ for (ServiceProperty serviceProperty : serviceProperties) {
+ if (!SPECIAL_PROPERTIES.contains(serviceProperty.name)) {
+ serviceProperty.write(writer);
}
}
writer.writeEndElement();
Added: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/ServiceProperty.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/ServiceProperty.java?rev=1781654&view=auto
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/ServiceProperty.java (added)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/pax/ServiceProperty.java Sat Feb 4 11:02:53 2017
@@ -0,0 +1,104 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.aries.blueprint.plugin.handlers.pax;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.util.Arrays;
+import java.util.List;
+
+class ServiceProperty {
+ final String name;
+ private final String type;
+ private final boolean isArray;
+ private final List<String> values;
+
+ ServiceProperty(String name, String value) {
+ if (hasTypeSignature(name)) {
+ String[] splitName = name.split(":");
+ this.name = splitName[0];
+ this.type = getType(splitName[1]);
+ this.isArray = splitName[1].endsWith("[]");
+ this.values = isArray ? Arrays.asList(value.split("\\|")) : Arrays.asList(value);
+ } else {
+ this.name = name;
+ this.type = null;
+ this.isArray = false;
+ this.values = Arrays.asList(value);
+ }
+ }
+
+ private static boolean hasTypeSignature(String name) {
+ return name.contains(":");
+ }
+
+ private static String getType(String typeSignature) {
+ String rawType;
+ if (typeSignature.endsWith("[]")) {
+ rawType = typeSignature.substring(0, typeSignature.length() - 2);
+ } else {
+ rawType = typeSignature;
+ }
+
+ if ("".equals(rawType)) {
+ return null;
+ }
+ if (rawType.contains(".")) {
+ return rawType;
+ } else {
+ return "java.lang." + rawType;
+ }
+ }
+
+ void write(XMLStreamWriter writer) throws XMLStreamException {
+ if (type == null && !isArray) {
+ writer.writeEmptyElement("entry");
+ writer.writeAttribute("key", name);
+ writer.writeAttribute("value", values.get(0));
+ } else {
+ writer.writeStartElement("entry");
+ writer.writeAttribute("key", name);
+ if (isArray) {
+ writer.writeStartElement("array");
+ if (type != null) {
+ writer.writeAttribute("value-type", type);
+ }
+ for (String value : values) {
+ writer.writeStartElement("value");
+ writer.writeCharacters(value);
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ } else {
+ writer.writeStartElement("value");
+ writer.writeAttribute("type", type);
+ writer.writeCharacters(values.get(0));
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ }
+ }
+
+ String getSingleValue() {
+ if (values.size() > 1) {
+ throw new IllegalArgumentException("Property has more than one value");
+ }
+ return values.get(0);
+ }
+}
Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1781654&r1=1781653&r2=1781654&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java Sat Feb 4 11:02:53 2017
@@ -47,10 +47,10 @@ import static org.apache.aries.blueprint
class Bean extends BeanRef implements BeanEnricher {
public SortedSet<Property> properties = new TreeSet<>();
- public List<Argument> constructorArguments = new ArrayList<>();
+ List<Argument> constructorArguments = new ArrayList<>();
public boolean isPrototype;
public final Map<String, String> attributes = new HashMap<>();
- public final Map<String, XmlWriter> beanContentWriters = new HashMap<>();
+ final Map<String, XmlWriter> beanContentWriters = new HashMap<>();
protected final ContextEnricher contextEnricher;
Bean(Class<?> clazz, ContextEnricher contextEnricher) {
@@ -195,19 +195,19 @@ class Bean extends BeanRef implements Be
return clazz.getName();
}
- public void writeProperties(XMLStreamWriter writer) throws XMLStreamException {
+ void writeProperties(XMLStreamWriter writer) throws XMLStreamException {
for (Property property : properties) {
property.write(writer);
}
}
- public void writeArguments(XMLStreamWriter writer) throws XMLStreamException {
+ void writeArguments(XMLStreamWriter writer) throws XMLStreamException {
for (Argument argument : constructorArguments) {
argument.write(writer);
}
}
- public boolean needFieldInjection() {
+ boolean needFieldInjection() {
for (Property property : properties) {
if (property.isField) {
return true;
@@ -225,4 +225,10 @@ class Bean extends BeanRef implements Be
public void addBeanContentWriter(String id, XmlWriter blueprintWriter) {
beanContentWriters.put(id, blueprintWriter);
}
+
+ void writeCustomContent(XMLStreamWriter writer) throws XMLStreamException {
+ for (XmlWriter xmlWriter : beanContentWriters.values()) {
+ xmlWriter.write(writer);
+ }
+ }
}
Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Blueprint.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Blueprint.java?rev=1781654&r1=1781653&r2=1781654&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Blueprint.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Blueprint.java Sat Feb 4 11:02:53 2017
@@ -154,6 +154,7 @@ public class Blueprint implements Bluepr
for (Bean bean : getBeans()) {
writeBeanStart(writer, bean);
+ bean.writeCustomContent(writer);
bean.writeArguments(writer);
bean.writeProperties(writer);
writer.writeEndElement();
@@ -193,9 +194,6 @@ public class Blueprint implements Bluepr
if (bean instanceof BeanFromFactory) {
writeFactory(writer, (BeanFromFactory) bean);
}
- for (XmlWriter xmlWriter : bean.beanContentWriters.values()) {
- xmlWriter.write(writer);
- }
}
private void writeFactory(XMLStreamWriter writer, BeanFromFactory bean) throws XMLStreamException {
Modified: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java?rev=1781654&r1=1781653&r2=1781654&view=diff
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java (original)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java Sat Feb 4 11:02:53 2017
@@ -719,6 +719,39 @@ public class BlueprintFileWriterTest {
assertXpathEquals(bean, "@factory-method", "getBean3");
}
+ @Test
+ public void typedProperties() throws Exception {
+ Node service = getServiceByRef("serviceWithTypedParameters");
+ assertXpathEquals(service, "count(service-properties/entry)", "6");
+ assertXpathEquals(service, "service-properties/entry[@key='test1']/@value", "test");
+
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test2']/@value");
+ assertXpathEquals(service, "service-properties/entry[@key='test2']/value", "15");
+ assertXpathEquals(service, "service-properties/entry[@key='test2']/value/@type", "java.lang.Integer");
+
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test3']/@value");
+ assertXpathEquals(service, "service-properties/entry[@key='test3']/value", "true");
+ assertXpathEquals(service, "service-properties/entry[@key='test3']/value/@type", "java.lang.Boolean");
+
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test4']/@value");
+ assertXpathEquals(service, "service-properties/entry[@key='test4']/array/value[1]", "val1");
+ assertXpathEquals(service, "service-properties/entry[@key='test4']/array/value[2]", "val2");
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test4']/array/@value-type");
+
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test5']/@value");
+ assertXpathEquals(service, "service-properties/entry[@key='test5']/array/value[1]", "1");
+ assertXpathEquals(service, "service-properties/entry[@key='test5']/array/value[2]", "2");
+ assertXpathEquals(service, "service-properties/entry[@key='test5']/array/value[3]", "3");
+ assertXpathEquals(service, "service-properties/entry[@key='test5']/array/@value-type", "java.lang.Short");
+
+ assertXpathDoesNotExist(service, "service-properties/entry[@key='test6']/@value");
+ assertXpathEquals(service, "service-properties/entry[@key='test6']/array/value[1]", "1.5");
+ assertXpathEquals(service, "service-properties/entry[@key='test6']/array/value[2]", "0.8");
+ assertXpathEquals(service, "service-properties/entry[@key='test6']/array/value[3]", "-7.1");
+ assertXpathEquals(service, "service-properties/entry[@key='test6']/array/@value-type", "java.lang.Double");
+
+ }
+
private void assertXpathDoesNotExist(Node node, String xpathExpression) throws XPathExpressionException {
assertXpathEquals(node, "count(" + xpathExpression + ")", "0");
}
Added: aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceWithTypedParameters.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceWithTypedParameters.java?rev=1781654&view=auto
==============================================================================
--- aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceWithTypedParameters.java (added)
+++ aries/trunk/blueprint/plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/ServiceWithTypedParameters.java Sat Feb 4 11:02:53 2017
@@ -0,0 +1,20 @@
+package org.apache.aries.blueprint.plugin.test;
+
+import org.ops4j.pax.cdi.api.OsgiServiceProvider;
+import org.ops4j.pax.cdi.api.Properties;
+import org.ops4j.pax.cdi.api.Property;
+
+import javax.inject.Singleton;
+
+@OsgiServiceProvider
+@Properties({
+ @Property(name = "test1", value = "test"),
+ @Property(name = "test2:Integer", value = "15"),
+ @Property(name = "test3:java.lang.Boolean", value = "true"),
+ @Property(name = "test4:[]", value = "val1|val2"),
+ @Property(name = "test5:Short[]", value = "1|2|3"),
+ @Property(name = "test6:java.lang.Double[]", value = "1.5|0.8|-7.1")
+})
+@Singleton
+public class ServiceWithTypedParameters {
+}