Preloader image

Help us document this example! Click the blue pencil icon in the upper right to edit this page.

CalculatorImpl

package org.superbiz.calculator;

import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ejb.Stateless;
import jakarta.jws.WebService;

/**
 * This is an EJB 3 style pojo stateless session bean
 * Every stateless session bean implementation must be annotated
 * using the annotation @Stateless
 * This EJB has a single interface: CalculatorWs a webservice interface.
 */
//START SNIPPET: code
@DeclareRoles(value = {"Administrator"})
@Stateless
@WebService(
        portName = "CalculatorPort",
        serviceName = "CalculatorWsService",
        targetNamespace = "http://superbiz.org/wsdl",
        endpointInterface = "org.superbiz.calculator.CalculatorWs")
public class CalculatorImpl implements CalculatorWs, CalculatorRemote {

    @RolesAllowed(value = {"Administrator"})
    public int sum(int add1, int add2) {
        return add1 + add2;
    }

    public int multiply(int mul1, int mul2) {
        return mul1 * mul2;
    }
}

CalculatorRemote

package org.superbiz.calculator;

import jakarta.ejb.Remote;

@Remote
public interface CalculatorRemote {

    public int sum(int add1, int add2);

    public int multiply(int mul1, int mul2);
}

CalculatorWs

package org.superbiz.calculator;

import jakarta.jws.WebService;

//END SNIPPET: code

/**
 * This is an EJB 3 webservice interface
 * A webservice interface must be annotated with the @Local
 * annotation.
 */
//START SNIPPET: code
@WebService(targetNamespace = "http://superbiz.org/wsdl")
public interface CalculatorWs {

    public int sum(int add1, int add2);

    public int multiply(int mul1, int mul2);
}

ejb-jar.xml

<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
         version="3.0" id="simple" metadata-complete="false">

  <enterprise-beans>

    <session>
      <ejb-name>CalculatorImplTimestamp1way</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplTimestamp2ways</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplUsernameTokenPlainPassword</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplUsernameTokenHashedPassword</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplUsernameTokenPlainPasswordEncrypt</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplSign</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplEncrypt2ways</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplSign2ways</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

    <session>
      <ejb-name>CalculatorImplEncryptAndSign2ways</ejb-name>
      <service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
      <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>

  </enterprise-beans>

</ejb-jar>

openejb-jar.xml

<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1">

  <ejb-deployment ejb-name="CalculatorImpl">
    <properties>
      # webservice.security.realm
      # webservice.security.securityRealm
      # webservice.security.transportGarantee = NONE
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = UsernameToken
      wss4j.in.passwordType = PasswordText
      wss4j.in.passwordCallbackClass = org.superbiz.calculator.CustomPasswordHandler

      # automatically added
      wss4j.in.validator.{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}UsernameToken = org.apache.openejb.server.cxf.OpenEJBLoginValidator
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplTimestamp1way">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = Timestamp
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplTimestamp2ways">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = Timestamp
      wss4j.out.action = Timestamp
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplUsernameTokenPlainPassword">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = UsernameToken
      wss4j.in.passwordType = PasswordText
      wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplUsernameTokenHashedPassword">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = UsernameToken
      wss4j.in.passwordType = PasswordDigest
      wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplUsernameTokenPlainPasswordEncrypt">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = UsernameToken Encrypt
      wss4j.in.passwordType = PasswordText
      wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
      wss4j.in.decryptionPropFile = META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-server.properties
    </properties>
  </ejb-deployment>
  <ejb-deployment ejb-name="CalculatorImplSign">
    <properties>
      webservice.security.authMethod = WS-SECURITY
      wss4j.in.action = Signature
      wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
      wss4j.in.signaturePropFile = META-INF/CalculatorImplSign-server.properties
    </properties>
  </ejb-deployment>

</openejb-jar>

webservices.xml

<webservices xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd"
             xmlns:ger="http://ciaows.org/wsdl" version="1.1">

  <webservice-description>
    <webservice-description-name>CalculatorWsService</webservice-description-name>
    <port-component>
      <port-component-name>CalculatorImplTimestamp1way</port-component-name>
      <wsdl-port>CalculatorImplTimestamp1way</wsdl-port>
      <service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>CalculatorImplTimestamp1way</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
      <port-component-name>CalculatorImplTimestamp2ways</port-component-name>
      <wsdl-port>CalculatorImplTimestamp2ways</wsdl-port>
      <service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>CalculatorImplTimestamp2ways</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
      <port-component-name>CalculatorImplUsernameTokenPlainPassword</port-component-name>
      <wsdl-port>CalculatorImplUsernameTokenPlainPassword</wsdl-port>
      <service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>CalculatorImplUsernameTokenPlainPassword</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
      <port-component-name>CalculatorImplUsernameTokenHashedPassword</port-component-name>
      <wsdl-port>CalculatorImplUsernameTokenHashedPassword</wsdl-port>
      <service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>CalculatorImplUsernameTokenHashedPassword</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
      <port-component-name>CalculatorImplUsernameTokenPlainPasswordEncrypt</port-component-name>
      <wsdl-port>CalculatorImplUsernameTokenPlainPasswordEncrypt</wsdl-port>
      <service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>CalculatorImplUsernameTokenPlainPasswordEncrypt</ejb-link>
      </service-impl-bean>
    </port-component>
  </webservice-description>

