// 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.plugin.html.commands; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import de.ugoe.cs.autoquest.CommandHelpers; import de.ugoe.cs.autoquest.eventcore.guimodel.GUIModel; import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement; import de.ugoe.cs.autoquest.plugin.html.guimodel.HTMLDocument; import de.ugoe.cs.autoquest.plugin.html.guimodel.HTMLPageElement; import de.ugoe.cs.autoquest.plugin.html.guimodel.HTMLServer; import de.ugoe.cs.util.console.Command; import de.ugoe.cs.util.console.Console; import de.ugoe.cs.util.console.GlobalDataContainer; /** *

* TODO document *

* * @author Patrick Harms * @version 1.0 */ public class CMDcondenseHTMLListStructures implements Command { /* * (non-Javadoc) * * @see de.ugoe.cs.util.console.Command#run(java.util.List) */ @Override public void run(List parameters) { String sequencesName; try { sequencesName = (String) parameters.get(0); } catch (Exception e) { throw new IllegalArgumentException("illegal parameters provided: " + e); } Object dataObject = GlobalDataContainer.getInstance().getData(sequencesName + "_targets"); if (dataObject == null) { CommandHelpers.objectNotFoundMessage(sequencesName + "_targets"); return; } if (!(dataObject instanceof GUIModel)) { CommandHelpers.objectNotType(sequencesName, "GUIModel"); return; } GUIModel model = (GUIModel) dataObject; for (IGUIElement root : model.getRootElements()) { if (root instanceof HTMLServer) { try { condenseListStructures((HTMLServer) root, model); } catch (Exception e) { Console.printerrln ("problems while condensing list structures on pages of server " + root); Console.logException(e); break; } } } } /** *

* *

* * @param server the server of which all documents shall be condensed * @param model the GUI model in which the server is referenced */ private void condenseListStructures(HTMLServer server, GUIModel model) { Console.traceln(Level.INFO, "condensing list structures in documents of " + server); for (IGUIElement document : model.getChildren(server)) { if (document instanceof HTMLDocument) { condenseListStructures((HTMLDocument) document, model, ""); } else { Console.traceln(Level.WARNING, "child " + document + " of server " + server + " is no document"); } } Console.traceln(Level.INFO, "condensed list structures in documents of " + server); } /** *

* TODO: comment *

* * @param document * @param model * @param string */ private void condenseListStructures(HTMLDocument document, GUIModel model, String indent) { for (IGUIElement pageElement : model.getChildren(document)) { if (pageElement instanceof HTMLPageElement) { condenseListStructures((HTMLPageElement) pageElement, model, indent + " "); } else { Console.traceln(Level.WARNING, "child " + pageElement + " of document " + document + " is no page element"); } } } /** *

* TODO: comment *

* * @param pageElement * @param model * @param string */ private List> condenseListStructures(HTMLPageElement pageElement, GUIModel model, String indent) { List children = model.getChildren(pageElement); if ((children == null) || (children.size() == 0)) { // no children, return the element itself as the single entry of a list List> result = new ArrayList<>(); result.add(new ArrayList()); result.get(0).add(pageElement); return result; } // traverse the children for structure information @SuppressWarnings("unchecked") List>[] childPaths = new List[children.size()]; int index = 0; for (IGUIElement childElement : children) { if (childElement instanceof HTMLPageElement) { childPaths[index++] = condenseListStructures((HTMLPageElement) childElement, model, indent + " "); } else { Console.traceln(Level.WARNING, "child " + childElement + " of " + pageElement + " is no page element"); } } // check for equally structured direct sibling children and group them. For this, their // child paths need to be equal ignoring the HTML ids. So check for this. Map> equallyStructured = new HashMap<>(); int indexToCompareTo = 0; equallyStructured.put(indexToCompareTo, new ArrayList()); SEARCH: for (int i = 1; i < childPaths.length; i++) { // compare any with the previous that needs to be compared with. if (childPaths[indexToCompareTo].size() != childPaths[i].size()) { // no equally structured children, try next. indexToCompareTo = i; equallyStructured.put(indexToCompareTo, new ArrayList()); continue SEARCH; } // compare individual child paths, first for their length for (int j = 0; j < childPaths[indexToCompareTo].size(); j++) { List firstPath = childPaths[indexToCompareTo].get(j); List secondPath = childPaths[i].get(j); if (firstPath.size() != secondPath.size()) { // no equally structured children, try next. indexToCompareTo = i; equallyStructured.put(indexToCompareTo, new ArrayList()); continue SEARCH; } // compare individual path elements for (int k = 0; k < firstPath.size(); k++) { if (!firstPath.get(k).getTagName().equals(secondPath.get(k).getTagName())) { // no equally structured children, try next. indexToCompareTo = i; equallyStructured.put(indexToCompareTo, new ArrayList()); continue SEARCH; } } } // found a match equallyStructured.get(indexToCompareTo).add(i); } for (Map.Entry> entry : equallyStructured.entrySet()) { if ((entry.getValue().size() > 1)) { entry.getValue().add(0, entry.getKey()); // check if the equal one have a minimum depth of 3 boolean hasMinDepth = false; for (Integer indexesOfEqualChildren : entry.getValue()) { for (List path : childPaths[indexesOfEqualChildren]) { if (path.size() >= 3) { hasMinDepth = true; break; } } } if (!hasMinDepth) { continue; } // found equally structured children --> dump them System.out.print("tata: " + pageElement.getView() + " "); String log = ""; IGUIElement elem = pageElement; while ((elem != null) && (elem instanceof HTMLPageElement)) { log = elem + "/" + log; elem = elem.getParent(); } System.out.println(log); for (int i = 0; i < entry.getValue().size(); i++) { System.out.println(" child " + (i + 1)); for (int j = 0; j < childPaths[entry.getValue().get(i)].size(); j++) { System.out.print(" "); List path = childPaths[entry.getValue().get(i)].get(j); for (int k = 0; k < path.size(); k++) { System.out.print(path.get(k)); System.out.print('/'); } System.out.println(); } } } } List> result = new ArrayList<>(); for (List> childStructure : childPaths) { for (List childPath : childStructure) { childPath.add(0, pageElement); result.add(childPath); } } return result; } /* * (non-Javadoc) * * @see de.ugoe.cs.util.console.Command#help() */ @Override public String help() { return "condenseHTMLListStructures "; } }