// Path: src/AndroidMonkeyResultAnalyzer/src/com/github/monkey/analyzer/model/Abnormality.java
// public abstract class Abnormality {
// 	protected String message = "";
// 	protected AbnormalityType type = AbnormalityType.UNKNOWN;
// 	protected HashMap<String, String> extraInfo = new HashMap<String, String>();
// 	protected boolean isValid = false;
// 	
// 	public static final String EXTRAS_KEY_BEFORE_START_PATTERN = "before";
// 	public static final String EXTRAS_KEY_AFTER_END_PATTERN = "after";
// 	public static final String EXTRAS_KEY_PATH = "path";
// 	/**
// 	 * set the type of abnormality
// 	 * 
// 	 */
// 	public abstract void setType(final AbnormalityType type);
// 
// 	/**
// 	 * get the type of abnormality
// 	 * 
// 	 * @return instance of FilterType
// 	 */
// 	public abstract AbnormalityType getType();
// 
// 	/**
// 	 * set whether this Abnormality is Valid
// 	 * 
// 	 * @param isValid
// 	 *            whether this Abnormality is Valid
// 	 */
// 
// 	public void setValid(boolean isValid) {
// 		this.isValid = isValid;
// 	}
// 
// 	/**
// 	 * tell user whether the abnormality is valid
// 	 * 
// 	 * @return true if valid, else return invalid
// 	 */
// 	public abstract boolean isValid();
// 
// 	/**
// 	 * set the main message of this abnormality file, it is usually monkey log
// 	 * 
// 	 * @return abnormality message
// 	 */
// 	final public void setMessage(StringBuilder sb) {
// 		if (sb == null)
// 			message = "";
// 		else
// 			message = sb.toString();
// 	}
// 
// 	/**
// 	 * the main message of this abnormality file, it is usually monkey log
// 	 * 
// 	 * @return abnormality message
// 	 */
// 	public String getMessage() {
// 		return message;
// 	}
// 
// 	/**
// 	 * extra message of this abnormality file, not in use now. it is used for
// 	 * extension
// 	 * 
// 	 * @return extra information of this abnormality
// 	 */
// 	final public HashMap<String, String> getExtras() {
// 		return extraInfo;
// 	}
// 
// 	/**
// 	 * put one entry to extras container
// 	 */
// 	final public String put(String key, String value) {
// 		return extraInfo.put(key, value);
// 	}
// 	/**
// 	 * copy from an
// 	 */
// 	final public void copyFrom(Map<String, String> extras) {
// 		if (extras == null || extras.isEmpty())
// 			return;
// 
// 		Set<Entry<String, String>> entries = extras.entrySet();
// 
// 		if (entries == null || entries.isEmpty())
// 			return;
// 
// 		for (Entry<String, String> entry : entries) {
// 			extraInfo.put(entry.getKey(), entry.getValue());
// 		}
// 	}
// }
// 
// Path: src/AndroidMonkeyResultAnalyzer/src/com/github/monkey/analyzer/model/InvalidAbnormality.java
// public class InvalidAbnormality extends Abnormality {
// 	@Override
// 	public AbnormalityType getType() {
// 		return AbnormalityType.UNKNOWN;
// 	}
// 	
// 	public void setValid(boolean isValid) {
// 		this.isValid = isValid;
// 	}
// 
// 	@Override
// 	public boolean isValid() {
// 		return false;
// 	}
// 
// 	@Override
// 	public void setType(AbnormalityType type) {
// 		
// 	}
// 
// }


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.github.monkey.analyzer.model.Abnormality;
import com.github.monkey.analyzer.model.InvalidAbnormality;
package com.github.monkey.analyzer.analyze;



/**
 * 
 * @author Alex Chen (apack1001@gmail.com)
 *
 */
class AnalyzerInvoker {
	/**
	 * The context of all analyzers, it stores all the Commands
	 */
	protected List<IAnalyzer> analyzers = Collections
			.synchronizedList(new ArrayList<IAnalyzer>());
	/**
	 * The target monkey result file to be analyzed
	 */
	protected List<String> paths = Collections
			.synchronizedList(new ArrayList<String>());

	/**
	 * All the known results
	 */
	protected ArrayList<Abnormality> knownAbnormalities = new ArrayList<Abnormality>();

	/**
	 * All the unknown results
	 */
	protected ArrayList<Abnormality> unknownAbnormalties = new ArrayList<Abnormality>();

