Index: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/EFGModelGenerator.java
===================================================================
--- trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/EFGModelGenerator.java	(revision 227)
+++ trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/EFGModelGenerator.java	(revision 227)
@@ -0,0 +1,132 @@
+package de.ugoe.cs.eventbench.efg;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+import de.ugoe.cs.eventbench.commands.CMDupdateModel;
+import de.ugoe.cs.eventbench.data.Event;
+import de.ugoe.cs.eventbench.efg.data.EFGEvent;
+import de.ugoe.cs.eventbench.models.DeterministicFiniteAutomaton;
+import de.ugoe.cs.eventbench.models.FirstOrderMarkovModel;
+import edu.umd.cs.guitar.model.GUITARConstants;
+import edu.umd.cs.guitar.model.IO;
+import edu.umd.cs.guitar.model.data.EFG;
+import edu.umd.cs.guitar.model.data.EventGraphType;
+import edu.umd.cs.guitar.model.data.EventType;
+
+/**
+ * <p>
+ * Provides functionality to generates models defined in the package
+ * de.ugoe.cs.eventbench.models from EFGs.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class EFGModelGenerator {
+
+	/**
+	 * <p>
+	 * Generates a {@link FirstOrderMarkovModel} from an EFG. In the generated
+	 * model, all following events are equally possible, i.e., the model is
+	 * equal to a {@link DeterministicFiniteAutomaton}. However, through further
+	 * training (e.g., {@link CMDupdateModel}) this can be changed.
+	 * </p>
+	 * 
+	 * @param efgFileName
+	 *            name of the EFG file
+	 * @return model generated from the EFG
+	 */
+	public FirstOrderMarkovModel efgToFirstOrderMarkovModel(String efgFileName) {
+		EFG efg = (EFG) IO.readObjFromFile(efgFileName, EFG.class);
+
+		Collection<List<Event<?>>> subsequences = generateEdgeSequences(efg);
+		FirstOrderMarkovModel model = new FirstOrderMarkovModel(new Random());
+		model.train(subsequences);
+		return model;
+	}
+
+	/**
+	 * <p>
+	 * Generates a {@link DeterministicFiniteAutomaton} from an EFG.
+	 * </p>
+	 * 
+	 * @param efgFileName
+	 *            name of the EFG file
+	 * @return model generated from the EFG
+	 */
+	public DeterministicFiniteAutomaton efgToDeterministicFiniteAutomaton(
+			String efgFileName) {
+		EFG efg = (EFG) IO.readObjFromFile(efgFileName, EFG.class);
+
+		Collection<List<Event<?>>> subsequences = generateEdgeSequences(efg);
+		DeterministicFiniteAutomaton model = new DeterministicFiniteAutomaton(
+				new Random());
+		model.train(subsequences);
+		return model;
+	}
+
+	/**
+	 * <p>
+	 * Extracts the graph structure from the EFG. The result is a set of
+	 * sequences, where each sequence has length two and represents an edge in
+	 * the EFG.
+	 * </p>
+	 * 
+	 * @param efg
+	 *            EFG for which the edge sequence set is generated
+	 * @return edge sequence set
+	 */
+	private Collection<List<Event<?>>> generateEdgeSequences(EFG efg) {
+		List<Event<?>> events = createEvents(efg);
+		/*
+		 * getEventGraph returns an adjacency matrix, i.e., a square matrix of
+		 * efgEvents.size(), where a 1 in row i, column j means an edge
+		 * efgEvents.get(i)->efgEvents.get(j) exists.
+		 */
+		EventGraphType efgGraph = efg.getEventGraph();
+		Collection<List<Event<?>>> subsequences = new LinkedList<List<Event<?>>>();
+
+		int efgSize = events.size();
+		for (int row = 0; row < efgSize; row++) {
+			for (int col = 0; col < efgSize; col++) {
+				int relation = efgGraph.getRow().get(row).getE().get(col);
+				// otherEvent is followed by currentEvent
+				if (relation != GUITARConstants.NO_EDGE) {
+					List<Event<?>> edge = new LinkedList<Event<?>>();
+					edge.add(events.get(row));
+					edge.add(events.get(col));
+					subsequences.add(edge);
+				}
+			}
+		}
+		return subsequences;
+	}
+
+	/**
+	 * <p>
+	 * Extracts creates {@link EFGEvent} for every event contained in the EFG.
+	 * </p>
+	 * 
+	 * @param efg
+	 *            EFG for which the events are created
+	 * @return list of events
+	 */
+	private List<Event<?>> createEvents(EFG efg) {
+		List<EventType> efgEvents = efg.getEvents().getEvent();
+		List<Event<?>> myEvents = new ArrayList<Event<?>>(efgEvents.size());
+		for (EventType event : efgEvents) {
+			/*
+			 * the widgetId and eventId are only hash values, the
+			 * "interpretation" is found in the GUI file.
+			 */
+			Event<?> myEvent = new EFGEvent(event.getEventId());
+			myEvent.setTarget(event.getWidgetId());
+			myEvents.add(myEvent);
+		}
+		return myEvents;
+	}
+}
Index: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/GUITARTestCaseParser.java
===================================================================
--- trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/GUITARTestCaseParser.java	(revision 227)
+++ trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/GUITARTestCaseParser.java	(revision 227)
@@ -0,0 +1,109 @@
+package de.ugoe.cs.eventbench.efg;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+
+import de.ugoe.cs.eventbench.data.Event;
+import de.ugoe.cs.eventbench.efg.data.EFGEvent;
+import edu.umd.cs.guitar.model.IO;
+import edu.umd.cs.guitar.model.data.EFG;
+import edu.umd.cs.guitar.model.data.EventType;
+import edu.umd.cs.guitar.model.data.StepType;
+import edu.umd.cs.guitar.model.data.TestCase;
+
+/**
+ * <p>
+ * Parser for GUITAR test case files.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class GUITARTestCaseParser {
+
+	/**
+	 * <p>
+	 * Name of the EFG file for the application the test cases that are parsed
+	 * are generated for.
+	 * </p>
+	 */
+	private String efgFileName = null;
+
+	/**
+	 * <p>
+	 * Internal handle to the parsed EFG.
+	 * </p>
+	 */
+	private EFG efg = null;
+
+	/**
+	 * <p>
+	 * Constructor. Creates a new GUITARTestCaseParser. No EFG file is
+	 * associated with this parser.
+	 * </p>
+	 */
+	public GUITARTestCaseParser() {
+
+	}
+
+	/**
+	 * <p>
+	 * Constructor. Creates a new GUITARTestCaseParser.
+	 * </p>
+	 * 
+	 * @param efgFileName
+	 *            EFG file associated with the test cases that are parsed.
+	 */
+	public GUITARTestCaseParser(String efgFileName) {
+		this.efgFileName = efgFileName;
+	}
+
+	/**
+	 * <p>
+	 * Parses a GUITAR test case file and returns its contents as an event
+	 * sequence.
+	 * </p>
+	 * 
+	 * @param testcaseFile
+	 *            file that is parsed
+	 * @return event sequence describing the test case
+	 */
+	public List<Event<?>> parseTestCaseFile(File testcaseFile) {
+		TestCase testcase = (TestCase) IO.readObjFromFile(
+				testcaseFile.getAbsolutePath(), TestCase.class);
+		List<StepType> steps = testcase.getStep();
+		List<Event<?>> sequence = new LinkedList<Event<?>>();
+		for (StepType step : steps) {
+			String eventId = step.getEventId();
+			EFGEvent event = new EFGEvent(eventId);
+			event.setTarget(getWidgetId(eventId));
+			sequence.add(event);
+		}
+		return sequence;
+	}
+
+	/**
+	 * <p>
+	 * If {@link #efgFileName} is specified, this function retrieves the
+	 * widgetId of the widget the event with id eventId belongs to from the EFG.
+	 * </p>
+	 * 
+	 * @param eventId
+	 * @return widgetId of the associated widget; null if {@link #efgFileName}
+	 *         ==null or no widgetId for the event is found in the EFG
+	 */
+	private String getWidgetId(String eventId) {
+		if (eventId != null && efgFileName != null) {
+			if (efg == null) {
+				efg = (EFG) IO.readObjFromFile(efgFileName, EFG.class);
+			}
+			for (EventType event : efg.getEvents().getEvent()) {
+				if (eventId.equals(event.getEventId())) {
+					return event.getWidgetId();
+				}
+			}
+		}
+		return null;
+	}
+}
Index: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgTestCasesToSequences.java
===================================================================
--- trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgTestCasesToSequences.java	(revision 226)
+++ trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgTestCasesToSequences.java	(revision 227)
@@ -9,10 +9,7 @@
 import de.ugoe.cs.eventbench.data.Event;
 import de.ugoe.cs.eventbench.data.GlobalDataContainer;
