You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2020/02/24 16:52:51 UTC
[jspwiki] 09/38: JSPWIKI-120: remove Engine#getCurrentWatchDog()
use WatchDog.getCurrentWathDog( Engine ) instead
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 2e4934a6229df6952c5b638d7b91b4d01140fcd2
Author: juanpablo <ju...@apache.org>
AuthorDate: Thu Feb 20 17:50:24 2020 +0100
JSPWIKI-120: remove Engine#getCurrentWatchDog() use WatchDog.getCurrentWathDog( Engine ) instead
---
.../src/main/java/org/apache/wiki/WatchDog.java | 150 ++++++++++-----------
.../java/org/apache/wiki/WikiBackgroundThread.java | 11 +-
.../main/java/org/apache/wiki/api/core/Engine.java | 9 --
.../main/java/org/apache/wiki/rss/RSSThread.java | 25 ++--
.../apache/wiki/search/LuceneSearchProvider.java | 2 +-
.../java/org/apache/wiki/ui/WikiJSPFilter.java | 14 +-
6 files changed, 97 insertions(+), 114 deletions(-)
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WatchDog.java b/jspwiki-main/src/main/java/org/apache/wiki/WatchDog.java
index 94d236f..ad261bd 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WatchDog.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WatchDog.java
@@ -18,6 +18,9 @@
*/
package org.apache.wiki;
+import org.apache.log4j.Logger;
+import org.apache.wiki.api.core.Engine;
+
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.Map;
@@ -25,64 +28,53 @@ import java.util.Set;
import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.log4j.Logger;
-
/**
- * WatchDog is a general system watchdog. You can attach any Watchable or a
- * Thread object to it, and it will notify you if a timeout has been exceeded.
+ * WatchDog is a general system watchdog. You can attach any Watchable or a Thread object to it, and it will notify you
+ * if a timeout has been exceeded.
* <p>
- * The notification of the timeouts is done from a separate WatchDog thread,
- * of which there is one per watched thread. This Thread is named 'WatchDog for
- * XXX', where XXX is your Thread name.
+ * The notification of the timeouts is done from a separate WatchDog thread, of which there is one per watched thread.
+ * This Thread is named 'WatchDog for XXX', where XXX is your Thread name.
* <p>
- * The suggested method of obtaining a WatchDog is via the static factory
- * method, since it will return you the correct watchdog for the current
- * thread. However, we do not prevent you from creating your own watchdogs
- * either.
+ * The suggested method of obtaining a WatchDog is via the static factory method, since it will return you the correct
+ * watchdog for the current thread. However, we do not prevent you from creating your own watchdogs either.
* <p>
- * If you create a WatchDog for a Thread, the WatchDog will figure out when
- * the Thread is dead, and will stop itself accordingly. However, this object
- * is not automatically released, so you might want to check it out after a while.
+ * If you create a WatchDog for a Thread, the WatchDog will figure out when the Thread is dead, and will stop itself
+ * accordingly. However, this object is not automatically released, so you might want to check it out after a while.
*
* @since 2.4.92
*/
public final class WatchDog {
private Watchable m_watchable;
- private Stack< State > m_stateStack = new Stack< State >();
+ private final Stack< State > m_stateStack = new Stack<>();
private boolean m_enabled = true;
- private WikiEngine m_engine;
+ private Engine m_engine;
private static final Logger log = Logger.getLogger( WatchDog.class );
- private static Map< Integer, WeakReference< WatchDog > > c_kennel = new ConcurrentHashMap< Integer, WeakReference< WatchDog > >();
-
+ private static Map< Integer, WeakReference< WatchDog > > c_kennel = new ConcurrentHashMap<>();
private static WikiBackgroundThread c_watcherThread;
/**
- * Returns the current watchdog for the current thread. This
- * is the preferred method of getting you a Watchdog, since it
- * keeps an internal list of Watchdogs for you so that there
- * won't be more than one watchdog per thread.
+ * Returns the current watchdog for the current thread. This is the preferred method of getting you a Watchdog, since it
+ * keeps an internal list of Watchdogs for you so that there won't be more than one watchdog per thread.
*
* @param engine The WikiEngine to which the Watchdog should be bonded to.
* @return A usable WatchDog object.
*/
- public static WatchDog getCurrentWatchDog( WikiEngine engine ) {
- Thread t = Thread.currentThread();
- WatchDog wd = null;
+ public static WatchDog getCurrentWatchDog( final Engine engine ) {
+ final Thread t = Thread.currentThread();
WeakReference< WatchDog > w = c_kennel.get( t.hashCode() );
-
+ WatchDog wd = null;
if( w != null ) {
wd = w.get();
}
if( w == null || wd == null ) {
wd = new WatchDog( engine, t );
- w = new WeakReference< WatchDog >( wd );
-
+ w = new WeakReference<>( wd );
c_kennel.put( t.hashCode(), w );
}
@@ -92,14 +84,14 @@ public final class WatchDog {
/**
* Creates a new WatchDog for a Watchable.
*
- * @param engine The WikiEngine.
- * @param watch A Watchable object.
+ * @param engine The Engine.
+ * @param watch A Watchable object.
*/
- public WatchDog( WikiEngine engine, Watchable watch ) {
+ public WatchDog( final Engine engine, final Watchable watch ) {
m_engine = engine;
m_watchable = watch;
- synchronized( this.getClass() ) {
+ synchronized( WatchDog.class ) {
if( c_watcherThread == null ) {
c_watcherThread = new WatchDogThread( engine );
c_watcherThread.start();
@@ -113,30 +105,24 @@ public final class WatchDog {
* @param engine The WikiEngine
* @param thread A Thread for watching.
*/
- public WatchDog(WikiEngine engine, Thread thread) {
- this( engine, new ThreadWrapper(thread) );
+ public WatchDog( final Engine engine, final Thread thread ) {
+ this( engine, new ThreadWrapper( thread ) );
}
/**
* Hopefully finalizes this properly. This is rather untested for now...
*/
private static void scrub() {
- //
- // During finalization, the object may already be cleared (depending
- // on the finalization order). Therefore, it's possible that this
- // method is called from another thread after the WatchDog itself
- // has been cleared.
- //
+ // During finalization, the object may already be cleared (depending on the finalization order). Therefore, it's
+ // possible that this method is called from another thread after the WatchDog itself has been cleared.
if( c_kennel == null ) {
return;
}
- for( Map.Entry< Integer, WeakReference< WatchDog > > e : c_kennel.entrySet() ) {
- WeakReference< WatchDog > w = e.getValue();
+ for( final Map.Entry< Integer, WeakReference< WatchDog > > e : c_kennel.entrySet() ) {
+ final WeakReference< WatchDog > w = e.getValue();
- //
// Remove expired as well
- //
if( w.get() == null ) {
c_kennel.remove( e.getKey() );
scrub();
@@ -149,7 +135,7 @@ public final class WatchDog {
* Can be used to enable the WatchDog. Will cause a new Thread to be created, if none was existing previously.
*/
public void enable() {
- synchronized( this.getClass() ) {
+ synchronized( WatchDog.class ) {
if( !m_enabled ) {
m_enabled = true;
c_watcherThread = new WatchDogThread( m_engine );
@@ -162,7 +148,7 @@ public final class WatchDog {
* Is used to disable a WatchDog. The watchdog thread is shut down and resources released.
*/
public void disable() {
- synchronized( this.getClass() ) {
+ synchronized( WatchDog.class ) {
if( m_enabled ) {
m_enabled = false;
c_watcherThread.shutdown();
@@ -177,7 +163,7 @@ public final class WatchDog {
*
* @param state A free-form string description of your state.
*/
- public void enterState( String state ) {
+ public void enterState( final String state ) {
enterState( state, Integer.MAX_VALUE );
}
@@ -197,14 +183,14 @@ public final class WatchDog {
* @param state A free-form string description of the state
* @param expectedCompletionTime The timeout in seconds.
*/
- public void enterState( String state, int expectedCompletionTime ) {
+ public void enterState( final String state, final int expectedCompletionTime ) {
if( log.isDebugEnabled() ){
log.debug( m_watchable.getName() + ": Entering state " + state +
", expected completion in " + expectedCompletionTime + " s");
}
synchronized( m_stateStack ) {
- State st = new State( state, expectedCompletionTime );
+ final State st = new State( state, expectedCompletionTime );
m_stateStack.push( st );
}
}
@@ -223,10 +209,10 @@ public final class WatchDog {
*
* @param state The state you wish to exit.
*/
- public void exitState( String state ) {
+ public void exitState( final String state ) {
if( !m_stateStack.empty() ) {
synchronized( m_stateStack ) {
- State st = m_stateStack.peek();
+ final State st = m_stateStack.peek();
if( state == null || st.getState().equals( state ) ) {
m_stateStack.pop();
@@ -249,7 +235,7 @@ public final class WatchDog {
* @return {@code true} if not empty, {@code false} otherwise.
*/
public boolean isStateStackNotEmpty() {
- return m_stateStack != null && !m_stateStack.isEmpty();
+ return !m_stateStack.isEmpty();
}
/**
@@ -268,8 +254,8 @@ public final class WatchDog {
synchronized( m_stateStack ) {
if( !m_stateStack.empty() ) {
- State st = m_stateStack.peek();
- long now = System.currentTimeMillis();
+ final State st = m_stateStack.peek();
+ final long now = System.currentTimeMillis();
if( now > st.getExpiryTime() ) {
log.info( "Watchable '" + m_watchable.getName() + "' exceeded timeout in state '" + st.getState() +
@@ -277,7 +263,7 @@ public final class WatchDog {
( log.isDebugEnabled() ? "" : "Enable DEBUG-level logging to see stack traces." ) );
dumpStackTraceForWatchable();
- m_watchable.timeoutExceeded(st.getState());
+ m_watchable.timeoutExceeded( st.getState() );
}
} else {
log.warn( "Stack for " + m_watchable.getName() + " is empty!" );
@@ -293,22 +279,22 @@ public final class WatchDog {
return;
}
- Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
- Set<Thread> threads = stackTraces.keySet();
- Iterator<Thread> threadIterator = threads.iterator();
- StringBuilder stacktrace = new StringBuilder();
+ final Map< Thread, StackTraceElement[] > stackTraces = Thread.getAllStackTraces();
+ final Set< Thread > threads = stackTraces.keySet();
+ final Iterator< Thread > threadIterator = threads.iterator();
+ final StringBuilder stacktrace = new StringBuilder();
while ( threadIterator.hasNext() ) {
- Thread t = threadIterator.next();
+ final Thread t = threadIterator.next();
if( t.getName().equals( m_watchable.getName() ) ) {
if( t.getName().equals( m_watchable.getName() ) ) {
- stacktrace.append( "dumping stacktrace for too long running thread : " + t );
+ stacktrace.append( "dumping stacktrace for too long running thread : " ).append( t );
} else {
- stacktrace.append( "dumping stacktrace for other running thread : " + t );
+ stacktrace.append( "dumping stacktrace for other running thread : " ).append( t );
}
- StackTraceElement[] ste = stackTraces.get( t );
- for( int i = 0; i < ste.length; i++ ) {
- stacktrace.append( "\n" + ste[i] );
+ final StackTraceElement[] ste = stackTraces.get( t );
+ for( final StackTraceElement stackTraceElement : ste ) {
+ stacktrace.append( "\n" ).append( stackTraceElement );
}
}
}
@@ -321,12 +307,13 @@ public final class WatchDog {
*
* @return Random ramblings.
*/
+ @Override
public String toString() {
synchronized( m_stateStack ) {
String state = "Idle";
if( !m_stateStack.empty() ) {
- State st = m_stateStack.peek();
+ final State st = m_stateStack.peek();
state = st.getState();
}
return "WatchDog state=" + state;
@@ -340,33 +327,34 @@ public final class WatchDog {
/** How often the watchdog thread should wake up (in seconds) */
private static final int CHECK_INTERVAL = 30;
- public WatchDogThread( WikiEngine engine ) {
+ public WatchDogThread( final Engine engine ) {
super( engine, CHECK_INTERVAL );
setName( "WatchDog for '" + engine.getApplicationName() + "'" );
}
+ @Override
public void startupTask() {
}
+ @Override
public void shutdownTask() {
WatchDog.scrub();
}
/**
- * Checks if the watchable is alive, and if it is, checks if
- * the stack is finished.
+ * Checks if the watchable is alive, and if it is, checks if the stack is finished.
*
- * If the watchable has been deleted in the mean time, will
- * simply shut down itself.
+ * If the watchable has been deleted in the mean time, will simply shut down itself.
*/
- public void backgroundTask() throws Exception {
+ @Override
+ public void backgroundTask() {
if( c_kennel == null ) {
return;
}
- for( Map.Entry< Integer, WeakReference< WatchDog > > entry : c_kennel.entrySet() ) {
- WeakReference< WatchDog > wr = entry.getValue();
- WatchDog w = wr.get();
+ for( final Map.Entry< Integer, WeakReference< WatchDog > > entry : c_kennel.entrySet() ) {
+ final WeakReference< WatchDog > wr = entry.getValue();
+ final WatchDog w = wr.get();
if( w != null ) {
if( w.isWatchableAlive() && w.isStateStackNotEmpty() ) {
w.check();
@@ -391,10 +379,10 @@ public final class WatchDog {
protected long m_enterTime;
protected long m_expiryTime;
- protected State( String state, int expiry ) {
+ protected State( final String state, final int expiry ) {
m_state = state;
m_enterTime = System.currentTimeMillis();
- m_expiryTime = m_enterTime + (expiry * 1000L);
+ m_expiryTime = m_enterTime + ( expiry * 1_000L );
}
protected String getState() {
@@ -404,6 +392,7 @@ public final class WatchDog {
protected long getExpiryTime() {
return m_expiryTime;
}
+
}
/**
@@ -412,18 +401,21 @@ public final class WatchDog {
private static class ThreadWrapper implements Watchable {
private Thread m_thread;
- public ThreadWrapper( Thread thread ) {
+ public ThreadWrapper( final Thread thread ) {
m_thread = thread;
}
- public void timeoutExceeded( String state ) {
+ @Override
+ public void timeoutExceeded( final String state ) {
// TODO: Figure out something sane to do here.
}
+ @Override
public String getName() {
return m_thread.getName();
}
+ @Override
public boolean isAlive() {
return m_thread.isAlive();
}
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiBackgroundThread.java b/jspwiki-main/src/main/java/org/apache/wiki/WikiBackgroundThread.java
index 18e48e3..8bda0fa 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiBackgroundThread.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiBackgroundThread.java
@@ -19,6 +19,7 @@
package org.apache.wiki;
import org.apache.log4j.Logger;
+import org.apache.wiki.api.core.Engine;
import org.apache.wiki.event.WikiEngineEvent;
import org.apache.wiki.event.WikiEvent;
import org.apache.wiki.event.WikiEventListener;
@@ -34,7 +35,7 @@ public abstract class WikiBackgroundThread extends Thread implements WikiEventLi
private static final Logger LOG = Logger.getLogger( WikiBackgroundThread.class );
private volatile boolean m_killMe = false;
- private final WikiEngine m_engine;
+ private final Engine m_engine;
private final int m_interval;
private static final long POLLING_INTERVAL = 1_000L;
@@ -46,7 +47,7 @@ public abstract class WikiBackgroundThread extends Thread implements WikiEventLi
* @param sleepInterval the interval between invocations of
* the thread's {@link Thread#run()} method, in seconds
*/
- public WikiBackgroundThread( final WikiEngine engine, final int sleepInterval ) {
+ public WikiBackgroundThread( final Engine engine, final int sleepInterval ) {
super();
m_engine = engine;
m_interval = sleepInterval;
@@ -60,7 +61,7 @@ public abstract class WikiBackgroundThread extends Thread implements WikiEventLi
* @param event {@inheritDoc}
* @see org.apache.wiki.event.WikiEventListener#actionPerformed(org.apache.wiki.event.WikiEvent)
*/
- public final void actionPerformed( final WikiEvent event ) {
+ @Override public final void actionPerformed( final WikiEvent event ) {
if ( event instanceof WikiEngineEvent ) {
if ( event.getType() == WikiEngineEvent.SHUTDOWN ) {
LOG.warn( "Detected wiki engine shutdown: killing " + getName() + "." );
@@ -81,7 +82,7 @@ public abstract class WikiBackgroundThread extends Thread implements WikiEventLi
*
* @return the wiki engine
*/
- public WikiEngine getEngine() {
+ public Engine getEngine() {
return m_engine;
}
@@ -103,7 +104,7 @@ public abstract class WikiBackgroundThread extends Thread implements WikiEventLi
*
* @see java.lang.Thread#run()
*/
- public final void run() {
+ @Override public final void run() {
try {
// Perform the initial startup task
final String name = getName();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/api/core/Engine.java b/jspwiki-main/src/main/java/org/apache/wiki/api/core/Engine.java
index f88eb88..bab095c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/api/core/Engine.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/api/core/Engine.java
@@ -19,7 +19,6 @@
package org.apache.wiki.api.core;
import org.apache.log4j.Logger;
-import org.apache.wiki.WatchDog;
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.event.WikiEventListener;
@@ -381,14 +380,6 @@ public interface Engine {
< T > T removeAttribute( String key );
/**
- * Returns a WatchDog for current thread.
- *
- * @return The current thread WatchDog.
- * @since 2.4.92
- */
- WatchDog getCurrentWatchDog();
-
- /**
* Signals that the Engine will be shut down by the servlet container.
*/
void shutdown();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/rss/RSSThread.java b/jspwiki-main/src/main/java/org/apache/wiki/rss/RSSThread.java
index 4d0d303..9707314 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/rss/RSSThread.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/rss/RSSThread.java
@@ -19,6 +19,12 @@
package org.apache.wiki.rss;
+import org.apache.log4j.Logger;
+import org.apache.wiki.WatchDog;
+import org.apache.wiki.WikiBackgroundThread;
+import org.apache.wiki.WikiEngine;
+import org.apache.wiki.util.FileUtil;
+
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
@@ -28,12 +34,6 @@ import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;
-import org.apache.log4j.Logger;
-import org.apache.wiki.WatchDog;
-import org.apache.wiki.WikiBackgroundThread;
-import org.apache.wiki.WikiEngine;
-import org.apache.wiki.util.FileUtil;
-
/**
* Runs the RSS generation thread.
* FIXME: MUST be somewhere else, this is not a good place.
@@ -54,7 +54,7 @@ public class RSSThread extends WikiBackgroundThread
* @param rssFile A File to write the RSS data to.
* @param rssInterval How often the RSS should be generated.
*/
- public RSSThread( WikiEngine engine, File rssFile, int rssInterval )
+ public RSSThread( final WikiEngine engine, final File rssFile, final int rssInterval )
{
super( engine, rssInterval );
m_generator = engine.getRSSGenerator();
@@ -68,9 +68,8 @@ public class RSSThread extends WikiBackgroundThread
* {@inheritDoc}
*/
@Override
- public void startupTask() throws Exception
- {
- m_watchdog = getEngine().getCurrentWatchDog();
+ public void startupTask() {
+ m_watchdog = WatchDog.getCurrentWatchDog( getEngine() );
}
/**
@@ -99,14 +98,14 @@ public class RSSThread extends WikiBackgroundThread
//
log.debug("Regenerating RSS feed to "+m_rssFile);
- String feed = m_generator.generate();
+ final String feed = m_generator.generate();
in = new StringReader(feed);
out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( m_rssFile ), "UTF-8") );
FileUtil.copyContents( in, out );
}
- catch( IOException e )
+ catch( final IOException e )
{
log.error("Cannot generate RSS feed to "+m_rssFile.getAbsolutePath(), e );
m_generator.setEnabled( false );
@@ -118,7 +117,7 @@ public class RSSThread extends WikiBackgroundThread
if( in != null ) in.close();
if( out != null ) out.close();
}
- catch( IOException e )
+ catch( final IOException e )
{
log.fatal("Could not close I/O for RSS", e );
m_generator.setEnabled( false );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
index 1cfcc30..c6ab12a 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
@@ -564,7 +564,7 @@ public class LuceneSearchProvider implements SearchProvider {
@Override
public void startupTask() throws Exception {
- m_watchdog = getEngine().getCurrentWatchDog();
+ m_watchdog = WatchDog.getCurrentWatchDog( getEngine() );
// Sleep initially...
try {
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
index d7d1fe2..03e16cd 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/WikiJSPFilter.java
@@ -77,15 +77,15 @@ public class WikiJSPFilter extends WikiServletFilter {
private boolean useEncoding;
/** {@inheritDoc} */
- public void init( final FilterConfig config ) throws ServletException {
+ @Override public void init( final FilterConfig config ) throws ServletException {
super.init( config );
m_wiki_encoding = m_engine.getWikiProperties().getProperty(WikiEngine.PROP_ENCODING);
useEncoding = !( Boolean.valueOf( m_engine.getWikiProperties().getProperty( WikiEngine.PROP_NO_FILTER_ENCODING, "false" ).trim() ).booleanValue() );
}
- public void doFilter( final ServletRequest request, final ServletResponse response, final FilterChain chain ) throws ServletException, IOException {
- final WatchDog w = m_engine.getCurrentWatchDog();
+ @Override public void doFilter( final ServletRequest request, final ServletResponse response, final FilterChain chain ) throws ServletException, IOException {
+ final WatchDog w = WatchDog.getCurrentWatchDog( m_engine );
try {
NDC.push( m_engine.getApplicationName()+":"+((HttpServletRequest)request).getRequestURI() );
w.enterState("Filtering for URL "+((HttpServletRequest)request).getRequestURI(), 90 );
@@ -229,15 +229,15 @@ public class WikiJSPFilter extends WikiServletFilter {
/**
* Returns a writer for output; this wraps the internal buffer into a PrintWriter.
*/
- public PrintWriter getWriter() {
+ @Override public PrintWriter getWriter() {
return m_writer;
}
- public ServletOutputStream getOutputStream() {
+ @Override public ServletOutputStream getOutputStream() {
return m_servletOut;
}
- public void flushBuffer() throws IOException {
+ @Override public void flushBuffer() throws IOException {
m_writer.flush();
super.flushBuffer();
}
@@ -272,7 +272,7 @@ public class WikiJSPFilter extends WikiServletFilter {
}
/** Returns whatever was written so far into the Writer. */
- public String toString() {
+ @Override public String toString() {
try {
flushBuffer();
} catch( final IOException e ) {