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
49 }
50
51 @Log(resultTemplate = "${result.id}")
52 private Order storeOrder(Order order) {
53
54 order.setId(nextOrderId.getAndIncrement());
55 saveToDb(order);
56 return order;
57 }
58
59 private void saveToDb(Order order) {
60
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
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
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
138 }
139
140 private void refund(Customer customer, Order order) throws PaymentException {
141
142 }
143 }