/* | |
* 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.spi.handler; | |
import org.apache.axis2.jaxws.ExceptionFactory; | |
import org.apache.axis2.jaxws.description.xml.handler.HandlerChainType; | |
import org.apache.axis2.jaxws.description.xml.handler.HandlerType; | |
import org.apache.axis2.jaxws.i18n.Messages; | |
import org.apache.axis2.jaxws.lifecycle.LifecycleException; | |
import org.apache.axis2.util.LoggingControl; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import javax.xml.ws.handler.Handler; | |
import javax.xml.ws.handler.HandlerResolver; | |
import javax.xml.ws.handler.LogicalHandler; | |
import javax.xml.ws.handler.PortInfo; | |
import javax.xml.ws.handler.soap.SOAPHandler; | |
import java.io.File; | |
import java.net.URI; | |
import java.util.ArrayList; | |
import java.util.Iterator; | |
import java.util.List; | |
/** | |
* This is an implementation of {@link HandlerResolver} that can be used with a JAX-WS client | |
* to set the handler list. | |
* | |
* @see javax.xml.ws.Service#setHandlerResolver(HandlerResolver) | |
*/ | |
public class HandlerResolverImpl extends BaseHandlerResolver { | |
private static Log log = LogFactory.getLog(HandlerResolverImpl.class); | |
/** | |
* Constructor | |
* | |
* @param filePath the path to the handler configuration file in URI format | |
*/ | |
public HandlerResolverImpl(String filePath) { | |
super(filePath); | |
} | |
/** | |
* Constructor | |
* | |
* @param fileURI the <code>URI</code> of the handler configuration file | |
*/ | |
public HandlerResolverImpl(URI fileURI) { | |
this(fileURI.toString()); | |
} | |
/** | |
* Constructor | |
* | |
* @param file the handler configuration file | |
*/ | |
public HandlerResolverImpl(File file) { | |
this(file.toURI()); | |
} | |
/* | |
* (non-Javadoc) | |
* @see javax.xml.ws.handler.HandlerResolver#getHandlerChain(javax.xml.ws.handler.PortInfo) | |
*/ | |
public List<Handler> getHandlerChain(PortInfo portinfo) { | |
ArrayList<Handler> handlers = new ArrayList<Handler>(); | |
Iterator it = handlerChainsType == null ? null : handlerChainsType.getHandlerChain().iterator(); | |
while ((it != null) && (it.hasNext())) { | |
HandlerChainType handlerChainType = ((HandlerChainType)it.next()); | |
// if !match, continue (to next chain) | |
if (!(chainResolvesToPort(handlerChainType, portinfo))) | |
continue; | |
List<HandlerType> handlerTypeList = handlerChainType.getHandler(); | |
Iterator ht = handlerTypeList.iterator(); | |
while (ht.hasNext()) { | |
HandlerType handlerType = (HandlerType)ht.next(); | |
// TODO must do better job comparing the handlerType with the PortInfo param | |
// to see if the current iterator handler is intended for this service. | |
// TODO review: need to check for null getHandlerClass() return? | |
// or will schema not allow it? | |
String portHandler = handlerType.getHandlerClass().getValue(); | |
Handler handler = null; | |
// instantiate portHandler class | |
try { | |
handler = createHandlerInstance(loadClass(portHandler)); | |
} catch (Exception e) { | |
// TODO: should we just ignore this problem? | |
throw ExceptionFactory.makeWebServiceException(e); | |
} | |
if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) { | |
log.debug("Successfully instantiated the class: " + handler.getClass()); | |
} | |
// 9.2.1.2 sort them by Logical, then SOAP | |
if (LogicalHandler.class.isAssignableFrom(handler.getClass())) | |
handlers.add((LogicalHandler) handler); | |
else if (SOAPHandler.class.isAssignableFrom(handler.getClass())) | |
// instanceof ProtocolHandler | |
handlers.add((SOAPHandler) handler); | |
else if (Handler.class.isAssignableFrom(handler.getClass())) { | |
throw ExceptionFactory.makeWebServiceException(Messages | |
.getMessage("handlerChainErr1", handler | |
.getClass().getName())); | |
} else { | |
throw ExceptionFactory.makeWebServiceException(Messages | |
.getMessage("handlerChainErr2", handler | |
.getClass().getName())); | |
} | |
} | |
} | |
return handlers; | |
} | |
//Create an instance of the handler class and perform appropriate lifecycle activities | |
//to it. | |
private Handler createHandlerInstance(Class handlerClass) throws LifecycleException { | |
if (handlerClass == null) { | |
throw ExceptionFactory. | |
makeWebServiceException(Messages.getMessage("createHandlerInstanceErr")); | |
} | |
//Resource injection not supported. | |
Object object = null; | |
try { | |
object = handlerClass.newInstance(); | |
} catch (InstantiationException e) { | |
throw ExceptionFactory.makeWebServiceException(e); | |
} catch (IllegalAccessException e) { | |
throw ExceptionFactory.makeWebServiceException(e); | |
} | |
//Invoke PostConstruct | |
LifecycleManager manager = new LifecycleManager(object); | |
manager.invokePostConstruct(); | |
return (Handler) object; | |
} | |
} |