// Path: core/src/main/java/com/ccoe/build/core/filter/model/Cause.java
// @XmlAccessorType(XmlAccessType.FIELD)
// public class Cause {
// 	
// 	@XmlAttribute
// 	private String source;
// 	
// 	@XmlAttribute
// 	private String keyword;
// 	
// 	@XmlAttribute
// 	private String pattern;
// 
// 	@XmlAttribute
// 	private String value;
// 
// 	public String getSource() {
// 		return source;
// 	}
// 
// 	public void setSource(String source) {
// 		this.source = source;
// 	}
// 	
// 	public String getKeyword() {
// 		return keyword;
// 	}
// 
// 	public void setKeyword(String keyword) {
// 		this.keyword = keyword;
// 	}
// 	
// 	public String getPattern() {
// 		return this.pattern;
// 	}
// 	
// 	public void setPattern(String p) {
// 		this.pattern = p;
// 	}
// 	
// 	public String getValue() {
// 		return value;
// 	}
// 
// 	public void setValue(String value) {
// 		this.value = value;
// 	}
// }
// 
// Path: core/src/main/java/com/ccoe/build/core/filter/model/Filter.java
// @XmlAccessorType(XmlAccessType.FIELD)
// public class Filter {
// 	@XmlAttribute
// 	private String name;
// 	
// 	@XmlAttribute
// 	private String description;
// 	
// 	private String category;
// 
// 	@XmlElement(name="cause")
// 	private List<Cause> cause = new ArrayList<Cause>();
// 	
// 	public List<Cause> getCause() {
// 		return this.cause;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 	
// 	public String getDescription() {
// 		return description;
// 	}
// 
// 	public void setDescription(String description) {
// 		this.description= description;
// 	}
// 
// 	public String getCategory() {
// 		return category;
// 	}
// 
// 	public void setCategory(String category) {
// 		this.category = category;
// 	}
// 	
// 	public void setCauses(List<Cause> lsCause){
// 		this.cause = lsCause;
// 	}
// }
// 
// Path: core/src/main/java/com/ccoe/build/core/utils/StringUtils.java
// public class StringUtils {
// 	
// 	public static boolean isEmpty(String str) {
// 		return (str == null) || (str.length() == 0);
// 	}
// 	
// 	public static List<String> getFound(String contents, String regex,
// 			boolean isCaseInsensitive) {
// 		if (isEmpty(regex) || isEmpty(contents)) {
// 			return new ArrayList<String>();
// 		}
// 		List<String> results = new ArrayList<String>();
// 		Pattern pattern;
// 		if (isCaseInsensitive) {
// 			pattern = Pattern.compile(regex, Pattern.UNICODE_CASE
// 					| Pattern.CASE_INSENSITIVE);
// 		} else {
// 			pattern = Pattern.compile(regex, Pattern.UNICODE_CASE);
// 		}
// 		Matcher matcher = pattern.matcher(contents);
// 		while (matcher.find()) {
// 			if (matcher.groupCount() > 0) {
// 				for (int i = 1; i <= matcher.groupCount(); i++) {
// 					if (!isEmpty(matcher.group(i))) {
// 						results.add(matcher.group(i));
// 					}
// 				}
// 			} else {
// 				if (!isEmpty(matcher.group())) {
// 					results.add(matcher.group());
// 				}
// 			}
// 		}
// 		return results;
// 	}
// 
// 	public static String getFirstFound(String contents, String regex,
// 			boolean isCaseInsensitive) {
// 		if (isEmpty(contents) || isEmpty(regex)) {
// 			return null;
// 		}
// 		List<String> found = getFound(contents, regex, isCaseInsensitive);
// 		if (found.size() > 0) {
// 			return (String) found.iterator().next();
// 		}
// 		return "";
// 	}
// 	
// 	public static Date setTime(Date date, String timeString) {
// 		Calendar cal1 = Calendar.getInstance();
// 		cal1.setTime(date);
// 		
// 		Calendar cal2 = Calendar.getInstance();
// 
// 		String[] time = timeString.split(":");
// 		
// 		cal2.set(cal1.get(Calendar.YEAR), 
// 				cal1.get(Calendar.MONTH), 
// 				cal1.get(Calendar.DAY_OF_MONTH), 
// 				Integer.parseInt(time[0]),
// 				Integer.parseInt(time[1]),
// 				Integer.parseInt(time[2]));
// 		
// 		return cal2.getTime();
// 	}
// }