</webservices>

CalculatorTest

package org.superbiz.calculator;

import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.handler.WSHandlerConstants;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.xml.namespace.QName;
import jakarta.xml.ws.Service;
import jakarta.xml.ws.soap.SOAPBinding;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

@RunWith(Arquillian.class)
public class CalculatorTest {

    //START SNIPPET: setup
    @ArquillianResource
    private URL base;

    @Deployment(testable = false)
    public static WebArchive war() {
        return ShrinkWrap.create(WebArchive.class, "webservice-ws-security.war")
                .addClasses(CalculatorImpl.class, CalculatorRemote.class, CalculatorWs.class, CustomPasswordHandler.class)
                .addAsWebInfResource(new ClassLoaderAsset("META-INF/ejb-jar.xml"), "ejb-jar.xml")
                .addAsWebInfResource(new ClassLoaderAsset("META-INF/openejb-jar.xml"), "openejb-jar.xml")
                .addAsWebInfResource(new ClassLoaderAsset("META-INF/webservices.xml"), "webservices.xml")
                .addAsResource("META-INF/CalculatorImplSign-server.properties")
                .addAsResource("META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-server.properties")
                .addAsResource("META-INF/serverStore.jks");
    }
    //END SNIPPET: setup

    //START SNIPPET: webservice
    @Test
    public void testCalculatorViaWsInterface() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImpl?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        outProps.put(WSHandlerConstants.USER, "jane");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("waterfall");
            }
        });

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(10, calc.sum(4, 6));
    }

    @Test
    public void testCalculatorViaWsInterfaceFactoryBean() throws Exception {
        final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

        factory.setServiceClass(CalculatorWs.class);
        factory.setAddress(base.toExternalForm() + "webservices/CalculatorImpl");

        final CalculatorWs calc = (CalculatorWs) factory.create();

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        outProps.put(WSHandlerConstants.USER, "jane");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("waterfall");
            }
        });

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(10, calc.sum(4, 6));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithTimestamp1way() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplTimestamp1way?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplTimestamp1way");

        //        CalculatorWs calc = calcService.getPort(
        //        	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //		CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(12, calc.multiply(3, 4));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithTimestamp2ways() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplTimestamp2ways?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplTimestamp2ways");

        //        CalculatorWs calc = calcService.getPort(
        //        	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //		CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
        endpoint.getInInterceptors().add(new SAAJInInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        final Map<String, Object> inProps = new HashMap<String, Object>();
        inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
        final WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
        endpoint.getInInterceptors().add(wssIn);

        assertEquals(12, calc.multiply(3, 4));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithUsernameTokenPlainPassword() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenPlainPassword?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplUsernameTokenPlainPassword");

        //        CalculatorWs calc = calcService.getPort(
        //        	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //        	CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        outProps.put(WSHandlerConstants.USER, "jane");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("waterfall");
            }
        });

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(10, calc.sum(4, 6));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithUsernameTokenHashedPassword() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenHashedPassword?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplUsernameTokenHashedPassword");

        //        CalculatorWs calc = calcService.getPort(
        //        	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //        	CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        outProps.put(WSHandlerConstants.USER, "jane");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("waterfall");
            }
        });

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(10, calc.sum(4, 6));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithUsernameTokenPlainPasswordEncrypt() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplUsernameTokenPlainPasswordEncrypt");

        //        CalculatorWs calc = calcService.getPort(
        //        	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //        	CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN
                + " " + WSHandlerConstants.ENCRYPT);
        outProps.put(WSHandlerConstants.USER, "jane");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("waterfall");
            }
        });
        outProps.put(WSHandlerConstants.ENC_PROP_FILE, "META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-client.properties");
        outProps.put(WSHandlerConstants.ENCRYPTION_USER, "serveralias");

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(10, calc.sum(4, 6));
    }

    @Test
    public void testCalculatorViaWsInterfaceWithSign() throws Exception {
        final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplSign?wsdl"),
                new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
        assertNotNull(calcService);

        // for debugging (ie. TCPMon)
        calcService.addPort(new QName("http://superbiz.org/wsdl",
                        "CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
                "http://127.0.0.1:8204/CalculatorImplSign");

        //      CalculatorWs calc = calcService.getPort(
        //	new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
        //	CalculatorWs.class);

        final CalculatorWs calc = calcService.getPort(CalculatorWs.class);

        final Client client = ClientProxy.getClient(calc);
        final Endpoint endpoint = client.getEndpoint();
        endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

        final Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE);
        outProps.put(WSHandlerConstants.USER, "clientalias");
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {

            @Override
            public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword("clientPassword");
            }
        });
        outProps.put(WSHandlerConstants.SIG_PROP_FILE, "META-INF/CalculatorImplSign-client.properties");
        outProps.put(WSHandlerConstants.SIG_KEY_ID, "IssuerSerial");

        final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        endpoint.getOutInterceptors().add(wssOut);

        assertEquals(24, calc.multiply(4, 6));
    }
    //END SNIPPET: webservice
}

