// 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; } }