@Override
  public void callTimeout(final TimerImpl timer, final Method timeoutMethod) throws Exception {
    final Interceptor interceptor;
    synchronized (this) {
      if (!started) {
        // this can happen if an invocation has been triggered as the deployment is shutting down
        throw EjbLogger.ROOT_LOGGER.timerInvocationFailedDueToInvokerNotBeingStarted();
      }
      interceptor = timeoutInterceptors.get(timeoutMethod);
    }
    if (interceptor == null) {
      throw EjbLogger.ROOT_LOGGER.failToInvokeTimeout(timeoutMethod);
    }
    final InterceptorContext context = new InterceptorContext();
    context.setContextData(new HashMap<String, Object>());
    context.setMethod(timeoutMethod);
    if (timeoutMethod.getParameterTypes().length == 0) {
      context.setParameters(new Object[0]);
    } else {
      final Object[] params = new Object[1];
      params[0] = timer;
      context.setParameters(params);
    }
    context.setTimer(timer);

    if (timer.getPrimaryKey() != null) {
      context.putPrivateData(EntityBeanComponent.PRIMARY_KEY_CONTEXT_KEY, timer.getPrimaryKey());
    }
    context.putPrivateData(Component.class, ejbComponent.getValue());
    context.putPrivateData(MethodIntf.class, MethodIntf.TIMER);
    context.putPrivateData(InvocationType.class, InvocationType.TIMER);
    interceptor.processInvocation(context);
  }
  /**
   * Invokes WS endpoint.
   *
   * @param endpoint WS endpoint
   * @param wsInvocation web service invocation
   * @throws Exception if any error occurs
   */
  public void invoke(final Endpoint endpoint, final Invocation wsInvocation) throws Exception {
    try {
      // prepare for invocation
      onBeforeInvocation(wsInvocation);
      // prepare invocation data
      final ComponentView componentView = getComponentView();
      Component component = componentView.getComponent();
      // for spring integration and @FactoryType is annotated we don't need to go into ee's
      // interceptors
      if (wsInvocation.getInvocationContext().getTargetBean() != null
              && (endpoint.getProperty("SpringBus") != null)
          || wsInvocation.getInvocationContext().getProperty("forceTargetBean") != null) {
        this.reference =
            new ManagedReference() {
              public void release() {}

              public Object getInstance() {
                return wsInvocation.getInvocationContext().getTargetBean();
              }
            };
        if (component instanceof WSComponent) {
          ((WSComponent) component).setReference(reference);
        }
      }
      final Method method =
          getComponentViewMethod(wsInvocation.getJavaMethod(), componentView.getViewMethods());
      final InterceptorContext context = new InterceptorContext();
      prepareForInvocation(context, wsInvocation);
      context.setMethod(method);
      context.setParameters(wsInvocation.getArgs());
      context.putPrivateData(Component.class, component);
      context.putPrivateData(ComponentView.class, componentView);
      if (wsInvocation.getInvocationContext().getProperty("forceTargetBean") != null) {
        context.putPrivateData(ManagedReference.class, reference);
      }
      // invoke method
      final Object retObj = componentView.invoke(context);
      // set return value
      wsInvocation.setReturnValue(retObj);
    } catch (Throwable t) {
      handleInvocationException(t);
    } finally {
      onAfterInvocation(wsInvocation);
    }
  }
 private void prepareInterceptorContext(
     final SkeletonStrategy op, final Object[] params, final InterceptorContext interceptorContext)
     throws IOException, ClassNotFoundException {
   if (!home) {
     if (componentView.getComponent() instanceof StatefulSessionComponent) {
       final SessionID sessionID = (SessionID) unmarshalIdentifier();
       interceptorContext.putPrivateData(SessionID.class, sessionID);
     } else if (componentView.getComponent() instanceof EntityBeanComponent) {
       final Object pk = unmarshalIdentifier();
       interceptorContext.putPrivateData(EntityBeanComponent.PRIMARY_KEY_CONTEXT_KEY, pk);
     }
   }
   interceptorContext.setContextData(new HashMap<String, Object>());
   interceptorContext.setParameters(params);
   interceptorContext.setMethod(op.getMethod());
   interceptorContext.putPrivateData(ComponentView.class, componentView);
   interceptorContext.putPrivateData(Component.class, componentView.getComponent());
 }
 public void invokeTimeoutMethod(final Method method, final Timer timer) {
   final Interceptor interceptor = timeoutInterceptors.get(method);
   if (interceptor == null) {
     throw MESSAGES.failToCallTimeOutMethod(method);
   }
   try {
     InterceptorContext context = prepareInterceptorContext();
     context.setMethod(method);
     context.setTimer(timer);
     context.setTarget(getInstance());
     final Object[] params;
     if (method.getParameterTypes().length == 1) {
       params = new Object[1];
       params[0] = timer;
     } else {
       params = EMPTY_OBJECT_ARRAY;
     }
     context.setParameters(params);
     interceptor.processInvocation(context);
   } catch (Exception e) {
     throw new RuntimeException(e);
   }
 }