You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2009/07/15 18:08:52 UTC
svn commit: r794318 - in /geronimo/server/trunk/plugins: cxf/geronimo-cxf/
cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/
j2ee/geronimo-naming-builder/src/main/xsd/
jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/bu...
Author: gawor
Date: Wed Jul 15 16:08:51 2009
New Revision: 794318
URL: http://svn.apache.org/viewvc?rev=794318&view=rev
Log:
1) set arbitrary port properties for service-references in geronimo plan and 2) recognize wss4j properties to enable ws-security for service-references (using CXF provider). Based on patch/work of Rahul Mehta (GERONIMO-4642)
Added:
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java (with props)
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (with props)
Modified:
geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java
geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml (original)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml Wed Jul 15 16:08:51 2009
@@ -61,6 +61,11 @@
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-ws-security</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java?rev=794318&view=auto
==============================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java (added)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java Wed Jul 15 16:08:51 2009
@@ -0,0 +1,44 @@
+/**
+ * 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.geronimo.cxf.client;
+
+import java.io.IOException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+import org.apache.ws.security.WSPasswordCallback;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CXFPasswordHandler implements CallbackHandler {
+
+ private static final Logger LOG = LoggerFactory.getLogger(CXFPasswordHandler.class);
+
+ private String password;
+
+ public CXFPasswordHandler(String password) {
+ this.password = password;
+ }
+
+ public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+ WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
+ pc.setPassword(this.password);
+ }
+}
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java?rev=794318&view=auto
==============================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (added)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java Wed Jul 15 16:08:51 2009
@@ -0,0 +1,112 @@
+/**
+ * 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.geronimo.cxf.client;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
+import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
+import org.apache.geronimo.jaxws.client.EndpointInfo;
+import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
+import org.apache.ws.security.handler.WSHandlerConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CXFPortMethodInterceptor extends PortMethodInterceptor {
+
+ private static final Logger LOG = LoggerFactory.getLogger(CXFPortMethodInterceptor.class);
+
+ private static final String IN_PREFIX = "wss4j.in.";
+ private static final String OUT_PREFIX = "wss4j.out.";
+
+ public CXFPortMethodInterceptor(Map<Object, EndpointInfo> seiInfoMap) {
+ super(seiInfoMap);
+ }
+
+ @Override
+ protected void setProperties(BindingProvider proxy, EndpointInfo info, Map<String, Object> props) {
+ if (info == null) {
+ return;
+ }
+
+ Map<String, Object> wss4jInProps = new HashMap<String, Object>();
+ Map<String, Object> wss4jOutProps = new HashMap<String, Object>();
+ Map<String, Object> otherProps = new HashMap<String, Object>();
+
+ for (Map.Entry<String, Object> entry : props.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ if (key.startsWith(IN_PREFIX)) {
+ key = key.substring(IN_PREFIX.length());
+ wss4jInProps.put(key, value);
+ } else if (key.startsWith(OUT_PREFIX)) {
+ key = key.substring(OUT_PREFIX.length());
+ wss4jOutProps.put(key, value);
+ } else {
+ otherProps.put(key, value);
+ }
+ }
+
+ super.setProperties(proxy, info, otherProps);
+
+ Client client = ClientProxy.getClient(proxy);
+ Endpoint cxfEndpoint = client.getEndpoint();
+
+ if (!wss4jOutProps.isEmpty()) {
+ // pass the security properties to the WSS4J out interceptor
+ updateSecurityProperties(wss4jOutProps);
+ WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(wss4jOutProps);
+ cxfEndpoint.getOutInterceptors().add(wssOut);
+ }
+
+ if (!wss4jInProps.isEmpty()) {
+ // pass the security properties to the WSS4J in interceptor
+ WSS4JInInterceptor wssIn = new WSS4JInInterceptor(wss4jInProps);
+ cxfEndpoint.getInInterceptors().add(wssIn);
+ }
+
+ }
+
+ private static void updateSecurityProperties(Map<String, Object> properties) {
+ String action = (String) properties.get(WSHandlerConstants.ACTION);
+ if (containsValue(action, WSHandlerConstants.USERNAME_TOKEN) &&
+ !properties.containsKey(WSHandlerConstants.PW_CALLBACK_CLASS)) {
+ String password = (String) properties.get("password");
+ properties.put(WSHandlerConstants.PW_CALLBACK_REF,
+ new CXFPasswordHandler(password));
+ }
+ }
+
+ private static boolean containsValue(String property, String value) {
+ if (property != null) {
+ String[] entries = property.split(" ");
+ for (String entry : entries) {
+ if (value.equals(entry)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java (original)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java Wed Jul 15 16:08:51 2009
@@ -38,6 +38,7 @@
import org.apache.geronimo.jaxws.JNDIResolver;
import org.apache.geronimo.jaxws.client.EndpointInfo;
import org.apache.geronimo.jaxws.client.JAXWSServiceReference;
+import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
import org.apache.geronimo.jaxws.handler.GeronimoHandlerResolver;
import org.apache.geronimo.xbeans.javaee.HandlerChainsType;
@@ -93,4 +94,9 @@
new GeronimoHandlerResolver(classLoader, serviceClass, getHandlerChains(), annotationProcessor);
return handlerResolver;
}
+
+ protected PortMethodInterceptor getPortMethodInterceptor() {
+ return new CXFPortMethodInterceptor(this.seiInfoMap);
+ }
+
}
Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd Wed Jul 15 16:08:51 2009
@@ -986,9 +986,19 @@
</xsd:documentation>
</xsd:annotation>
</xsd:element>
+ <xsd:element name="property" type="gernaming:portPropertyType"
+ minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
+ <xsd:complexType name="portPropertyType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
<xsd:complexType name="service-refType">
<xsd:sequence>
<xsd:element name="service-ref-name" type="xsd:string">
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java (original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java Wed Jul 15 16:08:51 2009
@@ -26,6 +26,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import javax.wsdl.Binding;
import javax.wsdl.Definition;
@@ -47,6 +48,7 @@
import org.apache.geronimo.jaxws.client.EndpointInfo;
import org.apache.geronimo.jaxws.wsdl.CatalogJarWSDLLocator;
import org.apache.geronimo.jaxws.wsdl.CatalogWSDLLocator;
+import org.apache.geronimo.xbeans.geronimo.naming.GerPortPropertyType;
import org.apache.geronimo.xbeans.geronimo.naming.GerPortType;
import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
@@ -118,7 +120,8 @@
URL location = getLocation(gerPort);
String credentialsName = getCredentialsName(gerPort);
boolean mtomEnabled = isMTOMEnabled(portName);
- EndpointInfo info = new EndpointInfo(location, credentialsName, mtomEnabled);
+ Map<String, Object> props = getProperties(gerPort);
+ EndpointInfo info = new EndpointInfo(location, credentialsName, mtomEnabled, props);
this.portInfoMap.put(portName, info);
}
}
@@ -240,7 +243,9 @@
boolean mtomEnabled = isMTOMEnabled(portType.getQName());
- EndpointInfo info = new EndpointInfo(location, credentialsName, mtomEnabled);
+ Map<String, Object> props = getProperties(gerPort);
+
+ EndpointInfo info = new EndpointInfo(location, credentialsName, mtomEnabled, props);
this.portInfoMap.put(portName, info);
// prefer first binding listed in wsdl
if (!this.portInfoMap.containsKey(portType.getQName())) {
@@ -272,6 +277,16 @@
return null;
}
+ private Map<String, Object> getProperties(GerPortType port) {
+ Map<String, Object> props = new HashMap<String, Object>();
+ if (port.getPropertyArray() != null) {
+ for (GerPortPropertyType propertyType : port.getPropertyArray()) {
+ props.put(propertyType.getName(), propertyType.getStringValue().trim());
+ }
+ }
+ return props;
+ }
+
private String getCredentialsName(GerPortType port) {
String credentialsName = port.getCredentialsName();
return (credentialsName == null) ? null : credentialsName.trim();
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java (original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java Wed Jul 15 16:08:51 2009
@@ -18,17 +18,20 @@
import java.io.Serializable;
import java.net.URL;
+import java.util.Map;
public class EndpointInfo implements Serializable {
private URL location;
private String credentialsName;
private boolean mtomEnabled;
+ private Map<String, Object> properties;
- public EndpointInfo(URL location, String credentialsName, boolean mtomEnabled) {
+ public EndpointInfo(URL location, String credentialsName, boolean mtomEnabled, Map<String, Object> properties) {
this.location = location;
this.credentialsName = credentialsName;
this.mtomEnabled = mtomEnabled;
+ this.properties = properties;
}
public boolean isMTOMEnabled() {
@@ -43,7 +46,11 @@
return this.credentialsName;
}
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
public String toString() {
- return this.location + " " + this.credentialsName + " " + this.mtomEnabled;
+ return this.location + " " + this.credentialsName + " " + this.mtomEnabled + " " + this.properties;
}
}
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java?rev=794318&r1=794317&r2=794318&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java (original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java Wed Jul 15 16:08:51 2009
@@ -97,7 +97,14 @@
setProperties(proxy, info);
}
- private void setProperties(BindingProvider proxy, EndpointInfo info) {
+ protected void setProperties(BindingProvider proxy, EndpointInfo info) {
+ if (info == null) {
+ return;
+ }
+ setProperties(proxy, info, info.getProperties());
+ }
+
+ protected void setProperties(BindingProvider proxy, EndpointInfo info, Map<String, Object> properties) {
if (info == null) {
return;
}
@@ -119,29 +126,35 @@
// set credentials
String credentialsName = info.getCredentialsName();
if (credentialsName != null) {
- Subject subject = ContextManager.getNextCaller();
- if (subject == null) {
- throw new IllegalStateException("Subject missing but authentication turned on");
- } else {
- Set creds = subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
- boolean found = false;
-
- for (Iterator iterator = creds.iterator(); iterator.hasNext();) {
- NamedUsernamePasswordCredential namedUsernamePasswordCredential = (NamedUsernamePasswordCredential) iterator.next();
- if (credentialsName.equals(namedUsernamePasswordCredential.getName())) {
- proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
- namedUsernamePasswordCredential.getUsername());
- proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
- new String(namedUsernamePasswordCredential.getPassword()));
- LOG.debug("Set username/password property: " + credentialsName);
- found = true;
- break;
- }
- }
- if (!found) {
- throw new IllegalStateException("no NamedUsernamePasswordCredential found for name " + credentialsName);
+ NamedUsernamePasswordCredential namedUsernamePasswordCredential = findCredential(credentialsName);
+ proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
+ namedUsernamePasswordCredential.getUsername());
+ proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
+ new String(namedUsernamePasswordCredential.getPassword()));
+ LOG.debug("Set username/password property: " + credentialsName);
+ }
+
+ // set user-specified properties
+ if (properties != null) {
+ for (Map.Entry<String, Object> entry : properties.entrySet()) {
+ proxy.getRequestContext().put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ protected NamedUsernamePasswordCredential findCredential(String credentialsName) {
+ Subject subject = ContextManager.getNextCaller();
+ if (subject == null) {
+ throw new IllegalStateException("Subject missing but authentication turned on");
+ } else {
+ Set creds = subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
+ for (Iterator iterator = creds.iterator(); iterator.hasNext();) {
+ NamedUsernamePasswordCredential namedUsernamePasswordCredential = (NamedUsernamePasswordCredential) iterator.next();
+ if (credentialsName.equals(namedUsernamePasswordCredential.getName())) {
+ return namedUsernamePasswordCredential;
}
}
+ throw new IllegalStateException("No NamedUsernamePasswordCredential found for name " + credentialsName);
}
}
}
Re: svn commit: r794318 - in /geronimo/server/trunk/plugins: cxf/geronimo-cxf/ cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/ j2ee/geronimo-naming-builder/src/main/xsd/ jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/bu...
Posted by David Jencks <da...@yahoo.com>.
Is it possible that this change causes this NPE?
at
org
..apache
..geronimo
..jaxws
..builder.EndpointInfoBuilder.getProperties(EndpointInfoBuilder.java:282)
at
org
..apache
..geronimo
..jaxws.builder.EndpointInfoBuilder.build(EndpointInfoBuilder.java:246)
at
org
..apache
..geronimo
..axis2
..builder
..Axis2ServiceRefBuilder.createService(Axis2ServiceRefBuilder.java:66)
at
org
..apache
..geronimo
..jaxws
..builder
..JAXWSServiceRefBuilder.buildNaming(JAXWSServiceRefBuilder.java:164)
at
org
..apache
..geronimo
..jaxws
..builder
..JAXWSServiceRefBuilder.buildNaming(JAXWSServiceRefBuilder.java:103)
at
org
..apache
..geronimo
..naming
..deployment
..SwitchingServiceRefBuilder
..buildNaming(SwitchingServiceRefBuilder.java:133)
at
org
..apache
..geronimo
..j2ee
..deployment
..NamingBuilderCollection.buildNaming(NamingBuilderCollection.java:69)
at
org
..apache
..geronimo
..web25
..deployment
..AbstractWebModuleBuilder
..configureBasicWebModuleAttributes(AbstractWebModuleBuilder.java:614)
at
org
..apache
..geronimo
..tomcat
..deployment.TomcatModuleBuilder.addGBeans(TomcatModuleBuilder.java:349)
at
org
..apache
..geronimo
..j2ee
..deployment
..SwitchingModuleBuilder.addGBeans(SwitchingModuleBuilder.java:165)
at
org
..apache
..geronimo
..j2ee
..deployment.EARConfigBuilder.buildConfiguration(EARConfigBuilder.java:
652)
at org.apache.geronimo.deployment.Deployer.deploy(Deployer.java:257)
On Jul 15, 2009, at 9:08 AM, gawor@apache.org wrote:
> Author: gawor
> Date: Wed Jul 15 16:08:51 2009
> New Revision: 794318
>
> URL: http://svn.apache.org/viewvc?rev=794318&view=rev
> Log:
> 1) set arbitrary port properties for service-references in geronimo
> plan and 2) recognize wss4j properties to enable ws-security for
> service-references (using CXF provider). Based on patch/work of
> Rahul Mehta (GERONIMO-4642)
>
> Added:
> geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPasswordHandler.java (with props)
> geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (with
> props)
> Modified:
> geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
> geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFServiceReference.java
> geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
> main/xsd/geronimo-naming-1.2.xsd
> geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
> main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
> geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/EndpointInfo.java
> geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
>
> Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml (original)
> +++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml Wed Jul
> 15 16:08:51 2009
> @@ -61,6 +61,11 @@
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-rt-transports-http</artifactId>
> </dependency>
> +
> + <dependency>
> + <groupId>org.apache.cxf</groupId>
> + <artifactId>cxf-rt-ws-security</artifactId>
> + </dependency>
>
> <dependency>
> <groupId>org.apache.geronimo.specs</groupId>
>
> Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/
> org/apache/geronimo/cxf/client/CXFPasswordHandler.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java?rev=794318&view=auto
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPasswordHandler.java (added)
> +++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPasswordHandler.java Wed Jul 15
> 16:08:51 2009
> @@ -0,0 +1,44 @@
> +/**
> + * 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.geronimo.cxf.client;
> +
> +import java.io.IOException;
> +
> +import javax.security.auth.callback.Callback;
> +import javax.security.auth.callback.CallbackHandler;
> +import javax.security.auth.callback.UnsupportedCallbackException;
> +
> +import org.apache.ws.security.WSPasswordCallback;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
> +
> +public class CXFPasswordHandler implements CallbackHandler {
> +
> + private static final Logger LOG =
> LoggerFactory.getLogger(CXFPasswordHandler.class);
> +
> + private String password;
> +
> + public CXFPasswordHandler(String password) {
> + this.password = password;
> + }
> +
> + public void handle(Callback[] callbacks) throws IOException,
> UnsupportedCallbackException {
> + WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
> + pc.setPassword(this.password);
> + }
> +}
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
> ------------------------------------------------------------------------------
> svn:keywords = Date Revision
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
> ------------------------------------------------------------------------------
> svn:mime-type = text/plain
>
> Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/
> org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java?rev=794318&view=auto
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (added)
> +++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFPortMethodInterceptor.java Wed Jul 15
> 16:08:51 2009
> @@ -0,0 +1,112 @@
> +/**
> + * 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.geronimo.cxf.client;
> +
> +import java.util.HashMap;
> +import java.util.Map;
> +
> +import javax.xml.ws.BindingProvider;
> +
> +import org.apache.cxf.endpoint.Client;
> +import org.apache.cxf.endpoint.Endpoint;
> +import org.apache.cxf.frontend.ClientProxy;
> +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
> +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
> +import org.apache.geronimo.jaxws.client.EndpointInfo;
> +import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
> +import org.apache.ws.security.handler.WSHandlerConstants;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
> +
> +public class CXFPortMethodInterceptor extends PortMethodInterceptor {
> +
> + private static final Logger LOG =
> LoggerFactory.getLogger(CXFPortMethodInterceptor.class);
> +
> + private static final String IN_PREFIX = "wss4j.in.";
> + private static final String OUT_PREFIX = "wss4j.out.";
> +
> + public CXFPortMethodInterceptor(Map<Object, EndpointInfo>
> seiInfoMap) {
> + super(seiInfoMap);
> + }
> +
> + @Override
> + protected void setProperties(BindingProvider proxy,
> EndpointInfo info, Map<String, Object> props) {
> + if (info == null) {
> + return;
> + }
> +
> + Map<String, Object> wss4jInProps = new HashMap<String,
> Object>();
> + Map<String, Object> wss4jOutProps = new HashMap<String,
> Object>();
> + Map<String, Object> otherProps = new HashMap<String,
> Object>();
> +
> + for (Map.Entry<String, Object> entry : props.entrySet()) {
> + String key = entry.getKey();
> + Object value = entry.getValue();
> + if (key.startsWith(IN_PREFIX)) {
> + key = key.substring(IN_PREFIX.length());
> + wss4jInProps.put(key, value);
> + } else if (key.startsWith(OUT_PREFIX)) {
> + key = key.substring(OUT_PREFIX.length());
> + wss4jOutProps.put(key, value);
> + } else {
> + otherProps.put(key, value);
> + }
> + }
> +
> + super.setProperties(proxy, info, otherProps);
> +
> + Client client = ClientProxy.getClient(proxy);
> + Endpoint cxfEndpoint = client.getEndpoint();
> +
> + if (!wss4jOutProps.isEmpty()) {
> + // pass the security properties to the WSS4J out
> interceptor
> + updateSecurityProperties(wss4jOutProps);
> + WSS4JOutInterceptor wssOut = new
> WSS4JOutInterceptor(wss4jOutProps);
> + cxfEndpoint.getOutInterceptors().add(wssOut);
> + }
> +
> + if (!wss4jInProps.isEmpty()) {
> + // pass the security properties to the WSS4J in
> interceptor
> + WSS4JInInterceptor wssIn = new
> WSS4JInInterceptor(wss4jInProps);
> + cxfEndpoint.getInInterceptors().add(wssIn);
> + }
> +
> + }
> +
> + private static void updateSecurityProperties(Map<String,
> Object> properties) {
> + String action = (String)
> properties.get(WSHandlerConstants.ACTION);
> + if (containsValue(action,
> WSHandlerConstants.USERNAME_TOKEN) &&
> + !
> properties.containsKey(WSHandlerConstants.PW_CALLBACK_CLASS)) {
> + String password = (String) properties.get("password");
> + properties.put(WSHandlerConstants.PW_CALLBACK_REF,
> + new CXFPasswordHandler(password));
> + }
> + }
> +
> + private static boolean containsValue(String property, String
> value) {
> + if (property != null) {
> + String[] entries = property.split(" ");
> + for (String entry : entries) {
> + if (value.equals(entry)) {
> + return true;
> + }
> + }
> + }
> + return false;
> + }
> +}
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
> ------------------------------------------------------------------------------
> svn:keywords = Date Revision
>
> Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
> ------------------------------------------------------------------------------
> svn:mime-type = text/plain
>
> Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
> java/org/apache/geronimo/cxf/client/CXFServiceReference.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFServiceReference.java (original)
> +++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
> apache/geronimo/cxf/client/CXFServiceReference.java Wed Jul 15
> 16:08:51 2009
> @@ -38,6 +38,7 @@
> import org.apache.geronimo.jaxws.JNDIResolver;
> import org.apache.geronimo.jaxws.client.EndpointInfo;
> import org.apache.geronimo.jaxws.client.JAXWSServiceReference;
> +import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
> import org.apache.geronimo.jaxws.handler.GeronimoHandlerResolver;
> import org.apache.geronimo.xbeans.javaee.HandlerChainsType;
>
> @@ -93,4 +94,9 @@
> new GeronimoHandlerResolver(classLoader,
> serviceClass, getHandlerChains(), annotationProcessor);
> return handlerResolver;
> }
> +
> + protected PortMethodInterceptor getPortMethodInterceptor() {
> + return new CXFPortMethodInterceptor(this.seiInfoMap);
> + }
> +
> }
>
> Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/
> src/main/xsd/geronimo-naming-1.2.xsd
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
> main/xsd/geronimo-naming-1.2.xsd (original)
> +++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
> main/xsd/geronimo-naming-1.2.xsd Wed Jul 15 16:08:51 2009
> @@ -986,9 +986,19 @@
> </xsd:documentation>
> </xsd:annotation>
> </xsd:element>
> + <xsd:element name="property"
> type="gernaming:portPropertyType"
> + minOccurs="0" maxOccurs="unbounded"/>
> </xsd:sequence>
> </xsd:complexType>
>
> + <xsd:complexType name="portPropertyType">
> + <xsd:simpleContent>
> + <xsd:extension base="xsd:string">
> + <xsd:attribute name="name" type="xsd:string"
> use="required"/>
> + </xsd:extension>
> + </xsd:simpleContent>
> + </xsd:complexType>
> +
> <xsd:complexType name="service-refType">
> <xsd:sequence>
> <xsd:element name="service-ref-name" type="xsd:string">
>
> Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/
> src/main/java/org/apache/geronimo/jaxws/builder/
> EndpointInfoBuilder.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
> main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
> (original)
> +++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
> main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
> Wed Jul 15 16:08:51 2009
> @@ -26,6 +26,7 @@
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
> +import java.util.Properties;
>
> import javax.wsdl.Binding;
> import javax.wsdl.Definition;
> @@ -47,6 +48,7 @@
> import org.apache.geronimo.jaxws.client.EndpointInfo;
> import org.apache.geronimo.jaxws.wsdl.CatalogJarWSDLLocator;
> import org.apache.geronimo.jaxws.wsdl.CatalogWSDLLocator;
> +import
> org.apache.geronimo.xbeans.geronimo.naming.GerPortPropertyType;
> import org.apache.geronimo.xbeans.geronimo.naming.GerPortType;
> import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
> import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
> @@ -118,7 +120,8 @@
> URL location = getLocation(gerPort);
> String credentialsName =
> getCredentialsName(gerPort);
> boolean mtomEnabled = isMTOMEnabled(portName);
> - EndpointInfo info = new
> EndpointInfo(location, credentialsName, mtomEnabled);
> + Map<String, Object> props =
> getProperties(gerPort);
> + EndpointInfo info = new
> EndpointInfo(location, credentialsName, mtomEnabled, props);
> this.portInfoMap.put(portName, info);
> }
> }
> @@ -240,7 +243,9 @@
>
> boolean mtomEnabled =
> isMTOMEnabled(portType.getQName());
>
> - EndpointInfo info = new EndpointInfo(location,
> credentialsName, mtomEnabled);
> + Map<String, Object> props = getProperties(gerPort);
> +
> + EndpointInfo info = new EndpointInfo(location,
> credentialsName, mtomEnabled, props);
> this.portInfoMap.put(portName, info);
> // prefer first binding listed in wsdl
> if (!
> this.portInfoMap.containsKey(portType.getQName())) {
> @@ -272,6 +277,16 @@
> return null;
> }
>
> + private Map<String, Object> getProperties(GerPortType port) {
> + Map<String, Object> props = new HashMap<String, Object>();
> + if (port.getPropertyArray() != null) {
> + for (GerPortPropertyType propertyType :
> port.getPropertyArray()) {
> + props.put(propertyType.getName(),
> propertyType.getStringValue().trim());
> + }
> + }
> + return props;
> + }
> +
> private String getCredentialsName(GerPortType port) {
> String credentialsName = port.getCredentialsName();
> return (credentialsName == null) ? null :
> credentialsName.trim();
>
> Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/
> main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/EndpointInfo.java (original)
> +++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/EndpointInfo.java Wed Jul 15
> 16:08:51 2009
> @@ -18,17 +18,20 @@
>
> import java.io.Serializable;
> import java.net.URL;
> +import java.util.Map;
>
> public class EndpointInfo implements Serializable {
>
> private URL location;
> private String credentialsName;
> private boolean mtomEnabled;
> + private Map<String, Object> properties;
>
> - public EndpointInfo(URL location, String credentialsName,
> boolean mtomEnabled) {
> + public EndpointInfo(URL location, String credentialsName,
> boolean mtomEnabled, Map<String, Object> properties) {
> this.location = location;
> this.credentialsName = credentialsName;
> this.mtomEnabled = mtomEnabled;
> + this.properties = properties;
> }
>
> public boolean isMTOMEnabled() {
> @@ -43,7 +46,11 @@
> return this.credentialsName;
> }
>
> + public Map<String, Object> getProperties() {
> + return properties;
> + }
> +
> public String toString() {
> - return this.location + " " + this.credentialsName + " " +
> this.mtomEnabled;
> + return this.location + " " + this.credentialsName + " " +
> this.mtomEnabled + " " + this.properties;
> }
> }
>
> Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/
> main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java?rev=794318&r1=794317&r2=794318&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/PortMethodInterceptor.java (original)
> +++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
> org/apache/geronimo/jaxws/client/PortMethodInterceptor.java Wed Jul
> 15 16:08:51 2009
> @@ -97,7 +97,14 @@
> setProperties(proxy, info);
> }
>
> - private void setProperties(BindingProvider proxy, EndpointInfo
> info) {
> + protected void setProperties(BindingProvider proxy,
> EndpointInfo info) {
> + if (info == null) {
> + return;
> + }
> + setProperties(proxy, info, info.getProperties());
> + }
> +
> + protected void setProperties(BindingProvider proxy,
> EndpointInfo info, Map<String, Object> properties) {
> if (info == null) {
> return;
> }
> @@ -119,29 +126,35 @@
> // set credentials
> String credentialsName = info.getCredentialsName();
> if (credentialsName != null) {
> - Subject subject = ContextManager.getNextCaller();
> - if (subject == null) {
> - throw new IllegalStateException("Subject missing
> but authentication turned on");
> - } else {
> - Set creds =
> subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
> - boolean found = false;
> -
> - for (Iterator iterator = creds.iterator();
> iterator.hasNext();) {
> - NamedUsernamePasswordCredential
> namedUsernamePasswordCredential = (NamedUsernamePasswordCredential)
> iterator.next();
> - if
> (credentialsName.equals(namedUsernamePasswordCredential.getName())) {
> -
> proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
> -
> namedUsernamePasswordCredential.getUsername());
> -
> proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
> - new
> String(namedUsernamePasswordCredential.getPassword()));
> - LOG.debug("Set username/password property:
> " + credentialsName);
> - found = true;
> - break;
> - }
> - }
> - if (!found) {
> - throw new IllegalStateException("no
> NamedUsernamePasswordCredential found for name " + credentialsName);
> + NamedUsernamePasswordCredential
> namedUsernamePasswordCredential = findCredential(credentialsName);
> +
> proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
> +
> namedUsernamePasswordCredential.getUsername());
> +
> proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
> + new
> String(namedUsernamePasswordCredential.getPassword()));
> + LOG.debug("Set username/password property: " +
> credentialsName);
> + }
> +
> + // set user-specified properties
> + if (properties != null) {
> + for (Map.Entry<String, Object> entry :
> properties.entrySet()) {
> + proxy.getRequestContext().put(entry.getKey(),
> entry.getValue());
> + }
> + }
> + }
> +
> + protected NamedUsernamePasswordCredential findCredential(String
> credentialsName) {
> + Subject subject = ContextManager.getNextCaller();
> + if (subject == null) {
> + throw new IllegalStateException("Subject missing but
> authentication turned on");
> + } else {
> + Set creds =
> subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
> + for (Iterator iterator = creds.iterator();
> iterator.hasNext();) {
> + NamedUsernamePasswordCredential
> namedUsernamePasswordCredential = (NamedUsernamePasswordCredential)
> iterator.next();
> + if
> (credentialsName.equals(namedUsernamePasswordCredential.getName())) {
> + return namedUsernamePasswordCredential;
> }
> }
> + throw new IllegalStateException("No
> NamedUsernamePasswordCredential found for name " + credentialsName);
> }
> }
> }
>
>