import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;


@Clientside
public aspect ServiceCall
{
    
    public pointcut ServicePoint()
        : call( * (@BussFacade *).*(..) )
          && !@within(Clientside)
          && !@annotation(Clientside)
          && ( !@within(ServiceImplementation)
             || @withincode(Clientside)
             )
          ;
   
    declare @type 
        : hasmethod(* (@BussFacade *).*(..)) : @ServiceImplementation
        ;
        
    public @interface ServiceImplementation {  }
        
        
    private pointcut call_Service(Object businessFacade)
        : ServicePoint()
          && target(businessFacade);
        
    
    protected Object findImpl(Object bussFacade, JoinPoint.StaticPart location) 
    {
        Class dienstID;
        if ( null!=bussFacade )
            dienstID = bussFacade.getClass();
        else {
            Signature sig = location.getSignature();
            dienstID = sig.getDeclaringType();
        }
        Object impl = new MyServiceImpl();  // call ServiceLocator here
        return impl;
    }


    
    Object around(Object bussFacade)
        : call_Service(bussFacade) 
     {
        try {
                Object umgelenkt = findImpl(bussFacade, thisJoinPointStaticPart);
                Object res = proceed(umgelenkt);
                return res;
            }
            catch(Throwable T) {
                System.out.println("oh my");
                throw new RuntimeException(T);
            }
     }    
    
}