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 {