KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > aspects > versioned > VersionedObjectForwardingInterceptor


1 /*
2   * JBoss, Home of Professional Open Source
3   * Copyright 2005, JBoss Inc., and individual contributors as indicated
4   * by the @authors tag. See the copyright.txt in the distribution for a
5   * full listing of individual contributors.
6   *
7   * This is free software; you can redistribute it and/or modify it
8   * under the terms of the GNU Lesser General Public License as
9   * published by the Free Software Foundation; either version 2.1 of
10   * the License, or (at your option) any later version.
11   *
12   * This software is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * Lesser General Public License for more details.
16   *
17   * You should have received a copy of the GNU Lesser General Public
18   * License along with this software; if not, write to the Free
19   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21   */

22 package org.jboss.aspects.versioned;
23
24 import org.jboss.aop.Advised;
25 import org.jboss.aop.ClassAdvisor;
26 import org.jboss.aop.joinpoint.MethodInvocation;
27 import org.jboss.aop.proxy.ClassProxyFactory;
28 import org.jboss.aop.util.reference.MethodPersistentReference;
29
30 import java.lang.reflect.InvocationTargetException JavaDoc;
31 import java.lang.reflect.Method JavaDoc;
32 import java.util.HashMap JavaDoc;
33 /**
34  * Invoke on a target object
35  *
36  * @author <a HREF="mailto:bill@jboss.org">Bill Burke</a>
37  * @version $Revision: 44133 $
38  */

39 public class VersionedObjectForwardingInterceptor implements org.jboss.aop.advice.Interceptor
40 {
41    public VersionedObjectForwardingInterceptor()
42    {
43    }
44
45    public String JavaDoc getName() { return "VersionedObjectForwardingInterceptor"; }
46
47    public Object JavaDoc invoke(org.jboss.aop.joinpoint.Invocation invocation) throws Throwable JavaDoc
48    {
49       Object JavaDoc target = invocation.getTargetObject();
50       if (target instanceof Advised)
51       {
52          ClassAdvisor advisor = (ClassAdvisor)((Advised)target)._getAdvisor();
53          // We will have already gone through the interceptor chain so just invoke on the
54
// object.
55
return advisor.invoke(invocation);
56       }
57       else
58       {
59          if (invocation instanceof MethodInvocation)
60          {
61             // For non-advised methods, we can only do public method invocations
62
org.jboss.aop.joinpoint.MethodInvocation methodInvocation = (org.jboss.aop.joinpoint.MethodInvocation)invocation;
63             long methodHash = methodInvocation.getMethodHash();
64             HashMap JavaDoc methodMap = ClassProxyFactory.getMethodMap(target.getClass());
65             MethodPersistentReference ref = (MethodPersistentReference)methodMap.get(new Long JavaDoc(methodHash));
66             Method JavaDoc method = (Method JavaDoc)ref.get();
67             Object JavaDoc[] args = methodInvocation.getArguments();
68             try
69             {
70                return method.invoke(target, args);
71             }
72             catch (InvocationTargetException JavaDoc ex)
73             {
74                throw ex.getTargetException();
75             }
76          }
77          else
78          {
79             throw new RuntimeException JavaDoc("should only be METHOD invocations on a non-advised target object: " + invocation.getClass().getName());
80          }
81       }
82    }
83 }
84
Popular Tags