Author: degenaro
Date: Wed Feb  6 19:33:14 2013
New Revision: 1443156

URL: http://svn.apache.org/viewvc?rev=1443156&view=rev
Log:
UIMA-2642 Support
1. proxy-job-status
2. proxy-job-monitor
3. WS auto-cancel after expiry
4. WaitTimeout and CancelPending... in Reason area of Jobs page
5. several utility functions

Added:
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/IListenerOrchestrator.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccFile.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/TrackingInfo.java
Modified:
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java

Added: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/IListenerOrchestrator.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/IListenerOrchestrator.java?rev=1443156&view=auto
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/IListenerOrchestrator.java
 (added)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/IListenerOrchestrator.java
 Wed Feb  6 19:33:14 2013
@@ -0,0 +1,7 @@
+package org.apache.uima.ducc.ws;
+
+import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
+
+public interface IListenerOrchestrator {
+       public void update(OrchestratorStateDuccEvent duccEvent);
+}

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/WebServerComponent.java
 Wed Feb  6 19:33:14 2013
@@ -36,6 +36,7 @@ import org.apache.uima.ducc.transport.ev
 import org.apache.uima.ducc.transport.event.RmStateDuccEvent;
 import org.apache.uima.ducc.transport.event.SmStateDuccEvent;
 import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.ws.server.DuccListeners;
 import org.apache.uima.ducc.ws.server.DuccWebServer;
 import org.apache.uima.ducc.ws.utils.DatedNodeMetricsUpdateDuccEvent;
 
@@ -127,6 +128,7 @@ implements IWebServer {
                        duccLogger.info(methodName, jobid, 
duccMsg.fetchLabel("jobs")+jobCount.get()+" 
"+duccMsg.fetchLabel("reservations")+reservationCount.get()+" 
"+duccMsg.fetchLabel("services")+serviceCount.get());
                }
                DuccData.getInstance().put(wm);
+               DuccListeners.getInstance().update(duccEvent);
                duccLogger.trace(methodName, jobid, duccMsg.fetch("exit"));
        }
 

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
 Wed Feb  6 19:33:14 2013
@@ -63,6 +63,7 @@ public abstract class DuccAbstractHandle
        public final String duccContextJsonFormat = duccContext+"/json-format";
        public final String duccContextUser       = duccContext+"/user";
        public final String duccContextLegacy     = duccContext+"/legacy";
+       public final String duccContextProxy      = duccContext+"/proxy";
        
        public final String duccjConsoleLink      = 
duccContext+"/jconsole-link.jnlp";
        
@@ -662,14 +663,6 @@ public abstract class DuccAbstractHandle
                return disabled;
        }
 
