blob: 67c977f456b8016b61810adfb2e3cd8794453e43 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nifi.web;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Aspect to limit access into the core.
*/
@Aspect
public class NiFiServiceFacadeLock {
private static final Logger logger = LoggerFactory.getLogger(NiFiServiceFacadeLock.class);
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
/* delegate methods through the wrapped view model */
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* create*(..))")
public Object createLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* clear*(..))")
public Object clearLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* delete*(..))")
public Object deleteLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* remove*(..))")
public Object removeLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* update*(..))")
public Object updateLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* set*(..))")
public Object setLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* copy*(..))")
public Object copyLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* import*(..))")
public Object importLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* export*(..))")
public Object exportLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* submit*(..))")
public Object submitLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* schedule*(..))")
public Object scheduleLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* activate*(..))")
public Object activateLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* populate*(..))")
public Object populateLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithWriteLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* get*(..))")
public Object getLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* is*(..))")
public Object isLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* search*(..))")
public Object searchLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* verify*(..))")
public Object verifyLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* register*(..))")
public Object registerLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
@Around("within(org.apache.nifi.web.NiFiServiceFacade+) && "
+ "execution(* resolve*(..))")
public Object resolveLock(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
return proceedWithReadLock(proceedingJoinPoint);
}
private Object proceedWithReadLock(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
final long beforeLock = System.nanoTime();
long afterLock = 0L;
readLock.lock();
try {
afterLock = System.nanoTime();
return proceedingJoinPoint.proceed();
} finally {
readLock.unlock();
final long afterProcedure = System.nanoTime();
final String procedure = proceedingJoinPoint.getSignature().toLongString();
logger.debug("In order to perform procedure {}, it took {} nanos to obtain the Read Lock {} and {} nanos to invoke the method",
procedure, afterLock - beforeLock, readLock, afterProcedure - afterLock);
}
}
private Object proceedWithWriteLock(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
final long beforeLock = System.nanoTime();
long afterLock = 0L;
writeLock.lock();
try {
afterLock = System.nanoTime();
return proceedingJoinPoint.proceed();
} finally {
writeLock.unlock();
final long afterProcedure = System.nanoTime();
final String procedure = proceedingJoinPoint.getSignature().toLongString();
logger.debug("In order to perform procedure {}, it took {} nanos to obtain the Write Lock {} and {} nanos to invoke the method",
procedure, afterLock - beforeLock, writeLock, afterProcedure - afterLock);
}
}
}