diff --git a/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java b/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java index 40df5ac8f6cd7bb5ab5cd7f6e8794042a0a97dee..459c724a46489d32a0f36135392eb03f2df945b9 100644 --- a/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java +++ b/common/source/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilities.java @@ -62,6 +62,12 @@ public final class ConcurrencyUtilities * Returns the log level to be used in error logging. */ LogLevel getLogLevelForError(); + + /** + * Returns the log level to be used in successful operation (return {@link LogLevel#OFF} to + * switch off logging for successful operation). + */ + LogLevel getLogLevelForSuccess(); } /** @@ -358,6 +364,14 @@ public final class ConcurrencyUtilities return ExecutionResult.createTimedOut(); } else { + if (logSettingsOrNull != null + && logSettingsOrNull.getLogLevelForSuccess() != LogLevel.OFF) + { + logSettingsOrNull.getLogger().log( + logSettingsOrNull.getLogLevelForSuccess(), + String.format("%s: call returns %s.", logSettingsOrNull + .getOperationName(), result.tryGetResult())); + } return result; } } catch (InterruptedException ex) diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java index df530f2538c2908a92916973d1d38b75146bc122..ec7d2f85a92bb02d22043ff3953fac2e2e38faf1 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/concurrent/ConcurrencyUtilitiesTest.java @@ -66,7 +66,7 @@ public class ConcurrencyUtilitiesTest public void beforeMethod() { logger = new AssertingLogger(); - createLogSettings(LogLevel.WARN); + createLogSettings(LogLevel.WARN, LogLevel.OFF); } @AfterClass @@ -75,14 +75,14 @@ public class ConcurrencyUtilitiesTest Thread.interrupted(); } - private void createLogSettings(final LogLevel level) + private void createLogSettings(final LogLevel levelForError, final LogLevel levelForSuccess) { logSettings = new ILogSettings() { @Override public LogLevel getLogLevelForError() { - return level; + return levelForError; } @Override @@ -96,6 +96,12 @@ public class ConcurrencyUtilitiesTest { return name; } + + @Override + public LogLevel getLogLevelForSuccess() + { + return levelForSuccess; + } }; } @@ -123,6 +129,7 @@ public class ConcurrencyUtilitiesTest @Test public void testGetExecutionResultOK() { + createLogSettings(LogLevel.ERROR, LogLevel.INFO); final String valueProvided = "This is the execution return value"; final ThreadPoolExecutor eservice = new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2); @@ -140,7 +147,8 @@ public class ConcurrencyUtilitiesTest assertNull(result.tryGetException()); assertEquals(valueProvided, result.tryGetResult()); assertTrue(future.isDone()); - logger.assertNumberOfMessage(0); + logger.assertNumberOfMessage(1); + logger.assertEq(0, LogLevel.INFO, name + ": call returns " + valueProvided + "."); } @Test @@ -273,7 +281,7 @@ public class ConcurrencyUtilitiesTest @Test(groups = "slow") public void testGetExecutionResultTimeoutWithoutCancelation() { - createLogSettings(LogLevel.INFO); + createLogSettings(LogLevel.INFO, LogLevel.OFF); final ThreadPoolExecutor eservice = new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2); final Future<String> future = eservice.submit(new Callable<String>() @@ -380,7 +388,7 @@ public class ConcurrencyUtilitiesTest @Test public void testGetExecutionResultInterrupted() { - createLogSettings(LogLevel.DEBUG); + createLogSettings(LogLevel.DEBUG, LogLevel.OFF); final ThreadPoolExecutor eservice = new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2); final Thread thread = Thread.currentThread(); @@ -437,7 +445,7 @@ public class ConcurrencyUtilitiesTest @Test public void testGetExecutionResultException() { - createLogSettings(LogLevel.ERROR); + createLogSettings(LogLevel.ERROR, LogLevel.OFF); final ThreadPoolExecutor eservice = new NamingThreadPoolExecutor(name).corePoolSize(1).maximumPoolSize(2); final Future<String> future = eservice.submit(new Callable<String>()