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 |  * 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 |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class AddressFilter implements Filter { | public class AddressFilter extends AbstractFilter { | ||||||
| 	public String execute(String[] request) { | 	 | ||||||
| 		if (request[2].equals("")) { | 	@Override | ||||||
| 			return null; | 	public String execute(Order order) { | ||||||
|  | 		String result = super.execute(order); | ||||||
|  | 		if (order.getAddress() == null || order.getAddress().isEmpty()) { | ||||||
|  | 			return result + "Invalid address! "; | ||||||
| 		} else | 		} else | ||||||
| 			return request[2]; | 			return result; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -8,13 +8,14 @@ package com.iluwatar; | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class App{ | public class App{ | ||||||
|  | 	 | ||||||
| 	public static void main(String[] args) { | 	public static void main(String[] args) { | ||||||
| 		FilterManager filterManager = new FilterManager(new Target()); | 		FilterManager filterManager = new FilterManager(new Target()); | ||||||
| 		filterManager.setFilter(new NameFilter()); | 		filterManager.addFilter(new NameFilter()); | ||||||
| 		filterManager.setFilter(new ContactFilter()); | 		filterManager.addFilter(new ContactFilter()); | ||||||
| 		filterManager.setFilter(new AddressFilter()); | 		filterManager.addFilter(new AddressFilter()); | ||||||
| 		filterManager.setFilter(new DepositFilter()); | 		filterManager.addFilter(new DepositFilter()); | ||||||
| 		filterManager.setFilter(new OrderFilter()); | 		filterManager.addFilter(new OrderFilter()); | ||||||
|  |  | ||||||
| 		Client client = new Client(); | 		Client client = new Client(); | ||||||
| 		client.setFilterManager(filterManager); | 		client.setFilterManager(filterManager); | ||||||
|   | |||||||
| @@ -85,12 +85,10 @@ public class Client extends JFrame { | |||||||
| 		processButton.addActionListener(new ActionListener() { | 		processButton.addActionListener(new ActionListener() { | ||||||
| 			@Override | 			@Override | ||||||
| 			public void actionPerformed(ActionEvent e) { | 			public void actionPerformed(ActionEvent e) { | ||||||
| 				String request = String.format("%s&%s&%s&%s&%s", | 				Order order = new Order(jtFields[0].getText(), jtFields[1] | ||||||
| 						jtFields[0].getText(), jtFields[1].getText(), | 						.getText(), jtAreas[0].getText(), | ||||||
| 						jtAreas[0].getText(), jtFields[2].getText(), | 						jtFields[2].getText(), jtAreas[1].getText()); | ||||||
| 						jtAreas[1].getText()); | 				jl.setText(sendRequest(order)); | ||||||
|  |  | ||||||
| 				jl.setText(sendRequest(request)); |  | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| @@ -103,7 +101,7 @@ public class Client extends JFrame { | |||||||
| 		this.filterManager = filterManager; | 		this.filterManager = filterManager; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public String sendRequest(String request) { | 	public String sendRequest(Order order) { | ||||||
| 		return filterManager.filterRequest(request); | 		return filterManager.filterRequest(order); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,16 +2,23 @@ package com.iluwatar; | |||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Concrete implementation of filter |  * 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 |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class ContactFilter implements Filter { | public class ContactFilter extends AbstractFilter { | ||||||
| 	public String execute(String[] request) { | 	 | ||||||
| 		if (request[1].equals("") || request[1].matches(".*[^\\d]+.*") | 	@Override | ||||||
| 				|| request[1].length() != 11) { | 	public String execute(Order order) { | ||||||
| 			return null; | 		String result = super.execute(order); | ||||||
| 		} else | 		if (order.getContactNumber() == null | ||||||
| 			return request[1]; | 				|| 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 |  * Concrete implementation of filter | ||||||
| * |  * This checks for the deposit code  | ||||||
|  * This checks for the deposit code, returns null when deposit field is empty  |  | ||||||
|  * @author joshzambales |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class DepositFilter implements Filter { | public class DepositFilter extends AbstractFilter { | ||||||
| 	public String execute(String[] request) { | 	 | ||||||
| 		if (request[3].equals("")) { | 	@Override | ||||||
| 			return null; | 	public String execute(Order order) { | ||||||
| 		} else | 		String result = super.execute(order); | ||||||
| 			return request[3]; | 		if (order.getDepositNumber() == null || order.getDepositNumber().isEmpty()) { | ||||||
|  | 			return result + "Invalid deposit number! "; | ||||||
|  | 		} else { | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,12 +1,37 @@ | |||||||
| package com.iluwatar; | package com.iluwatar; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| * Filter interface  |  * Filter interface Filters perform certain tasks prior or after execution of | ||||||
|  * Filters perform certain tasks prior or after execution of request by request handler. |  * request by request handler. In this case, before the request is handled by | ||||||
|  * In this case, before the request is handled by the target, the request undergoes through each Filter |  * the target, the request undergoes through each Filter | ||||||
|  |  *  | ||||||
|  * @author joshzambales |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public interface Filter { | 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; |  package com.iluwatar; | ||||||
|   |   | ||||||
|  import java.util.*; |  | ||||||
|    |    | ||||||
| /** | /** | ||||||
|  * Filter Chain carries multiple filters and help to execute them in defined order on target. |  * Filter Chain carries multiple filters and help to execute them in defined order on target. | ||||||
| @@ -8,7 +7,9 @@ | |||||||
|  * @author joshzambales |  * @author joshzambales | ||||||
|  */ |  */ | ||||||
| public class FilterChain { | public class FilterChain { | ||||||
| 	private ArrayList<Filter> filters = new ArrayList<Filter>(); | 	 | ||||||
|  | 	private Filter chain; | ||||||
|  | 	 | ||||||
| 	private final Target target; | 	private final Target target; | ||||||
|  |  | ||||||
| 	public FilterChain(Target target) { | 	public FilterChain(Target target) { | ||||||
| @@ -16,37 +17,47 @@ public class FilterChain { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public void addFilter(Filter filter) { | 	public void addFilter(Filter filter) { | ||||||
| 		filters.add(filter); | 		if (chain == null) { | ||||||
| 	} | 			chain = filter; | ||||||
|  | 		} else { | ||||||
| 	public String execute(String request) { | 			chain.getLast().setNext(filter); | ||||||
| 		String tempout[] = new String[filters.size()]; | 		} | ||||||
|  | 	} | ||||||
| 		String tempin[] = request.split("&"); |  | ||||||
| 		int i = 0; | 	public String execute(Order order) { | ||||||
| 		try { |  | ||||||
| 			for (Filter filter : filters) { | 		if (chain != null) { | ||||||
| 				tempout[i] = null; | 			return chain.execute(order); | ||||||
| 				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 { | 		} else { | ||||||
| 			target.execute(tempout); |  | ||||||
| 			return "RUNNING..."; | 			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 { | public class FilterManager { | ||||||
|  | 	 | ||||||
| 	private FilterChain filterChain; | 	private FilterChain filterChain; | ||||||
|  |  | ||||||
| 	public FilterManager(Target target) { | 	public FilterManager(Target target) { | ||||||
| 		filterChain = new FilterChain(target); | 		filterChain = new FilterChain(target); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public void setFilter(Filter filter) { | 	public void addFilter(Filter filter) { | ||||||
| 		filterChain.addFilter(filter); | 		filterChain.addFilter(filter); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public String filterRequest(String request) { | 	public String filterRequest(Order order) { | ||||||
| 		return filterChain.execute(request); | 		return filterChain.execute(order); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,11 +7,15 @@ package com.iluwatar; | |||||||
|  * @author joshzambales |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class NameFilter implements Filter { | public class NameFilter extends AbstractFilter { | ||||||
| 	public String execute(String[] request) { | 	 | ||||||
| 		if (request[0].equals("") || request[0].matches(".*[^\\w|\\s]+.*")) { | 	@Override | ||||||
| 			return null; | 	public String execute(Order order) { | ||||||
| 		} else | 		String result = super.execute(order); | ||||||
| 			return request[0]; | 		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; | package com.iluwatar; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Concrete implementation of filter This checks for the order field, returns |  * Concrete implementation of filter This checks for the order field | ||||||
|  * null when order field is empty |  | ||||||
|  *  |  *  | ||||||
|  * @author joshzambales |  * @author joshzambales | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| public class OrderFilter implements Filter { | public class OrderFilter extends AbstractFilter { | ||||||
| 	public String execute(String[] request) { | 	 | ||||||
| 		if (request[4].equals("")) { | 	@Override | ||||||
| 			return null; | 	public String execute(Order order) { | ||||||
| 		} else | 		String result = super.execute(order); | ||||||
| 			return request[4]; | 		if (order.getOrder() == null || order.getOrder().isEmpty()) { | ||||||
|  | 			return result + "Invalid order! "; | ||||||
|  | 		} else { | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user