KickJava   Java API By Example, From Geeks To Geeks.

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


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.joinpoint.FieldReadInvocation;
25 import org.jboss.aop.joinpoint.FieldWriteInvocation;
26 import org.jboss.aop.joinpoint.MethodInvocation;
27 import org.jboss.logging.Logger;
28
29 import javax.transaction.Transaction JavaDoc;
30 import javax.transaction.TransactionManager JavaDoc;
31
32 /**
33  * This interceptor handles chooses an object to invoke
34  * on based on the transaction
35  *
36  * @author <a HREF="mailto:bill@jboss.org">Bill Burke</a>
37  * @version $Revision: 37406 $
38  */

39 public class VersionedObjectInterceptor implements org.jboss.aop.advice.Interceptor
40 {
41    /**
42     * Logging instance
43     */

44    protected Logger log = Logger.getLogger(this.getClass());
45
46    private TransactionManager JavaDoc tm;
47    public VersionedObjectInterceptor(TransactionManager JavaDoc tm)
48    {
49       this.tm = tm;
50    }
51
52    public String JavaDoc getName() { return "VersionedObjectInterceptor"; }
53
54    /**
55     *
56     */

57    public Object JavaDoc invoke(org.jboss.aop.joinpoint.Invocation invocation) throws Throwable JavaDoc
58    {
59       Transaction JavaDoc tx = tm.getTransaction();
60       VersionedObject manager = (VersionedObject)invocation.getMetaData(Versioned.VERSIONED, Versioned.VERSIONED_OBJECT);
61
62       Object JavaDoc version = manager.getVersion(tx);
63       if (version != null)
64       {
65          invocation.setTargetObject(version);
66          return invocation.invokeNext();
67       }
68
69       boolean isReadonly = false;
70       if (invocation instanceof MethodInvocation)
71       {
72          String JavaDoc readonly = (String JavaDoc)invocation.getMetaData(Versioned.VERSIONED, Versioned.READONLY);
73          if (readonly != null)
74          {
75             isReadonly = Boolean.getBoolean(readonly.toLowerCase());
76          }
77       }
78       else if (invocation instanceof FieldReadInvocation)
79       {
80          isReadonly = true;
81       }
82       else if (invocation instanceof FieldWriteInvocation)
83       {
84          isReadonly = false;
85       }
86       if (isReadonly) return invocation.invokeNext();
87
88       // Ok, we're in a tx, we're not readonly, there is no previous version, so create another
89

90       version = manager.createVersion(tx);
91       invocation.setTargetObject(version);
92       return invocation.invokeNext();
93    }
94
95 }
96
Popular Tags