001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.axis2.ejb;
021
022 import javax.interceptor.AroundInvoke;
023 import javax.xml.ws.Binding;
024
025 import org.apache.axis2.AxisFault;
026 import org.apache.axis2.context.OperationContext;
027 import org.apache.axis2.description.AxisOperation;
028 import org.apache.axis2.description.WSDL2Constants;
029 import org.apache.axis2.engine.AxisEngine;
030 import org.apache.axis2.jaxws.core.InvocationContext;
031 import org.apache.axis2.jaxws.core.InvocationContextFactory;
032 import org.apache.axis2.jaxws.core.MessageContext;
033 import org.apache.axis2.jaxws.message.util.MessageUtils;
034 import org.apache.axis2.jaxws.server.JAXWSMessageReceiver;
035 import org.apache.axis2.wsdl.WSDLConstants.WSDL20_2004_Constants;
036 import org.apache.axis2.wsdl.WSDLConstants.WSDL20_2006Constants;
037 import org.apache.commons.logging.Log;
038 import org.apache.commons.logging.LogFactory;
039
040 public class EJBInterceptor {
041
042 private static final Log LOG = LogFactory.getLog(EJBInterceptor.class);
043
044 private MessageContext requestMsgCtx;
045 private EJBWebServiceContainer container;
046
047 public EJBInterceptor(EJBWebServiceContainer container, MessageContext requestCtx) {
048 this.container = container;
049 this.requestMsgCtx = requestCtx;
050 }
051
052 @AroundInvoke
053 public Object intercept(javax.interceptor.InvocationContext invContext) throws Exception {
054
055 this.container.injectHandlers();
056
057 AxisOperation operation = this.requestMsgCtx.getAxisMessageContext().getAxisOperation();
058 String mep = operation.getMessageExchangePattern();
059
060 EJBEndpointController controller = new EJBEndpointController(invContext);
061
062 Binding binding = (Binding)this.requestMsgCtx.getAxisMessageContext().getProperty(JAXWSMessageReceiver.PARAM_BINDING);
063 InvocationContext ic = InvocationContextFactory.createInvocationContext(binding);
064 ic.setRequestMessageContext(this.requestMsgCtx);
065
066 controller.invoke(ic);
067
068 MessageContext responseMsgCtx = ic.getResponseMessageContext();
069
070 //If there is a fault it could be Robust In-Only
071 if (!isMepInOnly(mep) || hasFault(responseMsgCtx)) {
072 // If this is a two-way exchange, there should already be a
073 // JAX-WS MessageContext for the response. We need to pull
074 // the Message data out of there and set it on the Axis2
075 // MessageContext.
076 org.apache.axis2.context.MessageContext axisResponseMsgCtx =
077 responseMsgCtx.getAxisMessageContext();
078
079 MessageUtils.putMessageOnMessageContext(responseMsgCtx.getMessage(),
080 axisResponseMsgCtx);
081
082 OperationContext opCtx = axisResponseMsgCtx.getOperationContext();
083 opCtx.addMessageContext(axisResponseMsgCtx);
084
085 // If this is a fault message, we want to throw it as an
086 // exception so that the transport can do the appropriate things
087 if (responseMsgCtx.getMessage().isFault()) {
088 throw new AxisFault("An error was detected during JAXWS processing",
089 axisResponseMsgCtx);
090 } else {
091 //Create the AxisEngine for the reponse and send it.
092 AxisEngine engine =
093 new AxisEngine(axisResponseMsgCtx.getConfigurationContext());
094 engine.send(axisResponseMsgCtx);
095 }
096 }
097
098 // TODO: convert response into object?
099 return null;
100 }
101
102 private boolean hasFault(MessageContext responseMsgCtx) {
103 if (responseMsgCtx == null || responseMsgCtx.getMessage() == null) {
104 return false;
105 }
106 return responseMsgCtx.getMessage().isFault();
107 }
108
109 private boolean isMepInOnly(String mep) {
110 boolean inOnly = mep.equals(WSDL20_2004_Constants.MEP_URI_ROBUST_IN_ONLY) ||
111 mep.equals(WSDL20_2004_Constants.MEP_URI_IN_ONLY) ||
112 mep.equals(WSDL2Constants.MEP_URI_IN_ONLY) ||
113 mep.equals(WSDL2Constants.MEP_URI_ROBUST_IN_ONLY) ||
114 mep.equals(WSDL20_2006Constants.MEP_URI_ROBUST_IN_ONLY) ||
115 mep.equals(WSDL20_2006Constants.MEP_URI_IN_ONLY);
116 return inOnly;
117 }
118
119 }