-       public String getUserLogsDir(IDuccWorkJob job) {
-               String retVal = job.getLogDirectory();
-               if(!retVal.endsWith(File.separator)) {
-                       retVal += File.separator;
-               }
-               return retVal;
-       }
-
        public String buildjConsoleLink(String service) {
                String location = "buildjConsoleLink";
                String href = "<a 
href=\""+duccjConsoleLink+"?"+"service="+service+"\" onclick=\"var newWin = 
window.open(this.href,'child','height=800,width=1200,scrollbars');  
newWin.focus(); return false;\">"+service+"</a>";
@@ -688,7 +681,7 @@ public abstract class DuccAbstractHandle
                        if(name == null) {
                                name = errorCount;
                        }
-                       String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
+                       String logsjobdir = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
                        String logfile = "jd.err.log";
                        String href = "<a 
href=\""+duccLogData+"?"+"fname="+logsjobdir+logfile+"\" onclick=\"var newWin = 
window.open(this.href,'child','height=800,width=1200,scrollbars');  
newWin.focus(); return false;\">"+name+"</a>";
                        retVal = href;

Added: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccFile.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccFile.java?rev=1443156&view=auto
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccFile.java
 (added)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccFile.java
 Wed Feb  6 19:33:14 2013
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+
+package org.apache.uima.ducc.ws.server;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.uima.ducc.common.IDuccEnv;
+import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
+
+public class DuccFile {
+       
+       public static Properties getProperties(IDuccWorkJob job) throws 
IOException {
+               String directory = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
+               String name = "job-specification.properties";
+               Properties properties = DuccFile.getProperties(directory, name);
+               return properties;
+       }
+       
+       public static Properties getProperties(String directory, String name) 
throws IOException {
+               return getProperties(directory+name);
+       }
+       
+       public static Properties getProperties(String path) throws IOException {
+               FileInputStream fis = null;
+               try {
+                       File file = new File(path);
+                       fis = new FileInputStream(file);
+                       Properties properties = new Properties();
+                       properties.load(fis);
+                       fis.close();
+                       return properties;
+               }
+               catch(IOException e) {
+                       if(fis != null) {
+                               fis.close();
+                       }
+                       throw e;
+               }
+       }
+}

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
 Wed Feb  6 19:33:14 2013
@@ -302,7 +302,7 @@ public class DuccHandler extends DuccAbs
        }
        
        private void buildJobProcessListEntry(StringBuffer sb, DuccWorkJob job, 
IDuccProcess process, String type, int counter) {
-               String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
+               String logsjobdir = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
                String logfile = buildLogFileName(job, process, type);
                String errfile = "jd.err.log";
                String href = "<a 
href=\""+duccLogData+"?"+"fname="+logsjobdir+logfile+"\" onclick=\"var newWin = 
window.open(this.href,'child','height=800,width=1200,scrollbars');  
newWin.focus(); return false;\">"+logfile+"</a>";
@@ -1126,13 +1126,7 @@ public class DuccHandler extends DuccAbs
                DuccWorkJob job = getJob(jobNo);
                if(job != null) {
                        try {
-                               String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
-                               String specfile = 
"job-specification.properties";
-                               File file = new File(logsjobdir+specfile);
-                               FileInputStream fis = new FileInputStream(file);
-                               Properties properties = new Properties();
-                               properties.load(fis);
-                               fis.close();
+                               Properties properties = 
DuccFile.getProperties(job);
                                TreeMap<String,String> map = new 
TreeMap<String,String>();
                                Enumeration<?> enumeration = properties.keys();
                                while(enumeration.hasMoreElements()) {
@@ -1200,7 +1194,7 @@ public class DuccHandler extends DuccAbs
                                                data.append("<td>");
                                                DuccId processId = 
processIterator.next();
                                                IDuccProcess process = 
processMap.get(processId);
-                                               String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
+                                               String logsjobdir = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
                                                String logfile = 
buildLogFileName(job, process, "UIMA");
                                                String link = logfile;
                                                String reason = 
process.getReasonForStoppingProcess();
@@ -1248,7 +1242,7 @@ public class DuccHandler extends DuccAbs
                                                data.append("<td>");
                                                DuccId processId = 
processIterator.next();
                                                IDuccProcess process = 
processMap.get(processId);
-                                               String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
+                                               String logsjobdir = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
                                                String logfile = 
buildLogFileName(job, process, "UIMA");
                                                String link = logfile;
                                                String reason = 
process.getReasonForStoppingProcess();
@@ -1273,7 +1267,7 @@ public class DuccHandler extends DuccAbs
        }
 
        private void buildServiceProcessListEntry(StringBuffer sb, DuccWorkJob 
job, IDuccProcess process, String type, int counter) {
-               String logsjobdir = 
getUserLogsDir(job)+job.getDuccId().getFriendly()+File.separator;
+               String logsjobdir = 
job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
                String logfile = buildLogFileName(job, process, type);
                String href = "<a 
href=\""+duccLogData+"?"+"fname="+logsjobdir+logfile+"\" onclick=\"var newWin = 
window.open(this.href,'child','height=800,width=1200,scrollbars');  
newWin.focus(); return false;\">"+logfile+"</a>";
                sb.append(trGet(counter));
@@ -1417,7 +1411,7 @@ public class DuccHandler extends DuccAbs
                DuccWorkJob service = getService(jobNo);
                if(service != null) {
                        try {
-                               String logsjobdir = 
getUserLogsDir(service)+service.getDuccId().getFriendly()+File.separator;
+                               String logsjobdir = 
service.getUserLogsDir()+service.getDuccId().getFriendly()+File.separator;
                                String specfile = 
"service-specification.properties";
                                File file = new File(logsjobdir+specfile);
                                FileInputStream fis = new FileInputStream(file);

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
 Wed Feb  6 19:33:14 2013
@@ -146,6 +146,7 @@ public class DuccHandlerJsonFormat exten
                // Reason
                sb = new StringBuffer();
                if(job.isOperational()) {
+                       boolean multi = false;
                        sb.append("<span>");
                        ArrayList<String> swappingMachines = 
getSwappingMachines(job);
                        if(!swappingMachines.isEmpty()) {
@@ -155,11 +156,60 @@ public class DuccHandlerJsonFormat exten
                                        mb.append(" ");
                                }
                                String ml = mb.toString().trim();
+                               if(multi) {
+                                       sb.append(" ");
+                               }
+                               multi = true;
                                sb.append("<span class=\"health_red\" 
title=\""+ml+"\">");
                                sb.append("Swapping");
                                sb.append("</span>");
                        }
                        sb.append("</span>");
+                       DuccWebMonitor duccWebMonitor = 
DuccWebMonitor.getInstance();
+                       Long expiry = duccWebMonitor.getExpiry(duccId);
+                       if(expiry != null) {
+                               if(multi) {
+                                       sb.append(" ");
+                               }
+                               multi = true;
+                               String t2 = " left until auto-cancel, unless 
renewed";
+                               String t1;
+                               if(expiry == 0) {
+                                       t1 = "less than 1 minute";
+                               }
+                               else {
+                                       t1 = expiry+"+ minutes";
+                               }
+                               String text = t1+t2;
+                               long expiryWarnTime = 3;
+                               Properties properties = DuccWebProperties.get();
+                               String key = 
"ducc.ws.job.automatic.cancel.minutes";
+                               if(properties.containsKey(key)) {
+                                       String value = 
properties.getProperty(key);
+                                       try {
+                                               long time = 
Long.parseLong(value)/2;
+                                               if(time > 0) {
+                                                       expiryWarnTime = time;
+                                               }
+                                       }
+                                       catch(Exception e) {
+                                               
+                                       }
+                               }
+                               if(expiry > expiryWarnTime) {
+                                       sb.append("<span class=\"health_green\" 
title=\""+text+"\">");
+                               }
+                               else {
+                                       sb.append("<span class=\"health_red\" 
title=\""+text+"\">");
+                               }
+                               sb.append("WaitTimeout");
+                               sb.append("</span>");
+                       }
+                       else if(duccWebMonitor.isCancelPending(duccId)) {
+                               sb.append("<span class=\"health_red\" >");
+                               sb.append("CancelPending...");
+                               sb.append("</span>");
+                       }
                }
                else if(job.isCompleted()) {
                        JobCompletionType jobCompletionType = 
job.getCompletionType();

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
 Wed Feb  6 19:33:14 2013
@@ -155,6 +155,7 @@ public class DuccHandlerLegacy extends D
                sb.append("</td>");
                // Reason
                if(job.isOperational()) {
+                       boolean multi = false;
                        sb.append("<td valign=\"bottom\">");
                        ArrayList<String> swappingMachines = 
getSwappingMachines(job);
                        if(!swappingMachines.isEmpty()) {
@@ -164,10 +165,59 @@ public class DuccHandlerLegacy extends D
                                        mb.append(" ");
                                }
                                String ml = mb.toString().trim();
+                               if(multi) {
+                                       sb.append(" ");
+                               }
+                               multi = true;
                                sb.append("<span class=\"health_red\" 
title=\""+ml+"\">");
                                sb.append("Swapping");
                                sb.append("</span>");
                        }
+                       DuccWebMonitor duccWebMonitor = 
DuccWebMonitor.getInstance();
+                       Long expiry = duccWebMonitor.getExpiry(duccId);
+                       if(expiry != null) {
+                               if(multi) {
+                                       sb.append(" ");
+                               }
+                               multi = true;
+                               String t2 = " left until auto-cancel, unless 
renewed";
+                               String t1;
+                               if(expiry == 0) {
+                                       t1 = "less than 1 minute";
+                               }
+                               else {
+                                       t1 = expiry+"+ minutes";
+                               }
+                               String text = t1+t2;
+                               long expiryWarnTime = 3;
+                               Properties properties = DuccWebProperties.get();
+                               String key = 
"ducc.ws.job.automatic.cancel.minutes";
+                               if(properties.containsKey(key)) {
+                                       String value = 
properties.getProperty(key);
+                                       try {
+                                               long time = 
Long.parseLong(value)/2;
+                                               if(time > 0) {
+                                                       expiryWarnTime = time;
+                                               }
+                                       }
+                                       catch(Exception e) {
+                                               
+                                       }
+                               }
+                               if(expiry > expiryWarnTime) {
+                                       sb.append("<span class=\"health_green\" 
title=\""+text+"\">");
+                               }
+                               else {
+                                       sb.append("<span class=\"health_red\" 
title=\""+text+"\">");
+                               }
+                               sb.append("WaitTimeout");
+                               sb.append("</span>");
+                       }
+                       else if(duccWebMonitor.isCancelPending(duccId)) {
+                               sb.append("<span class=\"health_red\" >");
+                               sb.append("CancelPending...");
+                               sb.append("</span>");
+                       }
                        sb.append("</td>");
                }
                else if(job.isCompleted()) {

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java?rev=1443156&r1=1443155&r2=1443156&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
 Wed Feb  6 19:33:14 2013
@@ -183,9 +183,10 @@ public class DuccWebServer {
                DuccHandler duccHandler = new DuccHandler(this);
                DuccHandlerLegacy duccHandlerLegacy = new 
DuccHandlerLegacy(this);
                DuccHandlerJsonFormat duccHandlerJson = new 
DuccHandlerJsonFormat();
+               DuccHandlerProxy duccHandlerProxy = new DuccHandlerProxy();
                DuccHandlerUserAuthentication duccHandlerUserAuthentication = 
new DuccHandlerUserAuthentication();
                SessionHandler sessionHandler = new SessionHandler();
-               handlers.setHandlers(new Handler[] { sessionHandler, 
duccHandlerUserAuthentication, duccHandlerJson, duccHandlerLegacy, duccHandler, 
jspHandler, resourceHandler, new DefaultHandler() });
+               handlers.setHandlers(new Handler[] { sessionHandler, 
duccHandlerUserAuthentication, duccHandlerJson, duccHandlerProxy, 
duccHandlerLegacy, duccHandler, jspHandler, resourceHandler, new 
DefaultHandler() });
                server.setHandler(handlers);
                logger.trace(methodName, null, messages.fetch("exit"));
        }

Added: 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/TrackingInfo.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/TrackingInfo.java?rev=1443156&view=auto
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/TrackingInfo.java
 (added)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/TrackingInfo.java
 Wed Feb  6 19:33:14 2013
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+
+package org.apache.uima.ducc.ws.server;
+
+public class TrackingInfo {
+       public long time;
+       public String user;
+}


Reply via email to