import java.util.HashMap;
import java.util.regex.Pattern;
import com.ccoe.build.core.filter.model.Cause;
import com.ccoe.build.core.filter.model.Filter;
import com.ccoe.build.core.utils.StringUtils;
				String value = source.get(sourceName);   //wouldn't cause error when sourceName is null;
				if(!isMatchCause(value, cause)) {
					return false;
				}
			} else {
				return false;
			}
		}
		return true;
	}

	public boolean isMatch(String fullstack, Filter filter) {
		for (Cause cause : filter.getCause()) {
			if (!isMatchCause(fullstack, cause)) {
				return false;
			}
		}
		return true;
	}
	
	protected boolean isMatchCause(String content, Cause cause) {
		if (isMatchContent(content, cause)
				|| isMatchKeyword(content, cause)
				|| isMatchPattern(content, cause)) {
			return true;
		}
		return false;
	}
	
	protected boolean isMatchContent(String content, Cause cause) {
// Path: core/src/main/java/com/ccoe/build/core/filter/model/Cause.java
// @XmlAccessorType(XmlAccessType.FIELD)
// public class Cause {
// 	
// 	@XmlAttribute
// 	private String source;
// 	
// 	@XmlAttribute
// 	private String keyword;
// 	
// 	@XmlAttribute
// 	private String pattern;
// 
// 	@XmlAttribute
// 	private String value;
// 
// 	public String getSource() {
// 		return source;
// 	}
// 
// 	public void setSource(String source) {
// 		this.source = source;
// 	}
// 	
// 	public String getKeyword() {
// 		return keyword;
// 	}
// 
// 	public void setKeyword(String keyword) {
// 		this.keyword = keyword;
// 	}
// 	
// 	public String getPattern() {
// 		return this.pattern;
// 	}
// 	
// 	public void setPattern(String p) {
// 		this.pattern = p;
// 	}
// 	
// 	public String getValue() {
// 		return value;
// 	}
// 
// 	public void setValue(String value) {
// 		this.value = value;
// 	}
// }
// 
// Path: core/src/main/java/com/ccoe/build/core/filter/model/Filter.java
// @XmlAccessorType(XmlAccessType.FIELD)
// public class Filter {
// 	@XmlAttribute
// 	private String name;
// 	
// 	@XmlAttribute
// 	private String description;
// 	
// 	private String category;
// 
// 	@XmlElement(name="cause")
// 	private List<Cause> cause = new ArrayList<Cause>();
// 	
// 	public List<Cause> getCause() {
// 		return this.cause;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 	
// 	public String getDescription() {
// 		return description;
// 	}
// 
// 	public void setDescription(String description) {
// 		this.description= description;
// 	}
// 
// 	public String getCategory() {
// 		return category;
// 	}
// 
// 	public void setCategory(String category) {
// 		this.category = category;
// 	}
// 	
// 	public void setCauses(List<Cause> lsCause){
// 		this.cause = lsCause;
// 	}
// }
// 
// Path: core/src/main/java/com/ccoe/build/core/utils/StringUtils.java
// public class StringUtils {
// 	
// 	public static boolean isEmpty(String str) {
// 		return (str == null) || (str.length() == 0);
// 	}
// 	
// 	public static List<String> getFound(String contents, String regex,
// 			boolean isCaseInsensitive) {
// 		if (isEmpty(regex) || isEmpty(contents)) {
// 			return new ArrayList<String>();
// 		}
// 		List<String> results = new ArrayList<String>();
// 		Pattern pattern;
// 		if (isCaseInsensitive) {
// 			pattern = Pattern.compile(regex, Pattern.UNICODE_CASE
// 					| Pattern.CASE_INSENSITIVE);
// 		} else {
// 			pattern = Pattern.compile(regex, Pattern.UNICODE_CASE);
// 		}
// 		Matcher matcher = pattern.matcher(contents);
// 		while (matcher.find()) {
// 			if (matcher.groupCount() > 0) {
// 				for (int i = 1; i <= matcher.groupCount(); i++) {
// 					if (!isEmpty(matcher.group(i))) {
// 						results.add(matcher.group(i));
// 					}
// 				}
// 			} else {
// 				if (!isEmpty(matcher.group())) {
// 					results.add(matcher.group());
// 				}
// 			}
// 		}
// 		return results;
// 	}
// 
// 	public static String getFirstFound(String contents, String regex,
// 			boolean isCaseInsensitive) {
// 		if (isEmpty(contents) || isEmpty(regex)) {
// 			return null;
// 		}
// 		List<String> found = getFound(contents, regex, isCaseInsensitive);
// 		if (found.size() > 0) {
// 			return (String) found.iterator().next();
// 		}
// 		return "";
// 	}
// 	
// 	public static Date setTime(Date date, String timeString) {
// 		Calendar cal1 = Calendar.getInstance();
// 		cal1.setTime(date);
// 		
// 		Calendar cal2 = Calendar.getInstance();
// 
// 		String[] time = timeString.split(":");
// 		
// 		cal2.set(cal1.get(Calendar.YEAR), 
// 				cal1.get(Calendar.MONTH), 
// 				cal1.get(Calendar.DAY_OF_MONTH), 
// 				Integer.parseInt(time[0]),
// 				Integer.parseInt(time[1]),
// 				Integer.parseInt(time[2]));
// 		
// 		return cal2.getTime();
// 	}
// }


// Path: core/src/main/java/com/ccoe/build/core/filter/FilterMatcher.java
import java.util.HashMap;
import java.util.regex.Pattern;
import com.ccoe.build.core.filter.model.Cause;
import com.ccoe.build.core.filter.model.Filter;
import com.ccoe.build.core.utils.StringUtils;

				String value = source.get(sourceName);   //wouldn't cause error when sourceName is null;
				if(!isMatchCause(value, cause)) {
					return false;
				}
			} else {
				return false;
			}
		}
		return true;
	}

	public boolean isMatch(String fullstack, Filter filter) {
		for (Cause cause : filter.getCause()) {
			if (!isMatchCause(fullstack, cause)) {
				return false;
			}
		}
		return true;
	}
	
	protected boolean isMatchCause(String content, Cause cause) {
		if (isMatchContent(content, cause)
				|| isMatchKeyword(content, cause)
				|| isMatchPattern(content, cause)) {
			return true;
		}
		return false;
	}
	
	protected boolean isMatchContent(String content, Cause cause) {
		if (!StringUtils.isEmpty(cause.getValue()) && content.equals(cause.getValue())) {