Package org.objectweb.celtix.bus.jaxws.servlet

Source Code of org.objectweb.celtix.bus.jaxws.servlet.CeltixServlet

package org.objectweb.celtix.bus.jaxws.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.xml.sax.SAXException;

import org.objectweb.celtix.Bus;
import org.objectweb.celtix.BusException;
import org.objectweb.celtix.bus.jaxws.EndpointImpl;
import org.objectweb.celtix.transports.TransportFactory;
import org.objectweb.celtix.ws.addressing.EndpointReferenceType;
import org.objectweb.celtix.wsdl.EndpointReferenceUtils;

public class CeltixServlet extends HttpServlet {
    static final String HTTP_REQUEST =
        CeltixServlet.class.getName() + ".REQUEST";
    static final String HTTP_RESPONSE =
        CeltixServlet.class.getName() + ".RESPONSE";
   
    static final Map<String, WeakReference<Bus>> BUS_MAP = new Hashtable<String, WeakReference<Bus>>();
   
    protected Bus bus;
    protected Map<String, ServletServerTransport> servantMap
        = new HashMap<String, ServletServerTransport>();

    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
       
        List<String> list = new ArrayList<String>();
        String busid = servletConfig.getInitParameter("bus.id");
        if (null != busid) {
            list.add("-BUSid");
            list.add(busid);
            WeakReference<Bus> ref = BUS_MAP.get(busid);
            if (null != ref) {
                bus = ref.get();
            }
        }
        try {
            if (null == bus) {
                bus = Bus.init(list.toArray(new String[list.size()]));

                TransportFactory factory = createServletTransportFactory();
                factory.init(bus);
                registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/soap/");
                registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/soap/http");
                registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/http/");
                registerTransport(factory, "http://celtix.objectweb.org/bindings/xmlformat");
                registerTransport(factory, "http://celtix.objectweb.org/transports/http/configuration");
            }
        } catch (BusException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }
        if (null != busid) {
            BUS_MAP.put(busid, new WeakReference<Bus>(bus));
        }

        InputStream ins = servletConfig.getServletContext()
            .getResourceAsStream("/WEB-INF/celtix-servlet.xml");
        if (ins != null) {
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            builderFactory.setNamespaceAware(true);
            builderFactory.setValidating(false);
           
           
            try {
                Document doc = builderFactory.newDocumentBuilder().parse(ins);
                Node nd = doc.getDocumentElement().getFirstChild();
                while (nd != null) {
                    if ("endpoint".equals(nd.getLocalName())) {
                        loadEndpoint(servletConfig, nd);
                    }
                    nd = nd.getNextSibling();
                }
            } catch (SAXException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            } catch (IOException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            } catch (ParserConfigurationException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            }
        }
    }

    /**
     * @return
     */
    protected TransportFactory createServletTransportFactory() {
        return new ServletTransportFactory(this);
    }

    private void registerTransport(TransportFactory factory, String namespace) throws BusException {
        this.bus.getTransportFactoryManager().registerTransportFactory(namespace,
                                                                  factory);
    }

    public void loadEndpoint(String implName,
                             String serviceName,
                             String wsdlName,
                             String portName,
                             String urlPat) {

        try {
            URL url = null;
            if (wsdlName != null) {
                try {
                    url = getServletConfig().getServletContext().getResource(wsdlName);
                } catch (MalformedURLException ex) {
                    try {
                        url = new URL(wsdlName);
                    } catch (MalformedURLException ex2) {
                        try {
                            url = getServletConfig().getServletContext().getResource("/" + wsdlName);
                        } catch (MalformedURLException ex3) {
                            url = null;
                        }
                    }
                }
            }
            Class cls = Class.forName(implName, false, Thread.currentThread().getContextClassLoader());
            Object impl = cls.newInstance();
            EndpointReferenceType ref;
            if (url != null) {
                ref = EndpointReferenceUtils
                    .getEndpointReference(url,
                                      QName.valueOf(serviceName),
                                      portName);
            } else {
                ref =
                    EndpointReferenceUtils.getEndpointReference(bus.getWSDLManager(),
                                                            impl);
            }
            EndpointImpl ep = new EndpointImpl(bus, impl, null, ref);
           
            //doesn't really matter what URL is used here
            ep.publish("http://localhost" + (urlPat.charAt(0) == '/' ? "" : "/") + urlPat);
        } catch (ClassNotFoundException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }   
    }

    public void loadEndpoint(ServletConfig servletConfig, Node node) {
        Element el = (Element)node;
        String implName = el.getAttribute("implementation");
        String serviceName = el.getAttribute("service");
        String wsdlName = el.getAttribute("wsdl");
        String portName = el.getAttribute("port");
        String urlPat = el.getAttribute("url-pattern");
        /*
        String intfName = el.getAttribute("interface");
        String name = el.getAttribute("name");
        */

        loadEndpoint(implName, serviceName, wsdlName, portName, urlPat);
    }

    public void destroy() {
        try {
            String s = bus.getBusID();
            BUS_MAP.remove(s);
           
            bus.shutdown(true);
        } catch (BusException ex) {
            ex.printStackTrace();
            //ignore
        }
    }
   
    void addServant(URL url, ServletServerTransport servant) {
        servantMap.put(url.getPath(), servant);
    }
    void removeServant(URL url, ServletServerTransport servant) {
        servantMap.remove(url.getPath());
    }
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        ServletServerTransport tp = servantMap.get(request.getPathInfo());
        if (tp == null) {
            throw new ServletException("Unknown servlet mapping " + request.getPathInfo());
        }
        try {
            tp.doPost(request, response);
        } catch (IOException ex) {
            throw new ServletException(ex.getMessage());
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        ServletServerTransport tp = servantMap.get(request.getPathInfo());
        if (tp == null) {
            throw new ServletException("Unknown servlet mapping " + request.getPathInfo());
        }
        try {
            tp.doGet(request, response);
        } catch (IOException ex) {
            throw new ServletException(ex.getMessage());
        }
    }

}
TOP

Related Classes of org.objectweb.celtix.bus.jaxws.servlet.CeltixServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.