Author: tchemit Date: 2011-07-04 22:54:39 +0200 (Mon, 04 Jul 2011) New Revision: 82 Url: http://nuiton.org/repositories/revision/nuiton-web/82 Log: add new interceptor which deals with opening and closing Topia transaction Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/interceptor/TopiaTransactionInterceptor.java Modified: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/TopiaTransactionAware.java Modified: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/TopiaTransactionAware.java =================================================================== --- trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/TopiaTransactionAware.java 2011-07-04 14:47:25 UTC (rev 81) +++ trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/TopiaTransactionAware.java 2011-07-04 20:54:39 UTC (rev 82) @@ -45,4 +45,6 @@ * @return the current transaction (can be null or closed...). */ TopiaContext getTransaction(); + + void setTransaction(TopiaContext transaction); } Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/interceptor/TopiaTransactionInterceptor.java =================================================================== --- trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/interceptor/TopiaTransactionInterceptor.java (rev 0) +++ trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/interceptor/TopiaTransactionInterceptor.java 2011-07-04 20:54:39 UTC (rev 82) @@ -0,0 +1,130 @@ +package org.nuiton.web.struts2.interceptor; + +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.interceptor.AbstractInterceptor; +import com.opensymphony.xwork2.util.TextParseUtil; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.web.struts2.TopiaTransactionAware; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * To deal with topia transaction . + * + * @author tchemit <chemit@codelutin.com> + * @since 1.2 + */ +public abstract class TopiaTransactionInterceptor extends AbstractInterceptor { + + private static final long serialVersionUID = 1L; + + public static final String[] DEFAULT_EXCLUDE_METHODS = { + "beginTransaction", + "closeContext", + "clear" + }; + + protected Set<String> excludeMethods; + + public Set<String> getExcludeMethods() { + return excludeMethods; + } + + public void setExcludeMethods(String excludeMethods) { + this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods); + } + + protected abstract TopiaContext beginTransaction() throws TopiaException; + + @Override + public void init() { + super.init(); + + if (getExcludeMethods() == null) { + + // use default exclude methods + excludeMethods = new HashSet<String>( + Arrays.asList(DEFAULT_EXCLUDE_METHODS) + ); + } + } + + @Override + public String intercept(ActionInvocation invocation) throws Exception { + + TopiaTransactionAware transactionAware = null; + + Object action = invocation.getProxy().getAction(); + + if (action instanceof TopiaTransactionAware) { + transactionAware = (TopiaTransactionAware) action; + } + + TopiaContext transaction = null; + if (transactionAware != null) { + + // action need a transaction + transaction = beginTransaction(); + + // creates a proxy + TopiaContext proxy = (TopiaContext) Proxy.newProxyInstance( + getClass().getClassLoader(), + new Class<?>[]{TopiaContext.class}, + new TopiaTransaction() + ); + + // set the transaction in the action + transactionAware.setTransaction(proxy); + } + try { + return invocation.invoke(); + } finally { + + if (transactionAware != null) { + + // we are on a action with a internal topia transaction + + if (transaction != null && !transaction.isClosed()) { + + // close the opened transaction + transaction.closeContext(); + } + } + } + } + + /** + * Un proxy pour interdire d'utiliser les méthodes définies dans + * {@link #excludeMethods}. + */ + class TopiaTransaction implements InvocationHandler { + + @Override + public Object invoke(Object proxy, + Method method, + Object[] args) throws Throwable { + + String methodName = method.getName(); + + if (getExcludeMethods().contains(methodName)) { + + // not authorized + throw new IllegalAccessException( + "Not allowed to access method " + methodName + " on " + + proxy); + } + + // any other methods are fine + Object result = method.invoke(args); + + return result; + } + } + +} \ No newline at end of file Property changes on: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/interceptor/TopiaTransactionInterceptor.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native
participants (1)
-
tchemit@users.nuiton.org