diff --git a/intercepting-filter/src/main/java/com/iluwatar/AbstractFilter.java b/intercepting-filter/src/main/java/com/iluwatar/AbstractFilter.java new file mode 100644 index 000000000..b24d28575 --- /dev/null +++ b/intercepting-filter/src/main/java/com/iluwatar/AbstractFilter.java @@ -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 ""; + } + } +} diff --git a/intercepting-filter/src/main/java/com/iluwatar/AddressFilter.java b/intercepting-filter/src/main/java/com/iluwatar/AddressFilter.java index 12ea248f8..fadba0e0d 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/AddressFilter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/AddressFilter.java @@ -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; } -} \ No newline at end of file +} diff --git a/intercepting-filter/src/main/java/com/iluwatar/App.java b/intercepting-filter/src/main/java/com/iluwatar/App.java index 853bd0d1d..c6c77d4f4 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/App.java +++ b/intercepting-filter/src/main/java/com/iluwatar/App.java @@ -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); diff --git a/intercepting-filter/src/main/java/com/iluwatar/Client.java b/intercepting-filter/src/main/java/com/iluwatar/Client.java index e1d6c5fa0..a2e20ced0 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/Client.java +++ b/intercepting-filter/src/main/java/com/iluwatar/Client.java @@ -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); } } diff --git a/intercepting-filter/src/main/java/com/iluwatar/ContactFilter.java b/intercepting-filter/src/main/java/com/iluwatar/ContactFilter.java index 64cdf3c18..1a545a85c 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/ContactFilter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/ContactFilter.java @@ -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; + } } } diff --git a/intercepting-filter/src/main/java/com/iluwatar/DepositFilter.java b/intercepting-filter/src/main/java/com/iluwatar/DepositFilter.java index a41849218..7361834c3 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/DepositFilter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/DepositFilter.java @@ -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; + } } } diff --git a/intercepting-filter/src/main/java/com/iluwatar/Filter.java b/intercepting-filter/src/main/java/com/iluwatar/Filter.java index 2c2facd1d..f6deb18b4 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/Filter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/Filter.java @@ -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(); } diff --git a/intercepting-filter/src/main/java/com/iluwatar/FilterChain.java b/intercepting-filter/src/main/java/com/iluwatar/FilterChain.java index b71264ee1..dc204be73 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/FilterChain.java +++ b/intercepting-filter/src/main/java/com/iluwatar/FilterChain.java @@ -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 filters = new ArrayList(); + + 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..."; +// } } - } diff --git a/intercepting-filter/src/main/java/com/iluwatar/FilterManager.java b/intercepting-filter/src/main/java/com/iluwatar/FilterManager.java index 8c9ed0fcf..ad8d14d3a 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/FilterManager.java +++ b/intercepting-filter/src/main/java/com/iluwatar/FilterManager.java @@ -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); } } diff --git a/intercepting-filter/src/main/java/com/iluwatar/NameFilter.java b/intercepting-filter/src/main/java/com/iluwatar/NameFilter.java index 1863a11dd..93f79e7d5 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/NameFilter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/NameFilter.java @@ -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; + } } } diff --git a/intercepting-filter/src/main/java/com/iluwatar/Order.java b/intercepting-filter/src/main/java/com/iluwatar/Order.java new file mode 100644 index 000000000..d3ab5a96d --- /dev/null +++ b/intercepting-filter/src/main/java/com/iluwatar/Order.java @@ -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; + } +} diff --git a/intercepting-filter/src/main/java/com/iluwatar/OrderFilter.java b/intercepting-filter/src/main/java/com/iluwatar/OrderFilter.java index 813ee56ea..e9afda424 100644 --- a/intercepting-filter/src/main/java/com/iluwatar/OrderFilter.java +++ b/intercepting-filter/src/main/java/com/iluwatar/OrderFilter.java @@ -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; + } } -} \ No newline at end of file +}