| | |
| | | package org.opends.server.loggers.debug; |
| | | |
| | | import org.opends.server.types.DebugLogLevel; |
| | | import org.opends.server.types.DebugLogCategory; |
| | | import org.opends.server.loggers.LogLevel; |
| | | import org.opends.server.loggers.LogCategory; |
| | | |
| | | import java.util.Set; |
| | | import java.util.HashSet; |
| | | |
| | | /** |
| | | * This class encapsulates the trace settings in effect at a given traceing |
| | |
| | | static final TraceSettings DISABLED = |
| | | new TraceSettings(DebugLogLevel.DISABLED); |
| | | |
| | | static final String STACK_DUMP_KEYWORD = "stack"; |
| | | static final String INCLUDE_CAUSE_KEYWORD = "cause"; |
| | | static final String SUPPRESS_ARG_KEYWORD = "noargs"; |
| | | static final String SUPPRESS_RETVAL_KEYWORD = "noretval"; |
| | | static final String INCLUDE_CATEGORY_KEYWORD = "category"; |
| | | static final String LEVEL_KEYWORD = "level"; |
| | | |
| | | final LogLevel level; |
| | | final Set<LogCategory> includeCategories; |
| | | |
| | |
| | | this.stackDepth = stackDepth; |
| | | this.includeCause = includeCause; |
| | | } |
| | | |
| | | /** |
| | | * Parse trace settings from the string representation. |
| | | * |
| | | * @param value the trace settings string to be parsed. |
| | | * @return the trace settings parsed from the string. |
| | | */ |
| | | protected static TraceSettings parseTraceSettings(String value) |
| | | { |
| | | TraceSettings settings = null; |
| | | if(value != null) |
| | | { |
| | | //Touch DebugLogLevel and DebugLogCategory so they are statically |
| | | //initialized or parse will not see all the levels/categories. |
| | | LogLevel level = DebugLogLevel.ERROR; |
| | | LogCategory categoryStub = DebugLogCategory.MESSAGE; |
| | | |
| | | Set<LogCategory> includeCategories = null; |
| | | boolean noArgs = false; |
| | | boolean noRetVal = false; |
| | | int stackDepth = 0; |
| | | boolean includeCause = false; |
| | | |
| | | String[] keywords = value.split(","); |
| | | |
| | | for(String keyword : keywords) |
| | | { |
| | | //See if stack dump keyword is included |
| | | if(keyword.startsWith(STACK_DUMP_KEYWORD)) |
| | | { |
| | | //See if a stack depth is included |
| | | if(keyword.length() == STACK_DUMP_KEYWORD.length()) |
| | | { |
| | | stackDepth = DebugStackTraceFormatter.COMPLETE_STACK; |
| | | } |
| | | else |
| | | { |
| | | int depthStart= keyword.indexOf("=", STACK_DUMP_KEYWORD.length()); |
| | | if (depthStart == STACK_DUMP_KEYWORD.length()) |
| | | { |
| | | try |
| | | { |
| | | stackDepth = Integer.valueOf(keyword.substring(depthStart+1)); |
| | | } |
| | | catch(NumberFormatException nfe) |
| | | { |
| | | System.err.println("The keyword " + STACK_DUMP_KEYWORD + |
| | | " contains an invalid depth value. The complete stack " + |
| | | "will be included."); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //See if to include cause in exception messages. |
| | | else if(keyword.equals(INCLUDE_CAUSE_KEYWORD)) |
| | | { |
| | | includeCause = true; |
| | | } |
| | | //See if to supress method arguments. |
| | | else if(keyword.equals(SUPPRESS_ARG_KEYWORD)) |
| | | { |
| | | noArgs = true; |
| | | } |
| | | //See if to supress return values. |
| | | else if(keyword.equals(SUPPRESS_RETVAL_KEYWORD)) |
| | | { |
| | | noRetVal = true; |
| | | } |
| | | else if(keyword.startsWith(INCLUDE_CATEGORY_KEYWORD)) |
| | | { |
| | | int categoryStart = |
| | | keyword.indexOf("=", INCLUDE_CATEGORY_KEYWORD.length()); |
| | | |
| | | if(keyword.length() == INCLUDE_CATEGORY_KEYWORD.length() || |
| | | categoryStart != INCLUDE_CATEGORY_KEYWORD.length()) |
| | | { |
| | | System.err.println("The keyword " + INCLUDE_CATEGORY_KEYWORD + |
| | | " does not contain an equal sign to define the set of " + |
| | | "categories to include. All categories will be included."); |
| | | } |
| | | else |
| | | { |
| | | String[] categories = |
| | | keyword.substring(categoryStart+1).split("[|]"); |
| | | includeCategories = new HashSet<LogCategory>(); |
| | | for(String category : categories) |
| | | { |
| | | try |
| | | { |
| | | includeCategories.add(DebugLogCategory.parse(category)); |
| | | } |
| | | catch(IllegalArgumentException iae) |
| | | { |
| | | System.err.println("The keyword " + INCLUDE_CATEGORY_KEYWORD + |
| | | " contains an invalid debug log category: " + |
| | | iae.toString() + ". It will be ignored."); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | else if(keyword.startsWith(LEVEL_KEYWORD)) |
| | | { |
| | | int levelStart = |
| | | keyword.indexOf("=", LEVEL_KEYWORD.length()); |
| | | |
| | | if(keyword.length() == LEVEL_KEYWORD.length() || |
| | | levelStart != LEVEL_KEYWORD.length()) |
| | | { |
| | | System.err.println("The keyword " + LEVEL_KEYWORD + |
| | | " does not contain an equal sign to specify the log level. " + |
| | | "Default level of " + level.toString() + " will be used."); |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | level = LogLevel.parse(keyword.substring(levelStart+1)); |
| | | } |
| | | catch(IllegalArgumentException iae) |
| | | { |
| | | System.err.println("The keyword " + LEVEL_KEYWORD + |
| | | " contains an invalid debug log level: " + |
| | | iae.toString() + ". Default level of " + level.toString() + |
| | | " will be used."); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | settings = new TraceSettings(level, includeCategories, noArgs, noRetVal, |
| | | stackDepth, includeCause); |
| | | } |
| | | |
| | | return settings; |
| | | } |
| | | } |