001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2001-2007 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki.ui.progress;
021:
022: import java.util.HashMap;
023: import java.util.Map;
024:
025: import org.apache.log4j.Logger;
026: import org.safehaus.uuid.UUIDGenerator;
027:
028: import com.ecyrd.jspwiki.rpc.RPCCallable;
029: import com.ecyrd.jspwiki.rpc.json.JSONRPCManager;
030:
031: /**
032: * Manages progressing items. In general this class is used whenever JSPWiki
033: * is doing something which may require a long time. In addition, this manager
034: * provides a JSON interface for finding remotely what the progress is. The
035: * JSON object name is JSON_PROGRESSTRACKER = "{@value JSON_PROGRESSTRACKER}".
036: *
037: * @author Janne Jalkanen
038: * @since 2.6
039: */
040: // FIXME: Gotta synchronize
041: public class ProgressManager {
042: private Map m_progressingTasks = new HashMap();
043:
044: /**
045: * The name of the progress tracker JSON object. The current value is "{@value}",
046: */
047: public static final String JSON_PROGRESSTRACKER = "progressTracker";
048:
049: private static Logger log = Logger.getLogger(ProgressManager.class);
050:
051: /**
052: * Creates a new ProgressManager.
053: */
054: public ProgressManager() {
055: JSONRPCManager.registerGlobalObject(JSON_PROGRESSTRACKER,
056: new JSONTracker());
057: }
058:
059: /**
060: * You can use this to get an unique process identifier.
061: * @return A new random value
062: */
063: public String getNewProgressIdentifier() {
064: return UUIDGenerator.getInstance().generateRandomBasedUUID()
065: .toString();
066: }
067:
068: /**
069: * Call this method to get your ProgressItem into the ProgressManager queue.
070: * The ProgressItem will be moved to state STARTED.
071: *
072: * @param pi ProgressItem to start
073: * @param id The progress identifier
074: */
075: public void startProgress(ProgressItem pi, String id) {
076: log.debug("Adding " + id + " to progress queue");
077: m_progressingTasks.put(id, pi);
078: pi.setState(ProgressItem.STARTED);
079: }
080:
081: /**
082: * Call this method to remove your ProgressItem from the queue (after which
083: * getProgress() will no longer find it. The ProgressItem will be moved to state
084: * STOPPED.
085: *
086: * @param id The progress identifier
087: */
088: public void stopProgress(String id) {
089: log.debug("Removed " + id + " from progress queue");
090: ProgressItem pi = (ProgressItem) m_progressingTasks.remove(id);
091: if (pi != null)
092: pi.setState(ProgressItem.STOPPED);
093: }
094:
095: /**
096: * Get the progress in percents.
097: *
098: * @param id The progress identifier.
099: * @return A value between 0 to 100 indicating the progress.
100: * @throws IllegalArgumentException If no such progress item exists.
101: */
102: public int getProgress(String id) throws IllegalArgumentException {
103: ProgressItem pi = (ProgressItem) m_progressingTasks.get(id);
104:
105: if (pi != null) {
106: return pi.getProgress();
107: }
108:
109: throw new IllegalArgumentException("No such id was found");
110: }
111:
112: /**
113: * Provides access to a progress indicator, assuming you know the ID.
114: *
115: * @author Janne Jalkanen
116: */
117: public class JSONTracker implements RPCCallable {
118: /**
119: * Returns upload progress in percents so far.
120: * @param uploadId
121: * @return
122: */
123: public int getProgress(String progressId) {
124: return ProgressManager.this.getProgress(progressId);
125: }
126: }
127: }
|