/* * JBoss, Home of Professional Open Source * Copyright 2007, 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.jboss.transaction.txinterop.webservices.atinterop.client; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.AddressingFeature; import javax.xml.ws.handler.Handler; import java.util.List; import java.util.ArrayList; import java.util.Map; import com.arjuna.webservices11.ServiceRegistry; import org.jboss.ws.api.addressing.MAP; import org.jboss.ws.api.addressing.MAPEndpoint; import org.jboss.ws.api.addressing.MAPBuilder; import org.jboss.ws.api.addressing.MAPBuilderFactory; import com.arjuna.webservices11.wsaddr.AddressingHelper; import com.jboss.transaction.txinterop.webservices.atinterop.generated.InitiatorService; import com.jboss.transaction.txinterop.webservices.atinterop.generated.ParticipantService; import com.jboss.transaction.txinterop.webservices.atinterop.generated.InitiatorPortType; import com.jboss.transaction.txinterop.webservices.atinterop.generated.ParticipantPortType; import com.jboss.transaction.txinterop.webservices.atinterop.ATInteropConstants; import com.jboss.transaction.txinterop.webservices.handlers.CoordinationContextHandler; /** * Created by IntelliJ IDEA. * User: adinn * Date: Apr 17, 2008 * Time: 4:18:34 PM * To change this template use File | Settings | File Templates. */ public class ATInteropClient { // TODO -- do we really need a thread local here or can we just use one service? /** * thread local which maintains a per thread activation service instance */ private static ThreadLocal<InitiatorService> initiatorService = new ThreadLocal<InitiatorService>(); /** * thread local which maintains a per thread activation service instance */ private static ThreadLocal<ParticipantService> participantService = new ThreadLocal<ParticipantService>(); /** * builder used to construct addressing info for calls */ private static MAPBuilder builder = MAPBuilderFactory.getInstance().getBuilderInstance(); /** * fetch a coordinator activation service unique to the current thread * @return */ private static synchronized InitiatorService getInitiatorService() { if (initiatorService.get() == null) { initiatorService.set(new InitiatorService()); } return initiatorService.get(); } /** * fetch a coordinator registration service unique to the current thread * @return */ private static synchronized ParticipantService getParticipantService() { if (participantService.get() == null) { participantService.set(new ParticipantService()); } return participantService.get(); } public static InitiatorPortType getInitiatorPort(MAP map, String action) { InitiatorService service = getInitiatorService(); InitiatorPortType port = service.getPort(InitiatorPortType.class, new AddressingFeature(true, true)); BindingProvider bindingProvider = (BindingProvider)port; String to = map.getTo(); /* * we have to add the JaxWS WSAddressingClientHandler because we cannot specify the WSAddressing feature List<Handler> customHandlerChain = new ArrayList<Handler>(); customHandlerChain.add(new WSAddressingClientHandler()); bindingProvider.getBinding().setHandlerChain(customHandlerChain); */ Map<String, Object> requestContext = bindingProvider.getRequestContext(); map.setAction(action); map.setFrom(getParticipant()); AddressingHelper.configureRequestContext(requestContext, map, to, action); return port; } // don't think we ever need this as we get a registration port from the endpoint ref returned by // the activation port request public static ParticipantPortType getParticipantPort(MAP map, String action) { ParticipantService service = getParticipantService(); ParticipantPortType port = service.getPort(ParticipantPortType.class, new AddressingFeature(true, true)); BindingProvider bindingProvider = (BindingProvider)port; String to = map.getTo(); List<Handler> customHandlerChain = new ArrayList<Handler>(); /* * we need to add the coordination context handler in the case where we are passing a * coordination context via a header element */ customHandlerChain.add(new CoordinationContextHandler()); /* * we no longer have to add the JaxWS WSAddressingClientHandler because we can specify the WSAddressing feature customHandlerChain.add(new WSAddressingClientHandler()); */ bindingProvider.getBinding().setHandlerChain(customHandlerChain); Map<String, Object> requestContext = bindingProvider.getRequestContext(); map.setAction(action); map.setFrom(getInitiator()); AddressingHelper.configureRequestContext(requestContext, map, to, action); return port; } private static MAPEndpoint initiator; private static MAPEndpoint participant; private static synchronized MAPEndpoint getInitiator() { if (initiator == null) { final String initiatorURIString = ServiceRegistry.getRegistry().getServiceURI(ATInteropConstants.SERVICE_INITIATOR); initiator = builder.newEndpoint(initiatorURIString); } return initiator; } private static synchronized MAPEndpoint getParticipant() { if (participant == null) { final String participantURIString = ServiceRegistry.getRegistry().getServiceURI(ATInteropConstants.SERVICE_PARTICIPANT); participant = builder.newEndpoint(participantURIString); } return participant; } }