diff options
Diffstat (limited to 'ide_common/src/com/android/ide/common/resources/ResourceRepository.java')
-rwxr-xr-x[-rw-r--r--] | ide_common/src/com/android/ide/common/resources/ResourceRepository.java | 91 |
1 files changed, 49 insertions, 42 deletions
diff --git a/ide_common/src/com/android/ide/common/resources/ResourceRepository.java b/ide_common/src/com/android/ide/common/resources/ResourceRepository.java index 3040dc0..48c9690 100644..100755 --- a/ide_common/src/com/android/ide/common/resources/ResourceRepository.java +++ b/ide_common/src/com/android/ide/common/resources/ResourceRepository.java @@ -36,8 +36,10 @@ import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.IdentityHashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -58,11 +60,12 @@ public abstract class ResourceRepository { protected final Map<ResourceFolderType, List<ResourceFolder>> mFolderMap = new EnumMap<ResourceFolderType, List<ResourceFolder>>(ResourceFolderType.class); - protected final Map<ResourceType, List<ResourceItem>> mResourceMap = - new EnumMap<ResourceType, List<ResourceItem>>(ResourceType.class); + protected final Map<ResourceType, Map<String, ResourceItem>> mResourceMap = + new EnumMap<ResourceType, Map<String, ResourceItem>>( + ResourceType.class); - private final Map<List<ResourceItem>, List<ResourceItem>> mReadOnlyListMap = - new IdentityHashMap<List<ResourceItem>, List<ResourceItem>>(); + private final Map<Map<String, ResourceItem>, Collection<ResourceItem>> mReadOnlyListMap = + new IdentityHashMap<Map<String, ResourceItem>, Collection<ResourceItem>>(); private final boolean mFrameworkRepository; @@ -193,13 +196,13 @@ public abstract class ResourceRepository { * @return true if the resource is known */ public boolean hasResourceItem(ResourceType type, String name) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list != null) { - for (ResourceItem item : list) { - if (name.equals(item.getName())) { - return true; - } + if (map != null) { + + ResourceItem resourceItem = map.get(name); + if (resourceItem != null) { + return true; } } @@ -225,16 +228,19 @@ public abstract class ResourceRepository { item = createResourceItem(name); - List<ResourceItem> list = mResourceMap.get(type); - if (list == null) { - list = new ArrayList<ResourceItem>(); - mResourceMap.put(type, list); + Map<String, ResourceItem> map = mResourceMap.get(type); + + if (map == null) { + map = new HashMap<String, ResourceItem>(); + mResourceMap.put(type, map); + } - list.add(item); + map.put(item.getName(), item); if (oldItem != null) { - list.remove(oldItem); + map.remove(oldItem.getName()); + } } @@ -324,16 +330,16 @@ public abstract class ResourceRepository { * @return a non null collection of resource items */ public Collection<ResourceItem> getResourceItemsOfType(ResourceType type) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list == null) { + if (map == null) { return Collections.emptyList(); } - List<ResourceItem> roList = mReadOnlyListMap.get(list); + Collection<ResourceItem> roList = mReadOnlyListMap.get(map); if (roList == null) { - roList = Collections.unmodifiableList(list); - mReadOnlyListMap.put(list, roList); + roList = Collections.unmodifiableCollection(map.values()); + mReadOnlyListMap.put(map, roList); } return roList; @@ -345,7 +351,7 @@ public abstract class ResourceRepository { * @return true if the repository contains resources of the given type, false otherwise. */ public boolean hasResourcesOfType(ResourceType type) { - List<ResourceItem> items = mResourceMap.get(type); + Map<String, ResourceItem> items = mResourceMap.get(type); return (items != null && items.size() > 0); } @@ -567,10 +573,10 @@ public abstract class ResourceRepository { } protected void removeFile(ResourceType type, ResourceFile file) { - List<ResourceItem> list = mResourceMap.get(type); - if (list != null) { - for (int i = 0 ; i < list.size(); i++) { - ResourceItem item = list.get(i); + Map<String, ResourceItem> map = mResourceMap.get(type); + if (map != null) { + Collection<ResourceItem> values = map.values(); + for (ResourceItem item : values) { item.removeFile(file); } } @@ -587,7 +593,7 @@ public abstract class ResourceRepository { FolderConfiguration referenceConfig) { // get the resource item for the given type - List<ResourceItem> items = mResourceMap.get(type); + Map<String, ResourceItem> items = mResourceMap.get(type); if (items == null) { return new HashMap<String, ResourceValue>(); } @@ -595,7 +601,7 @@ public abstract class ResourceRepository { // create the map HashMap<String, ResourceValue> map = new HashMap<String, ResourceValue>(items.size()); - for (ResourceItem item : items) { + for (ResourceItem item : items.values()) { ResourceValue value = item.getResourceValue(type, referenceConfig, isFrameworkRepository()); if (value != null) { @@ -614,13 +620,15 @@ public abstract class ResourceRepository { // Since removed files/folders remove source files from existing ResourceItem, loop through // all resource items and remove the ones that have no source files. - Collection<List<ResourceItem>> lists = mResourceMap.values(); - for (List<ResourceItem> list : lists) { - for (int i = 0 ; i < list.size() ;) { - if (list.get(i).hasNoSourceFile()) { - list.remove(i); - } else { - i++; + Collection<Map<String, ResourceItem>> maps = mResourceMap.values(); + for (Map<String, ResourceItem> map : maps) { + Set<String> keySet = map.keySet(); + Iterator<String> iterator = keySet.iterator(); + while (iterator.hasNext()) { + String name = iterator.next(); + ResourceItem resourceItem = map.get(name); + if (resourceItem.hasNoSourceFile()) { + iterator.remove(); } } } @@ -634,17 +642,16 @@ public abstract class ResourceRepository { * @return the existing ResourceItem or null if no match was found. */ private ResourceItem findDeclaredResourceItem(ResourceType type, String name) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list != null) { - for (ResourceItem item : list) { - // ignore inline - if (name.equals(item.getName()) && item.isDeclaredInline() == false) { - return item; - } + if (map != null) { + ResourceItem resourceItem = map.get(name); + if (resourceItem != null && !resourceItem.isDeclaredInline()) { + return resourceItem; } } return null; } } + |