Package com.arjuna.webservices11.wsaddr.client

Source Code of com.arjuna.webservices11.wsaddr.client.SoapFaultClient

/*
* JBoss, Home of Professional Open Source
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a full listing
* of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA  02110-1301, USA.
*
* (C) 2005-2006,
* @author JBoss Inc.
*/
package com.arjuna.webservices11.wsaddr.client;

import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.net.URISyntaxException;

import javax.xml.namespace.QName;
import javax.xml.ws.addressing.*;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.handler.Handler;

import com.arjuna.webservices.SoapFault;
import com.arjuna.webservices11.SoapFault11;
import com.arjuna.webservices11.wsaddr.AddressingHelper;
import com.arjuna.webservices11.wsarj.InstanceIdentifier;
import org.jboss.jbossts.xts.soapfault.SoapFaultPortType;
import org.jboss.jbossts.xts.soapfault.Fault;
import org.jboss.jbossts.xts.soapfault.SoapFaultService;
import org.jboss.ws.extensions.addressing.jaxws.WSAddressingClientHandler;
import org.w3c.dom.Element;

/**
* Base client.
* @author kevin
*/
public class SoapFaultClient
{
    /**
     * Send a fault.
     * @param soapFault The SOAP fault.
     * @param addressingProperties addressing context initialised with to and message ID.
     * @param action The action URI for the request.
     * @throws com.arjuna.webservices.SoapFault For any errors.
     * @throws java.io.IOException for any transport errors.
     */
    public static void sendSoapFault(final SoapFault11 soapFault,
                                     final AddressingProperties addressingProperties,
                                     final AttributedURI action)
        throws SoapFault11, IOException
    {
        if (action != null)
        {
            soapFault.setAction(action.getURI().toString()) ;
        }

        final SoapFaultPortType faultPort = getSoapFaultPort(addressingProperties, action);
        Fault fault = soapFault.toFault();
        faultPort.soapFault(fault);
    }

    /**
     * Send a fault to a specific endpoint.
     * @param soapFault The SOAP fault.
     * @param endpoint an endpoint ot dispatch the fault to.
     * @param addressingProperties addressing context initialised with to and message ID.
     * @param action The action URI for the request.
     * @throws com.arjuna.webservices.SoapFault For any errors.
     * @throws java.io.IOException for any transport errors.
     */
    public static void sendSoapFault(final SoapFault11 soapFault,
                                     W3CEndpointReference endpoint,
                                     final AddressingProperties addressingProperties,
                                     final AttributedURI action)
        throws SoapFault11, IOException
    {
        if (action != null)
        {
            soapFault.setAction(action.getURI().toString()) ;
        }

        final SoapFaultPortType faultPort = getSoapFaultPort(endpoint, addressingProperties, action);
        Fault fault = soapFault.toFault();
        faultPort.soapFault(fault);
    }

    /**
     * fetch a coordinator activation service unique to the current thread
     * @return
     */
    private static synchronized SoapFaultService getSoapFaultService()
    {
        if (soapFaultService.get() == null) {
            soapFaultService.set(new SoapFaultService());
        }
        return soapFaultService.get();
    }

    private static SoapFaultPortType getSoapFaultPort(final AddressingProperties addressingProperties,
                                                      final AttributedURI action)
    {
        SoapFaultService service = getSoapFaultService();
        SoapFaultPortType port = service.getPort(SoapFaultPortType.class);
        BindingProvider bindingProvider = (BindingProvider)port;
        AttributedURI toUri = addressingProperties.getTo();
        List<Handler> customHandlerChain = new ArrayList<Handler>();
        /*
         * we have to add the JaxWS WSAddressingClientHandler because we cannot specify the WSAddressing feature
         */
    customHandlerChain.add(new WSAddressingClientHandler());
        bindingProvider.getBinding().setHandlerChain(customHandlerChain);

        Map<String, Object> requestContext = bindingProvider.getRequestContext();
        if (action != null) {
            addressingProperties.setAction(action);
        }
        requestContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES, addressingProperties);
      // jbossws should do this for us . . .
      requestContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND, addressingProperties);
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, toUri.getURI().toString());
        // need to set soap action header based upon what the client asks for
        requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, action.getURI().toString());

        return port;
    }

    private static SoapFaultPortType getSoapFaultPort(final W3CEndpointReference endpoint,
                                                      final AddressingProperties addressingProperties,
                                                      final AttributedURI action)
    {
        SoapFaultService service = getSoapFaultService();
        SoapFaultPortType port = service.getPort(endpoint, SoapFaultPortType.class);
        BindingProvider bindingProvider = (BindingProvider)port;
        Map<String, Object> requestContext = bindingProvider.getRequestContext();
        AddressingProperties requestProperties = (AddressingProperties)requestContext.get(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND);
        if (action != null) {
            addressingProperties.setAction(action);
        }
        AddressingHelper.installCallerProperties(addressingProperties, requestProperties);
        AttributedURI toUri = requestProperties.getTo();
        List<Handler> customHandlerChain = new ArrayList<Handler>();
        /*
         * we have to add the JaxWS WSAddressingClientHandler because we cannot specify the WSAddressing feature
         */
    customHandlerChain.add(new WSAddressingClientHandler());
        bindingProvider.getBinding().setHandlerChain(customHandlerChain);
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, toUri.getURI().toString());
        // need to set soap action header based upon what the client asks for
        requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, action.getURI().toString());

        return port;
    }

    private static final ThreadLocal<SoapFaultService> soapFaultService = new ThreadLocal<SoapFaultService>();
}
TOP

Related Classes of com.arjuna.webservices11.wsaddr.client.SoapFaultClient

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.