/* * 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.description.impl; import java.io.InputStream; import java.util.Arrays; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; import javax.xml.ws.WebServiceException; import org.apache.axis2.jaxws.description.xml.handler.HandlerChainType; import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType; import org.apache.axis2.jaxws.description.xml.handler.HandlerType; import org.apache.axis2.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class HandlerChainsParser { private static final String JAVA_EE_NS = "http://java.sun.com/xml/ns/javaee"; private static final QName QNAME_HANDLER_CHAINS = new QName(JAVA_EE_NS, "handler-chains"); private static final QName QNAME_HANDLER_CHAIN = new QName(JAVA_EE_NS, "handler-chain"); private static JAXBContext context; public HandlerChainsType loadHandlerChains(InputStream in) throws Exception { Document document = XMLUtils.newDocument(in); Element el = document.getDocumentElement(); if (!JAVA_EE_NS.equals(el.getNamespaceURI()) || !"handler-chains".equals(el.getLocalName())) { throw new WebServiceException("Unexpected element {" + el.getNamespaceURI() + "}" + el.getLocalName() + ". Expected " + QNAME_HANDLER_CHAINS + " element"); } HandlerChainsType handlerChains = new HandlerChainsType(); Node node = el.getFirstChild(); while (node != null) { if (node instanceof Element) { el = (Element)node; if (!JAVA_EE_NS.equals(el.getNamespaceURI()) || !el.getLocalName().equals("handler-chain")) { throw new WebServiceException("Unexpected element {" + el.getNamespaceURI() + "}" + el.getLocalName() + ". Expected " + QNAME_HANDLER_CHAIN + " element"); } handlerChains.getHandlerChain().add(processHandlerChainElement(el)); } node = node.getNextSibling(); } return handlerChains; } private HandlerChainType processHandlerChainElement(Element el) throws Exception { HandlerChainType handler = new HandlerChainType(); Node node = el.getFirstChild(); while (node != null) { Node cur = node; node = node.getNextSibling(); if (cur instanceof Element) { el = (Element)cur; if (!JAVA_EE_NS.equals(el.getNamespaceURI())) { throw new WebServiceException(); } String name = el.getLocalName(); if ("port-name-pattern".equals(name)) { handler.setPortNamePattern(processPatternElement(el)); } else if ("service-name-pattern".equals(name)) { handler.setServiceNamePattern(processPatternElement(el)); } else if ("protocol-bindings".equals(name)) { handler.getProtocolBindings().addAll(processProtocolBindingsElement(el)); } else if ("handler".equals(name)) { handler.getHandler().add(processHandlerElement(el)); } } } return handler; } private List<String> processProtocolBindingsElement(Element el) { String protocolBindingsString = el.getTextContent().trim(); String [] protocolBindings = protocolBindingsString.split("\\s+"); return Arrays.asList(protocolBindings); } private QName processPatternElement(Element el) throws Exception { String namePattern = el.getTextContent().trim(); // see BaseHandlerResolver.validatePattern for valid strings if ("*".equals(namePattern)) { return new QName("*"); } if (!namePattern.contains(":")) { return new QName("", namePattern, ""); } String localPart = namePattern.substring(namePattern.indexOf(':') + 1, namePattern.length()); String pfx = namePattern.substring(0, namePattern.indexOf(':')); String ns = el.lookupNamespaceURI(pfx); if (ns == null) { ns = pfx; } // populate prefix so BaseHandlerResolver.validatePattern can validate it // QName ctor is QName(namespace, localpart, prefix) return new QName(ns, localPart, pfx); } private HandlerType processHandlerElement(Element el) throws Exception { JAXBContext ctx = getContextForHandlerType(); Unmarshaller unmarshaller = ctx.createUnmarshaller(); HandlerType handler = unmarshaller.unmarshal(el, HandlerType.class).getValue(); return handler; } private static synchronized JAXBContext getContextForHandlerType() throws JAXBException { if (context == null) { context = JAXBContext.newInstance(HandlerType.class); } return context; } }