Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright (c) 1997-2013 Oracle and/or its affiliates. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common Development
   * and Distribution License("CDDL") (collectively, the "License").  You
   * may not use this file except in compliance with the License.  You can
  * obtain a copy of the License at
  * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
  * or packager/legal/LICENSE.txt.  See the License for the specific
  * language governing permissions and limitations under the License.
  *
  * When distributing the software, include this License Header Notice in each
  * file and include the License file at packager/legal/LICENSE.txt.
  *
  * GPL Classpath Exception:
  * Oracle designates this particular file as subject to the "Classpath"
  * exception as provided by Oracle in the GPL Version 2 section of the License
  * file that accompanied this code.
  *
  * Modifications:
  * If applicable, add the following below the License Header, with the fields
  * enclosed by brackets [] replaced by your own identifying information:
  * "Portions Copyright [year] [name of copyright owner]"
  *
  * Contributor(s):
  * If you wish your version of this file to be governed by only the CDDL or
  * only the GPL Version 2, indicate your decision by adding "[Contributor]
  * elects to include this software in this distribution under the [CDDL or GPL
  * Version 2] license."  If you don't indicate a single choice of license, a
  * recipient has the option to distribute your version of this file under
  * either the CDDL, the GPL Version 2 or to extend the choice of license to
  * its licensees as provided above.  However, if you add GPL Version 2 code
  * and therefore, elected the GPL Version 2 license, then the option applies
  * only if the new code is made subject to such option by the copyright
  * holder.
  */
 
 package org.glassfish.webservices;
 
 
 
 
 
 
Handles dispatching of ejb web service http invocations.

