Spring – 31 – Aspect Oriented Programming (AOP) – 05 – AspectJ with XML – Authenticate

Merhaba Arkadaslar
Onceki bolumde AspectJ ornegi uygulamistik. Bu bolumde de AspectJ ile AOP yaklasimini bir baska ornek uzerinde uygulayarak daha iyi anlamaya calisalim.

Model

UserData.java

package _36.aspectj.model;

public class UserData {

	private String userName;
	private String password;
	private boolean locked;
	private int tryCount;

	// more
	//getters and setters

	
}

Exception

ExceptionMessages.java

package _36.aspectj.exception;

public interface ExceptionMessages {

	public static final String INVALID_USER_DATA = "Invalid user data.";
	public static final String USER_LOCKED = "The user is locked.";
	public static final String USER_NOT_PERMITTED = "User not permitted.";

}

UserDataException.java

package _36.aspectj.exception;

public class UserDataException extends Exception {

	private static final long serialVersionUID = 1L;

	private String errorMessage;

	public UserDataException(String errorMessage) {
		super();
		this.errorMessage = errorMessage;
	}

	public String getErrorMessage() {
		return errorMessage;
	}

	public void setErrorMessage(String errorMessage) {
		this.errorMessage = errorMessage;
	}
}

Service & Aspect

TransactionEngineService.java
TransactionEngine#processTransaction metodunda business logic’imiz olsun.

package _36.aspectj.service;

import _36.aspectj.model.UserData;

public class TransactionEngineService {

	public void processTransaction(UserData userData) {

		// business logic	
		System.out.println("processTransaction is invoked...");
		//
		//

		throw new RuntimeException();

	}
}

UserAuthenticator.java
UserAuthenticator#authenticateUser metodunda , cesitli kontroller olsun ;

package _36.aspectj.service;

import _36.aspectj.exception.ExceptionMessages;
import _36.aspectj.exception.UserDataException;
import _36.aspectj.model.UserData;

public class UserAuthenticator {

	public void authenticateUser(UserData userData) throws UserDataException {

		if (userData == null) {
			throw new UserDataException(ExceptionMessages.INVALID_USER_DATA);
		}

		if (userData.isLocked()) {
			throw new UserDataException(ExceptionMessages.USER_LOCKED);
		}

		if (userData.getTryCount() > 5) {
			userData.setLocked(true);
		}

		///
		boolean hasPermission = checkPermission(1000);

		if (!hasPermission) {
			throw new UserDataException(ExceptionMessages.USER_NOT_PERMITTED);
		}

		//
		// more logic about authetication

	}

	public boolean checkPermission(int permissionId) {
		///
		// check permission
		//
		return true;

	}
}

UserAuthenticatorAspect.java

package _36.aspectj.service;

import _36.aspectj.exception.UserDataException;
import _36.aspectj.model.UserData;

public class UserAuthenticatorAspect {

	public void authenticateBefore(UserData userData) {

		System.out.println("UserAuthenticatorAspect#authenticateBefore is invoked...");

		UserAuthenticator authenticator = new UserAuthenticator();
		try {
			authenticator.authenticateUser(userData);
		} catch (UserDataException e) {
			System.out.println("Exception caught!");
			System.out.println(e.getErrorMessage());

		}
	}
}

LoggingServiceAspect.java

package _36.aspectj.service;

public class LoggingServiceAspect {

	public void logger(Exception exception) {
		System.out.println("LoggingServiceAspect#logger is invoked...");
		System.out.println(exception);
	}

}

36.aspectj.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop.xsd ">

	
	<bean id="transactionEngineService" class="_36.aspectj.service.TransactionEngineService" />
	<bean id="userAuthenticatorAspectId" class="_36.aspectj.service.UserAuthenticatorAspect" />	
	<bean id="loggingServiceAspectId" class="_36.aspectj.service.LoggingServiceAspect" />
	
	<aop:config>
		<aop:aspect id="authenticatorAspect" ref="userAuthenticatorAspectId">

			<!-- Before -->
			<aop:pointcut id="pointCutBeforeId" expression="execution(* *.processTransaction(..)) and args(userData)" />
			<aop:before method="authenticateBefore" pointcut-ref="pointCutBeforeId" />

		</aop:aspect>
		
		<aop:aspect id="logAspect" ref="loggingServiceAspectId">	
					
			<!-- AfterThrowing -->
			<aop:pointcut id="pointCutAfterThrowingId"  expression="execution(* *.processTransaction(..))" />
			<aop:after-throwing method="logger" throwing="exception" pointcut-ref="pointCutAfterThrowingId"  />
		
		</aop:aspect>
		
	</aop:config>

</beans>

Run Application

AspectJTest.java
processTransaction metoduna UserData modelimizi veriyoruz. Bu metot calismadan once UserAuthenticatorAspect#authenticateBefore metodu calisacaktir.

package _36.aspectj.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import _36.aspectj.model.UserData;
import _36.aspectj.service.TransactionEngineService;

public class AspectJTest {

	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("36.aspectj.xml");

		TransactionEngineService transactionEngineService = context.getBean("transactionEngineService",
				TransactionEngineService.class);

		UserData userData = new UserData();

		try {
			transactionEngineService.processTransaction(userData);
		} catch (Exception e) {
			System.out.println("AspectJTest#main");
		}

		context.close();
	}
}

Ornegimizi calistirdigimizda before aspect type kullandigimiz icin processTransaction oncesinde UserAuthenticatorAspect#authenticateBefore metodu calisacaktir.
sonrasinda processTransaction calismasina devam edecektir , processTransaction metodunda bir RuntimeException firlatiyoruz ,After Throwing aspect yaklasimini kullandigimiz icin LoggingServiceAspect#logger metodu calisacaktir.

UserAuthenticatorAspect#authenticateBefore is invoked...
processTransaction is invoked...
LoggingServiceAspect#logger is invoked...
java.lang.RuntimeException
AspectJTest#main

Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *