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