Fixes "Intercepting Filter example needs some improvement" #43

This commit is contained in:
Ilkka Seppala 2015-04-09 22:23:17 +03:00
parent 717cb53f2b
commit e03bd818ec
12 changed files with 254 additions and 87 deletions

View File

@ -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 "";
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}

View File

@ -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...";
// }
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View 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;
}
}

View File

@ -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;
}
}
}
}