-import de.ugoe.cs.eventbench.efg.data.EFGEvent;
+import de.ugoe.cs.eventbench.efg.GUITARTestCaseParser;
 import de.ugoe.cs.util.console.Command;
 import de.ugoe.cs.util.console.Console;
-import edu.umd.cs.guitar.model.IO;
-import edu.umd.cs.guitar.model.data.StepType;
-import edu.umd.cs.guitar.model.data.TestCase;
 
 /**
@@ -34,9 +31,11 @@
 	public void run(List<Object> parameters) {
 		String foldername;
-		String sequencesName = "sequences";
+		String sequencesName;
+		String efgFileName = null;
 		try {
 			foldername = (String) parameters.get(0);
-			if (parameters.size() >= 2) {
-				sequencesName = (String) parameters.get(1);
+			sequencesName = (String) parameters.get(1);
+			if (parameters.size() >= 3) {
+				efgFileName = (String) parameters.get(2);
 			}
 		} catch (Exception e) {
@@ -48,20 +47,14 @@
 		File[] testcaseFiles = folder.listFiles();
 		Collection<List<Event<?>>> sequences = new LinkedList<List<Event<?>>>();
+		GUITARTestCaseParser parser;
+		if (efgFileName == null) {
+			parser = new GUITARTestCaseParser();
+		} else {
+			parser = new GUITARTestCaseParser(efgFileName);
+		}
 		for (File testcaseFile : testcaseFiles) {
 			Console.traceln("Loading from file "
 					+ testcaseFile.getAbsolutePath());
-			TestCase testcase = (TestCase) IO.readObjFromFile(
-					testcaseFile.getAbsolutePath(), TestCase.class);
-			List<StepType> steps = testcase.getStep();
-			List<Event<?>> sequence = new LinkedList<Event<?>>();
-			for (StepType step : steps) {
-				step.getEventId();
-				sequence.add(new EFGEvent(step.getEventId()));
-				/*
-				 * Problem: widgetId unknown! Therefore, the events will not be
-				 * equal to those in the generated from a EFG.
-				 */
-			}
-			sequences.add(sequence);
+			sequences.add(parser.parseTestCaseFile(testcaseFile));
 		}
 		if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
