/* * (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed 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. * * Contributors: * Arnaud Kervern */ package org.nuxeo.ecm.platform.api.ws; import static javax.xml.ws.Endpoint.WSDL_PORT; import static javax.xml.ws.Endpoint.WSDL_SERVICE; import static org.apache.commons.lang.StringUtils.isBlank; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Endpoint; import javax.xml.ws.handler.Handler; import javax.xml.ws.soap.SOAPBinding; import org.nuxeo.common.xmap.annotation.XNode; import org.nuxeo.common.xmap.annotation.XNodeList; import org.nuxeo.common.xmap.annotation.XObject; import org.nuxeo.ecm.platform.ws.WSEndpointManager; import org.nuxeo.ecm.platform.ws.WSEndpointManagerImpl; import org.nuxeo.runtime.api.Framework; /** * @author <a href="mailto:ak@nuxeo.com">Arnaud Kervern</a> * @since 5.7.2 */ @XObject("endpoint") public class WSEndpointDescriptor { private static final String NUXEO_URL = "nuxeo.url"; @XNode("@name") public String name; @XNode("@address") public String address; @XNode("@implementor") public Class<?> clazz; @XNodeList(value = "handlers/handler", type = String[].class, componentType = Class.class) public Class<? extends Handler>[] handlers; @XNode("@namespace") public String namespace; @XNode("@wsdl") public String wsdl; @XNode("@port") public String port; @XNode("@service") public String service; @XNode("enable-mtom") public boolean mtom; @XNode("publishedEndpointUrl") public String publishedEndpointUrl; public Object getImplementorInstance() throws IllegalAccessException, InstantiationException { return clazz != null ? clazz.newInstance() : null; } public Endpoint toEndpoint() throws IOException, IllegalAccessException, InstantiationException { Endpoint ep = Endpoint.create(getImplementorInstance()); List<Source> metadata = new ArrayList<>(); Map<String, Object> properties = new HashMap<>(); if (!isBlank(port)) { properties.put(WSDL_PORT, new QName(namespace, port)); } if (!isBlank(port)) { properties.put(WSDL_SERVICE, new QName(namespace, service)); } if (!isBlank(wsdl)) { URL wsdlURL = WSEndpointManagerImpl.class.getClassLoader().getResource(wsdl); if (wsdlURL == null) { throw new FileNotFoundException("WSDL: " + wsdl); } Source src = new StreamSource(wsdlURL.openStream()); src.setSystemId(wsdlURL.toExternalForm()); metadata.add(src); } if (isBlank(publishedEndpointUrl)) { publishedEndpointUrl = String.format("%s%s%s", Framework.getProperty(NUXEO_URL), WSEndpointManager.WS_SERVLET, address); } properties.put("publishedEndpointUrl", publishedEndpointUrl); ep.setMetadata(metadata); ep.setProperties(properties); return ep; } public void configurePostPublishing(Endpoint ep) throws IllegalAccessException, InstantiationException { if (handlers != null) { List<Handler> handlerChain = ep.getBinding().getHandlerChain(); for (Class<? extends Handler> handler : handlers) { handlerChain.add(handler.newInstance()); } ep.getBinding().setHandlerChain(handlerChain); } if (mtom && ep.getBinding() instanceof SOAPBinding) { SOAPBinding binding = (SOAPBinding) ep.getBinding(); binding.setMTOMEnabled(mtom); } } }