Author(s):
Kenneth Saks
 
 public class EjbWebServiceDispatcher implements EjbMessageDispatcher {
 
     private static final Logger logger = LogUtils.getLogger();
 
     private JaxRpcObjectFactory rpcFactory;
     private WsUtil wsUtil = new WsUtil();
     private WebServiceEngineImpl wsEngine;
 
     // @@@ This should be added to jaxrpc spi, probably within
     // SOAPConstants.
     private static final QName FAULT_CODE_CLIENT =
         new QName(."Client");
 
     // @@@ Used to set http servlet response object so that TieBase
     // will correctly flush response code for one-way operations.
     // Should be added to SPI
     private static final String HTTP_SERVLET_RESPONSE = 
         "com.sun.xml.rpc.server.http.HttpServletResponse";
 
     //the security service
 
     public EjbWebServiceDispatcher() {
          = JaxRpcObjectFactory.newInstance();
          = WebServiceEngineImpl.getInstance();
        if (Globals.getDefaultHabitat() != null) {
             = Globals.get(org.glassfish.webservices.SecurityService.class);
        }
    }           
    public void invoke(HttpServletRequest req
                       HttpServletResponse resp,
                       ServletContext ctxt,
                       EjbRuntimeEndpointInfo endpointInfo) {
        String method = req.getMethod();
        if (.isLoggable(.)) {
                    new Object[] {req.getMethod(), req.getRequestURI(), req.getQueryString()});
        }
        try {
            ifmethod.equals("POST") ) {
                handlePost(reqrespendpointInfo);
            } else ifmethod.equals("GET") ) {
                handleGet(reqrespctxtendpointInfo);
            } else {
                String errorMessage = MessageFormat.format(
                        .getResourceBundle().getString(.),
                        new Object[] {methodendpointInfo.getEndpoint().getEndpointName(),
                            endpointInfo.getEndpointAddressUri()});
                .log(.errorMessage);
                .writeInvalidMethodType(resperrorMessage);
            }
        } catch(Exception e) {
            .log(..e);
        }
    }
    private void handlePost(HttpServletRequest req,
                            HttpServletResponse resp,
                            EjbRuntimeEndpointInfo endpointInfo)
        throws IOExceptionSOAPException {
        
        JAXRPCEndpointImpl endpoint = null;               
        String messageID = null;
        SOAPMessageContext msgContext = null;
        
        try {
            
            MimeHeaders headers = .getHeaders(req);
            if (!.hasTextXmlContentType(headers)) {
                .writeInvalidContentType(resp);
                return;
            }
            
            msgContext = .createSOAPMessageContext();
            SOAPMessage message = createSOAPMessage(reqheaders);
                        
    	    boolean wssSucceded = true;
            
            if (message != null) {                                
                
                msgContext.setMessage(message);
                // get the endpoint info
                endpoint = (JAXRPCEndpointImplendpointInfo.getEndpoint().getExtraAttribute(.);
                
                if (endpoint!=null) {
                    // first global notification
                    if (.hasGlobalMessageListener()) {
                        messageID = .preProcessRequest(endpoint);
                    }
                } else {
                    if (.isLoggable(.)) {
                        .log(..req.getRequestURI());
                    }
                }                                   
                
                AdapterInvocationInfo aInfo = null;
                
                if (!(endpointInfo instanceof Ejb2RuntimeEndpointInfo)) {
                    throw new IllegalArgumentException(endpointInfo + "is not instance of Ejb2RuntimeEndpointInfo.");
                }
                try {
                    Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
                    // Do ejb container pre-invocation and pre-handler
                    // logic
                    aInfo = endpointInfo2.getHandlerImplementor();
                    // Set message context in invocation
                    ((EJBInvocationaInfo.getInv()).setMessageContext(msgContext);
                    // Set http response object so one-way operations will
                    // response before actual business method invocation.
                    msgContext.setProperty(resp);
                    if ( != null) {
                        wssSucceded = .validateRequest(endpointInfo2.getServerAuthConfig(),
                                (StreamingHandler)aInfo.getHandler(), msgContext);
                    }
                    // Trace if necessary
                    if (messageID!=null || (endpoint!=null && endpoint.hasListeners())) {
                        // create the thread local
                        ThreadLocalInfo threadLocalInfo = new ThreadLocalInfo(messageIDreq);
                        .getThreadLocal().set(threadLocalInfo);
                        endpoint.processRequest(msgContext);
                    }
                    
                    // Pass control back to jaxrpc runtime to invoke
                    // any handlers and call the webservice method itself,
                    // which will be flow back into the ejb container.
                    if (wssSucceded) {
                        aInfo.getHandler().handle(msgContext);
                    }
                } finally {
                    // Always call release, even if an error happened
                    // during getImplementor(), since some of the
                    // preInvoke steps might have occurred.  It's ok
                    // if implementor is null.
                    if (aInfo != null) {
                        endpointInfo.releaseImplementor(aInfo.getInv());
                    }
                }
            } else {
                String errorMsg = MessageFormat.format(
                        .getResourceBundle().getString(.),
                        endpointInfo.getEndpoint().getEndpointName(), endpointInfo.getEndpointAddressUri());
                    if (.isLoggable(.)) {
                        .fine(errorMsg);
                    }
                    msgContext.writeSimpleErrorResponse
                    (errorMsg);
            }
            if (messageID!=null || endpoint!=null) {
                endpoint.processResponse(msgContext);
            }
            SOAPMessage reply = msgContext.getMessage();
            if ( != null && wssSucceded) {
                if (!(endpointInfo instanceof Ejb2RuntimeEndpointInfo)) {
                    throw new IllegalArgumentException(endpointInfo + "is not instance of Ejb2RuntimeEndpointInfo.");
                }
                Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
                .secureResponse(endpointInfo2.getServerAuthConfig(),(StreamingHandler)endpointInfo2.getHandlerImplementor().getHandler(),msgContext);
            }
            
            if (reply.saveRequired()) {
                reply.saveChanges();
            }
            .writeReply(respmsgContext);
        } catch (Throwable e) {
            String errorMessage = MessageFormat.format(
                    .getResourceBundle().getString(.),
                    new Object[] {endpointInfo.getEndpoint().getEndpointName(),
                        endpointInfo.getEndpointAddressUri(), e.getMessage()});
            .log(.errorMessagee);
            SOAPMessageContext errorMsgContext =
                .createSOAPMessageContext();
            errorMsgContext.writeSimpleErrorResponse
                (.errorMessage);
            if (messageID!=null || endpoint!=null) {
                endpoint.processResponse(errorMsgContext);
            }
            .writeReply(resperrorMsgContext);
        }
        // final tracing notification
        if (messageID!=null) {
            HttpResponseInfoImpl response = new HttpResponseInfoImpl(resp);
            .postProcessResponse(messageIDresponse);
        }
    }
    private void handleGet(HttpServletRequest req
                           HttpServletResponse resp,
                           ServletContext ctxt,
                           EjbRuntimeEndpointInfo endpointInfo)
        throws IOException
    {
       
        .handleGet(reqrespendpointInfo.getEndpoint());           
    }    
                                            MimeHeaders headers)
        throws IOException {
        InputStream is = request.getInputStream();
        
        byte[] bytes = readFully(is);
        int length = request.getContentLength() == -1 ? bytes.length 
            : request.getContentLength();
        ByteInputStream in = new ByteInputStream(byteslength);
        SOAPMessageContext msgContext = .createSOAPMessageContext();
        SOAPMessage message = msgContext.createMessage(headersin);
        return message;
    }
    protected byte[] readFully(InputStream istreamthrows IOException {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int num = 0;
        while( (num = istream.read(buf)) != -1) {
            bout.write(buf, 0, num);
        }
        byte[] ret = bout.toByteArray();
        return ret;
    }
New to GrepCode? Check out our FAQ X