Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 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.tuscany.sca.implementation.java.invocation;
 
 
Responsible for asynchronously dispatching an invocation to a Java component implementation instance
 
 	
     public JavaAsyncImplementationInvoker(Operation operationMethod methodRuntimeComponent component
     		InterfaceContract interfaceContract) {
     	superoperationmethodcomponentinterfaceContract);
         assert method != null : "Operation method cannot be null";
         assert ((JavaOperationoperation).isAsyncServer() : "Operation must be async";
     } // end constructor
     
     public Message invoke(Message msg) {
         Operation op = this.;
         
         Object payload = msg.getBody();
 
         // Save the current thread context classloader
         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
         
         try {
             // The following call might create a new conversation, as a result, the msg.getConversationID() might 
             // return a new value
             InstanceWrapper wrapper = .getWrapper(null);
 
             Object instance = wrapper.getInstance();
            
             // Set the TCCL to the classloader used to load the implementation class
             Thread.currentThread().setContextClassLoader(instance.getClass().getClassLoader());
             
             // For an async server method, there is an extra input parameter, which is a DispatchResponse instance 
             // which is typed by the type of the response
             Class<?> responseType = op.getOutputType().getPhysical();
             ResponseDispatch<?> dispatch = ResponseDispatchImpl.newInstance(responseTypemsg );
             
             Object ret;
             Object[] payload2;
             if (payload != null && !payload.getClass().isArray()) {
             	payload2 = new Object[2];
             	payload2[0] = payload;
             } else {
             	payload2 = new Object[ ((Object[])payload).length + 1 ];
             	forint i = 0; i < ((Object[])payload).lengthi++) {
             		payload2[i] = ((Object[])payload)[i];
             	} // end for
             }
             payload2payload2.length - 1 ] = dispatch;
             
             ret = .invoke(instance, (Object[])payload2);
             
             throw new InvocationTargetExceptionnew AsyncResponseException("AsyncResponse") );
 
         } catch (InvocationTargetException e) {
             Throwable cause = e.getTargetException();
             boolean isChecked = false;
             for (DataType<?> d : .getFaultTypes()) {
                 if (d.getPhysical().isInstance(cause)) {
                     isChecked = true;
                    msg.setFaultBody(cause);
                    break;
                }
            } // end for
            
            if (!isChecked) {
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException)cause;
                }
                if (cause instanceof Error) {
                    throw (Error)cause;
                } else {
                    throw new ServiceRuntimeException(cause.getMessage(), cause);
                }
            }  // end if          
                
        } catch (ObjectCreationException e) {
            throw new ServiceRuntimeException(e.getMessage(), e);
        } catch (Exception e) {
            msg.setFaultBody(e);           
        } finally {
            // set the tccl 
            Thread.currentThread().setContextClassLoader(tccl);
        }
        return msg;
    } // end method invoke
    protected Invoker next;
    protected InvokerAsyncResponse previous;
	public void setNext(Invoker next) {
		this. = next;
	}
	public Invoker getNext() {
		return ;
	}
	public void invokeAsyncRequest(Message msgthrows Throwable {
// end method invokeAsyncRequest
	public void invokeAsyncResponse(Message msg) {
		msg = processResponse(msg);
        InvokerAsyncResponse thePrevious = (InvokerAsyncResponse)getPrevious();
        if (thePrevious != null ) thePrevious.invokeAsyncResponse(msg);
// end method invokeAsyncResponse
	public void setPrevious(InvokerAsyncResponse previous) {
		this. = previous;
	}
		return ;
	}
	public Message processRequest(Message msg) {
        Operation op 	= this.;
        Object payload 	= msg.getBody();
        // Replace TCCL with the class loader used to load the java class as per SCA Spec
        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
        
        try {
            InstanceWrapper wrapper = .getWrapper(null);
            Object instance = wrapper.getInstance();
           
            // Set the TCCL to the classloader used to load the implementation class
            Thread.currentThread().setContextClassLoader(instance.getClass().getClassLoader());
            
            // For an async server method, there is an extra input parameter, which is a DispatchResponse instance 
            // which is typed by the type of the response
            Class<?> responseType = op.getOutputType().getPhysical();
            ResponseDispatch<?> dispatch = ResponseDispatchImpl.newInstance(responseTypemsg );
            
            Object[] payload2;
            if (payload != null && !payload.getClass().isArray()) {
            	payload2 = new Object[2];
            	payload2[0] = payload;
            } else {
            	payload2 = new Object[ ((Object[])payload).length + 1 ];
            	forint i = 0; i < ((Object[])payload).lengthi++) {
            		payload2[i] = ((Object[])payload)[i];
            	} // end for
            }
            payload2payload2.length - 1 ] = dispatch;
            
            .invoke(instance, (Object[])payload2);
            
        } catch (InvocationTargetException e) {
            Throwable cause = e.getTargetException();
            boolean isChecked = false;
            for (DataType<?> d : .getFaultTypes()) {
                if (d.getPhysical().isInstance(cause)) {
                    isChecked = true;
                    // Ignore these errors since they should be returned asynchronously
                    break;
                }
            } // end for
            
            if (!isChecked) {
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException)cause;
                } // end if
                if (cause instanceof Error) {
                    throw (Error)cause;
                } else {
                    throw new ServiceRuntimeException(cause.getMessage(), cause);
                } // end if
            } // end if           
                
        } catch (Exception e) {
            throw new ServiceRuntimeException(e.getMessage(), e);        
        } finally {
            // set the tccl 
            Thread.currentThread().setContextClassLoader(tccl);
        }
        return msg;
// end method processRequest
		return msg;
	}
			throws Throwable {
		throw e;
	}
		return msg;
// end method processResponse
// end class JavaAsyncImplementationInvoker
New to GrepCode? Check out our FAQ X