You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jo...@apache.org on 2019/05/30 11:46:38 UTC

[mina] branch 2.1.X updated: Fix DIRMINA-1115 prevent division by zero

This is an automated email from the ASF dual-hosted git repository.

johnnyv pushed a commit to branch 2.1.X
in repository https://gitbox.apache.org/repos/asf/mina.git


The following commit(s) were added to refs/heads/2.1.X by this push:
     new a6aa784  Fix DIRMINA-1115 prevent division by zero
a6aa784 is described below

commit a6aa78483aa91282376dfab959d9e4dad3ea30d2
Author: johnnyv <jo...@apache.org>
AuthorDate: Thu May 30 07:44:05 2019 -0400

    Fix DIRMINA-1115 prevent division by zero
---
 .../mina/filter/statistic/ProfilerTimerFilter.java | 1259 ++++++++++----------
 1 file changed, 615 insertions(+), 644 deletions(-)

diff --git a/mina-core/src/main/java/org/apache/mina/filter/statistic/ProfilerTimerFilter.java b/mina-core/src/main/java/org/apache/mina/filter/statistic/ProfilerTimerFilter.java
index dd5815a..08bb7b4 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/statistic/ProfilerTimerFilter.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/statistic/ProfilerTimerFilter.java
@@ -31,16 +31,12 @@ import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.WriteRequest;
 
 /**
- * This class will measure the time it takes for a
- * method in the {@link IoFilterAdapter} class to execute.  The basic
- * premise of the logic in this class is to get the current time
- * at the beginning of the method, call method on nextFilter, and
- * then get the current time again.  An example of how to use
- * the filter is:
+ * This class will measure the time it takes for a method in the {@link IoFilterAdapter} class to execute. The basic
+ * premise of the logic in this class is to get the current time at the beginning of the method, call method on
+ * nextFilter, and then get the current time again. An example of how to use the filter is:
  *
  * <pre>
- * ProfilerTimerFilter profiler = new ProfilerTimerFilter(
- *         TimeUnit.MILLISECOND, IoEventType.MESSAGE_RECEIVED);
+ * ProfilerTimerFilter profiler = new ProfilerTimerFilter(TimeUnit.MILLISECOND, IoEventType.MESSAGE_RECEIVED);
  * chain.addFirst("Profiler", profiler);
  * </pre>
  * 
@@ -98,806 +94,781 @@ public class ProfilerTimerFilter extends IoFilterAdapter {
     private boolean profileSessionClosed = false;
 
     /**
-     * Creates a new instance of ProfilerFilter.  This is the
-     * default constructor and will print out timings for
-     * messageReceived and messageSent and the time increment
-     * will be in milliseconds.
+     * Creates a new instance of ProfilerFilter. This is the default constructor and will print out timings for
+     * messageReceived and messageSent and the time increment will be in milliseconds.
      */
     public ProfilerTimerFilter() {
-        this(TimeUnit.MILLISECONDS, IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
+	this(TimeUnit.MILLISECONDS, IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
     }
 
     /**
-     * Creates a new instance of ProfilerFilter.  This is the
-     * default constructor and will print out timings for
+     * Creates a new instance of ProfilerFilter. This is the default constructor and will print out timings for
      * messageReceived and messageSent.
      * 
-     * @param timeUnit the time increment to set
+     * @param timeUnit
+     *            the time increment to set
      */
     public ProfilerTimerFilter(TimeUnit timeUnit) {
-        this(timeUnit, IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
+	this(timeUnit, IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
     }
 
     /**
-     * Creates a new instance of ProfilerFilter.  An example
-     * of this call would be:
+     * Creates a new instance of ProfilerFilter. An example of this call would be:
      *
      * <pre>
-     * new ProfilerTimerFilter(
-     *         TimeUnit.MILLISECONDS,
-     *         IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
+     * new ProfilerTimerFilter(TimeUnit.MILLISECONDS, IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT);
      * </pre>
      * 
-     * Note : you can add as many {@link IoEventType} as you want. The method accepts
-     * a variable number of arguments.
+     * Note : you can add as many {@link IoEventType} as you want. The method accepts a variable number of arguments.
      * 
-     * @param timeUnit Used to determine the level of precision you need in your timing.
-     * @param eventTypes A list of {@link IoEventType} representation of the methods to profile
+     * @param timeUnit
+     *            Used to determine the level of precision you need in your timing.
+     * @param eventTypes
+     *            A list of {@link IoEventType} representation of the methods to profile
      */
     public ProfilerTimerFilter(TimeUnit timeUnit, IoEventType... eventTypes) {
-        this.timeUnit = timeUnit;
+	this.timeUnit = timeUnit;
 
-        setProfilers(eventTypes);
+	setProfilers(eventTypes);
     }
 
     /**
      * Create the profilers for a list of {@link IoEventType}.
      * 
-     * @param eventTypes the list of {@link IoEventType} to profile
+     * @param eventTypes
+     *            the list of {@link IoEventType} to profile
      */
     private void setProfilers(IoEventType... eventTypes) {
-        for (IoEventType type : eventTypes) {
-            switch (type) {
-                case MESSAGE_RECEIVED:
-                    messageReceivedTimerWorker = new TimerWorker();
-                    profileMessageReceived = true;
-                    break;
-    
-                case MESSAGE_SENT:
-                    messageSentTimerWorker = new TimerWorker();
-                    profileMessageSent = true;
-                    break;
-                    
-                case SESSION_CLOSED:
-                    sessionClosedTimerWorker = new TimerWorker();
-                    profileSessionClosed = true;
-                    break;
-    
-                case SESSION_CREATED:
-                    sessionCreatedTimerWorker = new TimerWorker();
-                    profileSessionCreated = true;
-                    break;
-                    
-                case SESSION_IDLE:
-                    sessionIdleTimerWorker = new TimerWorker();
-                    profileSessionIdle = true;
-                    break;
-    
-                case SESSION_OPENED:
-                    sessionOpenedTimerWorker = new TimerWorker();
-                    profileSessionOpened = true;
-                    break;
-                    
-                default : 
-                        break;
-            }
-        }
+	for (IoEventType type : eventTypes) {
+	    switch (type) {
+	    case MESSAGE_RECEIVED:
+		messageReceivedTimerWorker = new TimerWorker();
+		profileMessageReceived = true;
+		break;
+
+	    case MESSAGE_SENT:
+		messageSentTimerWorker = new TimerWorker();
+		profileMessageSent = true;
+		break;
+
+	    case SESSION_CLOSED:
+		sessionClosedTimerWorker = new TimerWorker();
+		profileSessionClosed = true;
+		break;
+
+	    case SESSION_CREATED:
+		sessionCreatedTimerWorker = new TimerWorker();
+		profileSessionCreated = true;
+		break;
+
+	    case SESSION_IDLE:
+		sessionIdleTimerWorker = new TimerWorker();
+		profileSessionIdle = true;
+		break;
+
+	    case SESSION_OPENED:
+		sessionOpenedTimerWorker = new TimerWorker();
+		profileSessionOpened = true;
+		break;
+
+	    default:
+		break;
+	    }
+	}
     }
 
     /**
      * Sets the {@link TimeUnit} being used.
      *
-     * @param timeUnit the new {@link TimeUnit} to be used.
+     * @param timeUnit
+     *            the new {@link TimeUnit} to be used.
      */
     public void setTimeUnit(TimeUnit timeUnit) {
-        this.timeUnit = timeUnit;
+	this.timeUnit = timeUnit;
     }
 
     /**
      * Set the {@link IoEventType} to be profiled
      *
-     * @param type The {@link IoEventType} to profile
+     * @param type
+     *            The {@link IoEventType} to profile
      */
     public void profile(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                profileMessageReceived = true;
-    
-                if (messageReceivedTimerWorker == null) {
-                    messageReceivedTimerWorker = new TimerWorker();
-                }
-    
-                return;
-    
-            case MESSAGE_SENT:
-                profileMessageSent = true;
-    
-                if (messageSentTimerWorker == null) {
-                    messageSentTimerWorker = new TimerWorker();
-                }
-    
-                return;
-                
-            case SESSION_CLOSED:
-                profileSessionClosed = true;
-    
-                if (sessionClosedTimerWorker == null) {
-                    sessionClosedTimerWorker = new TimerWorker();
-                }
-    
-                return;
-
-            case SESSION_CREATED:
-                profileSessionCreated = true;
-    
-                if (sessionCreatedTimerWorker == null) {
-                    sessionCreatedTimerWorker = new TimerWorker();
-                }
-    
-                return;
-                
-            case SESSION_IDLE:
-                profileSessionIdle = true;
-    
-                if (sessionIdleTimerWorker == null) {
-                    sessionIdleTimerWorker = new TimerWorker();
-                }
-    
-                return;
-    
-            case SESSION_OPENED:
-                profileSessionOpened = true;
-    
-                if (sessionOpenedTimerWorker == null) {
-                    sessionOpenedTimerWorker = new TimerWorker();
-                }
-    
-                return;
-            
-            default:
-                    break;
-        }
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    profileMessageReceived = true;
+
+	    if (messageReceivedTimerWorker == null) {
+		messageReceivedTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	case MESSAGE_SENT:
+	    profileMessageSent = true;
+
+	    if (messageSentTimerWorker == null) {
+		messageSentTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	case SESSION_CLOSED:
+	    profileSessionClosed = true;
+
+	    if (sessionClosedTimerWorker == null) {
+		sessionClosedTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	case SESSION_CREATED:
+	    profileSessionCreated = true;
+
+	    if (sessionCreatedTimerWorker == null) {
+		sessionCreatedTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	case SESSION_IDLE:
+	    profileSessionIdle = true;
+
+	    if (sessionIdleTimerWorker == null) {
+		sessionIdleTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	case SESSION_OPENED:
+	    profileSessionOpened = true;
+
+	    if (sessionOpenedTimerWorker == null) {
+		sessionOpenedTimerWorker = new TimerWorker();
+	    }
+
+	    return;
+
+	default:
+	    break;
+	}
     }
 
     /**
      * Stop profiling an {@link IoEventType}
      *
-     * @param type The {@link IoEventType} to stop profiling
+     * @param type
+     *            The {@link IoEventType} to stop profiling
      */
     public void stopProfile(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                profileMessageReceived = false;
-                return;
-    
-            case MESSAGE_SENT:
-                profileMessageSent = false;
-                return;
-                
-            case SESSION_CLOSED:
-                profileSessionClosed = false;
-                return;
-    
-            case SESSION_CREATED:
-                profileSessionCreated = false;
-                return;
-                
-            case SESSION_IDLE:
-                profileSessionIdle = false;
-                return;
-    
-            case SESSION_OPENED:
-                profileSessionOpened = false;
-                return;
-                
-            default:
-                return;
-        }
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    profileMessageReceived = false;
+	    return;
+
+	case MESSAGE_SENT:
+	    profileMessageSent = false;
+	    return;
+
+	case SESSION_CLOSED:
+	    profileSessionClosed = false;
+	    return;
+
+	case SESSION_CREATED:
+	    profileSessionCreated = false;
+	    return;
+
+	case SESSION_IDLE:
+	    profileSessionIdle = false;
+	    return;
+
+	case SESSION_OPENED:
+	    profileSessionOpened = false;
+	    return;
+
+	default:
+	    return;
+	}
     }
 
     /**
      * Return the set of {@link IoEventType} which are profiled.
      *
-     * @return a Set containing all the profiled {@link IoEventType} 
+     * @return a Set containing all the profiled {@link IoEventType}
      */
     public Set<IoEventType> getEventsToProfile() {
-        Set<IoEventType> set = new HashSet<IoEventType>();
+	Set<IoEventType> set = new HashSet<IoEventType>();
 
-        if (profileMessageReceived) {
-            set.add(IoEventType.MESSAGE_RECEIVED);
-        }
+	if (profileMessageReceived) {
+	    set.add(IoEventType.MESSAGE_RECEIVED);
+	}
 
-        if (profileMessageSent) {
-            set.add(IoEventType.MESSAGE_SENT);
-        }
+	if (profileMessageSent) {
+	    set.add(IoEventType.MESSAGE_SENT);
+	}
 
-        if (profileSessionCreated) {
-            set.add(IoEventType.SESSION_CREATED);
-        }
+	if (profileSessionCreated) {
+	    set.add(IoEventType.SESSION_CREATED);
+	}
 
-        if (profileSessionOpened) {
-            set.add(IoEventType.SESSION_OPENED);
-        }
+	if (profileSessionOpened) {
+	    set.add(IoEventType.SESSION_OPENED);
+	}
 
-        if (profileSessionIdle) {
-            set.add(IoEventType.SESSION_IDLE);
-        }
+	if (profileSessionIdle) {
+	    set.add(IoEventType.SESSION_IDLE);
+	}
 
-        if (profileSessionClosed) {
-            set.add(IoEventType.SESSION_CLOSED);
-        }
+	if (profileSessionClosed) {
+	    set.add(IoEventType.SESSION_CLOSED);
+	}
 
-        return set;
+	return set;
     }
 
     /**
      * Set the profilers for a list of {@link IoEventType}
      * 
-     * @param eventTypes the list of {@link IoEventType} to profile
+     * @param eventTypes
+     *            the list of {@link IoEventType} to profile
      */
     public void setEventsToProfile(IoEventType... eventTypes) {
-        setProfilers(eventTypes);
+	setProfilers(eventTypes);
     }
 
     /**
-     * Profile a MessageReceived event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a MessageReceived event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
-     * @param message the received message
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
+     * @param message
+     *            the received message
      */
     @Override
     public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
-        if (profileMessageReceived) {
-            long start = timeNow();
-            nextFilter.messageReceived(session, message);
-            long end = timeNow();
-            messageReceivedTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.messageReceived(session, message);
-        }
+	if (profileMessageReceived) {
+	    long start = timeNow();
+	    nextFilter.messageReceived(session, message);
+	    long end = timeNow();
+	    messageReceivedTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.messageReceived(session, message);
+	}
     }
 
     /**
-     * Profile a MessageSent event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a MessageSent event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
-     * @param writeRequest the sent message
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
+     * @param writeRequest
+     *            the sent message
      */
     @Override
     public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
-        if (profileMessageSent) {
-            long start = timeNow();
-            nextFilter.messageSent(session, writeRequest);
-            long end = timeNow();
-            messageSentTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.messageSent(session, writeRequest);
-        }
+	if (profileMessageSent) {
+	    long start = timeNow();
+	    nextFilter.messageSent(session, writeRequest);
+	    long end = timeNow();
+	    messageSentTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.messageSent(session, writeRequest);
+	}
     }
 
     /**
-     * Profile a SessionCreated event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a SessionCreated event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
      */
     @Override
     public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
-        if (profileSessionCreated) {
-            long start = timeNow();
-            nextFilter.sessionCreated(session);
-            long end = timeNow();
-            sessionCreatedTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.sessionCreated(session);
-        }
+	if (profileSessionCreated) {
+	    long start = timeNow();
+	    nextFilter.sessionCreated(session);
+	    long end = timeNow();
+	    sessionCreatedTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.sessionCreated(session);
+	}
     }
 
     /**
-     * Profile a SessionOpened event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a SessionOpened event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
      */
     @Override
     public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {
-        if (profileSessionOpened) {
-            long start = timeNow();
-            nextFilter.sessionOpened(session);
-            long end = timeNow();
-            sessionOpenedTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.sessionOpened(session);
-        }
+	if (profileSessionOpened) {
+	    long start = timeNow();
+	    nextFilter.sessionOpened(session);
+	    long end = timeNow();
+	    sessionOpenedTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.sessionOpened(session);
+	}
     }
 
     /**
-     * Profile a SessionIdle event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a SessionIdle event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
-     * @param status The session's status
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
+     * @param status
+     *            The session's status
      */
     @Override
     public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {
-        if (profileSessionIdle) {
-            long start = timeNow();
-            nextFilter.sessionIdle(session, status);
-            long end = timeNow();
-            sessionIdleTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.sessionIdle(session, status);
-        }
+	if (profileSessionIdle) {
+	    long start = timeNow();
+	    nextFilter.sessionIdle(session, status);
+	    long end = timeNow();
+	    sessionIdleTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.sessionIdle(session, status);
+	}
     }
 
     /**
-     * Profile a SessionClosed event. This method will gather the following
-     * informations :
-     * - the method duration
-     * - the shortest execution time
-     * - the slowest execution time
-     * - the average execution time
-     * - the global number of calls
+     * Profile a SessionClosed event. This method will gather the following informations : - the method duration - the
+     * shortest execution time - the slowest execution time - the average execution time - the global number of calls
      * 
-     * @param nextFilter The filter to call next
-     * @param session The associated session
+     * @param nextFilter
+     *            The filter to call next
+     * @param session
+     *            The associated session
      */
     @Override
     public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
-        if (profileSessionClosed) {
-            long start = timeNow();
-            nextFilter.sessionClosed(session);
-            long end = timeNow();
-            sessionClosedTimerWorker.addNewDuration(end - start);
-        } else {
-            nextFilter.sessionClosed(session);
-        }
+	if (profileSessionClosed) {
+	    long start = timeNow();
+	    nextFilter.sessionClosed(session);
+	    long end = timeNow();
+	    sessionClosedTimerWorker.addNewDuration(end - start);
+	} else {
+	    nextFilter.sessionClosed(session);
+	}
     }
 
     /**
      * Get the average time for the specified method represented by the {@link IoEventType}
      *
      * @param type
-     *  The {@link IoEventType} that the user wants to get the average method call time
-     * @return
-     *  The average time it took to execute the method represented by the {@link IoEventType}
+     *            The {@link IoEventType} that the user wants to get the average method call time
+     * @return The average time it took to execute the method represented by the {@link IoEventType}
      */
     public double getAverageTime(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                if (profileMessageReceived) {
-                    return messageReceivedTimerWorker.getAverage();
-                }
-    
-                break;
-    
-            case MESSAGE_SENT:
-                if (profileMessageSent) {
-                    return messageSentTimerWorker.getAverage();
-                }
-    
-                break;
-                
-            case SESSION_CLOSED:
-                if (profileSessionClosed) {
-                    return sessionClosedTimerWorker.getAverage();
-                }
-    
-                break;
-    
-            case SESSION_CREATED:
-                if (profileSessionCreated) {
-                    return sessionCreatedTimerWorker.getAverage();
-                }
-    
-                break;
-                
-            case SESSION_IDLE:
-                if (profileSessionIdle) {
-                    return sessionIdleTimerWorker.getAverage();
-                }
-    
-                break;
-    
-            case SESSION_OPENED:
-                if (profileSessionOpened) {
-                    return sessionOpenedTimerWorker.getAverage();
-                }
-    
-                break;
-                
-            default:
-                break;
-        }
-
-        throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    if (profileMessageReceived) {
+		return messageReceivedTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	case MESSAGE_SENT:
+	    if (profileMessageSent) {
+		return messageSentTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	case SESSION_CLOSED:
+	    if (profileSessionClosed) {
+		return sessionClosedTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	case SESSION_CREATED:
+	    if (profileSessionCreated) {
+		return sessionCreatedTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	case SESSION_IDLE:
+	    if (profileSessionIdle) {
+		return sessionIdleTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	case SESSION_OPENED:
+	    if (profileSessionOpened) {
+		return sessionOpenedTimerWorker.getAverage();
+	    }
+
+	    break;
+
+	default:
+	    break;
+	}
+
+	throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
     }
 
     /**
-     * Gets the total number of times the method has been called that is represented by the
-     * {@link IoEventType}
+     * Gets the total number of times the method has been called that is represented by the {@link IoEventType}
      *
      * @param type
-     *  The {@link IoEventType} that the user wants to get the total number of method calls
-     * @return
-     *  The total number of method calls for the method represented by the {@link IoEventType}
+     *            The {@link IoEventType} that the user wants to get the total number of method calls
+     * @return The total number of method calls for the method represented by the {@link IoEventType}
      */
     public long getTotalCalls(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                if (profileMessageReceived) {
-                    return messageReceivedTimerWorker.getCallsNumber();
-                }
-    
-                break;
-    
-            case MESSAGE_SENT:
-                if (profileMessageSent) {
-                    return messageSentTimerWorker.getCallsNumber();
-                }
-    
-                break;
-                
-            case SESSION_CLOSED:
-                if (profileSessionClosed) {
-                    return sessionClosedTimerWorker.getCallsNumber();
-                }
-                
-                break;
-    
-            case SESSION_CREATED:
-                if (profileSessionCreated) {
-                    return sessionCreatedTimerWorker.getCallsNumber();
-                }
-    
-                break;
-                
-            case SESSION_IDLE:
-                if (profileSessionIdle) {
-                    return sessionIdleTimerWorker.getCallsNumber();
-                }
-    
-                break;
-    
-            case SESSION_OPENED:
-                if (profileSessionOpened) {
-                    return sessionOpenedTimerWorker.getCallsNumber();
-                }
-    
-                break;
-    
-            default:
-                break;
-        }
-
-        throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    if (profileMessageReceived) {
+		return messageReceivedTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	case MESSAGE_SENT:
+	    if (profileMessageSent) {
+		return messageSentTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	case SESSION_CLOSED:
+	    if (profileSessionClosed) {
+		return sessionClosedTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	case SESSION_CREATED:
+	    if (profileSessionCreated) {
+		return sessionCreatedTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	case SESSION_IDLE:
+	    if (profileSessionIdle) {
+		return sessionIdleTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	case SESSION_OPENED:
+	    if (profileSessionOpened) {
+		return sessionOpenedTimerWorker.getCallsNumber();
+	    }
+
+	    break;
+
+	default:
+	    break;
+	}
+
+	throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
     }
 
     /**
      * The total time this method has been executing
      *
      * @param type
-     *  The {@link IoEventType} that the user wants to get the total time this method has
-     *  been executing
-     * @return
-     *  The total time for the method represented by the {@link IoEventType}
+     *            The {@link IoEventType} that the user wants to get the total time this method has been executing
+     * @return The total time for the method represented by the {@link IoEventType}
      */
     public long getTotalTime(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                if (profileMessageReceived) {
-                    return messageReceivedTimerWorker.getTotal();
-                }
-    
-                break;
-    
-            case MESSAGE_SENT:
-                if (profileMessageSent) {
-                    return messageSentTimerWorker.getTotal();
-                }
-    
-                break;
-                
-            case SESSION_CLOSED:
-                if (profileSessionClosed) {
-                    return sessionClosedTimerWorker.getTotal();
-                }
-    
-                break;
-    
-            case SESSION_CREATED:
-                if (profileSessionCreated) {
-                    return sessionCreatedTimerWorker.getTotal();
-                }
-    
-                break;
-                
-            case SESSION_IDLE:
-                if (profileSessionIdle) {
-                    return sessionIdleTimerWorker.getTotal();
-                }
-    
-                break;
-
-            case SESSION_OPENED:
-                if (profileSessionOpened) {
-                    return sessionOpenedTimerWorker.getTotal();
-                }
-    
-                break;
-                
-            default:
-                break;
-        }
-
-        throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    if (profileMessageReceived) {
+		return messageReceivedTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	case MESSAGE_SENT:
+	    if (profileMessageSent) {
+		return messageSentTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	case SESSION_CLOSED:
+	    if (profileSessionClosed) {
+		return sessionClosedTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	case SESSION_CREATED:
+	    if (profileSessionCreated) {
+		return sessionCreatedTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	case SESSION_IDLE:
+	    if (profileSessionIdle) {
+		return sessionIdleTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	case SESSION_OPENED:
+	    if (profileSessionOpened) {
+		return sessionOpenedTimerWorker.getTotal();
+	    }
+
+	    break;
+
+	default:
+	    break;
+	}
+
+	throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
     }
 
     /**
      * The minimum time the method represented by {@link IoEventType} has executed
      *
      * @param type
-     *  The {@link IoEventType} that the user wants to get the minimum time this method has
-     *  executed
-     * @return
-     *  The minimum time this method has executed represented by the {@link IoEventType}
+     *            The {@link IoEventType} that the user wants to get the minimum time this method has executed
+     * @return The minimum time this method has executed represented by the {@link IoEventType}
      */
     public long getMinimumTime(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                if (profileMessageReceived) {
-                    return messageReceivedTimerWorker.getMinimum();
-                }
-    
-                break;
-    
-            case MESSAGE_SENT:
-                if (profileMessageSent) {
-                    return messageSentTimerWorker.getMinimum();
-                }
-    
-                break;
-                
-            case SESSION_CLOSED:
-                if (profileSessionClosed) {
-                    return sessionClosedTimerWorker.getMinimum();
-                }
-
-                break;
-
-            case SESSION_CREATED:
-                if (profileSessionCreated) {
-                    return sessionCreatedTimerWorker.getMinimum();
-                }
-    
-                break;
-                
-            case SESSION_IDLE:
-                if (profileSessionIdle) {
-                    return sessionIdleTimerWorker.getMinimum();
-                }
-    
-                break;
-    
-            case SESSION_OPENED:
-                if (profileSessionOpened) {
-                    return sessionOpenedTimerWorker.getMinimum();
-                }
-    
-                break;
-                
-            default:
-                break;
-        }
-
-        throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    if (profileMessageReceived) {
+		return messageReceivedTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	case MESSAGE_SENT:
+	    if (profileMessageSent) {
+		return messageSentTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	case SESSION_CLOSED:
+	    if (profileSessionClosed) {
+		return sessionClosedTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	case SESSION_CREATED:
+	    if (profileSessionCreated) {
+		return sessionCreatedTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	case SESSION_IDLE:
+	    if (profileSessionIdle) {
+		return sessionIdleTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	case SESSION_OPENED:
+	    if (profileSessionOpened) {
+		return sessionOpenedTimerWorker.getMinimum();
+	    }
+
+	    break;
+
+	default:
+	    break;
+	}
+
+	throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
     }
 
     /**
      * The maximum time the method represented by {@link IoEventType} has executed
      *
      * @param type
-     *  The {@link IoEventType} that the user wants to get the maximum time this method has
-     *  executed
-     * @return
-     *  The maximum time this method has executed represented by the {@link IoEventType}
+     *            The {@link IoEventType} that the user wants to get the maximum time this method has executed
+     * @return The maximum time this method has executed represented by the {@link IoEventType}
      */
     public long getMaximumTime(IoEventType type) {
-        switch (type) {
-            case MESSAGE_RECEIVED:
-                if (profileMessageReceived) {
-                    return messageReceivedTimerWorker.getMaximum();
-                }
-    
-                break;
-    
-            case MESSAGE_SENT:
-                if (profileMessageSent) {
-                    return messageSentTimerWorker.getMaximum();
-                }
-    
-                break;
-                
-            case SESSION_CLOSED:
-                if (profileSessionClosed) {
-                    return sessionClosedTimerWorker.getMaximum();
-                }
-    
-                break;
-    
-            case SESSION_CREATED:
-                if (profileSessionCreated) {
-                    return sessionCreatedTimerWorker.getMaximum();
-                }
-    
-                break;
-                
-            case SESSION_IDLE:
-                if (profileSessionIdle) {
-                    return sessionIdleTimerWorker.getMaximum();
-                }
-    
-                break;
-    
-            case SESSION_OPENED:
-                if (profileSessionOpened) {
-                    return sessionOpenedTimerWorker.getMaximum();
-                }
-    
-                break;
-                
-            default:
-                break;
-        }
-
-        throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
+	switch (type) {
+	case MESSAGE_RECEIVED:
+	    if (profileMessageReceived) {
+		return messageReceivedTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	case MESSAGE_SENT:
+	    if (profileMessageSent) {
+		return messageSentTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	case SESSION_CLOSED:
+	    if (profileSessionClosed) {
+		return sessionClosedTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	case SESSION_CREATED:
+	    if (profileSessionCreated) {
+		return sessionCreatedTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	case SESSION_IDLE:
+	    if (profileSessionIdle) {
+		return sessionIdleTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	case SESSION_OPENED:
+	    if (profileSessionOpened) {
+		return sessionOpenedTimerWorker.getMaximum();
+	    }
+
+	    break;
+
+	default:
+	    break;
+	}
+
+	throw new IllegalArgumentException("You are not monitoring this event.  Please add this event first.");
     }
 
     /**
-     * Class that will track the time each method takes and be able to provide information
-     * for each method.
+     * Class that will track the time each method takes and be able to provide information for each method.
      *
      */
     private class TimerWorker {
-        /** The sum of all operation durations */
-        private final AtomicLong total;
-
-        /** The number of calls */
-        private final AtomicLong callsNumber;
-
-        /** The fastest operation */
-        private final AtomicLong minimum;
-
-        /** The slowest operation */
-        private final AtomicLong maximum;
-
-        /** A lock for synchinized blocks */
-        private final Object lock = new Object();
-
-        /**
-         * Creates a new instance of TimerWorker.
-         *
-         */
-        public TimerWorker() {
-            total = new AtomicLong();
-            callsNumber = new AtomicLong();
-            minimum = new AtomicLong();
-            maximum = new AtomicLong();
-        }
-
-        /**
-         * Add a new operation duration to this class.  Total is updated
-         * and calls is incremented
-         *
-         * @param duration
-         *  The new operation duration
-         */
-        public void addNewDuration(long duration) {
-            callsNumber.incrementAndGet();
-            total.addAndGet(duration);
-
-            synchronized (lock) {
-                // this is not entirely thread-safe, must lock
-                if (duration < minimum.longValue()) {
-                    minimum.set(duration);
-                }
-
-                // this is not entirely thread-safe, must lock
-                if (duration > maximum.longValue()) {
-                    maximum.set(duration);
-                }
-            }
-        }
-
-        /**
-         * Gets the average reading for this event
-         *
-         * @return the average reading for this event
-         */
-        public double getAverage() {
-            synchronized (lock) {
-                // There are two operations, we need to synchronize the block
-                return total.longValue() / callsNumber.longValue();
-            }
-        }
-
-        /**
-         * @return The total number of profiled operation 
-         */
-        public long getCallsNumber() {
-            return callsNumber.longValue();
-        }
-
-        /**
-         * @return the total time
-         */
-        public long getTotal() {
-            return total.longValue();
-        }
-
-        /**
-         * @return the lowest execution time
-         */
-        public long getMinimum() {
-            return minimum.longValue();
-        }
-
-        /**
-         * @return the longest execution time
-         */
-        public long getMaximum() {
-            return maximum.longValue();
-        }
+	/** The sum of all operation durations */
+	private final AtomicLong total;
+
+	/** The number of calls */
+	private final AtomicLong callsNumber;
+
+	/** The fastest operation */
+	private final AtomicLong minimum;
+
+	/** The slowest operation */
+	private final AtomicLong maximum;
+
+	/** A lock for synchinized blocks */
+	private final Object lock = new Object();
+
+	/**
+	 * Creates a new instance of TimerWorker.
+	 *
+	 */
+	public TimerWorker() {
+	    total = new AtomicLong();
+	    callsNumber = new AtomicLong();
+	    minimum = new AtomicLong();
+	    maximum = new AtomicLong();
+	}
+
+	/**
+	 * Add a new operation duration to this class. Total is updated and calls is incremented
+	 *
+	 * @param duration
+	 *            The new operation duration
+	 */
+	public void addNewDuration(long duration) {
+	    callsNumber.incrementAndGet();
+	    total.addAndGet(duration);
+
+	    synchronized (lock) {
+		// this is not entirely thread-safe, must lock
+		if (duration < minimum.longValue()) {
+		    minimum.set(duration);
+		}
+
+		// this is not entirely thread-safe, must lock
+		if (duration > maximum.longValue()) {
+		    maximum.set(duration);
+		}
+	    }
+	}
+
+	/**
+	 * Gets the average reading for this event
+	 *
+	 * @return the average reading for this event
+	 */
+	public double getAverage() {
+	    synchronized (lock) {
+		// There are two operations, we need to synchronize the block
+		return callsNumber.longValue() != 0 ? total.longValue() / callsNumber.longValue() : 0;
+	    }
+	}
+
+	/**
+	 * @return The total number of profiled operation
+	 */
+	public long getCallsNumber() {
+	    return callsNumber.longValue();
+	}
+
+	/**
+	 * @return the total time
+	 */
+	public long getTotal() {
+	    return total.longValue();
+	}
+
+	/**
+	 * @return the lowest execution time
+	 */
+	public long getMinimum() {
+	    return minimum.longValue();
+	}
+
+	/**
+	 * @return the longest execution time
+	 */
+	public long getMaximum() {
+	    return maximum.longValue();
+	}
     }
 
     /**
      * @return the current time, expressed using the fixed TimeUnit.
      */
     private long timeNow() {
-        switch (timeUnit) {
-        case SECONDS:
-            return System.currentTimeMillis() / 1000;
+	switch (timeUnit) {
+	case SECONDS:
+	    return System.currentTimeMillis() / 1000;
 
-        case MICROSECONDS:
-            return System.nanoTime() / 1000;
+	case MICROSECONDS:
+	    return System.nanoTime() / 1000;
 
-        case NANOSECONDS:
-            return System.nanoTime();
+	case NANOSECONDS:
+	    return System.nanoTime();
 
-        default:
-            return System.currentTimeMillis();
-        }
+	default:
+	    return System.currentTimeMillis();
+	}
     }
 }