Fixes "Intercepting Filter example needs some improvement" #43
This commit is contained in:
parent
717cb53f2b
commit
e03bd818ec
@ -0,0 +1,46 @@
|
||||
package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Base class for order processing filters.
|
||||
* Handles chain management.
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractFilter implements Filter {
|
||||
|
||||
private Filter next;
|
||||
|
||||
public AbstractFilter() {
|
||||
}
|
||||
|
||||
public AbstractFilter(Filter next) {
|
||||
this.next = next;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNext(Filter filter) {
|
||||
this.next = filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter getNext() {
|
||||
return next;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter getLast() {
|
||||
Filter last = this;
|
||||
while (last.getNext() != null) {
|
||||
last = last.getNext();
|
||||
}
|
||||
return last;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
if (getNext() != null) {
|
||||
return getNext().execute(order);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
@ -2,15 +2,18 @@ package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Concrete implementation of filter
|
||||
* This filter is responsible for checking/filtering the input in the address field, returns null if field is empty
|
||||
* This filter is responsible for checking/filtering the input in the address field.
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public class AddressFilter implements Filter {
|
||||
public String execute(String[] request) {
|
||||
if (request[2].equals("")) {
|
||||
return null;
|
||||
public class AddressFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getAddress() == null || order.getAddress().isEmpty()) {
|
||||
return result + "Invalid address! ";
|
||||
} else
|
||||
return request[2];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,13 +8,14 @@ package com.iluwatar;
|
||||
*
|
||||
*/
|
||||
public class App{
|
||||
|
||||
public static void main(String[] args) {
|
||||
FilterManager filterManager = new FilterManager(new Target());
|
||||
filterManager.setFilter(new NameFilter());
|
||||
filterManager.setFilter(new ContactFilter());
|
||||
filterManager.setFilter(new AddressFilter());
|
||||
filterManager.setFilter(new DepositFilter());
|
||||
filterManager.setFilter(new OrderFilter());
|
||||
filterManager.addFilter(new NameFilter());
|
||||
filterManager.addFilter(new ContactFilter());
|
||||
filterManager.addFilter(new AddressFilter());
|
||||
filterManager.addFilter(new DepositFilter());
|
||||
filterManager.addFilter(new OrderFilter());
|
||||
|
||||
Client client = new Client();
|
||||
client.setFilterManager(filterManager);
|
||||
|
@ -85,12 +85,10 @@ public class Client extends JFrame {
|
||||
processButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String request = String.format("%s&%s&%s&%s&%s",
|
||||
jtFields[0].getText(), jtFields[1].getText(),
|
||||
jtAreas[0].getText(), jtFields[2].getText(),
|
||||
jtAreas[1].getText());
|
||||
|
||||
jl.setText(sendRequest(request));
|
||||
Order order = new Order(jtFields[0].getText(), jtFields[1]
|
||||
.getText(), jtAreas[0].getText(),
|
||||
jtFields[2].getText(), jtAreas[1].getText());
|
||||
jl.setText(sendRequest(order));
|
||||
}
|
||||
});
|
||||
|
||||
@ -103,7 +101,7 @@ public class Client extends JFrame {
|
||||
this.filterManager = filterManager;
|
||||
}
|
||||
|
||||
public String sendRequest(String request) {
|
||||
return filterManager.filterRequest(request);
|
||||
public String sendRequest(Order order) {
|
||||
return filterManager.filterRequest(order);
|
||||
}
|
||||
}
|
||||
|
@ -2,16 +2,23 @@ package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Concrete implementation of filter
|
||||
* 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)
|
||||
* 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)
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public class ContactFilter implements Filter {
|
||||
public String execute(String[] request) {
|
||||
if (request[1].equals("") || request[1].matches(".*[^\\d]+.*")
|
||||
|| request[1].length() != 11) {
|
||||
return null;
|
||||
} else
|
||||
return request[1];
|
||||
public class ContactFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getContactNumber() == null
|
||||
|| order.getContactNumber().isEmpty()
|
||||
|| order.getContactNumber().matches(".*[^\\d]+.*")
|
||||
|| order.getContactNumber().length() != 11) {
|
||||
return result + "Invalid contact number! ";
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,16 +2,19 @@ package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Concrete implementation of filter
|
||||
*
|
||||
* This checks for the deposit code, returns null when deposit field is empty
|
||||
* This checks for the deposit code
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public class DepositFilter implements Filter {
|
||||
public String execute(String[] request) {
|
||||
if (request[3].equals("")) {
|
||||
return null;
|
||||
} else
|
||||
return request[3];
|
||||
public class DepositFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getDepositNumber() == null || order.getDepositNumber().isEmpty()) {
|
||||
return result + "Invalid deposit number! ";
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,37 @@
|
||||
package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Filter interface
|
||||
* Filters perform certain tasks prior or after execution of request by request handler.
|
||||
* In this case, before the request is handled by the target, the request undergoes through each Filter
|
||||
* Filter interface Filters perform certain tasks prior or after execution of
|
||||
* request by request handler. In this case, before the request is handled by
|
||||
* the target, the request undergoes through each Filter
|
||||
*
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public interface Filter {
|
||||
public String execute(String[] request);
|
||||
|
||||
/**
|
||||
* Execute order processing filter.
|
||||
* @param order
|
||||
* @return empty string on success, otherwise error message.
|
||||
*/
|
||||
String execute(Order order);
|
||||
|
||||
/**
|
||||
* Set next filter in chain after this.
|
||||
* @param filter
|
||||
*/
|
||||
void setNext(Filter filter);
|
||||
|
||||
/**
|
||||
* Get next filter in chain after this.
|
||||
* @return
|
||||
*/
|
||||
Filter getNext();
|
||||
|
||||
/**
|
||||
* Get last filter in the chain.
|
||||
* @return
|
||||
*/
|
||||
Filter getLast();
|
||||
}
|
||||
|
@ -1,14 +1,15 @@
|
||||
package com.iluwatar;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
||||
/**
|
||||
* Filter Chain carries multiple filters and help to execute them in defined order on target.
|
||||
*
|
||||
* @author joshzambales
|
||||
*/
|
||||
public class FilterChain {
|
||||
private ArrayList<Filter> filters = new ArrayList<Filter>();
|
||||
|
||||
private Filter chain;
|
||||
|
||||
private final Target target;
|
||||
|
||||
public FilterChain(Target target) {
|
||||
@ -16,37 +17,47 @@ public class FilterChain {
|
||||
}
|
||||
|
||||
public void addFilter(Filter filter) {
|
||||
filters.add(filter);
|
||||
if (chain == null) {
|
||||
chain = filter;
|
||||
} else {
|
||||
chain.getLast().setNext(filter);
|
||||
}
|
||||
}
|
||||
|
||||
public String execute(String request) {
|
||||
String tempout[] = new String[filters.size()];
|
||||
public String execute(Order order) {
|
||||
|
||||
String tempin[] = request.split("&");
|
||||
int i = 0;
|
||||
try {
|
||||
for (Filter filter : filters) {
|
||||
tempout[i] = null;
|
||||
tempout[i++] = filter.execute(tempin);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return "NOT ENOUGHT INPUT";
|
||||
}
|
||||
|
||||
if (tempout[4] == null) {
|
||||
return "INVALID ORDER!";
|
||||
} else if (tempout[3] == null) {
|
||||
return "INVALID DEPOSIT NUMBER!";
|
||||
} else if (tempout[2] == null) {
|
||||
return "INVALID ADRDESS!";
|
||||
} else if (tempout[1] == null) {
|
||||
return "INVALID Contact Number!";
|
||||
} else if (tempout[0] == null) {
|
||||
return "INVALID Name!";
|
||||
if (chain != null) {
|
||||
return chain.execute(order);
|
||||
} else {
|
||||
target.execute(tempout);
|
||||
return "RUNNING...";
|
||||
}
|
||||
|
||||
// String tempout[] = new String[filters.size()];
|
||||
//
|
||||
// String tempin[] = request.split("&");
|
||||
// int i = 0;
|
||||
// try {
|
||||
// for (Filter filter : filters) {
|
||||
// tempout[i] = null;
|
||||
// tempout[i++] = filter.execute(tempin);
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// return "NOT ENOUGHT INPUT";
|
||||
// }
|
||||
//
|
||||
// if (tempout[4] == null) {
|
||||
// return "INVALID ORDER!";
|
||||
// } else if (tempout[3] == null) {
|
||||
// return "INVALID DEPOSIT NUMBER!";
|
||||
// } else if (tempout[2] == null) {
|
||||
// return "INVALID ADRDESS!";
|
||||
// } else if (tempout[1] == null) {
|
||||
// return "INVALID Contact Number!";
|
||||
// } else if (tempout[0] == null) {
|
||||
// return "INVALID Name!";
|
||||
// } else {
|
||||
// target.execute(tempout);
|
||||
// return "RUNNING...";
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,17 +7,18 @@ package com.iluwatar;
|
||||
*
|
||||
*/
|
||||
public class FilterManager {
|
||||
|
||||
private FilterChain filterChain;
|
||||
|
||||
public FilterManager(Target target) {
|
||||
filterChain = new FilterChain(target);
|
||||
}
|
||||
|
||||
public void setFilter(Filter filter) {
|
||||
public void addFilter(Filter filter) {
|
||||
filterChain.addFilter(filter);
|
||||
}
|
||||
|
||||
public String filterRequest(String request) {
|
||||
return filterChain.execute(request);
|
||||
public String filterRequest(Order order) {
|
||||
return filterChain.execute(order);
|
||||
}
|
||||
}
|
||||
|
@ -7,11 +7,15 @@ package com.iluwatar;
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public class NameFilter implements Filter {
|
||||
public String execute(String[] request) {
|
||||
if (request[0].equals("") || request[0].matches(".*[^\\w|\\s]+.*")) {
|
||||
return null;
|
||||
} else
|
||||
return request[0];
|
||||
public class NameFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getName() == null || order.getName().isEmpty() || order.getName().matches(".*[^\\w|\\s]+.*")) {
|
||||
return result + "Invalid order! ";
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
65
intercepting-filter/src/main/java/com/iluwatar/Order.java
Normal file
65
intercepting-filter/src/main/java/com/iluwatar/Order.java
Normal file
@ -0,0 +1,65 @@
|
||||
package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Order class carries the order data.
|
||||
*
|
||||
*/
|
||||
public class Order {
|
||||
|
||||
private String name;
|
||||
private String contactNumber;
|
||||
private String address;
|
||||
private String depositNumber;
|
||||
private String order;
|
||||
|
||||
public Order() {
|
||||
}
|
||||
|
||||
public Order(String name, String contactNumber, String address, String depositNumber, String order) {
|
||||
this.name = name;
|
||||
this.contactNumber = contactNumber;
|
||||
this.address = address;
|
||||
this.depositNumber = depositNumber;
|
||||
this.order = order;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getContactNumber() {
|
||||
return contactNumber;
|
||||
}
|
||||
|
||||
public void setContactNumber(String contactNumber) {
|
||||
this.contactNumber = contactNumber;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public String getDepositNumber() {
|
||||
return depositNumber;
|
||||
}
|
||||
|
||||
public void setDepositNumber(String depositNumber) {
|
||||
this.depositNumber = depositNumber;
|
||||
}
|
||||
|
||||
public String getOrder() {
|
||||
return order;
|
||||
}
|
||||
|
||||
public void setOrder(String order) {
|
||||
this.order = order;
|
||||
}
|
||||
}
|
@ -1,17 +1,20 @@
|
||||
package com.iluwatar;
|
||||
|
||||
/**
|
||||
* Concrete implementation of filter This checks for the order field, returns
|
||||
* null when order field is empty
|
||||
* Concrete implementation of filter This checks for the order field
|
||||
*
|
||||
* @author joshzambales
|
||||
*
|
||||
*/
|
||||
public class OrderFilter implements Filter {
|
||||
public String execute(String[] request) {
|
||||
if (request[4].equals("")) {
|
||||
return null;
|
||||
} else
|
||||
return request[4];
|
||||
public class OrderFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getOrder() == null || order.getOrder().isEmpty()) {
|
||||
return result + "Invalid order! ";
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user