From bc7ce66cfa25953aad53b3fc36c06de496eb3b0e Mon Sep 17 00:00:00 2001 From: van Sabben Date: Wed, 9 Apr 2014 21:17:56 +0200 Subject: [PATCH 1/5] Test: Add tests with multiple services and update the services. --- .../cm/ManagedServiceFactoryTest.java | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java index be6898255d..f6148e049b 100644 --- a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java +++ b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java @@ -113,7 +113,7 @@ public void test3() throws Exception { cf.update(props); BundleContext context = getBundleContext(); - ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(key=foo3)", Helper.DEFAULT_TIMEOUT); + ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo3)(a=5))", Helper.DEFAULT_TIMEOUT); assertNotNull(sr); Foo foo = (Foo) context.getService(sr); @@ -138,4 +138,101 @@ public void test3() throws Exception { assertEquals("foo", sr.getProperty("b")); } + @Test + public void testCreateServices() throws Exception { + ConfigurationAdmin ca = getOsgiService(ConfigurationAdmin.class); + Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null); + Hashtable props = new Hashtable(); + props.put("a", "5"); + cf.update(props); + + Configuration cf2 = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null); + Hashtable props2 = new Hashtable(); + props2.put("a", "7"); + cf2.update(props2); + + BundleContext context = getBundleContext(); + ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo3)(a=5))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr); + + ServiceReference sr2 = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo3)(a=7))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr2); + + Foo foo = (Foo) context.getService(sr); + assertNotNull(foo); + assertEquals(5, foo.getA()); + assertEquals("default", foo.getB()); + assertEquals("5", sr.getProperty("a")); + assertNull(sr.getProperty("b")); + + Foo foo2 = (Foo) context.getService(sr2); + assertNotNull(foo2); + assertEquals(7, foo2.getA()); + assertEquals("default", foo2.getB()); + assertEquals("7", sr2.getProperty("a")); + assertNull(sr2.getProperty("b")); + } + + @Test + public void testCreateAndUpdate() throws Exception { + ConfigurationAdmin ca = getOsgiService(ConfigurationAdmin.class); + + Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null); + Hashtable props = new Hashtable(); + props.put("a", "5"); + cf.update(props); + + Configuration cf2 = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory3", null); + Hashtable props2 = new Hashtable(); + props2.put("a", "7"); + cf2.update(props2); + + BundleContext context = getBundleContext(); + ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo3)(a=5))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr); + + ServiceReference sr2 = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo3)(a=7))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr2); + + Foo foo = (Foo) context.getService(sr); + assertNotNull(foo); + assertEquals(5, foo.getA()); + assertEquals("default", foo.getB()); + assertEquals("5", sr.getProperty("a")); + assertNull(sr.getProperty("b")); + + Foo foo2 = (Foo) context.getService(sr2); + assertNotNull(foo2); + assertEquals(7, foo2.getA()); + assertEquals("default", foo2.getB()); + assertEquals("7", sr2.getProperty("a")); + assertNull(sr2.getProperty("b")); + + props = new Hashtable(); + props.put("a", "5"); + props.put("b", "foo"); + cf.update(props); + + props2 = new Hashtable(); + props2.put("a", "7"); + props2.put("b", "foo2"); + cf2.update(props2); + + // Update after creation + Thread.sleep(500); + assertEquals(5, foo.getA()); + assertEquals("foo", foo.getB()); + + // Update of service properties + assertEquals("5", sr.getProperty("a")); + assertEquals("foo", sr.getProperty("b")); + + // 2a Update after creation + assertEquals(7, foo2.getA()); + assertEquals("foo2", foo2.getB()); + + // 2b Update of service properties + assertEquals("7", sr2.getProperty("a")); + assertEquals("foo2", sr2.getProperty("b")); + } } From fdc0a6ce42d82d09a1012dfb10bb9e8cfe6a8756 Mon Sep 17 00:00:00 2001 From: van Sabben Date: Wed, 9 Apr 2014 21:53:11 +0200 Subject: [PATCH 2/5] Fix: Update correct managed service in factory. --- .../blueprint/compendium/cm/CmManagedProperties.java | 9 ++++++++- .../compendium/cm/CmManagedServiceFactory.java | 10 +++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java index 16226895e1..493ca8e3ae 100644 --- a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java +++ b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedProperties.java @@ -152,7 +152,14 @@ public void updated(final Dictionary props) { LOGGER.debug("Configuration updated for bean={} / pid={}", beanName, persistentId); synchronized (lock) { properties = props; - for (Object bean : beans) { + } + } + + public void updated(Object bean, final Dictionary props) { + LOGGER.debug("Configuration updated for bean={} / pid={}", beanName, persistentId); + synchronized (lock) { + properties = props; + if (bean != null) { inject(bean, false); } } diff --git a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedServiceFactory.java b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedServiceFactory.java index 9600eca3dd..8a8d50a637 100644 --- a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedServiceFactory.java +++ b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmManagedServiceFactory.java @@ -134,7 +134,7 @@ private void getRegistrationProperties(Dictionary properties, boolean update) { while (!properties.isEmpty()) { properties.remove(properties.keys().nextElement()); } - } else { + } else { if (!cm.getUpdate()) { if (update) { while (!properties.isEmpty()) { @@ -157,10 +157,10 @@ private void getRegistrationProperties(Dictionary properties, boolean update) { properties.put(Constants.SERVICE_PID, pid); } - private void updateComponentProperties(Dictionary props) { + private void updateComponentProperties(Object bean, Dictionary props) { CmManagedProperties cm = findBeanProcessor(); if (cm != null) { - cm.updated(props); + cm.updated(bean, props); } } @@ -200,14 +200,14 @@ private Method findDestroyMethod(Class clazz) { } protected Object doCreate(Dictionary properties) throws Exception { - updateComponentProperties(copy(properties)); + updateComponentProperties(null, copy(properties)); Object component = blueprintContainer.getComponentInstance(managedComponentName); getRegistrationProperties(properties, false); return component; } protected Object doUpdate(Object service, Dictionary properties) throws Exception { - updateComponentProperties(copy(properties)); + updateComponentProperties(service, copy(properties)); getRegistrationProperties(properties, true); return service; } From cb894ddf8c47890d18fc3aa29c15770378b72a83 Mon Sep 17 00:00:00 2001 From: van Sabben Date: Wed, 9 Apr 2014 21:55:28 +0200 Subject: [PATCH 3/5] Test: Verify component managed update functionality. --- .../aries/blueprint/compendium/cm/Foo.java | 19 ++++++ .../cm/ManagedServiceFactoryTest.java | 63 +++++++++++++++++++ .../cm/ManagedServiceFactoryTest.xml | 14 +++++ 3 files changed, 96 insertions(+) diff --git a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/Foo.java b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/Foo.java index d2eac1dbf5..61de2bcce4 100644 --- a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/Foo.java +++ b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/Foo.java @@ -18,6 +18,7 @@ */ package org.apache.aries.blueprint.compendium.cm; +import java.util.Map; import java.util.Properties; public class Foo implements FooInterface { @@ -52,5 +53,23 @@ public Properties getProps() { public void setProps(Properties props) { this.props = props; } + + public void update(Map pMap) { + Properties properties = new Properties(); + + String value = pMap.get("a"); + if (value != null) { + a = Integer.parseInt(value); + properties.put("a", a); + } + + value = pMap.get("b"); + if (value != null) { + b = value; + properties.put("b", b); + } + + props = properties; + } } diff --git a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java index f6148e049b..5232676343 100644 --- a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java +++ b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java @@ -235,4 +235,67 @@ public void testCreateAndUpdate() throws Exception { assertEquals("7", sr2.getProperty("a")); assertEquals("foo2", sr2.getProperty("b")); } + + @Test + public void testCreateAndUpdateUsingUpdateMethod() throws Exception { + ConfigurationAdmin ca = getOsgiService(ConfigurationAdmin.class); + + Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory4", null); + Hashtable props = new Hashtable(); + props.put("a", "5"); + cf.update(props); + + Configuration cf2 = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory4", null); + Hashtable props2 = new Hashtable(); + props2.put("a", "7"); + cf2.update(props2); + + BundleContext context = getBundleContext(); + ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo4)(a=5))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr); + + ServiceReference sr2 = Helper.getOsgiServiceReference(context, Foo.class, "(&(key=foo4)(a=7))", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr2); + + Foo foo = (Foo) context.getService(sr); + assertNotNull(foo); + assertEquals(5, foo.getA()); + assertEquals("default", foo.getB()); + assertEquals("5", sr.getProperty("a")); + assertNull(sr.getProperty("b")); + + Foo foo2 = (Foo) context.getService(sr2); + assertNotNull(foo2); + assertEquals(7, foo2.getA()); + assertEquals("default", foo2.getB()); + assertEquals("7", sr2.getProperty("a")); + assertNull(sr2.getProperty("b")); + + props = new Hashtable(); + props.put("a", "5"); + props.put("b", "foo"); + cf.update(props); + + props2 = new Hashtable(); + props2.put("a", "7"); + props2.put("b", "foo2"); + cf2.update(props2); + + // Update after creation + Thread.sleep(500); + assertEquals(5, foo.getA()); + assertEquals("foo", foo.getB()); + + // Update of service properties + assertEquals("5", sr.getProperty("a")); + assertEquals("foo", sr.getProperty("b")); + + // 2a Update after creation + assertEquals(7, foo2.getA()); + assertEquals("foo2", foo2.getB()); + + // 2b Update of service properties + assertEquals("7", sr2.getProperty("a")); + assertEquals("foo2", sr2.getProperty("b")); + } } diff --git a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml index 457e8a8f87..fcba0dc5e9 100644 --- a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml +++ b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml @@ -57,5 +57,19 @@ + + + + + + + + + + + + From 8f8bbff6370440974966b6b5cbdfc67ff11443d7 Mon Sep 17 00:00:00 2001 From: van Sabben Date: Wed, 9 Apr 2014 21:57:39 +0200 Subject: [PATCH 4/5] Test: Verify factory functionality for a managed component. --- .../blueprint/compendium/cm/FooFactory.java | 29 ++++++++++++++++ .../cm/ManagedServiceFactoryTest.java | 33 +++++++++++++++++++ .../cm/ManagedServiceFactoryTest.xml | 17 +++++++++- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/FooFactory.java diff --git a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/FooFactory.java b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/FooFactory.java new file mode 100644 index 0000000000..17e4087063 --- /dev/null +++ b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/FooFactory.java @@ -0,0 +1,29 @@ +/** + * 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.aries.blueprint.compendium.cm; + + +public class FooFactory { + + + public FooInterface create(){ + return new Foo(); + } +} + diff --git a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java index 5232676343..a7abcc4b39 100644 --- a/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java +++ b/blueprint/blueprint-cm/src/test/java/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.java @@ -298,4 +298,37 @@ public void testCreateAndUpdateUsingUpdateMethod() throws Exception { assertEquals("7", sr2.getProperty("a")); assertEquals("foo2", sr2.getProperty("b")); } + + @Test + public void testFactoryCreation() throws Exception { + ConfigurationAdmin ca = getOsgiService(ConfigurationAdmin.class); + Configuration cf = ca.createFactoryConfiguration("blueprint-sample-managed-service-factory5", null); + Hashtable props = new Hashtable(); + props.put("a", "5"); + cf.update(props); + + BundleContext context = getBundleContext(); + ServiceReference sr = Helper.getOsgiServiceReference(context, Foo.class, "(key=foo5)", Helper.DEFAULT_TIMEOUT); + assertNotNull(sr); + Foo foo = (Foo) context.getService(sr); + assertNotNull(foo); + assertEquals(5, foo.getA()); + assertEquals("default", foo.getB()); + assertEquals("5", sr.getProperty("a")); + assertNull(sr.getProperty("b")); + + props = new Hashtable(); + props.put("a", "5"); + props.put("b", "foo"); + cf.update(props); + Thread.sleep(500); + + // No update of bean after creation + assertEquals(5, foo.getA()); + assertEquals("default", foo.getB()); + + // Only initial update of service properties + assertEquals("5", sr.getProperty("a")); + assertNull(sr.getProperty("b")); + } } diff --git a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml index fcba0dc5e9..423233f4b2 100644 --- a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml +++ b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml @@ -57,7 +57,7 @@ - + @@ -71,5 +71,20 @@ + + + + + + + + + + + + + From b1efec1c339a5dca2b3e975d48295acf920811e1 Mon Sep 17 00:00:00 2001 From: van Sabben Date: Wed, 9 Apr 2014 21:58:32 +0200 Subject: [PATCH 5/5] Fix: Factory functionality for a managed component. --- .../compendium/cm/CmNamespaceHandler.java | 8 +- .../OSGI-INF/blueprint/blueprint-cm.xml | 5 + .../compendium/cm/blueprint-cm-1.3.0.xsd | 133 ++++++++++++++++++ .../cm/ManagedServiceFactoryTest.xml | 9 +- 4 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.3.0.xsd diff --git a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java index 34e2909f3d..672de87433 100644 --- a/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java +++ b/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmNamespaceHandler.java @@ -81,6 +81,7 @@ public class CmNamespaceHandler implements NamespaceHandler { public static final String BLUEPRINT_CM_NAMESPACE_1_0 = "http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"; public static final String BLUEPRINT_CM_NAMESPACE_1_1 = "http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"; public static final String BLUEPRINT_CM_NAMESPACE_1_2 = "http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.2.0"; + public static final String BLUEPRINT_CM_NAMESPACE_1_3 = "http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.3.0"; public static final String BLUEPRINT_EXT_NAMESPACE_V1_0 = "http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"; public static final String BLUEPRINT_EXT_NAMESPACE_V1_1 = "http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.1.0"; public static final String BLUEPRINT_EXT_NAMESPACE_V1_2 = "http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"; @@ -148,7 +149,9 @@ public void setConfigAdmin(ConfigurationAdmin configAdmin) { } public URL getSchemaLocation(String namespace) { - if (BLUEPRINT_CM_NAMESPACE_1_2.equals(namespace)) { + if (BLUEPRINT_CM_NAMESPACE_1_3.equals(namespace)) { + return getClass().getResource("blueprint-cm-1.3.0.xsd"); + } else if (BLUEPRINT_CM_NAMESPACE_1_2.equals(namespace)) { return getClass().getResource("blueprint-cm-1.2.0.xsd"); } else if (BLUEPRINT_CM_NAMESPACE_1_1.equals(namespace)) { return getClass().getResource("blueprint-cm-1.1.0.xsd"); @@ -591,7 +594,8 @@ public static boolean isBlueprintNamespace(String ns) { public static boolean isCmNamespace(String uri) { return BLUEPRINT_CM_NAMESPACE_1_0.equals(uri) || BLUEPRINT_CM_NAMESPACE_1_1.equals(uri) - || BLUEPRINT_CM_NAMESPACE_1_2.equals(uri); + || BLUEPRINT_CM_NAMESPACE_1_2.equals(uri) + || BLUEPRINT_CM_NAMESPACE_1_3.equals(uri); } public static boolean isExtNamespace(String uri) { diff --git a/blueprint/blueprint-cm/src/main/resources/OSGI-INF/blueprint/blueprint-cm.xml b/blueprint/blueprint-cm/src/main/resources/OSGI-INF/blueprint/blueprint-cm.xml index c9ffa4ed70..bb1e71cb08 100644 --- a/blueprint/blueprint-cm/src/main/resources/OSGI-INF/blueprint/blueprint-cm.xml +++ b/blueprint/blueprint-cm/src/main/resources/OSGI-INF/blueprint/blueprint-cm.xml @@ -36,5 +36,10 @@ + + + + + diff --git a/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.3.0.xsd b/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.3.0.xsd new file mode 100644 index 0000000000..f83bdbcea3 --- /dev/null +++ b/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.3.0.xsd @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml index 423233f4b2..82f67bcba6 100644 --- a/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml +++ b/blueprint/blueprint-cm/src/test/resources/org/apache/aries/blueprint/compendium/cm/ManagedServiceFactoryTest.xml @@ -15,7 +15,8 @@ License. --> + xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" + xmlns:cm1_3="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.3.0"> - @@ -85,6 +86,6 @@ - - + +