	/**
	 * Traverse the command iteration an
	 */
// Path: src/AndroidMonkeyResultAnalyzer/src/com/github/monkey/analyzer/model/Abnormality.java
// public abstract class Abnormality {
// 	protected String message = "";
// 	protected AbnormalityType type = AbnormalityType.UNKNOWN;
// 	protected HashMap<String, String> extraInfo = new HashMap<String, String>();
// 	protected boolean isValid = false;
// 	
// 	public static final String EXTRAS_KEY_BEFORE_START_PATTERN = "before";
// 	public static final String EXTRAS_KEY_AFTER_END_PATTERN = "after";
// 	public static final String EXTRAS_KEY_PATH = "path";
// 	/**
// 	 * set the type of abnormality
// 	 * 
// 	 */
// 	public abstract void setType(final AbnormalityType type);
// 
// 	/**
// 	 * get the type of abnormality
// 	 * 
// 	 * @return instance of FilterType
// 	 */
// 	public abstract AbnormalityType getType();
// 
// 	/**
// 	 * set whether this Abnormality is Valid
// 	 * 
// 	 * @param isValid
// 	 *            whether this Abnormality is Valid
// 	 */
// 
// 	public void setValid(boolean isValid) {
// 		this.isValid = isValid;
// 	}
// 
// 	/**
// 	 * tell user whether the abnormality is valid
// 	 * 
// 	 * @return true if valid, else return invalid
// 	 */
// 	public abstract boolean isValid();
// 
// 	/**
// 	 * set the main message of this abnormality file, it is usually monkey log
// 	 * 
// 	 * @return abnormality message
// 	 */
// 	final public void setMessage(StringBuilder sb) {
// 		if (sb == null)
// 			message = "";
// 		else
// 			message = sb.toString();
// 	}
// 
// 	/**
// 	 * the main message of this abnormality file, it is usually monkey log
// 	 * 
// 	 * @return abnormality message
// 	 */
// 	public String getMessage() {
// 		return message;
// 	}
// 
// 	/**
// 	 * extra message of this abnormality file, not in use now. it is used for
// 	 * extension
// 	 * 
// 	 * @return extra information of this abnormality
// 	 */
// 	final public HashMap<String, String> getExtras() {
// 		return extraInfo;
// 	}
// 
// 	/**
// 	 * put one entry to extras container
// 	 */
// 	final public String put(String key, String value) {
// 		return extraInfo.put(key, value);
// 	}
// 	/**
// 	 * copy from an
// 	 */
// 	final public void copyFrom(Map<String, String> extras) {
// 		if (extras == null || extras.isEmpty())
// 			return;
// 
// 		Set<Entry<String, String>> entries = extras.entrySet();
// 
// 		if (entries == null || entries.isEmpty())
// 			return;
// 
// 		for (Entry<String, String> entry : entries) {
// 			extraInfo.put(entry.getKey(), entry.getValue());
// 		}
// 	}
// }
// 
// Path: src/AndroidMonkeyResultAnalyzer/src/com/github/monkey/analyzer/model/InvalidAbnormality.java
// public class InvalidAbnormality extends Abnormality {
// 	@Override
// 	public AbnormalityType getType() {
// 		return AbnormalityType.UNKNOWN;
// 	}
// 	
// 	public void setValid(boolean isValid) {
// 		this.isValid = isValid;
// 	}
// 
// 	@Override
// 	public boolean isValid() {
// 		return false;
// 	}
// 
// 	@Override
// 	public void setType(AbnormalityType type) {
// 		
// 	}
// 
// }


// Path: src/AndroidMonkeyResultAnalyzer/src/com/github/monkey/analyzer/analyze/AnalyzerInvoker.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.github.monkey.analyzer.model.Abnormality;
import com.github.monkey.analyzer.model.InvalidAbnormality;

package com.github.monkey.analyzer.analyze;



/**
 * 
 * @author Alex Chen (apack1001@gmail.com)
 *
 */
class AnalyzerInvoker {
	/**
	 * The context of all analyzers, it stores all the Commands
	 */
	protected List<IAnalyzer> analyzers = Collections
			.synchronizedList(new ArrayList<IAnalyzer>());
	/**
	 * The target monkey result file to be analyzed
	 */
	protected List<String> paths = Collections
			.synchronizedList(new ArrayList<String>());

	/**
	 * All the known results
	 */
	protected ArrayList<Abnormality> knownAbnormalities = new ArrayList<Abnormality>();

	/**
	 * All the unknown results
	 */
	protected ArrayList<Abnormality> unknownAbnormalties = new ArrayList<Abnormality>();

	/**
	 * Traverse the command iteration an
	 */
	public final void analyze() {