Author: gnodet
Date: Wed Jul 2 07:49:20 2008
New Revision: 673410
URL: http://svn.apache.org/viewvc?rev=673410&view=rev
Log:
Fix osgi manifest, use the internal security layer
Added:
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/IntrospectionSupport.java
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/URISupport.java
Modified:
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/KeystoreInstanceCrypto.java
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandler.java
servicemix/components/shared-libraries/trunk/servicemix-soap/src/test/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandlerTest.java
servicemix/components/shared-libraries/trunk/servicemix-soap2/pom.xml
Added:
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/IntrospectionSupport.java
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/IntrospectionSupport.java?rev=673410&view=auto
==============================================================================
---
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/IntrospectionSupport.java
(added)
+++
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/IntrospectionSupport.java
Wed Jul 2 07:49:20 2008
@@ -0,0 +1,214 @@
+/*
+ * 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.servicemix.common.util;
+
+import java.beans.PropertyEditor;
+import java.beans.PropertyEditorManager;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+public final class IntrospectionSupport {
+
+ private IntrospectionSupport() {
+ }
+
+ public static boolean setProperties(Object target, Map props, String
optionPrefix) {
+ boolean rc = false;
+ if (target == null) {
+ throw new IllegalArgumentException("target was null.");
+ }
+ if (props == null) {
+ throw new IllegalArgumentException("props was null.");
+ }
+ for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
+ String name = (String) iter.next();
+ if (name.startsWith(optionPrefix)) {
+ Object value = props.get(name);
+ name = name.substring(optionPrefix.length());
+ if (setProperty(target, name, value)) {
+ iter.remove();
+ rc = true;
+ }
+ }
+ }
+ return rc;
+ }
+
+ public static Map extractProperties(Map props, String optionPrefix) {
+ if (props == null) {
+ throw new IllegalArgumentException("props was null.");
+ }
+ Map rc = new HashMap(props.size());
+ for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
+ String name = (String) iter.next();
+ if (name.startsWith(optionPrefix)) {
+ Object value = props.get(name);
+ name = name.substring(optionPrefix.length());
+ rc.put(name, value);
+ iter.remove();
+ }
+ }
+ return rc;
+ }
+
+ public static void setProperties(Object target, Map props) {
+ if (target == null) {
+ throw new IllegalArgumentException("target was null.");
+ }
+ if (props == null) {
+ throw new IllegalArgumentException("props was null.");
+ }
+ for (Iterator iter = props.entrySet().iterator(); iter.hasNext();) {
+ Map.Entry entry = (Entry) iter.next();
+ if (setProperty(target, (String) entry.getKey(),
entry.getValue())) {
+ iter.remove();
+ }
+ }
+ }
+
+ private static boolean setProperty(Object target, String name, Object
value) {
+ try {
+ Class clazz = target.getClass();
+ Method setter = findSetterMethod(clazz, name);
+ if (setter == null) {
+ return false;
+ }
+ // If the type is null or it matches the needed type, just use the
+ // value directly
+ if (value == null || value.getClass() ==
setter.getParameterTypes()[0]) {
+ setter.invoke(target, new Object[] {value });
+ } else {
+ // We need to convert it
+ setter.invoke(target, new Object[] {convert(value,
setter.getParameterTypes()[0]) });
+ }
+ return true;
+ } catch (Throwable ignore) {
+ return false;
+ }
+ }
+
+ private static Object convert(Object value, Class type) throws
URISyntaxException {
+ PropertyEditor editor = PropertyEditorManager.findEditor(type);
+ if (editor != null) {
+ editor.setAsText(value.toString());
+ return editor.getValue();
+ }
+ if (type == URI.class) {
+ return new URI(value.toString());
+ }
+ return null;
+ }
+
+ private static Method findSetterMethod(Class clazz, String name) {
+ // Build the method name.
+ name = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
+ Method[] methods = clazz.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ Method method = methods[i];
+ Class params[] = method.getParameterTypes();
+ if (method.getName().equals(name) && params.length == 1 &&
isSettableType(params[0])) {
+ return method;
+ }
+ }
+ return null;
+ }
+
+ private static boolean isSettableType(Class clazz) {
+ if (PropertyEditorManager.findEditor(clazz) != null) {
+ return true;
+ }
+ if (clazz == URI.class) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String toString(Object target) {
+ return toString(target, Object.class);
+ }
+
+ public static String toString(Object target, Class stopClass) {
+ Map map = new LinkedHashMap();
+ addFields(target, target.getClass(), stopClass, map);
+ StringBuffer buffer = new StringBuffer(simpleName(target.getClass()));
+ buffer.append(" {");
+ Set entrySet = map.entrySet();
+ boolean first = true;
+ for (Iterator iter = entrySet.iterator(); iter.hasNext();) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ if (first) {
+ first = false;
+ } else {
+ buffer.append(", ");
+ }
+ buffer.append(entry.getKey());
+ buffer.append(" = ");
+ buffer.append(entry.getValue());
+ }
+ buffer.append("}");
+ return buffer.toString();
+ }
+
+ public static String simpleName(Class clazz) {
+ String name = clazz.getName();
+ int p = name.lastIndexOf(".");
+ if (p >= 0) {
+ name = name.substring(p + 1);
+ }
+ return name;
+ }
+
+ private static void addFields(Object target, Class startClass, Class
stopClass, Map map) {
+ if (startClass != stopClass) {
+ addFields(target, startClass.getSuperclass(), stopClass, map);
+ }
+ Field[] fields = startClass.getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ Field field = fields[i];
+ if (Modifier.isStatic(field.getModifiers()) ||
Modifier.isTransient(field.getModifiers())
+ || Modifier.isPrivate(field.getModifiers())) {
+ continue;
+ }
+ try {
+ field.setAccessible(true);
+ Object o = field.get(target);
+ if (o != null && o.getClass().isArray()) {
+ try {
+ o = Arrays.asList((Object[]) o);
+ } catch (Throwable e) {
+ // Ignore
+ }
+ }
+ map.put(field.getName(), o);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+}
Added:
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/URISupport.java
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/URISupport.java?rev=673410&view=auto
==============================================================================
---
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/URISupport.java
(added)
+++
servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/util/URISupport.java
Wed Jul 2 07:49:20 2008
@@ -0,0 +1,336 @@
+/*
+ * 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.servicemix.common.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @version $Revision$
+ */
+public class URISupport {
+
+ public static class CompositeData {
+ String scheme;
+
+ String path;
+
+ URI components[];
+
+ Map parameters;
+
+ String fragment;
+
+ String host;
+
+ public URI[] getComponents() {
+ return components;
+ }
+
+ public String getFragment() {
+ return fragment;
+ }
+
+ public Map getParameters() {
+ return parameters;
+ }
+
+ public String getScheme() {
+ return scheme;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public URI toURI() throws URISyntaxException {
+ StringBuffer sb = new StringBuffer();
+ if (scheme != null) {
+ sb.append(scheme);
+ sb.append(':');
+ }
+
+ if (host != null && host.length() != 0) {
+ sb.append(host);
+ } else {
+ sb.append('(');
+ for (int i = 0; i < components.length; i++) {
+ if (i != 0) {
+ sb.append(',');
+ }
+ sb.append(components[i].toString());
+ }
+ sb.append(')');
+ }
+
+ if (path != null) {
+ sb.append('/');
+ sb.append(path);
+ }
+ if (!parameters.isEmpty()) {
+ sb.append("?");
+ sb.append(createQueryString(parameters));
+ }
+ if (fragment != null) {
+ sb.append("#");
+ sb.append(fragment);
+ }
+ return new URI(sb.toString());
+ }
+ }
+
+ public static Map parseQuery(String uri) throws URISyntaxException {
+ try {
+ Map rc = new HashMap();
+ if (uri != null) {
+ String[] parameters = uri.split("&");
+ for (int i = 0; i < parameters.length; i++) {
+ int p = parameters[i].indexOf("=");
+ if (p >= 0) {
+ String name =
URLDecoder.decode(parameters[i].substring(0, p), "UTF-8");
+ String value =
URLDecoder.decode(parameters[i].substring(p + 1), "UTF-8");
+ rc.put(name, value);
+ } else {
+ rc.put(parameters[i], null);
+ }
+ }
+ }
+ return rc;
+ } catch (UnsupportedEncodingException e) {
+ throw (URISyntaxException) new URISyntaxException(e.toString(),
"Invalid encoding").initCause(e);
+ }
+ }
+
+ public static Map parseParamters(URI uri) throws URISyntaxException {
+ return uri.getQuery() == null ? Collections.EMPTY_MAP :
parseQuery(stripPrefix(uri.getQuery(), "?"));
+ }
+
+ /**
+ * Removes any URI query from the given uri
+ */
+ public static URI removeQuery(URI uri) throws URISyntaxException {
+ return createURIWithQuery(uri, null);
+ }
+
+ /**
+ * Creates a URI with the given query
+ */
+ public static URI createURIWithQuery(URI uri, String query) throws
URISyntaxException {
+ return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(),
uri.getPort(), uri.getPath(), query, uri.getFragment());
+ }
+
+ public static CompositeData parseComposite(URI uri) throws
URISyntaxException {
+
+ CompositeData rc = new CompositeData();
+ rc.scheme = uri.getScheme();
+ String ssp = stripPrefix(uri.getSchemeSpecificPart().trim(),
"//").trim();
+
+ parseComposite(uri, rc, ssp);
+
+ rc.fragment = uri.getFragment();
+ return rc;
+ }
+
+ /**
+ * @param uri
+ * @param rc
+ * @param ssp
+ * @param p
+ * @throws URISyntaxException
+ */
+ private static void parseComposite(URI uri, CompositeData rc, String ssp)
throws URISyntaxException {
+ String componentString;
+ String params;
+
+ if (!checkParenthesis(ssp)) {
+ throw new URISyntaxException(uri.toString(), "Not a matching
number of '(' and ')' parenthesis");
+ }
+
+ int p;
+ int intialParen = ssp.indexOf("(");
+ if (intialParen == 0) {
+ rc.host = ssp.substring(0, intialParen);
+ p = rc.host.indexOf("/");
+ if (p >= 0) {
+ rc.path = rc.host.substring(p);
+ rc.host = rc.host.substring(0, p);
+ }
+ p = ssp.lastIndexOf(")");
+ componentString = ssp.substring(intialParen + 1, p);
+ params = ssp.substring(p + 1).trim();
+
+ } else {
+ componentString = ssp;
+ params = "";
+ }
+
+ String components[] = splitComponents(componentString);
+ rc.components = new URI[components.length];
+ for (int i = 0; i < components.length; i++) {
+ rc.components[i] = new URI(components[i].trim());
+ }
+
+ p = params.indexOf("?");
+ if (p >= 0) {
+ if (p > 0) {
+ rc.path = stripPrefix(params.substring(0, p), "/");
+ }
+ rc.parameters = parseQuery(params.substring(p + 1));
+ } else {
+ if (params.length() > 0) {
+ rc.path = stripPrefix(params, "/");
+ }
+ rc.parameters = Collections.EMPTY_MAP;
+ }
+ }
+
+ /**
+ * @param componentString
+ * @return
+ */
+ private static String[] splitComponents(String str) {
+ List<String> l = new ArrayList<String>();
+
+ int last = 0;
+ int depth = 0;
+ char chars[] = str.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ switch (chars[i]) {
+ case '(':
+ depth++;
+ break;
+ case ')':
+ depth--;
+ break;
+ case ',':
+ if (depth == 0) {
+ String s = str.substring(last, i);
+ l.add(s);
+ last = i + 1;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ String s = str.substring(last);
+ if (s.length() != 0) {
+ l.add(s);
+ }
+
+ String rc[] = new String[l.size()];
+ l.toArray(rc);
+ return rc;
+ }
+
+ public static String stripPrefix(String value, String prefix) {
+ if (value.startsWith(prefix)) {
+ return value.substring(prefix.length());
+ }
+ return value;
+ }
+
+ public static URI stripScheme(URI uri) throws URISyntaxException {
+ return new URI(stripPrefix(uri.getSchemeSpecificPart().trim(), "//"));
+ }
+
+ public static String createQueryString(Map options) throws
URISyntaxException {
+ try {
+ if (options.size() > 0) {
+ StringBuffer rc = new StringBuffer();
+ boolean first = true;
+ for (Iterator iter = options.keySet().iterator();
iter.hasNext();) {
+ if (first) {
+ first = false;
+ } else {
+ rc.append("&");
+ }
+ String key = (String) iter.next();
+ String value = (String) options.get(key);
+ rc.append(URLEncoder.encode(key, "UTF-8"));
+ rc.append("=");
+ rc.append(URLEncoder.encode(value, "UTF-8"));
+ }
+ return rc.toString();
+ } else {
+ return "";
+ }
+ } catch (UnsupportedEncodingException e) {
+ throw (URISyntaxException) new URISyntaxException(e.toString(),
"Invalid encoding").initCause(e);
+ }
+ }
+
+ /**
+ * Creates a URI from the original URI and the remaining paramaters
+ *
+ * @throws URISyntaxException
+ */
+ public static URI createRemainingURI(URI originalURI, Map params) throws
URISyntaxException {
+ String s = createQueryString(params);
+ if (s.length() == 0) {
+ s = null;
+ }
+ return createURIWithQuery(originalURI, s);
+ }
+
+ public static URI changeScheme(URI bindAddr, String scheme) throws
URISyntaxException {
+ return new URI(scheme, bindAddr.getUserInfo(), bindAddr.getHost(),
bindAddr.getPort(),
+ bindAddr.getPath(), bindAddr.getQuery(),
bindAddr.getFragment());
+ }
+
+ public static boolean checkParenthesis(String str) {
+ boolean result = true;
+ if (str != null) {
+ int open = 0;
+ int closed = 0;
+
+ int i = str.indexOf('(');
+ while (i >= 0) {
+ open++;
+ i = str.indexOf('(', i + 1);
+ }
+ i = str.indexOf(')');
+ while (i >= 0) {
+ closed++;
+ i = str.indexOf(')', i + 1);
+ }
+ result = open == closed;
+ }
+ return result;
+ }
+
+ public int indexOfParenthesisMatch(String str) {
+ int result = -1;
+
+ return result;
+ }
+
+}
Modified:
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/KeystoreInstanceCrypto.java
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/KeystoreInstanceCrypto.java?rev=673410&r1=673409&r2=673410&view=diff
==============================================================================
---
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/KeystoreInstanceCrypto.java
(original)
+++
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/KeystoreInstanceCrypto.java
Wed Jul 2 07:49:20 2008
@@ -23,8 +23,8 @@
import java.util.Arrays;
import java.util.List;
-import org.apache.servicemix.jbi.security.keystore.KeystoreInstance;
-import org.apache.servicemix.jbi.security.keystore.KeystoreManager;
+import org.apache.servicemix.common.security.KeystoreInstance;
+import org.apache.servicemix.common.security.KeystoreManager;
public class KeystoreInstanceCrypto extends BaseCrypto {
Modified:
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandler.java
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandler.java?rev=673410&r1=673409&r2=673410&view=diff
==============================================================================
---
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandler.java
(original)
+++
servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandler.java
Wed Jul 2 07:49:20 2008
@@ -32,8 +32,8 @@
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.xml.namespace.QName;
-import org.apache.servicemix.jbi.security.auth.AuthenticationService;
-import org.apache.servicemix.jbi.security.keystore.KeystoreManager;
+import org.apache.servicemix.common.security.AuthenticationService;
+import org.apache.servicemix.common.security.KeystoreManager;
import org.apache.servicemix.soap.Context;
import org.apache.servicemix.soap.Handler;
import org.apache.servicemix.soap.SoapFault;
Modified:
servicemix/components/shared-libraries/trunk/servicemix-soap/src/test/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandlerTest.java
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-soap/src/test/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandlerTest.java?rev=673410&r1=673409&r2=673410&view=diff
==============================================================================
---
servicemix/components/shared-libraries/trunk/servicemix-soap/src/test/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandlerTest.java
(original)
+++
servicemix/components/shared-libraries/trunk/servicemix-soap/src/test/java/org/apache/servicemix/soap/handlers/security/WSSecurityHandlerTest.java
Wed Jul 2 07:49:20 2008
@@ -37,6 +37,7 @@
import org.apache.servicemix.soap.marshalers.SoapMessage;
import org.apache.servicemix.soap.marshalers.SoapReader;
import org.apache.servicemix.soap.marshalers.SoapWriter;
+import org.apache.servicemix.common.security.AuthenticationService;
import org.apache.ws.security.WSSecurityEngineResult;
import org.apache.ws.security.WSUsernameTokenPrincipal;
import org.apache.ws.security.handler.WSHandlerConstants;
@@ -68,7 +69,7 @@
ctx.setInMessage(msg);
WSSecurityHandler handler = new WSSecurityHandler();
- handler.setAuthenticationService(new JAASAuthenticationService());
+
handler.setAuthenticationService(AuthenticationService.Proxy.create(new
JAASAuthenticationService()));
handler.setReceiveAction(WSHandlerConstants.USERNAME_TOKEN);
handler.onReceive(ctx);
List l = (List) ctx.getProperty(WSHandlerConstants.RECV_RESULTS);
@@ -105,7 +106,7 @@
crypto.setKeyStoreUrl(new ClassPathResource("privatestore.jks"));
crypto.setKeyStorePassword("keyStorePassword");
WSSecurityHandler handler = new WSSecurityHandler();
- handler.setAuthenticationService(new JAASAuthenticationService());
+
handler.setAuthenticationService(AuthenticationService.Proxy.create(new
JAASAuthenticationService()));
handler.setCrypto(crypto);
handler.setUsername("myalias");
crypto.setKeyPassword("myAliasPassword");
@@ -146,7 +147,7 @@
crypto.setKeyStoreUrl(new ClassPathResource("privatestore.jks"));
crypto.setKeyStorePassword("keyStorePassword");
WSSecurityHandler handler = new WSSecurityHandler();
- handler.setAuthenticationService(new JAASAuthenticationService());
+
handler.setAuthenticationService(AuthenticationService.Proxy.create(new
JAASAuthenticationService()));
handler.setCrypto(crypto);
handler.setUsername("myalias");
crypto.setKeyPassword("myAliasPassword");
Modified: servicemix/components/shared-libraries/trunk/servicemix-soap2/pom.xml
URL:
http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-soap2/pom.xml?rev=673410&r1=673409&r2=673410&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-soap2/pom.xml
(original)
+++ servicemix/components/shared-libraries/trunk/servicemix-soap2/pom.xml Wed
Jul 2 07:49:20 2008
@@ -39,6 +39,7 @@
org.apache.servicemix;resolution:=optional,
org.apache.servicemix.jbi*;resolution:=optional,
org.apache.servicemix.components*;resolution:=optional,
+ org.apache.woden*;resolution:=optional,
*
</servicemix.osgi.import>
<servicemix.osgi.export.pkg>