Fixes "Intercepting Filter example needs some improvement" #43
This commit is contained in:
		| @@ -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,6 +1,5 @@ | ||||
|  package com.iluwatar; | ||||
|   | ||||
|  import java.util.*; | ||||
|    | ||||
| /** | ||||
|  * Filter Chain carries multiple filters and help to execute them in defined order on target. | ||||
| @@ -8,7 +7,9 @@ | ||||
|  * @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); | ||||
| 	} | ||||
|  | ||||
| 	public String execute(String request) { | ||||
| 		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!"; | ||||
| 		if (chain == null) { | ||||
| 			chain = filter; | ||||
| 		} else { | ||||
| 			chain.getLast().setNext(filter); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public String execute(Order order) { | ||||
|  | ||||
| 		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; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user