// 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.patterns;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import de.ugoe.cs.autoquest.eventcore.IEventTarget;
import de.ugoe.cs.autoquest.eventcore.IEventType;
import de.ugoe.cs.autoquest.eventcore.StringEventType;
import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskVisitor;
import de.ugoe.cs.autoquest.test.DummyGUIElement;
import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTargetFilter;
import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter;
import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter;
/**
*
* TODO comment
*
*
* @author Alexander Deicke
*/
public abstract class InteractionPatternVisitor implements ITaskVisitor {
protected TaskTypeFilter taskType;
protected EventTypeFilter eventType;
protected EventTargetFilter eventTarget;
protected InteractionPattern containedPattern;
protected boolean present = false;
protected List retainedSelectionTasks = Lists.newArrayList();
/*
* (non-Javadoc)
*
* @see
* de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc
* .IEventTask)
*/
public void visit(IEventTask event) {
if (!this.present && isEventVisitor()) {
boolean matchesEventType = matchesEventType(event.getEventType());
boolean matchesEventTarget = matchesEventTarget(event.getEventTarget());
this.present = eventTarget != null ? matchesEventType && matchesEventTarget : matchesEventType;
}
}
private boolean matchesEventType(IEventType eventType) {
if (eventType instanceof StringEventType) {
return eventType.toString().equals(nameOfEventType());
}
else {
return eventType.getClass().equals(this.eventType.clazz());
}
}
private boolean matchesEventTarget(IEventTarget eventTarget) {
if(this.eventTarget != null) {
if(eventTarget instanceof DummyGUIElement) {
return false;
} else {
return eventTarget.getClass().equals(this.eventTarget.clazz());
}
}
return false;
}
public boolean isEventVisitor() {
return this.eventType != null && this.containedPattern == null;
}
protected String nameOfEventType() {
String ret = StringUtils.EMPTY;
Iterable splitted = Splitter.on("_").split(this.eventType.name());
for (String str : splitted) {
str = str.toLowerCase();
ret += Character.toString(str.charAt(0)).toUpperCase() + str.substring(1);
}
return ret;
}
/*
* (non-Javadoc)
*
* @see
* de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#accept(de.ugoe.cs.autoquest.tasktrees.
* treeifc.ITask)
*/
@Override
public void visit(ITask task) {
if (task instanceof ISequence) {
this.visit((ISequence) task);
}
else if (task instanceof IIteration) {
this.visit((IIteration) task);
}
else if (task instanceof ISelection) {
this.visit((ISelection) task);
}
else {
this.visit((IOptional) task);
}
}
/*
* (non-Javadoc)
*
* @see
* de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc
* .ISelection)
*/
public void visit(ISelection selection) {
if (isEventVisitor()) {
retainNodesWherePatternIsPresent(selection);
this.present = patternIsPresent();
}
else {
this.present = containedPattern.containedIn(selection);
}
}
@SuppressWarnings("unchecked")
protected void retainNodesWherePatternIsPresent(ISelection selection) {
for (ITask task : selection.getChildren()) {
this.present = false;
task.accept(this);
if (this.present && this.taskType.filterPredicate().apply(selection)) {
this.retainedSelectionTasks.add(selection);
}
if (this.present) {
break;
}
}
}
private boolean patternIsPresent() {
return !this.retainedSelectionTasks.isEmpty();
}
/**
*
* TODO: comment
*
*
* @return
*/
public boolean isPresent() {
return this.present;
}
/**
*
* TODO: comment
*
*
*/
public void reset() {
this.retainedSelectionTasks.clear();
this.present = false;
}
/**
*
* TODO: comment
*
*
* @return
*/
public boolean hasExcludedSelectionNodes() {
return patternIsPresent();
}
/**
*
* TODO: comment
*
*
* @return
*/
public List getRetainedSelectionNodes() {
return this.retainedSelectionTasks;
}
}