/*
* 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.axis2.jaxws.handler;
import junit.framework.TestCase;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.handler.factory.HandlerPostInvokerFactory;
import org.apache.axis2.jaxws.handler.factory.HandlerPreInvokerFactory;
import org.apache.axis2.jaxws.message.Block;
import org.apache.axis2.jaxws.message.Message;
import org.apache.axis2.jaxws.message.Protocol;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.message.factory.XMLStringBlockFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import static com.google.common.truth.Truth.assertThat;
import java.util.ArrayList;
import java.util.Set;
/**
* HandlerPrePostInvokerTests verifies that the mechanisms for finding the implementation classes to
* call before and after handler.handleMessage work, and that the calls are actually made. Simple as that.
*/
public class HandlerPrePostInvokerTests extends TestCase {
private MessageContext mc = null;
private boolean preInvokerCalled = false;
private boolean postInvokerCalled = false;
private boolean messageAccessed = false;
private static final String soap11env = "http://schemas.xmlsoap.org/soap/envelope/";
public static final String SOAP11_ENVELOPE =
"<?xml version='1.0' encoding='utf-8'?>" +
"<soapenv:Envelope xmlns:soapenv=\"" + soap11env + "\">" +
"<soapenv:Header />" +
"<soapenv:Body>" +
"</soapenv:Body>" +
"</soapenv:Envelope>";
@Override
protected void setUp() throws Exception {
// Create a SOAP 1.1 Message and MessageContext
// I just grabbed this code from the JAXWS MessageTests
MessageFactory mf = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.create(Protocol.soap11);
XMLStringBlockFactory f =
(XMLStringBlockFactory) FactoryRegistry.getFactory(XMLStringBlockFactory.class);
Block block = f.createFrom(SOAP11_ENVELOPE, null, null);
m.setBodyBlock(block);
mc = new MessageContext();
mc.setMessage(m);
mc.setMEPContext(new MEPContext(mc));
}
/**
* make sure the defaults are as expected
*
*/
public void testFactoryRegistry() {
HandlerPreInvokerFactory preFact = (HandlerPreInvokerFactory)FactoryRegistry.getFactory(HandlerPreInvokerFactory.class);
HandlerPostInvokerFactory postFact = (HandlerPostInvokerFactory)FactoryRegistry.getFactory(HandlerPostInvokerFactory.class);
HandlerPreInvoker preInvoker = preFact.createHandlerPreInvoker();
HandlerPostInvoker postInvoker = postFact.createHandlerPostInvoker();
assertThat(preInvoker).named("preInvoker").isInstanceOf(org.apache.axis2.jaxws.handler.impl.HandlerPreInvokerImpl.class);
assertThat(postInvoker).named("postInvoker").isInstanceOf(org.apache.axis2.jaxws.handler.impl.HandlerPostInvokerImpl.class);
}
/**
* make sure the registered factories are used, and the calls are made in the places we expect
*
*/
public void testFactoryPrePost() {
HandlerPreInvokerFactory orgHandlerPreInvokerFactory = (HandlerPreInvokerFactory)FactoryRegistry.getFactory(HandlerPreInvokerFactory.class);
HandlerPostInvokerFactory orgHandlerPostInvokerFactory = (HandlerPostInvokerFactory)FactoryRegistry.getFactory(HandlerPostInvokerFactory.class);
try {
FactoryRegistry.setFactory(HandlerPreInvokerFactory.class, new HandlerPreInvokerFactoryImpl());
FactoryRegistry.setFactory(HandlerPostInvokerFactory.class, new HandlerPostInvokerFactoryImpl());
ArrayList<Handler> handlers = new ArrayList<Handler>();
handlers.add(new SOAPHandler1());
HandlerChainProcessor processor =
new HandlerChainProcessor(handlers, Protocol.soap11);
boolean success = true;
// server-side incoming request
success = processor.processChain(mc.getMEPContext(),
HandlerChainProcessor.Direction.IN,
HandlerChainProcessor.MEP.REQUEST,
true);
assertTrue("processChain should have succeeded", success);
assertTrue("preInvoker should have been called", preInvokerCalled);
assertTrue("postInvoker should have been called", postInvokerCalled);
assertTrue("Handler did not access message but messageAccessed property is true.", !messageAccessed);
} finally {
// Reset factory state to avoid side effects visible to other tests
FactoryRegistry.setFactory(HandlerPreInvokerFactory.class, orgHandlerPreInvokerFactory);
FactoryRegistry.setFactory(HandlerPostInvokerFactory.class, orgHandlerPostInvokerFactory);
}
}
public void testPostInvokerMessageAccessed() {
HandlerPostInvokerFactory orgHandlerPostInvokerFactory = (HandlerPostInvokerFactory)FactoryRegistry.getFactory(HandlerPostInvokerFactory.class);
try {
FactoryRegistry.setFactory(HandlerPostInvokerFactory.class, new HandlerPostInvokerFactoryImpl());
ArrayList<Handler> handlers = new ArrayList<Handler>();
handlers.add(new SOAPHandlerGetsMessage());
HandlerChainProcessor processor =
new HandlerChainProcessor(handlers, Protocol.soap11);
boolean success = true;
// server-side incoming request
success = processor.processChain(mc.getMEPContext(),
HandlerChainProcessor.Direction.IN,
HandlerChainProcessor.MEP.REQUEST,
true);
assertTrue("processChain should have succeeded", success);
assertTrue("postInvoker should have been called", postInvokerCalled);
assertTrue("Handler did access message but messageAccessed property is false.", messageAccessed);
} finally {
FactoryRegistry.setFactory(HandlerPostInvokerFactory.class, orgHandlerPostInvokerFactory);
}
}
/*****************************************
* Classes needed for junit testcase *
*****************************************/
private class SOAPHandler1 implements SOAPHandler<SOAPMessageContext> {
public Set getHeaders() {
return null;
}
public void close(javax.xml.ws.handler.MessageContext messagecontext) {
}
public boolean handleFault(SOAPMessageContext messagecontext) {
return true;
}
public boolean handleMessage(SOAPMessageContext messagecontext) {
return true;
}
}
/*****************************************
* Classes needed for junit testcase *
*****************************************/
private class SOAPHandlerGetsMessage implements SOAPHandler<SOAPMessageContext> {
public Set getHeaders() {
return null;
}
public void close(javax.xml.ws.handler.MessageContext messagecontext) {
}
public boolean handleFault(SOAPMessageContext messagecontext) {
return true;
}
public boolean handleMessage(SOAPMessageContext messagecontext) {
messagecontext.getMessage();
return true;
}
}
private class HandlerPreInvokerFactoryImpl implements HandlerPreInvokerFactory {
public HandlerPreInvoker createHandlerPreInvoker() {
return new HandlerPreInvokerImpl();
}
}
private class HandlerPostInvokerFactoryImpl implements HandlerPostInvokerFactory {
public HandlerPostInvoker createHandlerPostInvoker() {
return new HandlerPostInvokerImpl();
}
}
private class HandlerPreInvokerImpl implements HandlerPreInvoker {
public void preInvoke(javax.xml.ws.handler.MessageContext mc) {
preInvokerCalled = true;
}
}
private class HandlerPostInvokerImpl implements HandlerPostInvoker {
public void postInvoke(javax.xml.ws.handler.MessageContext mc) {
postInvokerCalled = true;
if (mc instanceof SoapMessageContext) {
SoapMessageContext smc = (SoapMessageContext) mc;
// PK96521 - before getting the message (which is expensive) check first to
// see if it was actually accessed by the handlers
messageAccessed = false;
if (smc.containsKey("jaxws.isMessageAccessed")) {
messageAccessed = (Boolean)(smc.get("jaxws.isMessageAccessed"));
}
}
}
}
}