Ignore:
Timestamp:
08/30/12 14:08:12 (12 years ago)
Author:
pharms
Message:

improved comparison of GUI elements

Location:
trunk/quest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/quest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElement.java

    r681 r714  
    6969     * @return the hashCode 
    7070     */ 
    71     String getElementHash() { 
     71    int getElementHash() { 
    7272        return specification.getElementHash(); 
    7373    } 
     
    8080    @Override 
    8181    public void updateSpecification(IGUIElementSpec updateSpecification) { 
    82         if( updateSpecification instanceof JFCGUIElementSpec ) { 
    83             specification.setName(((JFCGUIElementSpec) updateSpecification).getName()); 
    84             specification.setElementHash(((JFCGUIElementSpec) updateSpecification).getElementHash()); 
     82        if (updateSpecification instanceof JFCGUIElementSpec) { 
     83            specification.update(((JFCGUIElementSpec) updateSpecification)); 
    8584        } 
    8685    } 
     
    107106    @Override 
    108107    public String toString() { 
    109         String str = getElementDescriptor() + "(" + getName() + ", " + getElementHash() + "," + getIcon() + "," + getIndex() +")"; 
     108        String str = getElementDescriptor() + "(" + getName() + "," + getElementHash() + "," + 
     109            getIcon() + "," + getIndex() +")"; 
    110110        return str; 
    111111    } 
  • trunk/quest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/guimodel/JFCGUIElementSpec.java

    r655 r714  
    11package de.ugoe.cs.quest.plugin.jfc.guimodel; 
    22 
    3 import java.util.LinkedList; 
     3import java.util.ArrayList; 
    44import java.util.List; 
    55 
     
    1818public class JFCGUIElementSpec implements IGUIElementSpec { 
    1919 
    20     /** */ 
    21     private List<String> name = new LinkedList<String>(); 
    22      
     20    /** 
     21     * <p> 
     22     * current name of the GUI element 
     23     * </p> 
     24     */ 
     25    private String name; 
     26 
     27    /** 
     28     * <p> 
     29     * previous names of the GUI element as it may have changed over time. 
     30     * </p> 
     31     */ 
     32    private List<String> formerNames = new ArrayList<String>(); 
     33 
    2334    /** */ 
    2435    private String type = null; 
     
    3041    private int index = -1; 
    3142     
    32     /** */ 
    33     private List<String> elementHash = new LinkedList<String>(); 
    34      
     43    /** 
     44     * <p> 
     45     * hash code of the window elemt. Used as unique identifier during its existence. 
     46     * </p> 
     47     */ 
     48    private int elementHash = -1; 
     49 
     50    /** 
     51     * <p> 
     52     * previous handles of the window as the window may have been destroyed and recreated 
     53     * </p> 
     54     */ 
     55    private List<Integer> formerElementHashes = new ArrayList<Integer>(); 
     56 
    3557    /* (non-Javadoc) 
    3658     * @see de.ugoe.cs.quest.eventcore.guimodel.IGUIElementSpec#getSecificationSimilarity(IGUIElementSpec) 
     
    5072        JFCGUIElementSpec otherSpec = (JFCGUIElementSpec) other; 
    5173         
    52         boolean retVal = false; 
    53          
    54         boolean titleEqual = CollectionUtils.containsAny(name, otherSpec.name); 
    55         boolean hashEqual = CollectionUtils.containsAny(elementHash, otherSpec.elementHash); 
    56          
    57         if (type.equals("Class") ) { 
    58             retVal = type.equals(otherSpec.type) && (titleEqual || hashEqual); 
    59         } 
    60         else { 
    61             retVal = type.equals(otherSpec.type) && index==otherSpec.index && 
    62                 (titleEqual || hashEqual); 
    63         } 
    64          
    65         return retVal; 
     74        if ((type != otherSpec.type) && ((type != null) && (!type.equals(otherSpec.type)))) { 
     75            return false; 
     76        } 
     77 
     78        if ((icon != otherSpec.icon) && ((icon != null) && (!icon.equals(otherSpec.icon)))) { 
     79            return false; 
     80        } 
     81 
     82        // up to now, we compared, if the basics match. Now lets compare the id, the name and the 
     83        // index. All may change. The name may be reset (e.g. the title of a frame using the 
     84        // asterisk in the case data was changed). The id may change if e.g. a dialog is closed 
     85        // and reopend, i.e. a new instance is created. The index may change, if later in a panel 
     86        // a new element is added or another one is removed. If the element hash or the name stay 
     87        // the same, then similarity is given. Therefore these are the first two comparisons 
     88         
     89        if (elementHash == otherSpec.elementHash) { 
     90            return true; 
     91        } 
     92         
     93        if ((name != null) && (name.equals(otherSpec.name))) { 
     94            return true; 
     95        } 
     96         
     97        if ((((name == null) && (otherSpec.name == null)) || 
     98             (("".equals(name)) && ("".equals(otherSpec.name)))) && 
     99            (formerNames.size() == 0) && (otherSpec.formerNames.size() == 0)) 
     100        { 
     101            return true; 
     102        } 
     103         
     104        // if the id and the name did not stay the same, then the name should be checked first. 
     105        // One of all known names of one of the specs must be equal to one of the known names of the 
     106        // respective other spec for similarity. Furthermore, if this is given, the index should 
     107        // have stayed the same. 
     108 
     109        if ((otherSpec.name != null) && formerNames.contains(otherSpec.name)) { 
     110            return index == otherSpec.index; 
     111        } 
     112 
     113        if ((name != null) && otherSpec.formerNames.contains(name)) { 
     114            return index == otherSpec.index; 
     115        } 
     116         
     117        if (CollectionUtils.containsAny(formerNames, otherSpec.formerNames)) { 
     118            return index == otherSpec.index; 
     119        } 
     120         
     121        // ok. Even the names do not match. This is usually a clear indication, that the elements 
     122        // are distinct. However, we check, if the former ids matched. This is very unlikely 
     123        // to happen. But it may occur, if a GUI element does not have a name or its name stays 
     124        // the empty string and if this GUI element is created, destroyed, and created again. 
     125        // Again we are restrictive and request the index to be equal as well. 
     126 
     127        if (formerElementHashes.contains(otherSpec.elementHash)) { 
     128            return index == otherSpec.index; 
     129        } 
     130 
     131        if (otherSpec.formerElementHashes.contains(elementHash)) { 
     132            return index == otherSpec.index; 
     133        } 
     134         
     135        if (CollectionUtils.containsAny(formerElementHashes, otherSpec.formerElementHashes)) { 
     136            return index == otherSpec.index; 
     137        } 
     138         
     139        // now we can be really sure, that the GUI elements differ 
     140         
     141        return false; 
    66142    } 
    67143 
     
    102178     */ 
    103179    public String getName() { 
    104         // TODO for now always returns first matched name 
    105         if( name.isEmpty() ) { 
    106             return null; 
    107         } 
    108         return name.get(0); 
     180        StringBuffer names = new StringBuffer(); 
     181         
     182        if (name != null) { 
     183            names.append('"'); 
     184            names.append(name); 
     185            names.append('"'); 
     186        } 
     187        else { 
     188            names.append("NOT_SET"); 
     189        } 
     190         
     191        if (formerNames.size() > 0) { 
     192             
     193            names.append(" (aka "); 
     194             
     195            for (int i = 0; i < formerNames.size(); i++) { 
     196                if (i > 0) { 
     197                    names.append("/"); 
     198                } 
     199 
     200                names.append('"'); 
     201                names.append(formerNames.get(i)); 
     202                names.append('"'); 
     203            } 
     204             
     205            names.append(")"); 
     206        } 
     207         
     208        return names.toString(); 
    109209    } 
    110210 
     
    133233     * @return the elementHash 
    134234     */ 
    135     public String getElementHash() { 
    136         // TODO for now always returns the first hash value 
    137         if( elementHash.isEmpty() ) { 
    138             return null; 
    139         } 
    140         return elementHash.get(0); 
     235    public int getElementHash() { 
     236        return elementHash; 
    141237    } 
    142238 
     
    144240     * @param name the name to set 
    145241     */ 
    146     public void setName(String name) { 
    147         if( !this.name.contains(name) && name!=null ) { 
    148             this.name.add(name); 
    149         } 
     242    public void setName(String newName) { 
     243        if ((this.name != null) && 
     244            (!this.name.equals(newName)) && 
     245            (!this.formerNames.contains(this.name))) 
     246        { 
     247            this.formerNames.add(this.name); 
     248        } 
     249         
     250        this.name = newName; 
    150251    } 
    151252 
     
    174275     * @param elementHash the elementHash to set 
    175276     */ 
    176     public void setElementHash(String elementHash) { 
    177         if( !this.elementHash.contains(elementHash) ) { 
    178             this.elementHash.add(elementHash); 
    179         } 
     277    public void setElementHash(int newElementHash) { 
     278        if ((this.elementHash > -1) && 
     279            !this.formerElementHashes.contains(this.elementHash)) 
     280        { 
     281            this.formerElementHashes.add(this.elementHash); 
     282        } 
     283         
     284        this.elementHash = newElementHash; 
    180285    } 
    181286     
     287    /** 
     288     * <p> 
     289     * TODO: comment 
     290     * </p> 
     291     * 
     292     * @param furtherSpec 
     293     */ 
     294    void update(JFCGUIElementSpec other) { 
     295        if (other != this) { 
     296            for (int formerElementHash : other.formerElementHashes) { 
     297                setElementHash(formerElementHash); 
     298            } 
     299 
     300            if (elementHash != other.elementHash) { 
     301                elementHash = other.elementHash; 
     302            } 
     303 
     304            for (String formerName : other.formerNames) { 
     305                setName(formerName); 
     306            } 
     307 
     308            if ((name != other.name) && (name != null) && (!name.equals(other.name))) 
     309            { 
     310                setName(other.name); 
     311            } 
     312        } 
     313    } 
     314 
    182315    public String toString() { 
    183         return "" + name.toString() + "," + elementHash.toString() + "," + type + "," + "icon"; 
     316        return "[" + getName() + ";\"" + type + "\";\"" + icon + "\";" + index + ";" + 
     317                elementHash + "]"; 
    184318    } 
    185319 
Note: See TracChangeset for help on using the changeset viewer.