|
From: <ha...@us...> - 2008-02-12 17:09:17
|
Revision: 1884
http://cogkit.svn.sourceforge.net/cogkit/?rev=1884&view=rev
Author: hategan
Date: 2008-02-12 09:09:13 -0800 (Tue, 12 Feb 2008)
Log Message:
-----------
ensure proper ordering of events, and that all events are reported (even if by guessing)
Modified Paths:
--------------
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/TaskImpl.java
Added Paths:
-----------
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/StatusOrder.java
Added: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/StatusOrder.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/StatusOrder.java (rev 0)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/StatusOrder.java 2008-02-12 17:09:13 UTC (rev 1884)
@@ -0,0 +1,53 @@
+//----------------------------------------------------------------------
+//This code is developed as part of the Java CoG Kit project
+//The terms of the license can be found at http://www.cogkit.org/license
+//This message may not be removed or altered.
+//----------------------------------------------------------------------
+
+/*
+ * Created on Feb 11, 2008
+ */
+package org.globus.cog.abstraction.impl.common.task;
+
+import org.globus.cog.abstraction.interfaces.Status;
+
+public class StatusOrder {
+
+ /**
+ * Returns the predecessor of a status code or -1 if the code
+ * does not have one
+ */
+ public static int pred(int code) {
+ switch (code) {
+ case Status.CANCELED:
+ case Status.FAILED:
+ case Status.COMPLETED:
+ return Status.ACTIVE;
+ case Status.SUBMITTING:
+ return Status.UNSUBMITTED;
+ case Status.SUBMITTED:
+ return Status.SUBMITTING;
+ case Status.ACTIVE:
+ return Status.SUBMITTED;
+ case Status.RESUMED:
+ return Status.SUSPENDED;
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Returns true code1 is greater than code2 in the status
+ * order. The two need not be comparable (in which case false
+ * will be returned).
+ */
+ public static boolean greaterThan(int code1, int code2) {
+ int prev = pred(code1);
+ if (prev == -1) {
+ return false;
+ }
+ else {
+ return prev == code2 || greaterThan(prev, code2);
+ }
+ }
+}
Modified: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/TaskImpl.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/TaskImpl.java 2008-02-12 17:04:05 UTC (rev 1883)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/TaskImpl.java 2008-02-12 17:09:13 UTC (rev 1884)
@@ -8,11 +8,10 @@
import java.io.File;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collection;
-import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import org.apache.log4j.Logger;
import org.globus.cog.abstraction.impl.common.IdentityImpl;
@@ -46,17 +45,16 @@
private CopyOnWriteHashSet statusListeners, outputListeners;
- private Hashtable attributes = null;
- private Calendar submittedTime = null;
- private Calendar completedTime = null;
- private ArrayList serviceList = null;
+ private Map attributes;
+
+ private ArrayList serviceList;
private int requiredServices = 0;
private boolean anythingWaiting;
public TaskImpl() {
this.id = new IdentityImpl();
- this.attributes = new Hashtable();
+ this.attributes = new HashMap();
this.serviceList = new ArrayList();
this.status = new StatusImpl();
statusListeners = new CopyOnWriteHashSet();
@@ -196,19 +194,39 @@
}
public void setStatus(Status status) {
- if (logger.isDebugEnabled()) {
- logger.debug(this + " setting status to " + status);
+ int next = status.getStatusCode();
+ int pred = StatusOrder.pred(next);
+ boolean missing = false;
+ boolean discard = false;
+ synchronized (this) {
+ int crt = this.status.getStatusCode();
+ if (StatusOrder.greaterThan(crt, next) || crt == next) {
+ // discard late arrivals
+ discard = true;
+ }
+ else if (pred != crt && pred != -1) {
+ missing = true;
+ }
}
- this.status = status;
-
- if (this.status.getStatusCode() == Status.SUBMITTED) {
- this.submittedTime = this.status.getTime();
+ if (missing) {
+ setStatus(pred);
}
- else if (this.status.getStatusCode() == Status.COMPLETED) {
- this.completedTime = this.status.getTime();
+ if (!discard) {
+ // not much choice left
+ if (logger.isDebugEnabled()) {
+ logger.debug(this + " setting status to " + status);
+ }
+ synchronized(this) {
+ this.status = status;
+ }
+ notifyListeners(status);
}
+ // Now prove that this works correctly with concurrent updates.
+ // I will pay $20 for the first one.
+ }
- StatusEvent event = new StatusEvent(this, this.status);
+ protected void notifyListeners(Status status) {
+ StatusEvent event = new StatusEvent(this, status);
Iterator i = statusListeners.iterator();
try {
while (i.hasNext()) {
@@ -245,8 +263,8 @@
return this.attributes.get(name.toLowerCase());
}
- public Enumeration getAllAttributes() {
- return this.attributes.keys();
+ public Collection getAttributeNames() {
+ return this.attributes.keySet();
}
public void addStatusListener(StatusListener listener) {
@@ -272,14 +290,19 @@
public String toString() {
return "Task(type=" + typeString(type) + ", identity=" + id + ")";
}
-
+
public static String typeString(int type) {
switch (type) {
- case JOB_SUBMISSION: return "JOB_SUBMISSION";
- case FILE_TRANSFER: return "FILE_TRANSFER";
- case FILE_OPERATION: return "FILE_OPERATION";
- case INFORMATION_QUERY: return "INFORMATION_QUERY";
- default: return "UNKNOWN";
+ case JOB_SUBMISSION:
+ return "JOB_SUBMISSION";
+ case FILE_TRANSFER:
+ return "FILE_TRANSFER";
+ case FILE_OPERATION:
+ return "FILE_OPERATION";
+ case INFORMATION_QUERY:
+ return "INFORMATION_QUERY";
+ default:
+ return "UNKNOWN";
}
}
@@ -307,14 +330,6 @@
return (this.status.getStatusCode() == Status.CANCELED);
}
- public Calendar getSubmittedTime() {
- return this.submittedTime;
- }
-
- public Calendar getCompletedTime() {
- return this.completedTime;
- }
-
public boolean equals(Object object) {
return this.id.equals(((ExecutableObject) object).getIdentity());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ha...@us...> - 2008-04-08 11:20:48
|
Revision: 1962
http://cogkit.svn.sourceforge.net/cogkit/?rev=1962&view=rev
Author: hategan
Date: 2008-04-08 04:20:44 -0700 (Tue, 08 Apr 2008)
Log Message:
-----------
fixed issues introduced by previous commit
Modified Paths:
--------------
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceContactImpl.java
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceImpl.java
Modified: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceContactImpl.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceContactImpl.java 2008-04-07 08:02:56 UTC (rev 1961)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceContactImpl.java 2008-04-08 11:20:44 UTC (rev 1962)
@@ -16,25 +16,29 @@
public static final ServiceContact LOCALHOST = new ServiceContactImpl(
"localhost");
- private String host, path;
+ private String host, path, contact;
private int port;
public ServiceContactImpl() {
}
public ServiceContactImpl(String contact) {
+ this.contact = contact;
parse(contact);
}
public ServiceContactImpl(String host, int port) {
this.host = host;
this.port = port;
+ buildContact();
}
public void setHost(String host) {
this.host = host;
port = -1;
+ buildContact();
}
+
public String getHost() {
return host;
@@ -42,6 +46,7 @@
public void setPort(int port) {
this.port = port;
+ buildContact();
}
public int getPort() {
@@ -49,11 +54,12 @@
}
public void setContact(String contact) {
+ this.contact = contact;
parse(contact);
}
public String getContact() {
- return host + (port == -1 ? "" : ":" + port) + (path == null ? "" : path);
+ return contact;
}
public boolean equals(Object o) {
@@ -69,10 +75,17 @@
}
private void parse(String contact) {
- int portsep = contact.indexOf(':');
- int pathsep = contact.indexOf('/');
+ int schemesep = contact.indexOf("://");
+ if (schemesep == -1) {
+ schemesep = 0;
+ }
+ else {
+ schemesep += 3;
+ }
+ int portsep = contact.indexOf(':', schemesep);
+ int pathsep = contact.indexOf('/', schemesep);
if (portsep != -1 && (pathsep == -1 || portsep < pathsep)) {
- host = contact.substring(0, portsep);
+ host = contact.substring(schemesep, portsep);
if (pathsep == -1) {
port = Integer.parseInt(contact.substring(portsep + 1));
path = null;
@@ -83,16 +96,20 @@
}
}
else if (pathsep != -1) {
- host = contact.substring(0, pathsep);
+ host = contact.substring(schemesep, pathsep);
port = -1;
path = contact.substring(pathsep);
}
else {
- host = contact;
+ host = contact.substring(schemesep);
port = -1;
path = null;
}
}
+
+ private void buildContact() {
+ this.contact = host + (port == -1 ? "" : (":" + port));
+ }
public String toString() {
return getContact();
Modified: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceImpl.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceImpl.java 2008-04-07 08:02:56 UTC (rev 1961)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/common/task/ServiceImpl.java 2008-04-08 11:20:44 UTC (rev 1962)
@@ -21,7 +21,7 @@
public class ServiceImpl implements Service {
private Identity identity = null;
private String name = "";
- private ServiceContact serviceContact = null;
+ private ServiceContact serviceContact;
private SecurityContext securityContext = null;
private Map attributes;
private String provider = null;
@@ -88,7 +88,7 @@
}
public ServiceContact getServiceContact() {
- return this.serviceContact;
+ return serviceContact;
}
public void setSecurityContext(SecurityContext securityContext) {
@@ -153,7 +153,7 @@
}
public String toString() {
- return this.serviceContact.toString() + "(" + this.provider + ")";
+ return serviceContact.toString() + "(" + this.provider + ")";
}
public int hashCode() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|