Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/NoLetterOrDigitRatioMetric.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/NoLetterOrDigitRatioMetric.java	(revision 1139)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/NoLetterOrDigitRatioMetric.java	(revision 1139)
@@ -0,0 +1,90 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules.metrics;
+
+import static de.ugoe.cs.autoquest.usability.tasktree.filters.EventTypeFilter.TEXT_INPUT;
+import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.aggregateEnteredTextFromTextInputs;
+import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.characterIsLetterOrDigitPredicate;
+
+import java.util.List;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Optional;
+import com.google.common.collect.Multiset;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
+import de.ugoe.cs.autoquest.usability.result.DefectDescriptionResolver;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRule;
+import de.ugoe.cs.autoquest.usability.tasktree.FilterResult;
+import de.ugoe.cs.autoquest.usability.tasktree.IterativeDFSFilterStrategy;
+import de.ugoe.cs.autoquest.usability.tasktree.filters.TaskTreeFilter;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class NoLetterOrDigitRatioMetric extends UsabilityRule implements UsabilityMetric {
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param taskTree
+     */
+    public NoLetterOrDigitRatioMetric(ITaskTree taskTree) {
+        super(taskTree);
+        this.name = "NoLetterOrDigitRatio";
+        this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName());
+    }
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check()
+     */
+    @Override
+    public Optional<UsabilityDefect> check() {
+        FilterResult textInputEvents = extractNodesFromTaskTree();
+        float evaluationMetric = calculateEvaluationMetric(textInputEvents.nodesMatchedFilter());
+        return this.defect.isPresent(evaluationMetric);
+    }
+    
+    private FilterResult extractNodesFromTaskTree() {
+        return new TaskTreeFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT)
+            .from(this.taskTree);
+    }
+    
+    private float calculateEvaluationMetric(List<ITaskTreeNode> textInputEvents) {
+        Multiset<String> enteredTextFragments =
+            aggregateEnteredTextFromTextInputs(textInputEvents);
+        int allCharactersCount = 0;
+        int noLetterOrDigitCount = 0;
+        for (String textFragment : enteredTextFragments.elementSet()) {
+            int occurencesOfTextFragment = enteredTextFragments.count(textFragment);
+            allCharactersCount += CharMatcher.ANY.countIn(textFragment) * occurencesOfTextFragment;
+            noLetterOrDigitCount +=
+                CharMatcher.forPredicate(characterIsLetterOrDigitPredicate()).countIn(textFragment) *
+                    occurencesOfTextFragment;
+        }
+        return allCharactersCount != 0 ? (float) noLetterOrDigitCount / (float) allCharactersCount
+            : 0;
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputEntryRepetitionsMetric.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputEntryRepetitionsMetric.java	(revision 1139)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputEntryRepetitionsMetric.java	(revision 1139)
@@ -0,0 +1,105 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules.metrics;
+
+import static de.ugoe.cs.autoquest.usability.tasktree.filters.EventTypeFilter.TEXT_INPUT;
+import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.aggregateEnteredTextFromTextInputs;
+
+import java.util.List;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Multiset;
+import com.google.common.collect.Multisets;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
+import de.ugoe.cs.autoquest.usability.result.DefectDescriptionResolver;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRule;
+import de.ugoe.cs.autoquest.usability.tasktree.FilterResult;
+import de.ugoe.cs.autoquest.usability.tasktree.IterativeDFSFilterStrategy;
+import de.ugoe.cs.autoquest.usability.tasktree.filters.TaskTreeFilter;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class TextInputEntryRepetitionsMetric extends UsabilityRule implements UsabilityMetric {
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param taskTree
+     */
+    public TextInputEntryRepetitionsMetric(ITaskTree taskTree) {
+        super(taskTree);
+        this.name = "TextInputEntryRepetitions";
+        this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName());
+    }
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check()
+     */
+    @Override
+    public Optional<UsabilityDefect> check() {
+        FilterResult textInputEvents = extractNodesFromTaskTree();
+        float evaluationMetric = calculateEvaluationMetric(textInputEvents.nodesMatchedFilter());
+        return this.defect.isPresent(evaluationMetric);
+    }
+    
+    private FilterResult extractNodesFromTaskTree() {
+        return new TaskTreeFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT)
+            .from(this.taskTree);
+    }
+    
+    private float calculateEvaluationMetric(List<ITaskTreeNode> textInputEvents) {
+        Multiset<String> enteredTextFragments =
+            aggregateEnteredTextFromTextInputs(textInputEvents);
+        Multiset<String> orderedTextFragmentsWithMultipleOccurences =
+            onlyTextFragmentsWithMultipleOccurences(enteredTextFragments);
+        if (orderedTextFragmentsWithMultipleOccurences.isEmpty())
+            return 0;
+        String wordWithHighestRepetitionInTextFragments =
+            orderedTextFragmentsWithMultipleOccurences.iterator().next();
+        int numberOfRepeatedWords = orderedTextFragmentsWithMultipleOccurences.entrySet().size();
+        int maxRepetitions =
+            orderedTextFragmentsWithMultipleOccurences
+                .count(wordWithHighestRepetitionInTextFragments);
+        return Math.max(numberOfRepeatedWords, maxRepetitions);
+    }
+    
+    private Multiset<String> onlyTextFragmentsWithMultipleOccurences(final Multiset<String> allTextInputs)
+    {
+        return Multisets.copyHighestCountFirst(Multisets.filter(allTextInputs,
+                                                                new Predicate<String>() {
+
+                                                                    @Override
+                                                                    public boolean apply(String word)
+                                                                    {
+                                                                        return allTextInputs
+                                                                            .count(word) > 1;
+                                                                    }
+
+                                                                }));
+    }
+
+}
Index: /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputRatioMetric.java
===================================================================
--- /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputRatioMetric.java	(revision 1139)
+++ /trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputRatioMetric.java	(revision 1139)
@@ -0,0 +1,90 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.usability.rules.metrics;
+
+import static de.ugoe.cs.autoquest.usability.tasktree.filters.EventTypeFilter.TEXT_INPUT;
+
+import java.util.List;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
+import de.ugoe.cs.autoquest.usability.result.DefectDescriptionResolver;
+import de.ugoe.cs.autoquest.usability.result.UsabilityDefect;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric;
+import de.ugoe.cs.autoquest.usability.rules.UsabilityRule;
+import de.ugoe.cs.autoquest.usability.tasktree.FilterResult;
+import de.ugoe.cs.autoquest.usability.tasktree.IterativeDFSFilterStrategy;
+import de.ugoe.cs.autoquest.usability.tasktree.filters.TaskTreeFilter;
+
+/**
+ * <p>
+ * TODO comment
+ * </p>
+ * 
+ * @author Alexander Deicke
+ */
+public class TextInputRatioMetric extends UsabilityRule implements UsabilityMetric {
+
+    /**
+     * <p>
+     * TODO: comment
+     * </p>
+     *
+     * @param taskTree
+     */
+    public TextInputRatioMetric(ITaskTree taskTree) {
+        super(taskTree);
+        this.name = "TextInputRatio";
+        this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName());
+    }
+
+    /* (non-Javadoc)
+     * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check()
+     */
+    @Override
+    public Optional<UsabilityDefect> check() {
+        FilterResult textInputEvents = extractNodesFromTaskTree();
+        float evaluationMetric = calculateEvaluationMetric(textInputEvents.nodesMatchedFilter(), textInputEvents.nodesNotMatchedFilter());
+        return this.defect.isPresent(evaluationMetric);
+    }
+    
+    private FilterResult extractNodesFromTaskTree() {
+        return new TaskTreeFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT)
+            .from(this.taskTree);
+    }
+    
+    private float calculateEvaluationMetric(List<ITaskTreeNode> textInputEvents, List<ITaskTreeNode> nonTextInputEvents) {
+        float numberOfTextInputEvents = textInputEvents.size();
+        float numberOfNonTextInputEvents = nrOfEventNodesNotMatchedFilter(nonTextInputEvents);
+        return numberOfTextInputEvents / (numberOfTextInputEvents + numberOfNonTextInputEvents);
+    }
+
+    private int nrOfEventNodesNotMatchedFilter(List<ITaskTreeNode> nonTextInputEvents) {
+        return Iterables.size(Iterables.filter(nonTextInputEvents,
+                                               new Predicate<ITaskTreeNode>() {
+
+                                                   @Override
+                                                   public boolean apply(ITaskTreeNode node) {
+                                                       return (node.getChildren() == null) ||
+                                                           (node.getChildren().size() == 0);
+                                                   }
+                                               }));
+    }
+
+}
