| /* |
| * 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.ode.bpel.epr; |
| |
| import java.util.Map; |
| |
| import javax.xml.namespace.QName; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.ode.utils.DOMUtils; |
| import org.apache.ode.utils.Namespaces; |
| import org.w3c.dom.Element; |
| |
| /** |
| * Factory for {@link org.apache.ode.bpel.iapi.EndpointReference} |
| * implementations. |
| */ |
| public class EndpointFactory { |
| |
| private static final Log __log = LogFactory.getLog(EndpointFactory.class); |
| |
| private static QName WSDL20_ELMT_QNAME = new QName(Namespaces.WSDL_20, "service"); |
| |
| private static QName WSDL11_ELMT_QNAME = new QName(Namespaces.WSDL_11, "service"); |
| |
| private static QName WSA_ELMT_QNAME = new QName(Namespaces.WS_ADDRESSING_NS, "EndpointReference"); |
| |
| private static QName SOAP_ADDR_ELMT_QNAME = new QName(Namespaces.SOAP_NS, "address"); |
| |
| private static MutableEndpoint[] ENDPOINTS = new MutableEndpoint[] { new URLEndpoint(), new WSAEndpoint(), |
| new WSDL11Endpoint(), new WSDL20Endpoint() }; |
| |
| /** |
| * Creates a ServiceEndpoint using the provided Node. The actual endpoint |
| * type is detected using the endpoint node (text or element qname). |
| * |
| * @param endpointElmt |
| * @return the new ServiceEndpoint |
| */ |
| public static MutableEndpoint createEndpoint(Element endpointElmt) { |
| for (MutableEndpoint endpoint : EndpointFactory.ENDPOINTS) { |
| // Eliminating the service-ref element for accept |
| if (endpoint.accept(endpointElmt)) { |
| MutableEndpoint se; |
| try { |
| se = endpoint.getClass().newInstance(); |
| } catch (InstantiationException e) { |
| throw new RuntimeException(e); |
| } catch (IllegalAccessException e) { |
| throw new RuntimeException(e); |
| } |
| se.set(endpointElmt); |
| return se; |
| } |
| } |
| __log.warn("Couldnt create any endpoint for element " + DOMUtils.domToString(endpointElmt)); |
| return null; |
| } |
| |
| /** |
| * Convert an EPR element into another EPR using the provided target type. |
| * The target type is actually the qualified name of the root element for |
| * the target EPR (i.e wsa:MutableEndpoint, wsdl:service) or null to convert |
| * to a simple URL. |
| * |
| * @param targetElmtType |
| * QName to convert to |
| * @param sourceEndpoint |
| * @return the converted MutableEndpoint |
| */ |
| public static MutableEndpoint convert(QName targetElmtType, Element sourceEndpoint) { |
| MutableEndpoint targetEpr; |
| MutableEndpoint sourceEpr = EndpointFactory.createEndpoint(sourceEndpoint); |
| Map transfoMap = sourceEpr.toMap(); |
| if (targetElmtType == null) { |
| targetEpr = new URLEndpoint(); |
| } else if (targetElmtType.equals(EndpointFactory.WSDL20_ELMT_QNAME)) { |
| targetEpr = new WSDL20Endpoint(); |
| } else if (targetElmtType.equals(EndpointFactory.WSDL11_ELMT_QNAME)) { |
| targetEpr = new WSDL11Endpoint(); |
| } else if (targetElmtType.equals(EndpointFactory.WSA_ELMT_QNAME)) { |
| targetEpr = new WSAEndpoint(); |
| } else if (targetElmtType.equals(EndpointFactory.SOAP_ADDR_ELMT_QNAME)) { |
| targetEpr = new URLEndpoint(); |
| } else { |
| // When everything fails, shooting for the most simple EPR format |
| targetEpr = new URLEndpoint(); |
| } |
| |
| targetEpr.fromMap(transfoMap); |
| if (__log.isDebugEnabled()) { |
| __log.debug("Converted endpoint to type " + targetElmtType); |
| __log.debug("Source endpoint " + DOMUtils.domToString(sourceEndpoint)); |
| __log.debug("Destination endpoint " + DOMUtils.domToString(targetEpr.toXML())); |
| } |
| return targetEpr; |
| } |
| |
| public static WSAEndpoint convertToWSA(MutableEndpoint source) { |
| if (source == null) |
| return null; |
| |
| if (source instanceof WSAEndpoint) |
| return (WSAEndpoint) source; |
| |
| return new WSAEndpoint(source.toMap()); |
| } |
| |
| } |