Changeset 840


Ignore:
Timestamp:
09/20/12 14:55:07 (12 years ago)
Author:
pharms
Message:
  • corrected erroneous reuse of a component at a different place in the hierarchy just because it has the same toString parameter
  • followed the advice of Mr. Dr. Big to implement everything more defensive
File:
1 edited

Legend:

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

    r834 r840  
    1111import java.io.UnsupportedEncodingException; 
    1212import java.util.ArrayList; 
     13import java.util.Collections; 
    1314import java.util.HashMap; 
    1415import java.util.List; 
     
    262263    { 
    263264        if (qName.equals("sessions")) { 
    264             currentSession = new Session(); 
    265             currentSession.type = "sessions"; 
     265            if (currentSession != null) { 
     266                throw new SAXException("nested sessions are not allowed"); 
     267            } 
     268             
     269            currentSession = new Session("sessions"); 
    266270        } 
    267271        else if (qName.equals("newsession")) { 
     
    270274            } 
    271275             
    272             currentSession = new Session(); 
    273             currentSession.type = "newsession"; 
     276            currentSession = new Session("newsession"); 
    274277        } 
    275278        else if (qName.equals("event")) { 
    276             currentEvent = new Event(); 
    277             currentEvent.id = atts.getValue("id"); 
     279            if (currentEvent != null) { 
     280                throw new SAXException("nested events are not allowed"); 
     281            } 
     282             
     283            currentEvent = new Event(atts.getValue("id")); 
    278284        } 
    279285        else if (qName.equals("source")) { 
     286            if (currentSource != null) { 
     287                throw new SAXException("nested sources are not allowed"); 
     288            } 
     289             
    280290            currentSource = new Source(); 
    281291        } 
    282292        else if (qName.equals("component")) { 
     293            if (currentComponent != null) { 
     294                throw new SAXException("nested components are not allowed"); 
     295            } 
     296             
    283297            currentComponent = new Component(); 
    284298        } 
    285299        else if (qName.equals("param")) { 
    286300            if (currentComponent != null) { 
    287                 currentComponent.params.add 
    288                     (new String[] {atts.getValue("name"), atts.getValue("value") }); 
     301                currentComponent.addParameter(atts.getValue("name"), atts.getValue("value")); 
    289302            } 
    290303            else if (currentSource != null) { 
    291                 currentSource.params.add 
    292                     (new String[] {atts.getValue("name"), atts.getValue("value") }); 
     304                currentSource.addParameter(atts.getValue("name"), atts.getValue("value")); 
    293305            } 
    294306            else if (currentEvent != null) { 
    295                 currentEvent.params.add 
    296                     (new String[] {atts.getValue("name"), atts.getValue("value") }); 
     307                currentEvent.addParameter(atts.getValue("name"), atts.getValue("value")); 
    297308            } 
    298309            else { 
     
    313324    @Override 
    314325    public void endElement(String uri, String localName, String qName) throws SAXException { 
     326        // we do not have to check, if the current objects are null, as the Parser itself will 
     327        // throw an exception, if there is a closing tag for a non existent opening tag. But 
     328        // with a correct opening tag, the member variables will not be null (see startElement()) 
    315329        if (qName.equals("sessions")) { 
    316330            correctSources(currentSession); 
     
    328342        } 
    329343        else if (qName.equals("event")) { 
    330             currentSession.events.add(currentEvent); 
     344            currentSession.addEvent(currentEvent); 
    331345            currentEvent = null; 
    332346        } 
    333347        else if (qName.equals("source")) { 
    334             currentEvent.source = getUniqueSource(currentSource); 
     348            currentEvent.setSource(getUniqueSource(currentSource)); 
    335349            currentSource = null; 
    336350        } 
    337351        else if (qName.equals("component")) { 
    338             currentSource.components.add(currentComponent); 
     352            currentSource.addComponent(currentComponent); 
    339353            currentComponent = null; 
    340354        } 
     
    347361    /** 
    348362     * <p> 
    349      * stores a parsed source for later correction or reuse 
     363     * returns a source object, that is equal to the provided one but that is unique throughout 
     364     * the parsing process. The method may return the provided source, if this is the first 
     365     * occurrence of this source. This method is needed to reduce the amount of source 
     366     * representations that are instantiated during parsing log files.  
    350367     * </p> 
    351368     * 
    352      * @param source the source to store 
     369     * @param source the source to search for a unique representation 
     370     *  
     371     * @return the unique representation of the source 
    353372     */ 
    354373    private Source getUniqueSource(Source source) { 
    355         String toStringValue = getToStringParam(source); 
    356  
    357         Source existingSource = findSource(toStringValue); 
     374        Source existingSource = null; 
     375         
     376        List<Source> candidates = allSources.get(source.getToStringValue()); 
     377         
     378        if (candidates != null) { 
     379            for (Source candidate : candidates) { 
     380                if (candidate.equals(source)) { 
     381                    existingSource = candidate; 
     382                    break; 
     383                } 
     384            } 
     385        } 
    358386         
    359387        if (existingSource == null) { 
    360             List<Source> sources = allSources.get(toStringValue); 
    361          
    362             if (sources == null) { 
    363                 sources = new ArrayList<Source>(); 
    364                 allSources.put(toStringValue, sources); 
    365             } 
    366              
    367             sources.add(source); 
     388            if (candidates == null) { 
     389                candidates = new ArrayList<Source>(); 
     390                allSources.put(source.getToStringValue(), candidates); 
     391            } 
     392             
     393            candidates.add(source); 
    368394            existingSource = source; 
    369395        } 
     
    376402     * convenience method to find a source based on its <code>toString</code> parameter value. 
    377403     * The method only returns sources, which match the provided <code>toString</code> 
    378      * representation and which have a valid list of components. 
     404     * representation and which have a valid list of components (size greater 0). 
    379405     * </p> 
    380406     * 
     
    385411     *         none is found 
    386412     */ 
    387     private Source findSource(String toStringValue) { 
     413    private Source findValidSource(String toStringValue) { 
    388414        Source existingSource = null; 
    389415         
     
    392418        if (candidates != null) { 
    393419            for (Source candidate : candidates) { 
    394                 if (toStringValue.equals(getToStringParam(candidate)) && 
    395                     (candidate.components != null) && (candidate.components.size() > 0)) 
     420                if ((candidate.getComponents() != null) && (candidate.getComponents().size() > 0)) 
    396421                { 
    397422                    existingSource = candidate; 
     
    414439    private void correctSources(Session session) { 
    415440        Source previousSource = null; 
    416         for (Event event : session.events) { 
    417             if ((event.source == null) || (event.source.components == null) || 
    418                 (event.source.components.size() == 0)) 
     441        for (Event event : session.getEvents()) { 
     442            if ((event.getSource() == null) || (event.getSource().getComponents() == null) || 
     443                (event.getSource().getComponents().size() == 0)) 
    419444            { 
    420445                correctEventSource(event, previousSource); 
    421446            } 
    422447             
    423             previousSource = event.source; 
     448            previousSource = event.getSource(); 
    424449        } 
    425450    } 
     
    439464     */ 
    440465    private void correctEventSource(Event event, Source previousSource) { 
    441         String toStringValue = null; 
    442          
    443         if ((event.source != null) && (event.source.params != null)) { 
    444             toStringValue = getToStringParam(event.source); 
    445         } 
    446          
    447466        Source existingSource = null; 
    448467         
    449         if (toStringValue != null) { 
    450             existingSource = findSource(toStringValue); 
     468        if ((event.getSource() != null) && (event.getSource().getToStringValue() != null)) { 
     469            existingSource = findValidSource(event.getSource().getToStringValue()); 
    451470        } 
    452471         
    453472        if (existingSource != null) { 
    454             event.source = existingSource; 
     473            event.setSource(existingSource); 
    455474        } 
    456475        else { 
    457476            if (previousSource != null) { 
    458                 for (String[] parameterOfPreviousSource : previousSource.params) { 
     477                for (Parameter parameterOfPreviousSource : previousSource.getParameters()) { 
    459478                    boolean foundParameter = false; 
    460                     for (String[] parameter : event.source.params) { 
    461                         if (parameter[0].equals(parameterOfPreviousSource[0])) { 
     479                    for (Parameter parameter : event.getSource().getParameters()) { 
     480                        if (parameter.getName().equals(parameterOfPreviousSource.getName())) { 
    462481                            foundParameter = true; 
    463482                            break; 
     
    466485 
    467486                    if (!foundParameter) { 
    468                         event.source.params.add(parameterOfPreviousSource); 
     487                        event.getSource().addParameter(parameterOfPreviousSource); 
    469488                    } 
    470489                } 
    471490     
    472                 for (Component component : previousSource.components) { 
     491                for (Component component : previousSource.getComponents()) { 
    473492                    if (!(component instanceof ComponentFromToString)) { 
    474                         event.source.components.add(component); 
     493                        event.getSource().addComponent(component); 
    475494                    } 
    476495                } 
    477496            } 
    478497 
    479             event.source.components.add(getComponentFromToString(toStringValue)); 
    480         } 
    481     } 
    482  
    483     /** 
    484      * <p> 
    485      * retrieves the value of the <code>toString</code> parameter of the provided source. 
    486      * </p> 
    487      * 
    488      * @param source the source to read the parameter of 
    489      * @return the value of the parameter 
    490      */ 
    491     private String getToStringParam(Source source) { 
    492         String value = null; 
    493          
    494         for (String[] param : source.params) { 
    495             if (("toString".equals(param[0])) && (param[1] != null) && (!"".equals(param[1]))) { 
    496                 value = param[1]; 
    497                 break; 
    498             } 
    499         } 
    500          
    501         return value; 
     498            event.getSource().addComponent 
     499                (getComponentFromToString(event.getSource().getToStringValue())); 
     500        } 
    502501    } 
    503502 
     
    527526        int end = toStringValue.indexOf(',', start); 
    528527         
    529         component.x = Integer.parseInt(toStringValue.substring(start, end)); 
     528        component.setX(Integer.parseInt(toStringValue.substring(start, end))); 
    530529         
    531530        start = end + 1; 
    532531        end = toStringValue.indexOf(',', start); 
    533532 
    534         component.y = Integer.parseInt(toStringValue.substring(start, end)); 
     533        component.setY(Integer.parseInt(toStringValue.substring(start, end))); 
    535534 
    536535        start = end + 1; 
    537536        end = toStringValue.indexOf('x', start); 
    538537 
    539         component.width = Integer.parseInt(toStringValue.substring(start, end)); 
     538        component.setWidth(Integer.parseInt(toStringValue.substring(start, end))); 
    540539 
    541540        start = end + 1; 
    542541        end = toStringValue.indexOf(',', start); 
    543542 
    544         component.height = Integer.parseInt(toStringValue.substring(start, end)); 
     543        component.setHeight(Integer.parseInt(toStringValue.substring(start, end))); 
    545544 
    546545        // no start parsing the rest of the parameters and extract those having a key and a  
     
    619618                         "org.argouml.core.propertypanels.ui.LabelledComponent".equals(clazz)) 
    620619                { 
    621                     title += "position " + component.x + "/" + component.y + ", "; 
     620                    title += "position " + component.getX() + "/" + component.getY() + ", "; 
    622621                } 
    623622                 
     
    629628        } 
    630629         
    631         component.params.add(new String[] { "title", title } ); 
    632         component.params.add(new String[] { "class", clazz } ); 
    633         component.params.add(new String[] { "icon", icon } ); 
    634         component.params.add(new String[] { "index", "-1" }); 
     630        component.addParameter("title", title); 
     631        component.addParameter("class", clazz); 
     632        component.addParameter("icon", ((icon == null) ? "" : icon)); 
     633        component.addParameter("index", "-1"); 
    635634         
    636635        int hashCode = clazz.hashCode() + title.hashCode(); 
     
    640639        } 
    641640         
    642         component.params.add(new String[] { "hash", Integer.toString(hashCode, 16) }); 
     641        component.addParameter("hash", Integer.toString(hashCode, 16)); 
    643642 
    644643        return component; 
     
    650649     * </p> 
    651650     */ 
    652     private void dumpParams(PrintStream out, List<String[]> params, String indent) { 
    653         for (String[] param : params) { 
     651    private void dumpParams(PrintStream out, List<Parameter> params, String indent) { 
     652        for (Parameter param : params) { 
    654653            out.print(indent); 
    655654            out.print("<param name=\""); 
    656             out.print(StringTools.xmlEntityReplacement(param[0])); 
     655            out.print(StringTools.xmlEntityReplacement(param.getName())); 
    657656            out.print("\" value=\""); 
    658             out.print(StringTools.xmlEntityReplacement(param[1])); 
     657            out.print(StringTools.xmlEntityReplacement(param.getValue())); 
    659658            out.println("\" />"); 
    660659        } 
    661660         
    662661    } 
     662     
     663    /** 
     664     * <p> 
     665     * check if two parameter lists are equal. Thea are equal if the contain the same parameters 
     666     * ignoring their order. 
     667     * </p> 
     668     * 
     669     * @param params1 the first parameter list to be compared 
     670     * @param params2 the second parameter list to be compared 
     671     *  
     672     * @return true if both lists contain the same parameters, false else. 
     673     */ 
     674    private boolean parametersEqual(List<Parameter> params1, List<Parameter> params2) { 
     675        if (params1 == null) { 
     676            return params2 == null; 
     677        } 
     678         
     679        if (params2 == null) { 
     680            return false; 
     681        } 
     682         
     683        if (params1.size() != params2.size()) { 
     684            return false; 
     685        } 
     686         
     687        boolean found; 
     688        for (Parameter param1 : params1) { 
     689            found = false; 
     690             
     691            for (Parameter param2 : params2) { 
     692                if (param1.equals(param2)) { 
     693                    found = true; 
     694                    break; 
     695                } 
     696            } 
     697             
     698            if (!found) { 
     699                return false; 
     700            } 
     701        } 
     702         
     703        return true; 
     704    } 
     705     
    663706     
    664707    /** 
     
    668711     */ 
    669712    private class Session { 
     713         
     714        /** */ 
    670715        private String type; 
     716         
     717        /** */ 
    671718        private List<Event> events = new ArrayList<Event>(); 
    672719         
    673         public void dump(PrintStream out) { 
     720        /** 
     721         *  
     722         */ 
     723        private Session(String type) { 
     724            if (type == null) { 
     725                throw new IllegalArgumentException("type must not be null"); 
     726            } 
     727             
     728            this.type = type; 
     729        } 
     730         
     731        /** 
     732         *  
     733         */ 
     734        private void addEvent(Event event) { 
     735            if (event == null) { 
     736                throw new IllegalArgumentException("event must not be null"); 
     737            } 
     738             
     739            events.add(event); 
     740        } 
     741         
     742        /** 
     743         * @return the events 
     744         */ 
     745        private List<Event> getEvents() { 
     746            return Collections.unmodifiableList(events); 
     747        } 
     748 
     749        /** 
     750         *  
     751         */ 
     752        private void dump(PrintStream out) { 
     753            if (out == null) { 
     754                throw new IllegalArgumentException("out must not be null"); 
     755            } 
     756             
    674757            out.print("<"); 
    675758            out.print(type); 
     
    692775     */ 
    693776    private class Event { 
     777 
     778        /** */ 
    694779        private String id; 
    695         private List<String[]> params = new ArrayList<String[]>(); 
     780 
     781        /** */ 
     782        private List<Parameter> params = new ArrayList<Parameter>(); 
     783 
     784        /** */ 
    696785        private Source source; 
    697786         
     787        /** 
     788         *  
     789         */ 
     790        private Event(String id) { 
     791            if (id == null) { 
     792                throw new IllegalArgumentException("id must not be null"); 
     793            } 
     794             
     795            this.id = id; 
     796        } 
     797         
     798        /** 
     799         * @param source the source to set 
     800         */ 
     801        private void setSource(Source source) { 
     802            this.source = source; 
     803        } 
     804 
     805        /** 
     806         * @return the source 
     807         */ 
     808        private Source getSource() { 
     809            return source; 
     810        } 
     811 
     812        /** 
     813         *  
     814         */ 
     815        private void addParameter(String name, String value) { 
     816            if (name == null) { 
     817                throw new IllegalArgumentException("name must not be null"); 
     818            } 
     819             
     820            if (value == null) { 
     821                throw new IllegalArgumentException("value must not be null"); 
     822            } 
     823             
     824            params.add(new Parameter(name, value)); 
     825        } 
     826         
     827        /** 
     828         *  
     829         */ 
    698830        private void dump(PrintStream out) { 
     831            if (out == null) { 
     832                throw new IllegalArgumentException("out must not be null"); 
     833            } 
     834             
    699835            out.print("<event id=\""); 
    700836            out.print(StringTools.xmlEntityReplacement(id)); 
     
    714850     */ 
    715851    private class Source { 
    716         private List<String[]> params = new ArrayList<String[]>(); 
     852         
     853        /** */ 
     854        private List<Parameter> params = new ArrayList<Parameter>(); 
     855         
     856        /** */ 
    717857        private List<Component> components = new ArrayList<Component>(); 
    718  
     858         
     859        /** */ 
     860        private String toStringValue = null; 
     861 
     862        /** 
     863         * 
     864         */ 
     865        private String getToStringValue() { 
     866            if (toStringValue == null) { 
     867                for (Parameter param : params) { 
     868                    if (("toString".equals(param.getName())) && 
     869                        (param.getValue() != null) && (!"".equals(param.getValue()))) 
     870                    { 
     871                        toStringValue = param.getValue(); 
     872                        break; 
     873                    } 
     874                } 
     875            } 
     876             
     877            return toStringValue; 
     878        } 
     879 
     880        /** 
     881         *  
     882         */ 
     883        private void addParameter(String name, String value) { 
     884            if (name == null) { 
     885                throw new IllegalArgumentException("name must not be null"); 
     886            } 
     887             
     888            if (value == null) { 
     889                throw new IllegalArgumentException("value must not be null"); 
     890            } 
     891             
     892            params.add(new Parameter(name, value)); 
     893        } 
     894         
     895        /** 
     896         *  
     897         */ 
     898        private void addParameter(Parameter parameter) { 
     899            if (parameter == null) { 
     900                throw new IllegalArgumentException("parameter must not be null"); 
     901            } 
     902             
     903            params.add(parameter); 
     904        } 
     905         
     906        /** 
     907         * @return the params 
     908         */ 
     909        private List<Parameter> getParameters() { 
     910            return Collections.unmodifiableList(params); 
     911        } 
     912 
     913        /** 
     914         *  
     915         */ 
     916        private void addComponent(Component component) { 
     917            if (component == null) { 
     918                throw new IllegalArgumentException("component must not be null"); 
     919            } 
     920             
     921            components.add(component); 
     922        } 
     923         
     924        /** 
     925         * @return the components 
     926         */ 
     927        private List<Component> getComponents() { 
     928            return Collections.unmodifiableList(components); 
     929        } 
     930 
     931        /** 
     932         *  
     933         */ 
    719934        private void dump(PrintStream out) { 
     935            if (out == null) { 
     936                throw new IllegalArgumentException("out must not be null"); 
     937            } 
     938             
    720939            out.println(" <source>"); 
    721940             
     
    728947            out.println(" </source>"); 
    729948        } 
     949         
     950        /* (non-Javadoc) 
     951         * @see java.lang.Object#equals(java.lang.Object) 
     952         */ 
     953        @Override 
     954        public boolean equals(Object obj) { 
     955            if (this == obj) { 
     956                return true; 
     957            } 
     958             
     959            if (obj instanceof Source) { 
     960                Source other = (Source) obj; 
     961                 
     962                if ((getToStringValue() != other.getToStringValue()) || 
     963                    ((getToStringValue() != null) && 
     964                     (!getToStringValue().equals(other.getToStringValue())))) 
     965                { 
     966                    return false; 
     967                } 
     968                 
     969                if (!parametersEqual(params, other.params)) { 
     970                    return false; 
     971                } 
     972                 
     973                if (components == null) { 
     974                    return other.components == null; 
     975                } 
     976                 
     977                if (other.components == null) { 
     978                    return false; 
     979                } 
     980                 
     981                if (components.size() != other.components.size()) { 
     982                    return false; 
     983                } 
     984 
     985                for (int i = 0; i < components.size(); i++) { 
     986                    if (!components.get(i).equals(other.components.get(i))) { 
     987                        return false; 
     988                    } 
     989                } 
     990                 
     991                return true; 
     992            } 
     993             
     994            return false; 
     995        } 
     996 
     997        /* (non-Javadoc) 
     998         * @see java.lang.Object#hashCode() 
     999         */ 
     1000        @Override 
     1001        public int hashCode() { 
     1002            String str = getToStringValue(); 
     1003             
     1004            if (str != null) { 
     1005                return str.hashCode(); 
     1006            } 
     1007            else { 
     1008                // ensure that all incomplete sources provide the same hashcode 
     1009                return 0; 
     1010            } 
     1011        } 
     1012 
    7301013    } 
    7311014     
     
    7361019     */ 
    7371020    private class Component { 
    738         protected List<String[]> params = new ArrayList<String[]>(); 
    739          
     1021         
     1022        /** */ 
     1023        private List<Parameter> params = new ArrayList<Parameter>(); 
     1024         
     1025        /** 
     1026         *  
     1027         */ 
     1028        protected void addParameter(String name, String value) { 
     1029            if (name == null) { 
     1030                throw new IllegalArgumentException("name must not be null"); 
     1031            } 
     1032             
     1033            if (value == null) { 
     1034                throw new IllegalArgumentException("value must not be null"); 
     1035            } 
     1036             
     1037            params.add(new Parameter(name, value)); 
     1038        } 
     1039         
     1040        /** 
     1041         * @return the params 
     1042         */ 
     1043        private List<Parameter> getParameters() { 
     1044            return Collections.unmodifiableList(params); 
     1045        } 
     1046 
     1047        /** 
     1048         *  
     1049         */ 
    7401050        protected void dump(PrintStream out) { 
     1051            if (out == null) { 
     1052                throw new IllegalArgumentException("out must not be null"); 
     1053            } 
     1054             
    7411055            out.println("  <component>"); 
    7421056            dumpParams(out, params, "   "); 
     
    7441058        } 
    7451059 
    746         public boolean equals(Object other) { 
    747             if (this == other) { 
     1060        /** 
     1061         *  
     1062         */ 
     1063        public boolean equals(Object obj) { 
     1064            if (this == obj) { 
    7481065                return true; 
    7491066            } 
    7501067             
    751             if (!(other instanceof Component)) { 
    752                 return false; 
    753             } 
    754              
    755             Component otherComp = (Component) other; 
    756              
    757             boolean allParamsEqual = (params.size() == otherComp.params.size()); 
    758              
    759             if (allParamsEqual) { 
    760                 for (int i = 0; i < params.size(); i++) { 
    761                     if (!params.get(i)[0].equals(otherComp.params.get(i)[0]) && 
    762                         !params.get(i)[1].equals(otherComp.params.get(i)[1])) 
    763                     { 
    764                         allParamsEqual = false; 
    765                         break; 
    766                     } 
    767                 } 
    768             } 
    769              
    770             return allParamsEqual; 
     1068            if (obj instanceof Component) { 
     1069                return parametersEqual(params, ((Component) obj).params); 
     1070            } 
     1071            else {    
     1072               return false; 
     1073            } 
     1074        } 
     1075 
     1076        /* (non-Javadoc) 
     1077         * @see java.lang.Object#hashCode() 
     1078         */ 
     1079        @Override 
     1080        public int hashCode() { 
     1081            // all components with an equally sized parameter list can be equal. This does not 
     1082            // work, if not all component parameters are set yet. But we do not use components 
     1083            // in a hash map so we provide an easy implementation 
     1084            return params.size(); 
    7711085        } 
    7721086    } 
     
    7781092     */ 
    7791093    private class ComponentFromToString extends Component { 
     1094         
     1095        /** */ 
    7801096        private int x; 
     1097         
     1098        /** */ 
    7811099        private int y; 
     1100         
     1101        /** */ 
    7821102        private int width; 
     1103         
     1104        /** */ 
    7831105        private int height; 
    7841106         
     1107        /** 
     1108         * @param x the x to set 
     1109         */ 
     1110        private void setX(int x) { 
     1111            this.x = x; 
     1112        } 
     1113 
     1114        /** 
     1115         * @return the x 
     1116         */ 
     1117        private int getX() { 
     1118            return x; 
     1119        } 
     1120 
     1121       /** 
     1122         * @param y the y to set 
     1123         */ 
     1124        private void setY(int y) { 
     1125            this.y = y; 
     1126        } 
     1127 
     1128        /** 
     1129         * @return the y 
     1130         */ 
     1131        private int getY() { 
     1132            return y; 
     1133        } 
     1134 
     1135        /** 
     1136         * @param width the width to set 
     1137         */ 
     1138        private void setWidth(int width) { 
     1139            this.width = width; 
     1140        } 
     1141 
     1142        /** 
     1143         * @param height the height to set 
     1144         */ 
     1145        private void setHeight(int height) { 
     1146            this.height = height; 
     1147        } 
     1148 
     1149        /** 
     1150         *  
     1151         */ 
    7851152        @Override 
    7861153        protected void dump(PrintStream out) { 
     1154            if (out == null) { 
     1155                throw new IllegalArgumentException("out must not be null"); 
     1156            } 
     1157             
    7871158            out.println("  <component>"); 
    7881159             
     
    8071178            out.println("\" />"); 
    8081179 
    809             dumpParams(out, params, "   "); 
     1180            dumpParams(out, super.getParameters(), "   "); 
    8101181            out.println("  </component>"); 
    8111182        } 
    8121183         
    813         /*public boolean equals(Object other) { 
    814             if (this == other) { 
    815                 return true; 
    816             } 
    817              
    818             if (!(other instanceof ComponentFromToString)) { 
     1184        /** 
     1185         *  
     1186         */ 
     1187        public boolean equals(Object obj) { 
     1188            if (!super.equals(obj)) { 
    8191189                return false; 
    8201190            } 
    8211191             
    822             ComponentFromToString otherComp = (ComponentFromToString) other; 
    823              
    824             // ignore the coordinates and the width as it may change over time 
    825             boolean allParamsEqual = 
    826                 (height == otherComp.height) && (params.size() == otherComp.params.size()); 
    827              
    828             if (allParamsEqual) { 
    829                 for (int i = 0; i < params.size(); i++) { 
    830                     if (!"x".equals(params.get(i)[0]) && !"y".equals(params.get(i)[0]) && 
    831                         !"width".equals(params.get(i)[0]) && !"height".equals(params.get(i)[0]) && 
    832                         !"index".equals(params.get(i)[0]) && !"hash".equals(params.get(i)[0]) && 
    833                         !params.get(i)[0].equals(otherComp.params.get(i)[0]) && 
    834                         !params.get(i)[1].equals(otherComp.params.get(i)[1])) 
    835                     { 
    836                         allParamsEqual = false; 
    837                         break; 
    838                     } 
    839                 } 
    840             } 
    841              
    842             return allParamsEqual; 
    843         }*/ 
    844     } 
    845  
     1192            if (obj instanceof ComponentFromToString) { 
     1193                ComponentFromToString other = (ComponentFromToString) obj; 
     1194                return (x == other.x) && (y == other.y) && 
     1195                    (width == other.width) && (height == other.height); 
     1196            } 
     1197            else {    
     1198               return false; 
     1199            } 
     1200        } 
     1201 
     1202        /* (non-Javadoc) 
     1203         * @see java.lang.Object#hashCode() 
     1204         */ 
     1205        @Override 
     1206        public int hashCode() { 
     1207            return super.hashCode() + x + y + width + height; 
     1208        } 
     1209    } 
     1210 
     1211    /** 
     1212     * <p> 
     1213     * used to carry all information about a parameter being a key and a value 
     1214     * </p>  
     1215     */ 
     1216    private class Parameter { 
     1217         
     1218        /** */ 
     1219        private String name; 
     1220         
     1221        /** */ 
     1222        private String value; 
     1223         
     1224        /** 
     1225         *  
     1226         */ 
     1227        private Parameter(String name, String value) { 
     1228            if (name == null) { 
     1229                throw new IllegalArgumentException("name must not be null"); 
     1230            } 
     1231             
     1232            if (value == null) { 
     1233                throw new IllegalArgumentException("value must not be null"); 
     1234            } 
     1235             
     1236            this.name = name; 
     1237            this.value = value; 
     1238        } 
     1239 
     1240        /** 
     1241         * @return the name 
     1242         */ 
     1243        private String getName() { 
     1244            return name; 
     1245        } 
     1246 
     1247        /** 
     1248         * @return the value 
     1249         */ 
     1250        private String getValue() { 
     1251            return value; 
     1252        } 
     1253 
     1254        /* (non-Javadoc) 
     1255         * @see java.lang.Object#equals(java.lang.Object) 
     1256         */ 
     1257        @Override 
     1258        public boolean equals(Object obj) { 
     1259            if (obj instanceof Parameter) { 
     1260                return 
     1261                    (name.equals(((Parameter) obj).name) && value.equals(((Parameter) obj).value)); 
     1262            } 
     1263            else { 
     1264                return false; 
     1265            } 
     1266        } 
     1267 
     1268        /* (non-Javadoc) 
     1269         * @see java.lang.Object#hashCode() 
     1270         */ 
     1271        @Override 
     1272        public int hashCode() { 
     1273            return name.hashCode() + value.hashCode(); 
     1274        } 
     1275         
     1276         
     1277    } 
     1278         
    8461279} 
Note: See TracChangeset for help on using the changeset viewer.