@@ -78,5 +71,5 @@
 	@Override
 	public void help() {
-		Console.println("Usage: efgTestCasesToSequences <folder> {<sequencesName>}");
+		Console.println("Usage: efgTestCasesToSequences <folder> <sequencesName> {<efgFileName>}");
 	}
 
Index: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToDFA.java
===================================================================
--- trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToDFA.java	(revision 227)
+++ trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToDFA.java	(revision 227)
@@ -0,0 +1,55 @@
+package de.ugoe.cs.eventbench.efg.commands;
+
+import java.security.InvalidParameterException;
+import java.util.List;
+
+import de.ugoe.cs.eventbench.data.GlobalDataContainer;
+import de.ugoe.cs.eventbench.efg.EFGModelGenerator;
+import de.ugoe.cs.eventbench.models.DeterministicFiniteAutomaton;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Command to that loads an EFG and creates Deterministic Finite Automaton (DFA)
+ * with the same structure.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDefgToDFA implements Command {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@Override
+	public void run(List<Object> parameters) {
+		String filename;
+		String modelname;
+		try {
+			filename = (String) parameters.get(0);
+			modelname = (String) parameters.get(1);
+		} catch (Exception e) {
+			throw new InvalidParameterException();
+		}
+
+		EFGModelGenerator modelGenerator = new EFGModelGenerator();
+		DeterministicFiniteAutomaton model = modelGenerator
+				.efgToDeterministicFiniteAutomaton(filename);
+		GlobalDataContainer.getInstance().addData(modelname, model);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public void help() {
+		Console.println("Usage: efgToDFA <filename> <modelname>");
+	}
+
+}
Index: trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToMM.java
===================================================================
--- trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToMM.java	(revision 226)
+++ trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/efg/commands/CMDefgToMM.java	(revision 227)
@@ -2,21 +2,11 @@
 
 import java.security.InvalidParameterException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.Random;
 
-import de.ugoe.cs.eventbench.data.Event;
 import de.ugoe.cs.eventbench.data.GlobalDataContainer;
-import de.ugoe.cs.eventbench.efg.data.EFGEvent;
+import de.ugoe.cs.eventbench.efg.EFGModelGenerator;
 import de.ugoe.cs.eventbench.models.FirstOrderMarkovModel;
 import de.ugoe.cs.util.console.Command;
 import de.ugoe.cs.util.console.Console;
-import edu.umd.cs.guitar.model.GUITARConstants;
-import edu.umd.cs.guitar.model.IO;
-import edu.umd.cs.guitar.model.data.EFG;
-import edu.umd.cs.guitar.model.data.EventGraphType;
-import edu.umd.cs.guitar.model.data.EventType;
 
 /**
@@ -47,49 +37,7 @@
 		}
 
-		EFG efg = (EFG) IO.readObjFromFile(filename, EFG.class);
-
-		// extracting the events from the EFG
-		List<EventType> efgEvents = efg.getEvents().getEvent();
-		List<Event<?>> myEvents = new ArrayList<Event<?>>(efgEvents.size());
-		for (EventType event : efgEvents) {
-			/*
-			 * the widgetId and eventId are only hash values, the
-			 * "interpretation" is found in the GUI file.
-			 */
-			Event<?> myEvent = new EFGEvent(event.getEventId());
-			/*
-			 * The target is currently not set to event.widgetId() because the
-			 * WidgetId is not available when loading sequences in form of test
-			 * cases.
-			 */
-			// myEvent.setTarget(event.getWidgetId(););
-			myEvents.add(myEvent);
-		}
-
-		// extracting graph structure from the EFG
-		/*
-		 * getEventGraph returns an adjacency matrix, i.e., a square matrix of
-		 * efgEvents.size(), where a 1 in row i, column j means an edge
-		 * efgEvents.get(i)->efgEvents.get(j) exists.
-		 */
-		EventGraphType efgGraph = efg.getEventGraph();
-
-		FirstOrderMarkovModel model = new FirstOrderMarkovModel(new Random());
-		Collection<List<Event<?>>> subsequences = new LinkedList<List<Event<?>>>();
-
-		int efgSize = efgEvents.size();
-		for (int row = 0; row < efgSize; row++) {
-			for (int col = 0; col < efgSize; col++) {
-				int relation = efgGraph.getRow().get(row).getE().get(col);
-				// otherEvent is followed by currentEvent
-				if (relation != GUITARConstants.NO_EDGE) {
-					List<Event<?>> edge = new LinkedList<Event<?>>();
-					edge.add(myEvents.get(row));
-					edge.add(myEvents.get(col));
-					subsequences.add(edge);
-				}
-			}
-		}
-		model.train(subsequences);
+		EFGModelGenerator modelGenerator = new EFGModelGenerator();
+		FirstOrderMarkovModel model = modelGenerator
+				.efgToFirstOrderMarkovModel(filename);
 		GlobalDataContainer.getInstance().addData(modelname, model);
 	}
