summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/entity/proxy/MemberSubscription.java
diff options
context:
space:
mode:
authorabranson <andrew.branson@cern.ch>2011-08-04 00:42:34 +0200
committerabranson <andrew.branson@cern.ch>2011-08-04 00:42:34 +0200
commit0ec8481c10cd8277d84c7c1a785483a0a739e5a0 (patch)
tree5f6e5d9ae75193e67e6f3b3dfa488960c5cde1d5 /source/com/c2kernel/entity/proxy/MemberSubscription.java
parent036cbdba66f804743c4c838ed598d6972c4b3e17 (diff)
More code cleanup:
Refactored Entity Proxy Subscription to handle generics better Rewrote RemoteMap to use TreeMap instead of the internal array for order. It now sorts its keys by number if they parse, else as strings. Removed a no-longer-in-progress outcome form class
Diffstat (limited to 'source/com/c2kernel/entity/proxy/MemberSubscription.java')
-rw-r--r--source/com/c2kernel/entity/proxy/MemberSubscription.java72
1 files changed, 36 insertions, 36 deletions
diff --git a/source/com/c2kernel/entity/proxy/MemberSubscription.java b/source/com/c2kernel/entity/proxy/MemberSubscription.java
index ba2d725..157297f 100644
--- a/source/com/c2kernel/entity/proxy/MemberSubscription.java
+++ b/source/com/c2kernel/entity/proxy/MemberSubscription.java
@@ -8,31 +8,33 @@ import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.entity.C2KLocalObject;
import com.c2kernel.utils.Logger;
-public class MemberSubscription implements Runnable {
+public class MemberSubscription<C extends C2KLocalObject> implements Runnable {
+ public static final String ERROR = "Error";
+ public static final String END = "theEND";
+
EntityProxy subject;
String interest;
// keep the subscriber by weak reference, so it is not kept from the garbage collector if no longer used
- WeakReference<EntityProxyObserver> observerReference;
+ WeakReference<EntityProxyObserver<C>> observerReference;
ArrayList<String> contents = new ArrayList<String>();
boolean preLoad;
- public MemberSubscription(EntityProxy subject, String interest,
- EntityProxyObserver observer, boolean preLoad) {
+ public MemberSubscription(EntityProxyObserver<C> observer, String interest, boolean preLoad) {
setObserver(observer);
this.interest = interest;
- this.subject = subject;
this.preLoad = preLoad;
}
- public void run() {
+ @Override
+ public void run() {
Thread.currentThread().setName("Member Subscription: "+subject.getSystemKey()+":"+interest);
if (preLoad) loadChildren();
}
-
+
private void loadChildren() {
- C2KLocalObject newMember;
- EntityProxyObserver observer = getObserver();
- if (observer == null) return; //reaped
+ C newMember;
+ EntityProxyObserver<C> observer = getObserver();
+ if (observer == null) return; //reaped
try {
// fetch contents of path
String children = subject.queryData(interest+"/all");
@@ -40,22 +42,17 @@ public class MemberSubscription implements Runnable {
ArrayList<String> newContents = new ArrayList<String>();
while (tok.hasMoreTokens())
newContents.add(tok.nextToken());
-
+
// look to see what's new
for (String newChild: newContents) {
-
+
// load child object
try {
- newMember = subject.getObject(interest+"/"+newChild);
+ newMember = (C)subject.getObject(interest+"/"+newChild);
contents.remove(newChild);
- } catch (ObjectNotFoundException ex) {
- newMember = new MemberControl(MemberControl.ERROR, "Listed member "+newChild+" was not found.");
- }
- try {
observer.add(newMember);
- } catch (Throwable ex) {
- Logger.error("Error publishing member to "+observer);
- Logger.error(ex);
+ } catch (ObjectNotFoundException ex) {
+ observer.control(ERROR, "Listed member "+newChild+" was not found.");
}
}
// report what's left in old contents as deleted
@@ -65,24 +62,24 @@ public class MemberSubscription implements Runnable {
//replace contents arraylist
contents = newContents;
//report that we're done
- observer.add(MemberControl.theEND);
+ observer.control(END, null);
} catch (Exception ex) {
- observer.add(new MemberControl(MemberControl.ERROR, "Query on "+interest+" failed with "+ex));
- }
+ observer.control(ERROR, "Query on "+interest+" failed with "+ex);
+ }
}
-
+
public boolean isRelevant(String path) {
Logger.msg(7, "Checking relevance of "+path+" to "+interest);
return (path.startsWith(interest));
}
-
+
public void update(String path, boolean deleted) {
- EntityProxyObserver observer = getObserver();
+ EntityProxyObserver<C> observer = getObserver();
if (observer == null) return; //reaped
Logger.msg(7, "Processing proxy message path "+path +" for "+observer+". Interest: "+interest+" Was Deleted:"+deleted);
if (!path.startsWith(interest)) // doesn't concern us
return;
-
+
if (path.equals(interest)) // refresh contents
loadChildren();
else {
@@ -92,9 +89,9 @@ public class MemberSubscription implements Runnable {
contents.remove(name);
observer.remove(name);
}
- else {
+ else {
try {
- C2KLocalObject newMember = subject.getObject(path);
+ C newMember = (C)subject.getObject(path);
Logger.msg(4, "Adding "+path);
contents.add(name);
observer.add(newMember);
@@ -102,17 +99,20 @@ public class MemberSubscription implements Runnable {
Logger.error("Member Subscription: could not load "+path);
Logger.error(e);
}
- }
+ }
}
}
-
- public void setObserver(EntityProxyObserver observer) {
- observerReference = new WeakReference<EntityProxyObserver>(observer);
+
+ public void setObserver(EntityProxyObserver<C> observer) {
+ observerReference = new WeakReference<EntityProxyObserver<C>>(observer);
}
- public EntityProxyObserver getObserver() {
- EntityProxyObserver observer = (EntityProxyObserver)observerReference.get();
- return observer;
+ public void setSubject(EntityProxy subject) {
+ this.subject = subject;
+ }
+
+ public EntityProxyObserver<C> getObserver() {
+ return observerReference.get();
}
}