Sandro, you don't need to change the API.

You need something like the attached patch.



Sandro Martini (JIRA) wrote:
>     [ 
> https://issues.apache.org/jira/browse/PIVOT-132?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12766461#action_12766461
>  ] 
>
> Sandro Martini commented on PIVOT-132:
> --------------------------------------
>
> Now the same problem happens on ImageView class, this is the detail:
>
> ApplicationContext.java:1444 
> org.apache.pivot.wtk.ApplicationContext.resourceCache is or uses a map or set 
> of URLs, which can be a performance hog
> ImageView.java:69 org.apache.pivot.wtk.ImageView.loadMap is or uses a map or 
> set of URLs, which can be a performance hog
>
> Other the performance side of this (that probably for is is not a real 
> problem), I'll make some tests to ensure if this is really a bad practice.
>
>
>   
>> pivot/wtk/ApplicationContext.java:1201 
>> pivot.wtk.ApplicationContext.resourceCache is or uses a map or set of URLs, 
>> which can be a performance hog
>> -------------------------------------------------------------------------------------------------------------------------------------------------
>>
>>                 Key: PIVOT-132
>>                 URL: https://issues.apache.org/jira/browse/PIVOT-132
>>             Project: Pivot
>>          Issue Type: Improvement
>>          Components: wtk
>>    Affects Versions: 1.1, 1.2
>>            Reporter: Sandro Martini
>>            Assignee: Greg Brown
>>            Priority: Minor
>>             Fix For: 1.5
>>
>>
>> As from the latest FindBugs, this warning (with High Priority) in hilited:
>> pivot/wtk/ApplicationContext.java:1201 
>> pivot.wtk.ApplicationContext.resourceCache is or uses a map or set of URLs, 
>> which can be a performance hog
>> And from their doc related to this:
>> This method or field is or uses a Map or Set of URLs. Since both the equals 
>> and hashCode method of URL perform domain name resolution, this can result 
>> in a big performance hit. 
>> See 
>> http://michaelscharf.blogspot.com/2006/11/javaneturlequals-and-hashcode-make.html
>>  for more information. 
>> Consider using java.net.URI instead. 
>> Trying to change URL with URI is ok here, but given compilation error in 
>> approx. 24 classes related to this.
>> Needs further study.
>>     
>
>   

Index: ImageView.java
===================================================================
--- ImageView.java      (revision 825510)
+++ ImageView.java      (working copy)
@@ -16,6 +16,7 @@
  */
 package org.apache.pivot.wtk;
 
+import java.net.URISyntaxException;
 import java.net.URL;
 
 import org.apache.pivot.collections.ArrayList;
@@ -66,8 +67,8 @@
 
     // Maintains a mapping of image URL to image views that should be notified 
when
     // an asynchronously loaded image is available
-    private static HashMap<URL, ArrayList<ImageView>> loadMap =
-        new HashMap<URL, ArrayList<ImageView>>();
+    private static HashMap<java.net.URI, ArrayList<ImageView>> loadMap =
+        new HashMap<java.net.URI, ArrayList<ImageView>>();
 
     /**
      * Creates an empty image view.
@@ -131,11 +132,19 @@
         Image image = 
(Image)ApplicationContext.getResourceCache().get(imageURL);
 
         if (image == null) {
+            // convert to URI because using URL in a hashmap is a no-no - URL 
does bad stuff in equals() and hashCode()
+            final java.net.URI imageURI;
+            try {
+                imageURI = imageURL.toURI();
+            } catch (URISyntaxException ex) {
+                // should never happen
+                throw new RuntimeException(ex);
+            }
             if (asynchronous) {
-                if (loadMap.containsKey(imageURL)) {
+                if (loadMap.containsKey(imageURI)) {
                     // Add this to the list of image views that are interested 
in
                     // the image at this URL
-                    loadMap.get(imageURL).add(this);
+                    loadMap.get(imageURI).add(this);
                 } else {
                     Image.load(imageURL, new TaskAdapter<Image>(new 
TaskListener<Image>() {
                         @Override
@@ -144,11 +153,11 @@
 
                             // Update the contents of all image views that 
requested this
                             // image
-                            for (ImageView imageView : loadMap.get(imageURL)) {
+                            for (ImageView imageView : loadMap.get(imageURI)) {
                                 imageView.setImage(image);
                             }
 
-                            loadMap.remove(imageURL);
+                            loadMap.remove(imageURI);
 
                             // Add the image to the cache
                             
ApplicationContext.getResourceCache().put(imageURL, image);
@@ -160,7 +169,7 @@
                         }
                     }));
 
-                    loadMap.put(imageURL, new ArrayList<ImageView>(this));
+                    loadMap.put(imageURI, new ArrayList<ImageView>(this));
                 }
             } else {
                 try {

Reply via email to