This commit is contained in:
RedKale
2016-02-17 11:06:23 +08:00
parent 6c98529f66
commit 435acc4fb2

View File

@@ -34,9 +34,7 @@ public final class ResourceFactory {
private final ConcurrentHashMap<Type, ResourceLoader> loadermap = new ConcurrentHashMap();
private final ConcurrentHashMap<Class<?>, ConcurrentHashMap<String, ResourceEntry>> store = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ConcurrentHashMap<String, ResourceEntry>> gencstore = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ConcurrentHashMap<String, ResourceEntry>> store = new ConcurrentHashMap();
private ResourceFactory(ResourceFactory parent) {
this.parent = parent;
@@ -52,7 +50,6 @@ public final class ResourceFactory {
public void release() {
this.store.clear();
this.gencstore.clear();
}
public <A> A register(final Class<? extends A> clazz, final A rs) {
@@ -156,35 +153,16 @@ public final class ResourceFactory {
return register(true, name, clazz, rs);
}
public <A> A register(final boolean autoSync, final String name, final Class<? extends A> clazz, final A rs) {
ConcurrentHashMap<String, ResourceEntry> map = this.store.get(clazz);
if (map == null) {
ConcurrentHashMap<String, ResourceEntry> sub = new ConcurrentHashMap();
sub.put(name, new ResourceEntry(rs));
store.put(clazz, sub);
return null;
} else {
ResourceEntry re = map.get(name);
if (re == null) {
map.put(name, new ResourceEntry(rs));
} else {
map.put(name, new ResourceEntry(rs, re.elements, autoSync));
}
return re == null ? null : (A) re.value;
}
}
public <A> A register(final String name, final Type clazz, final A rs) {
return register(true, name, clazz, rs);
}
public <A> A register(final boolean autoSync, final String name, final Type clazz, final A rs) {
if (clazz instanceof Class) return register(autoSync, name, (Class<A>) clazz, rs);
ConcurrentHashMap<String, ResourceEntry> map = this.gencstore.get(clazz);
ConcurrentHashMap<String, ResourceEntry> map = this.store.get(clazz);
if (map == null) {
ConcurrentHashMap<String, ResourceEntry> sub = new ConcurrentHashMap();
sub.put(name, new ResourceEntry(rs));
gencstore.put(clazz, sub);
store.put(clazz, sub);
return null;
} else {
ResourceEntry re = map.get(name);
@@ -207,7 +185,7 @@ public final class ResourceFactory {
}
private ResourceEntry findEntry(String name, Type clazz) {
Map<String, ResourceEntry> map = this.gencstore.get(clazz);
Map<String, ResourceEntry> map = this.store.get(clazz);
if (map != null) {
ResourceEntry re = map.get(name);
if (re != null) return re;
@@ -220,24 +198,12 @@ public final class ResourceFactory {
return query(new ArrayList<A>(), clazz);
}
private <A> List<A> query(final List<A> list, Class<? extends A> clazz) {
Map<String, ResourceEntry> map = this.store.get(clazz);
if (map != null) {
for (ResourceEntry re : map.values()) {
if (re.value != null) list.add((A) re.value);
}
}
if (parent != null) query(list, clazz);
return list;
}
public <A> List<A> query(Type clazz) {
return query(new ArrayList<A>(), clazz);
}
private <A> List<A> query(final List<A> list, Type clazz) {
if (clazz instanceof Class) return query(list, (Class) clazz);
Map<String, ResourceEntry> map = this.gencstore.get(clazz);
Map<String, ResourceEntry> map = this.store.get(clazz);
if (map != null) {
for (ResourceEntry re : map.values()) {
if (re.value != null) list.add((A) re.value);
@@ -265,8 +231,9 @@ public final class ResourceFactory {
public <A> A findChild(final String name, final Class<? extends A> clazz) {
A rs = find(name, clazz);
if (rs != null) return rs;
for (Map.Entry<Class<?>, ConcurrentHashMap<String, ResourceEntry>> en : this.store.entrySet()) { //不用forEach为兼容JDK 6
if (!clazz.isAssignableFrom(en.getKey())) continue;
for (Map.Entry<Type, ConcurrentHashMap<String, ResourceEntry>> en : this.store.entrySet()) { //不用forEach为兼容JDK 6
if (!(en.getKey() instanceof Class)) continue;
if (!clazz.isAssignableFrom((Class) en.getKey())) continue;
ResourceEntry v = en.getValue().get(name);
if (v != null) return (A) v.value;
}