/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.core.server; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import com.google.inject.Inject; import com.google.inject.Injector; // TODO: Auto-generated Javadoc /* * See: * http://tembrel.blogspot.com/2007/09/matcher-and-methodinterceptor-for-dwr.html * */ /** * The Class OutermostCallInterceptor. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ public final class OutermostCallInterceptor implements MethodInterceptor { /** * Decorates a MethodInterceptor so that only the outermost invocation using * that interceptor will be intercepted and nested invocations willbe ignored. * * @param interceptor * the interceptor * @return the method interceptor */ public static MethodInterceptor outermostCall(final MethodInterceptor interceptor) { return new OutermostCallInterceptor(interceptor); } /** The count. */ @SuppressWarnings("rawtypes") private final ThreadLocal count = new ThreadLocal() { @Override protected Integer initialValue() { return 0; } }; /** The interceptor. */ private final MethodInterceptor interceptor; /** * Instantiates a new outermost call interceptor. * * @param interceptor * the interceptor */ private OutermostCallInterceptor(final MethodInterceptor interceptor) { this.interceptor = interceptor; } /** * Ensure underlying interceptor is injected. * * @param injector * the injector */ @Inject void injectInterceptor(final Injector injector) { injector.injectMembers(interceptor); } /* * (non-Javadoc) * * @see * org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept * .MethodInvocation) */ @Override @SuppressWarnings("unchecked") public Object invoke(final MethodInvocation invocation) throws Throwable { final int savedCount = (Integer) count.get(); count.set(savedCount + 1); try { if ((Integer) count.get() > 1) { return invocation.proceed(); } else { return interceptor.invoke(invocation); } } finally { count.set(savedCount); } } }