X Tutup
Skip to content

Commit e03bd81

Browse files
committed
Fixes "Intercepting Filter example needs some improvement" iluwatar#43
1 parent 717cb53 commit e03bd81

File tree

12 files changed

+254
-87
lines changed

12 files changed

+254
-87
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.iluwatar;
2+
3+
/**
4+
* Base class for order processing filters.
5+
* Handles chain management.
6+
*
7+
*/
8+
public abstract class AbstractFilter implements Filter {
9+
10+
private Filter next;
11+
12+
public AbstractFilter() {
13+
}
14+
15+
public AbstractFilter(Filter next) {
16+
this.next = next;
17+
}
18+
19+
@Override
20+
public void setNext(Filter filter) {
21+
this.next = filter;
22+
}
23+
24+
@Override
25+
public Filter getNext() {
26+
return next;
27+
}
28+
29+
@Override
30+
public Filter getLast() {
31+
Filter last = this;
32+
while (last.getNext() != null) {
33+
last = last.getNext();
34+
}
35+
return last;
36+
}
37+
38+
@Override
39+
public String execute(Order order) {
40+
if (getNext() != null) {
41+
return getNext().execute(order);
42+
} else {
43+
return "";
44+
}
45+
}
46+
}

intercepting-filter/src/main/java/com/iluwatar/AddressFilter.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
/**
44
* Concrete implementation of filter
5-
* This filter is responsible for checking/filtering the input in the address field, returns null if field is empty
5+
* This filter is responsible for checking/filtering the input in the address field.
66
* @author joshzambales
77
*
88
*/
9-
public class AddressFilter implements Filter {
10-
public String execute(String[] request) {
11-
if (request[2].equals("")) {
12-
return null;
9+
public class AddressFilter extends AbstractFilter {
10+
11+
@Override
12+
public String execute(Order order) {
13+
String result = super.execute(order);
14+
if (order.getAddress() == null || order.getAddress().isEmpty()) {
15+
return result + "Invalid address! ";
1316
} else
14-
return request[2];
17+
return result;
1518
}
16-
}
19+
}

intercepting-filter/src/main/java/com/iluwatar/App.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
*
99
*/
1010
public class App{
11+
1112
public static void main(String[] args) {
1213
FilterManager filterManager = new FilterManager(new Target());
13-
filterManager.setFilter(new NameFilter());
14-
filterManager.setFilter(new ContactFilter());
15-
filterManager.setFilter(new AddressFilter());
16-
filterManager.setFilter(new DepositFilter());
17-
filterManager.setFilter(new OrderFilter());
14+
filterManager.addFilter(new NameFilter());
15+
filterManager.addFilter(new ContactFilter());
16+
filterManager.addFilter(new AddressFilter());
17+
filterManager.addFilter(new DepositFilter());
18+
filterManager.addFilter(new OrderFilter());
1819

1920
Client client = new Client();
2021
client.setFilterManager(filterManager);

intercepting-filter/src/main/java/com/iluwatar/Client.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,10 @@ public void actionPerformed(ActionEvent e) {
8585
processButton.addActionListener(new ActionListener() {
8686
@Override
8787
public void actionPerformed(ActionEvent e) {
88-
String request = String.format("%s&%s&%s&%s&%s",
89-
jtFields[0].getText(), jtFields[1].getText(),
90-
jtAreas[0].getText(), jtFields[2].getText(),
91-
jtAreas[1].getText());
92-
93-
jl.setText(sendRequest(request));
88+
Order order = new Order(jtFields[0].getText(), jtFields[1]
89+
.getText(), jtAreas[0].getText(),
90+
jtFields[2].getText(), jtAreas[1].getText());
91+
jl.setText(sendRequest(order));
9492
}
9593
});
9694

@@ -103,7 +101,7 @@ public void setFilterManager(FilterManager filterManager) {
103101
this.filterManager = filterManager;
104102
}
105103

106-
public String sendRequest(String request) {
107-
return filterManager.filterRequest(request);
104+
public String sendRequest(Order order) {
105+
return filterManager.filterRequest(order);
108106
}
109107
}

intercepting-filter/src/main/java/com/iluwatar/ContactFilter.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22

33
/**
44
* Concrete implementation of filter
5-
* This filter checks for the contact field in which it checks if the input consist of numbers and it also checks if the input follows the length constraint (11 digits)
5+
* This filter checks for the contact field in which it checks if the input consist of numbers
6+
* and it also checks if the input follows the length constraint (11 digits)
67
* @author joshzambales
78
*
89
*/
9-
public class ContactFilter implements Filter {
10-
public String execute(String[] request) {
11-
if (request[1].equals("") || request[1].matches(".*[^\\d]+.*")
12-
|| request[1].length() != 11) {
13-
return null;
14-
} else
15-
return request[1];
10+
public class ContactFilter extends AbstractFilter {
11+
12+
@Override
13+
public String execute(Order order) {
14+
String result = super.execute(order);
15+
if (order.getContactNumber() == null
16+
|| order.getContactNumber().isEmpty()
17+
|| order.getContactNumber().matches(".*[^\\d]+.*")
18+
|| order.getContactNumber().length() != 11) {
19+
return result + "Invalid contact number! ";
20+
} else {
21+
return result;
22+
}
1623
}
1724
}

intercepting-filter/src/main/java/com/iluwatar/DepositFilter.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22

33
/**
44
* Concrete implementation of filter
5-
*
6-
* This checks for the deposit code, returns null when deposit field is empty
5+
* This checks for the deposit code
76
* @author joshzambales
87
*
98
*/
10-
public class DepositFilter implements Filter {
11-
public String execute(String[] request) {
12-
if (request[3].equals("")) {
13-
return null;
14-
} else
15-
return request[3];
9+
public class DepositFilter extends AbstractFilter {
10+
11+
@Override
12+
public String execute(Order order) {
13+
String result = super.execute(order);
14+
if (order.getDepositNumber() == null || order.getDepositNumber().isEmpty()) {
15+
return result + "Invalid deposit number! ";
16+
} else {
17+
return result;
18+
}
1619
}
1720
}
Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,37 @@
11
package com.iluwatar;
22

33
/**
4-
* Filter interface
5-
* Filters perform certain tasks prior or after execution of request by request handler.
6-
* In this case, before the request is handled by the target, the request undergoes through each Filter
4+
* Filter interface Filters perform certain tasks prior or after execution of
5+
* request by request handler. In this case, before the request is handled by
6+
* the target, the request undergoes through each Filter
7+
*
78
* @author joshzambales
89
*
910
*/
1011
public interface Filter {
11-
public String execute(String[] request);
12+
13+
/**
14+
* Execute order processing filter.
15+
* @param order
16+
* @return empty string on success, otherwise error message.
17+
*/
18+
String execute(Order order);
19+
20+
/**
21+
* Set next filter in chain after this.
22+
* @param filter
23+
*/
24+
void setNext(Filter filter);
25+
26+
/**
27+
* Get next filter in chain after this.
28+
* @return
29+
*/
30+
Filter getNext();
31+
32+
/**
33+
* Get last filter in the chain.
34+
* @return
35+
*/
36+
Filter getLast();
1237
}
Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,63 @@
11
package com.iluwatar;
22

3-
import java.util.*;
4-
3+
54
/**
65
* Filter Chain carries multiple filters and help to execute them in defined order on target.
76
*
87
* @author joshzambales
98
*/
109
public class FilterChain {
11-
private ArrayList<Filter> filters = new ArrayList<Filter>();
10+
11+
private Filter chain;
12+
1213
private final Target target;
1314

1415
public FilterChain(Target target) {
1516
this.target = target;
1617
}
1718

1819
public void addFilter(Filter filter) {
19-
filters.add(filter);
20+
if (chain == null) {
21+
chain = filter;
22+
} else {
23+
chain.getLast().setNext(filter);
24+
}
2025
}
2126

22-
public String execute(String request) {
23-
String tempout[] = new String[filters.size()];
27+
public String execute(Order order) {
2428

25-
String tempin[] = request.split("&");
26-
int i = 0;
27-
try {
28-
for (Filter filter : filters) {
29-
tempout[i] = null;
30-
tempout[i++] = filter.execute(tempin);
31-
}
32-
} catch (Exception e) {
33-
return "NOT ENOUGHT INPUT";
34-
}
35-
36-
if (tempout[4] == null) {
37-
return "INVALID ORDER!";
38-
} else if (tempout[3] == null) {
39-
return "INVALID DEPOSIT NUMBER!";
40-
} else if (tempout[2] == null) {
41-
return "INVALID ADRDESS!";
42-
} else if (tempout[1] == null) {
43-
return "INVALID Contact Number!";
44-
} else if (tempout[0] == null) {
45-
return "INVALID Name!";
29+
if (chain != null) {
30+
return chain.execute(order);
4631
} else {
47-
target.execute(tempout);
4832
return "RUNNING...";
4933
}
34+
35+
// String tempout[] = new String[filters.size()];
36+
//
37+
// String tempin[] = request.split("&");
38+
// int i = 0;
39+
// try {
40+
// for (Filter filter : filters) {
41+
// tempout[i] = null;
42+
// tempout[i++] = filter.execute(tempin);
43+
// }
44+
// } catch (Exception e) {
45+
// return "NOT ENOUGHT INPUT";
46+
// }
47+
//
48+
// if (tempout[4] == null) {
49+
// return "INVALID ORDER!";
50+
// } else if (tempout[3] == null) {
51+
// return "INVALID DEPOSIT NUMBER!";
52+
// } else if (tempout[2] == null) {
53+
// return "INVALID ADRDESS!";
54+
// } else if (tempout[1] == null) {
55+
// return "INVALID Contact Number!";
56+
// } else if (tempout[0] == null) {
57+
// return "INVALID Name!";
58+
// } else {
59+
// target.execute(tempout);
60+
// return "RUNNING...";
61+
// }
5062
}
51-
5263
}

intercepting-filter/src/main/java/com/iluwatar/FilterManager.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
*
88
*/
99
public class FilterManager {
10+
1011
private FilterChain filterChain;
1112

1213
public FilterManager(Target target) {
1314
filterChain = new FilterChain(target);
1415
}
1516

16-
public void setFilter(Filter filter) {
17+
public void addFilter(Filter filter) {
1718
filterChain.addFilter(filter);
1819
}
1920

20-
public String filterRequest(String request) {
21-
return filterChain.execute(request);
21+
public String filterRequest(Order order) {
22+
return filterChain.execute(order);
2223
}
2324
}

intercepting-filter/src/main/java/com/iluwatar/NameFilter.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
* @author joshzambales
88
*
99
*/
10-
public class NameFilter implements Filter {
11-
public String execute(String[] request) {
12-
if (request[0].equals("") || request[0].matches(".*[^\\w|\\s]+.*")) {
13-
return null;
14-
} else
15-
return request[0];
10+
public class NameFilter extends AbstractFilter {
11+
12+
@Override
13+
public String execute(Order order) {
14+
String result = super.execute(order);
15+
if (order.getName() == null || order.getName().isEmpty() || order.getName().matches(".*[^\\w|\\s]+.*")) {
16+
return result + "Invalid order! ";
17+
} else {
18+
return result;
19+
}
1620
}
1721
}

0 commit comments

Comments
 (0)
X Tutup