This is an automated email from the ASF dual-hosted git repository. juanpablo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jspwiki.git
commit 8a7d63b26d4085913ffc76d73d30662b0710e9d2 Author: juanpablo <[email protected]> AuthorDate: Sat Jan 18 15:07:58 2020 +0100 fix: add synchronization to progressing tasks on progress manager --- .../apache/wiki/ui/progress/ProgressManager.java | 122 ++++++++++----------- 1 file changed, 55 insertions(+), 67 deletions(-) diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/progress/ProgressManager.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/progress/ProgressManager.java index 7e04394..8552a3f 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/ui/progress/ProgressManager.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/progress/ProgressManager.java @@ -18,51 +18,46 @@ */ package org.apache.wiki.ui.progress; +import org.apache.log4j.Logger; +import org.apache.wiki.ajax.WikiAjaxDispatcherServlet; +import org.apache.wiki.ajax.WikiAjaxServlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.log4j.Logger; -import org.apache.wiki.ajax.WikiAjaxDispatcherServlet; -import org.apache.wiki.ajax.WikiAjaxServlet; /** - * Manages progressing items. In general this class is used whenever JSPWiki - * is doing something which may require a long time. In addition, this manager - * provides a JSON interface for finding remotely what the progress is. The - * JSON object name is JSON_PROGRESSTRACKER = "{@value #JSON_PROGRESSTRACKER}". + * Manages progressing items. In general this class is used whenever JSPWiki is doing something which may require a long time. + * In addition, this manager provides a JSON interface for finding remotely what the progress is. The JSON object name is + * JSON_PROGRESSTRACKER = "{@value #JSON_PROGRESSTRACKER}". * * @since 2.6 */ -// FIXME: Needs synchronization, I think -public class ProgressManager -{ - private Map<String,ProgressItem> m_progressingTasks = new HashMap<String,ProgressItem>(); +public class ProgressManager { - /** - * The name of the progress tracker JSON object. The current value is "{@value}", - */ + private Map< String,ProgressItem > m_progressingTasks = new ConcurrentHashMap<>(); + + /** The name of the progress tracker JSON object. The current value is "{@value}", */ public static final String JSON_PROGRESSTRACKER = "progressTracker"; - private static Logger log = Logger.getLogger( ProgressManager.class ); + private static final Logger log = Logger.getLogger( ProgressManager.class ); /** * Creates a new ProgressManager. */ - public ProgressManager() - { - //TODO: Replace with custom annotations. See JSPWIKI-566 + public ProgressManager() { + // TODO: Replace with custom annotations. See JSPWIKI-566 WikiAjaxDispatcherServlet.registerServlet( JSON_PROGRESSTRACKER, new JSONTracker() ); } /** * You can use this to get an unique process identifier. + * * @return A new random value */ public String getNewProgressIdentifier() @@ -71,31 +66,29 @@ public class ProgressManager } /** - * Call this method to get your ProgressItem into the ProgressManager queue. - * The ProgressItem will be moved to state STARTED. + * Call this method to get your ProgressItem into the ProgressManager queue. The ProgressItem will be moved to state STARTED. * * @param pi ProgressItem to start * @param id The progress identifier */ - public void startProgress( ProgressItem pi, String id ) - { - log.debug("Adding "+id+" to progress queue"); + public void startProgress( final ProgressItem pi, final String id ) { + log.debug( "Adding " + id + " to progress queue" ); m_progressingTasks.put( id, pi ); pi.setState( ProgressItem.STARTED ); } /** - * Call this method to remove your ProgressItem from the queue (after which - * getProgress() will no longer find it. The ProgressItem will be moved to state - * STOPPED. + * Call this method to remove your ProgressItem from the queue (after which getProgress() will no longer find it. + * The ProgressItem will be moved to state STOPPED. * * @param id The progress identifier */ - public void stopProgress( String id ) - { - log.debug("Removed "+id+" from progress queue"); - ProgressItem pi = m_progressingTasks.remove( id ); - if( pi != null ) pi.setState( ProgressItem.STOPPED ); + public void stopProgress( final String id ) { + log.debug( "Removed " + id + " from progress queue" ); + final ProgressItem pi = m_progressingTasks.remove( id ); + if( pi != null ) { + pi.setState( ProgressItem.STOPPED ); + } } /** @@ -105,33 +98,27 @@ public class ProgressManager * @return a value between 0 to 100 indicating the progress * @throws IllegalArgumentException If no such progress item exists. */ - public int getProgress( String id ) - throws IllegalArgumentException - { - ProgressItem pi = m_progressingTasks.get( id ); - - if( pi != null ) - { + public int getProgress( final String id ) throws IllegalArgumentException { + final ProgressItem pi = m_progressingTasks.get( id ); + if( pi != null ) { return pi.getProgress(); } - throw new IllegalArgumentException("No such id was found"); + throw new IllegalArgumentException( "No such id was found" ); } /** - * Provides access to a progress indicator, assuming you know the ID. - * Progress of zero (0) means that the progress has just started, and a progress of - * 100 means that it is complete. + * Provides access to a progress indicator, assuming you know the ID. Progress of zero (0) means that the progress has just started, + * and a progress of 100 means that it is complete. */ - public class JSONTracker implements WikiAjaxServlet - { + public class JSONTracker implements WikiAjaxServlet { /** * Returns upload progress in percents so far. - * @param progressId The string representation of the progress ID that you want to know the - * progress of. + * + * @param progressId The string representation of the progress ID that you want to know the progress of. * @return a value between 0 to 100 indicating the progress */ - public int getProgress( String progressId ) + public int getProgress( final String progressId ) { return ProgressManager.this.getProgress( progressId ); } @@ -140,26 +127,27 @@ public class ProgressManager return JSON_PROGRESSTRACKER; } - public void service(HttpServletRequest req, HttpServletResponse resp, String actionName, List<String> params) - throws ServletException, IOException - { - log.debug("ProgressManager.doGet() START"); - if (params.size()<1) { + public void service( final HttpServletRequest req, + final HttpServletResponse resp, + final String actionName, + final List< String > params ) throws IOException { + log.debug( "ProgressManager.doGet() START" ); + if( params.size() < 1 ) { return; } - String progressId = params.get(0); - log.debug("progressId="+progressId); + final String progressId = params.get(0); + log.debug( "progressId=" + progressId ); String progressString = ""; try { - int progress = getProgress(progressId); - progressString = Integer.toString(progress); - } catch (IllegalArgumentException e) { - // ignore - log.debug("progressId "+progressId+" is no longer valid"); + progressString = Integer.toString( getProgress( progressId ) ); + } catch( final IllegalArgumentException e ) { // ignore + log.debug( "progressId " + progressId + " is no longer valid" ); } - log.debug("progressString="+progressString); - resp.getWriter().write(progressString); - log.debug("ProgressManager.doGet() DONE"); + log.debug( "progressString=" + progressString ); + resp.getWriter().write( progressString ); + log.debug( "ProgressManager.doGet() DONE" ); } + } + }