CustomPasswordHandler

package org.superbiz.calculator;

import org.apache.ws.security.WSPasswordCallback;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;

public class CustomPasswordHandler implements CallbackHandler {
    @Override
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];

        if (pc.getUsage() == WSPasswordCallback.USERNAME_TOKEN) {
            pc.setPassword("waterfall");
        } else if (pc.getUsage() == WSPasswordCallback.DECRYPT) {
            pc.setPassword("serverPassword");
        } else if (pc.getUsage() == WSPasswordCallback.SIGNATURE) {
            pc.setPassword("serverPassword");
        }
    }
}

arquillian.xml

The test deploys the example to TomEE embedded. src/test/resources/arquillian.xml defines the users the UsernameToken endpoints log in with:

<arquillian
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
  <container qualifier="tomee" default="true">
    <configuration>
      <property name="httpPort">-1</property>
      <property name="stopPort">-1</property>
      <property name="appWorkingDir">target/tomee-embedded</property>
      <!-- <user>=<password> -->
      <property name="users">
        jane=waterfall
        joe=cool
      </property>
      <!-- <user>=<role>[,<role>] -->
      <property name="roles">
        jane=Administrator
        joe=Administrator
      </property>
    </configuration>
  </container>
</arquillian>

Running

generate keys:

do.sun.jdk:
     [echo] *** Running on a Sun JDK ***
     [echo] generate server keys
     [java] Certificate stored in file </Users/dblevins/examples/webservice-ws-security/target/classes/META-INF/serverKey.rsa>
     [echo] generate client keys
     [java] Certificate stored in file </Users/dblevins/examples/webservice-ws-security/target/test-classes/META-INF/clientKey.rsa>
     [echo] import client/server public keys in client/server keystores
     [java] Certificate was added to keystore
     [java] Certificate was added to keystore

do.ibm.jdk:

run:
     [echo] Running JDK specific keystore creation target

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.calculator.CalculatorTest
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Version: 10.3.0-SNAPSHOT
INFO: ------------------------- localhost -> /webservice-ws-security
INFO: Configuring enterprise application: /path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security
INFO: Auto-deploying ejb CalculatorImplEncrypt2ways: EjbDeployment(deployment-id=CalculatorImplEncrypt2ways)
INFO: Auto-deploying ejb CalculatorImplSign2ways: EjbDeployment(deployment-id=CalculatorImplSign2ways)
INFO: Auto-deploying ejb CalculatorImplEncryptAndSign2ways: EjbDeployment(deployment-id=CalculatorImplEncryptAndSign2ways)
INFO: Created Ejb(deployment-id=CalculatorImplEncrypt2ways, ejb-name=CalculatorImplEncrypt2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplTimestamp2ways, ejb-name=CalculatorImplTimestamp2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplTimestamp1way, ejb-name=CalculatorImplTimestamp1way, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplSign, ejb-name=CalculatorImplSign, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplSign2ways, ejb-name=CalculatorImplSign2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenPlainPassword, ejb-name=CalculatorImplUsernameTokenPlainPassword, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplEncryptAndSign2ways, ejb-name=CalculatorImplEncryptAndSign2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenPlainPasswordEncrypt, ejb-name=CalculatorImplUsernameTokenPlainPasswordEncrypt, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenHashedPassword, ejb-name=CalculatorImplUsernameTokenHashedPassword, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplEncrypt2ways, ejb-name=CalculatorImplEncrypt2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplTimestamp2ways, ejb-name=CalculatorImplTimestamp2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplTimestamp1way, ejb-name=CalculatorImplTimestamp1way, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplSign, ejb-name=CalculatorImplSign, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplSign2ways, ejb-name=CalculatorImplSign2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenPlainPassword, ejb-name=CalculatorImplUsernameTokenPlainPassword, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplEncryptAndSign2ways, ejb-name=CalculatorImplEncryptAndSign2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenPlainPasswordEncrypt, ejb-name=CalculatorImplUsernameTokenPlainPasswordEncrypt, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenHashedPassword, ejb-name=CalculatorImplUsernameTokenHashedPassword, container=Default Stateless Container)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp1way, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplTimestamp1way)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplTimestamp2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPassword, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenPlainPassword)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenHashedPassword, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenHashedPassword)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenPlainPasswordEncrypt)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplSign)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplEncrypt2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplEncrypt2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplSign2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplEncryptAndSign2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplEncryptAndSign2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImpl, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImpl)
INFO: Deployed Application(path=/path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security)
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp1way?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp2ways?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenHashedPassword?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImpl?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPassword?wsdl
INFO: Undeploying app: /path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.444 s -- in org.superbiz.calculator.CalculatorTest

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0