View Javadoc
1   package net.sf.aspect4log.manual;
2   
3   import java.math.BigDecimal;
4   import java.util.List;
5   import java.util.concurrent.atomic.AtomicInteger;
6   
7   import org.foo.service.FooService;
8   import org.slf4j.Logger;
9   
10  import net.sf.aspect4log.Log;
11  import net.sf.aspect4log.Log.Exceptions;
12  import net.sf.aspect4log.Log.Level;
13  import net.sf.aspect4log.slf4j.LoggerFactory;
14  
15  @Log
16  public class OrderService {
17  
18  	private final Logger logger = LoggerFactory.getLogger(FooService.class);
19  
20  	AtomicInteger nextOrderId = new AtomicInteger(0);
21  
22  	@Log(enterLevel = Level.INFO, exitLevel = Level.INFO,
23  			argumentsTemplate = "${args[0].id}", resultTemplate = "${result.id}",
24  			mdcKey = "customerId", mdcTemplate = "${args[0].id}")
25  	public Order createOrder(Customer customer, String address, Item... items) throws BusinessException, SecurityException {
26  		validateCustomer(customer);
27  		validateAddress(address);
28  		for (Item item : items) {
29  			validateItem(item);
30  		}
31  		return storeOrder(new Order(customer, address, items));
32  	}
33  
34  	@Log(enterLevel = Level.INFO, exitLevel = Level.INFO,
35  			argumentsTemplate = "customerId=${args[0].id}, order=${args[1].id}",
36  			mdcKey = "customerId", mdcTemplate = "${args[0].id}",
37  			on = {
38  					@Exceptions(exceptions = { RuntimeException.class }, stackTrace = true),
39  					@Exceptions(exceptions = { PaymentException.class, SecurityException.class }, level = Level.WARN, stackTrace = false)
40  			})
41  	public void pay(Customer customer, Order order, String cardNumber) throws SecurityException, PaymentException {
42  		validateCustomer(customer);
43  		withdrawFunds(cardNumber, order.getPrice());
44  	}
45  
46  	@Log(argumentsTemplate = "${args[1]}")
47  	private void withdrawFunds(String cardNumber, BigDecimal price) throws PaymentException {
48  		// we don't want to show a card number in a log
49  	}
50  
51  	@Log(resultTemplate = "${result.id}")
52  	private Order storeOrder(Order order) {
53  		// we want to print only the order id in the result log
54  		order.setId(nextOrderId.getAndIncrement());
55  		saveToDb(order);
56  		return order;
57  	}
58  
59  	private void saveToDb(Order order) {
60  		// TODO Auto-generated method stub
61  
62  	}
63  
64  	private void validateItem(Item item) throws BusinessException {
65  		if (getItemCount(item.getName()) > 0) {
66  			throw new BusinessException("store has no more items of type" + item.getName());
67  		}
68  	}
69  
70  	private int getItemCount(String name) {
71  		// lets pretend there was an actual db request here
72  		return name.length() - 5;
73  	}
74  
75  	private void validateAddress(String address) throws BusinessException {
76  		if (address.isEmpty()) {
77  			throw new BusinessException("address is empty");
78  		}
79  	}
80  
81  	private void validateCustomer(Customer customer) throws SecurityException {
82  		if (customer.getId() < 0) {
83  			throw new SecurityException("Customer with negative id are prohibited to place orders");
84  		}
85  	}
86  
87  	@Log(enterLevel = Level.NONE, exitLevel = Level.NONE, on = @Exceptions(level = Level.NONE), indent = false)
88  	public List<Item> recursiveItemSearch(Item itemExample) {
89  		// ..some comparison and search code goes here
90  		return recursiveItemSearch(itemExample);
91  	}
92  
93  	public void canelOrder(Customer customer, Order order) throws SecurityException, OrderAlreadySentException, PaymentException {
94  		try {
95  			if (logger.isDebugEnabled()) {
96  				logger.debug("↓refund(" + customer + "," + order + ")");
97  			}
98  			try {
99  				validateCustomer(customer);
100 				checkIfNotSent(order);
101 				refund(customer, order);
102 			} catch (SecurityException e){
103 				if (logger.isWarnEnabled()) {
104 					logger.warn("↑refund(" + customer + "," + order + ")" + " => " + e);
105 				}
106 				throw e;
107 			} catch (OrderAlreadySentException e){
108 				if (logger.isWarnEnabled()) {
109 					logger.warn("↑refund(" + customer + "," + order + ")" + " => " + e);
110 				}
111 				throw e;
112 			} catch( PaymentException e) {
113 				if (logger.isWarnEnabled()) {
114 					logger.warn("↑refund(" + customer + "," + order + ")" + " => " + e);
115 				}
116 				throw e;
117 			}
118 			if (logger.isDebugEnabled()) {
119 				logger.debug("↑refund(" + customer + "," + order + ")");
120 			}
121 		} catch (RuntimeException e) {
122 			if (logger.isErrorEnabled()) {
123 				logger.error("↑refund(" + customer + "," + order + ")" + " => " + e);
124 			}
125 			throw e;
126 		}
127 	}
128 
129 	@Log
130 	public void canel0der(Customer customer, Order order) throws SecurityException, OrderAlreadySentException, PaymentException {
131 		validateCustomer(customer);
132 		checkIfNotSent(order);
133 		refund(customer, order);
134 	}
135 
136 	private void checkIfNotSent(Order order) throws OrderAlreadySentException {
137 		// .. here goes implementation code
138 	}
139 
140 	private void refund(Customer customer, Order order) throws PaymentException {
141 		// .. here goes implementation code
142 	}
143 }