Ignore:
Timestamp:
01/02/13 10:09:15 (12 years ago)
Author:
fglaser
Message:
  • The JFCSimplifiedLogParser has been adapted to the new generic GUIElementTree.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/JFCSimplifiedLogParser.java

    r1010 r1027  
    1515import java.util.Map; 
    1616import java.util.logging.Level; 
    17 import java.util.regex.Matcher; 
    18 import java.util.regex.Pattern; 
    1917 
    2018import javax.xml.parsers.ParserConfigurationException; 
     
    7169     */ 
    7270    private JFCEventId currentEventId; 
    73      
     71 
    7472    /** 
    7573     *  
     
    7977     */ 
    8078    private Long currentGUIElementHash; 
    81      
     79 
    8280    /** 
    8381     *  
     
    8785     */ 
    8886    private Long currentParentHash; 
    89      
     87 
    9088    /** 
    9189     * <p> 
     
    9492     */ 
    9593    private Long currentEventSource; 
    96      
     94 
    9795    /** 
    9896     * <p> 
     
    10098     */ 
    10199    private Long currentEventTimestamp = -1l; 
    102       
     100 
    103101    /** 
    104102     * <p> 
     
    114112     */ 
    115113    private List<Event> currentSequence; 
    116     
     114 
    117115    /** 
    118116     * <p> 
     
    127125     * </p> 
    128126     */ 
    129     private GUIElementTree currentGUIElementTree; 
     127    private GUIElementTree<Long> currentGUIElementTree; 
    130128 
    131129    /** 
     
    136134     */ 
    137135    private IGUIElement lastGUIElement; 
    138      
     136 
    139137    /** 
    140138     * <p> 
     
    150148     */ 
    151149    private List<VirtualKey> mPressedKeys = new ArrayList<VirtualKey>(); 
    152      
     150 
    153151    /** 
    154152     * <p> 
     
    225223            saxParser = spf.newSAXParser(); 
    226224            inputSource = 
    227                 new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8")); 
     225                    new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8")); 
    228226        } 
    229227        catch (UnsupportedEncodingException e) { 
     
    257255            catch (SAXParseException e) { 
    258256                Console.printerrln("Failure parsing file in line " + e.getLineNumber() + 
    259                     ", column " + e.getColumnNumber() + "."); 
     257                                   ", column " + e.getColumnNumber() + "."); 
    260258                Console.logException(e); 
    261259                return; 
     
    303301     */ 
    304302    public void startElement(String uri, String localName, String qName, Attributes atts) 
    305         throws SAXException{ 
     303            throws SAXException{ 
    306304        if (qName.equals("sessions")) { 
    307305            currentSequence = new LinkedList<Event>(); 
    308306            if (currentGUIElementTree == null) 
    309                 currentGUIElementTree = new GUIElementTree(); 
     307                currentGUIElementTree = new GUIElementTree<Long>(); 
    310308        } 
    311309        if (qName.equals("newsession")) { 
     
    318316        } 
    319317        else if (qName.equals("component")) { 
    320                 currentGUIElementHash = Long.parseLong(atts.getValue("hash"), 16); 
    321                 currentGuiElementSpec = new JFCGUIElementSpec(); 
    322                 currentGuiElementSpec.setElementHash((int) currentGUIElementHash.longValue()); 
     318            currentGUIElementHash = Long.parseLong(atts.getValue("hash"), 16); 
     319            currentGuiElementSpec = new JFCGUIElementSpec(); 
     320            currentGuiElementSpec.setElementHash((int) currentGUIElementHash.longValue()); 
    323321        } 
    324322        else if (qName.equals("event")) { 
     
    330328        } 
    331329        else if (qName.equals("componentNameChange")) { 
    332                 int sourceHash = (int) Long.parseLong(atts.getValue("hash"), 16); 
    333                 String newName = atts.getValue("newName"); 
    334                 int titleSource = Integer.parseInt(atts.getValue("titleSource")); 
    335                 JFCGUIElement sourceElement = (JFCGUIElement) currentGUIElementTree.find(sourceHash); 
    336                 JFCGUIElementSpec sourceSpec = (JFCGUIElementSpec) sourceElement.getSpecification(); 
    337                 sourceSpec.setName(newName); 
     330            long sourceHash = Long.parseLong(atts.getValue("hash"), 16); 
     331            String newName = atts.getValue("newName"); 
     332            // int titleSource = Integer.parseInt(atts.getValue("titleSource")); 
     333            JFCGUIElement sourceElement = (JFCGUIElement) currentGUIElementTree.find(sourceHash); 
     334            JFCGUIElementSpec sourceSpec = (JFCGUIElementSpec) sourceElement.getSpecification(); 
     335            sourceSpec.setName(newName); 
    338336        } 
    339337        else if (qName.equals("param")) { 
    340                 if (currentEventId != null){ 
    341                         if ("source".equals(atts.getValue("name"))){ 
    342                                 currentEventSource = Long.parseLong(atts.getValue("value"), 16); 
    343                         } 
    344                         if ("timestamp".equals(atts.getValue("name"))){ 
    345                                 currentEventTimestamp = Long.parseLong(atts.getValue("value")); 
    346                         } 
     338            if (currentEventId != null){ 
     339                if ("source".equals(atts.getValue("name"))){ 
     340                    currentEventSource = Long.parseLong(atts.getValue("value"), 16); 
     341                } 
     342                if ("timestamp".equals(atts.getValue("name"))){ 
     343                    currentEventTimestamp = Long.parseLong(atts.getValue("value")); 
     344                } 
    347345                currentEventParameters.put(atts.getValue("name"), atts.getValue("value")); 
    348346            } else if(currentGUIElementHash != null){ 
    349                 if ("title".equals(atts.getValue("name"))) { 
    350                                 currentGuiElementSpec.setName(atts.getValue("value")); 
    351                         } 
    352                         else if ("class".equals(atts.getValue("name"))) { 
    353                                 currentGuiElementSpec.setType(atts.getValue("value")); 
    354                         } 
    355                         else if ("icon".equals(atts.getValue("name"))) { 
    356                                 currentGuiElementSpec.setIcon(atts.getValue("value")); 
    357                         } 
    358                         else if ("index".equals(atts.getValue("name"))) { 
    359                                 currentGuiElementSpec.setIndex(Integer.parseInt(atts.getValue("value"))); 
    360                         } 
    361                         else if ("parent".equals(atts.getValue("name"))) { 
    362                                 currentParentHash = Long.parseLong(atts.getValue("value"), 16); 
    363                         } 
     347                if ("title".equals(atts.getValue("name"))) { 
     348                    currentGuiElementSpec.setName(atts.getValue("value")); 
     349                } 
     350                else if ("class".equals(atts.getValue("name"))) { 
     351                    currentGuiElementSpec.setType(atts.getValue("value")); 
     352                } 
     353                else if ("icon".equals(atts.getValue("name"))) { 
     354                    currentGuiElementSpec.setIcon(atts.getValue("value")); 
     355                } 
     356                else if ("index".equals(atts.getValue("name"))) { 
     357                    currentGuiElementSpec.setIndex(Integer.parseInt(atts.getValue("value"))); 
     358                } 
     359                else if ("parent".equals(atts.getValue("name"))) { 
     360                    currentParentHash = Long.parseLong(atts.getValue("value"), 16); 
     361                } 
    364362            } 
    365363        } 
    366364        else if (qName.equals("ancestor")){ 
    367                         currentTypeHierarchy.add(atts.getValue("name")); 
     365            currentTypeHierarchy.add(atts.getValue("name")); 
    368366        } 
    369367        else if (qName.equals("ancestors")){ 
    370                         currentTypeHierarchy = new LinkedList<String>(); 
     368            currentTypeHierarchy = new LinkedList<String>(); 
    371369        } 
    372370    } 
     
    387385        } 
    388386        else if (qName.equals("ancestors")){ 
    389                 currentGuiElementSpec.setTypeHierarchy(currentTypeHierarchy); 
     387            currentGuiElementSpec.setTypeHierarchy(currentTypeHierarchy); 
    390388        } 
    391389        else if (qName.equals("component") && currentGUIElementHash != null) { 
    392                 currentGUIElementTree.add(currentGUIElementHash, currentParentHash, currentGuiElementSpec); 
    393                 // do something with the ancestor list here 
    394                  
    395                 currentGUIElementHash = null; 
    396                 currentParentHash = null; 
    397                 currentTypeHierarchy = null; 
     390            currentGUIElementTree.add(currentGUIElementHash, currentParentHash, currentGuiElementSpec); 
     391 
     392            currentGUIElementHash = null; 
     393            currentParentHash = null; 
     394            currentTypeHierarchy = null; 
    398395        } 
    399396        else if (currentEventId != null) { 
    400397            if (qName.equals("event")) { 
    401                  
     398 
    402399                IGUIElement currentGUIElement; 
    403400                currentGUIElement = currentGUIElementTree.find(currentEventSource); 
    404                  
     401 
    405402                Event event = new Event 
    406                     (instantiateInteraction(currentEventId, currentEventParameters), 
    407                      (currentGUIElement == null ? lastGUIElement : currentGUIElement)); 
     403                        (instantiateInteraction(currentEventId, currentEventParameters), 
     404                         (currentGUIElement == null ? lastGUIElement : currentGUIElement)); 
    408405                event.setTimestamp(currentEventTimestamp); 
    409406                JFCGUIElement currentEventTarget = (JFCGUIElement) event.getTarget(); 
    410407                currentEventTarget.markAsUsed(); 
    411                  
     408 
    412409                currentSequence.add(event); 
    413                  
     410 
    414411                currentEventParameters = null; 
    415412                currentEventId = null; 
    416413                currentEventTimestamp = -1l; 
    417                  
     414 
    418415                if (currentGUIElement != null) { 
    419416                    lastGUIElement = currentGUIElement; 
    420417                } 
    421                  
     418 
    422419                currentGUIElement = null; 
    423420            } 
     
    442439    private IInteraction instantiateInteraction(JFCEventId          eventId, 
    443440                                                Map<String, String> eventParameters) 
    444       throws SAXException 
    445     { 
     441                                                        throws SAXException 
     442                                                        { 
    446443        switch (eventId) 
    447444        { 
     
    467464                throw new SAXException("unhandled event id " + eventId); 
    468465        } 
    469     } 
     466                                                        } 
    470467 
    471468    /** 
     
    485482     */ 
    486483    private IInteraction handleMouseAction(JFCEventId eventId, Map<String, String> eventParameters) 
    487         throws SAXException 
    488     { 
     484            throws SAXException 
     485            { 
    489486        MouseButtonInteraction.Button button = null; 
    490487 
     
    532529            throw new SAXException("unknown event id " + eventId); 
    533530        } 
    534     } 
     531            } 
    535532 
    536533    /** 
     
    552549     */ 
    553550    private IInteraction handleKeyAction(JFCEventId eventId, Map<String, String> eventParameters) 
    554       throws SAXException 
    555     { 
     551            throws SAXException 
     552            { 
    556553        // TODO handle shortcuts 
    557554        if (JFCEventId.KEY_PRESSED == eventId) 
     
    572569            { 
    573570                Console.traceln(Level.SEVERE, "log file has an error, as it contains a key up event on key " + 
    574                                    key + " for which there is no preceeding key down event"); 
     571                        key + " for which there is no preceeding key down event"); 
    575572            } 
    576573 
     
    579576 
    580577        throw new SAXException("unknown event id " + eventId); 
    581     } 
     578            } 
    582579 
    583580    /** 
     
    596593     */ 
    597594    private IInteraction handleNewFocus(JFCEventId eventId, Map<String, String> eventParameters) 
    598         throws SAXException 
    599     { 
     595            throws SAXException 
     596            { 
    600597        if (JFCEventId.FOCUS_GAINED == eventId) 
    601598        { 
     
    606603            throw new SAXException("unknown event id " + eventId); 
    607604        } 
    608     } 
    609  
    610     /** 
    611      * <p> 
    612      * for some events in the log file, no GUI element specification is provided. In this case the 
    613      * GUI element on which the event is executed must be determined based on the 
    614      * <code>toString</code> parameter of the event. This is achieved through this method. The 
    615      * <code>toString</code> parameter does not always carry sufficient information for the GUI 
    616      * elements. For example the title is not necessarily provided. Therefore some of this 
    617      * information is generated. 
    618      * </p> 
    619      * 
    620      * @param toStringValue 
    621      *            the <code>toString</code> parameter of the event to be parsed for the GUI element 
    622      *             
    623      * @return the appropriate GUI Element 
    624      *  
    625      * @throws SAXException thrown if the provided value of the <code>toString</code> parameter 
    626      *                      can not be parsed 
    627      */ 
    628     private void getGUIElementSpecFromToString(String toStringValue) 
    629         throws SAXException 
    630     { 
    631         try 
    632         { 
    633             // match the following: <type>[<parameters>] 
    634             String pattern = "([\\w$\\.]*)\\[(.*)\\]"; 
    635             Matcher matcher = Pattern.compile(pattern).matcher(toStringValue); 
    636  
    637             if (!matcher.find()) 
    638             { 
    639                 throw new IllegalArgumentException 
    640                     ("could not parse target from toString parameter"); 
    641             } 
    642  
    643             String type = matcher.group(1); 
    644              
    645             // match the following: <parameter>|, 
    646             // where <parameter> := <digitValue>|<value>|<key>"="<value> 
    647             pattern = "([\\w$@=\\.]*)|,"; 
    648  
    649             matcher = Pattern.compile(pattern).matcher(matcher.group(2)); 
    650              
    651             float elementHash = -1; 
    652              
    653             pattern = "(([\\d]*)|([\\w$]*)|(([\\w$@\\.]*)=([\\w$@\\.]*)))\\z"; 
    654             Pattern valuePattern = Pattern.compile(pattern); 
    655              
    656             while (matcher.find()) { 
    657                 Matcher valueMatcher = valuePattern.matcher(matcher.group(1)); 
    658                 if (valueMatcher.find()) { 
    659                     if ((valueMatcher.group(2) != null) && (!"".equals(valueMatcher.group(2)))) { 
    660                         // found digit value. Those in combination usually denote the position 
    661                         // of the GUI element. So calculate an element has out of them 
    662                         elementHash += Integer.parseInt(valueMatcher.group(2)); 
    663                     } 
    664                     else if ((valueMatcher.group(5) != null) && 
    665                              (!"".equals(valueMatcher.group(5))) && 
    666                              (valueMatcher.group(6) != null) && 
    667                              (!"".equals(valueMatcher.group(6)))) 
    668                     { 
    669                         // found a key value pair. Get some of them and integrate them into the hash  
    670                         String key = valueMatcher.group(5); 
    671                          
    672                         if ("alignmentX".equals(key) || "alignmentY".equals(key)) { 
    673                             elementHash += Float.parseFloat(valueMatcher.group(6)); 
    674                         } 
    675                     } 
    676                 } 
    677             } 
    678  
    679             currentGuiElementSpec.setName("unknown(" + ((int) elementHash) + ")"); 
    680             currentGuiElementSpec.setType(type); 
    681             currentGuiElementSpec.setIndex(-1); 
    682             currentGuiElementSpec.setElementHash((int) elementHash); 
    683         } 
    684         catch (Exception e) 
    685         { 
    686             throw new SAXException("could not parse target", e); 
    687         } 
    688     } 
    689      
     605            } 
     606 
    690607    /** 
    691608     * <p> 
Note: See TracChangeset for help on using the changeset viewer.