/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.plugin.internal.aop;
import static com.qcadoo.plugin.api.PluginUtils.isEnabled;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import com.qcadoo.plugin.api.RunIfEnabled;
@Aspect
public class RunIfEnabledAspect {
@Around("(execution(* *(..)) || (adviceexecution() && !args(org.aspectj.lang.ProceedingJoinPoint, ..))) && @annotation(annotation)")
public Object runMethodIfEnabledAdvice(final ProceedingJoinPoint pjp, final RunIfEnabled annotation) throws Throwable {
return runIfEnabled(pjp, null, annotation);
}
@Around("(execution(* *(..)) || (adviceexecution() && !args(org.aspectj.lang.ProceedingJoinPoint, ..))) && @within(annotation) && !@annotation(com.qcadoo.plugin.api.RunIfEnabled)")
public Object runClassMethodIfEnabledAdvice(final ProceedingJoinPoint pjp, final RunIfEnabled annotation) throws Throwable {
return runIfEnabled(pjp, null, annotation);
}
@Around("adviceexecution() && args(innerPjp, ..) && @annotation(annotation)")
public Object runAroundAdviceIfEnabledAdvice(final ProceedingJoinPoint pjp, final ProceedingJoinPoint innerPjp,
final RunIfEnabled annotation) throws Throwable {
return runIfEnabled(pjp, innerPjp, annotation);
}
@Around("adviceexecution() && args(innerPjp, ..) && @within(annotation) && !@annotation(com.qcadoo.plugin.api.RunIfEnabled)")
public Object runAspectAroundIfEnabledAdvice(final ProceedingJoinPoint pjp, final ProceedingJoinPoint innerPjp,
final RunIfEnabled annotation) throws Throwable {
return runIfEnabled(pjp, innerPjp, annotation);
}
private Object runIfEnabled(final ProceedingJoinPoint pjp, final ProceedingJoinPoint innerPjp, final RunIfEnabled annotation)
throws Throwable {
Object result = null;
if (pluginsAreEnabled(annotation.value())) {
result = pjp.proceed();
} else if (innerPjp != null) {
result = innerPjp.proceed();
}
return result;
}
private boolean pluginsAreEnabled(final String[] pluginIdentifiers) {
for (String pluginIdentifier : pluginIdentifiers) {
if (!isEnabled(pluginIdentifier)) {
return false;
}
}
return true;
}
}