/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
|
* or http://forgerock.org/license/CDDLv1.0.html.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at legal-notices/CDDLv1_0.txt.
|
* If applicable, add the following below this CDDL HEADER, with the
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
* information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2006-2008 Sun Microsystems, Inc.
|
*/
|
|
package org.opends.server.loggers;
|
|
import static org.opends.server.util.ServerConstants.LOG_SEVERITY_DISABLED;
|
import static org.opends.server.util.ServerConstants.LOG_SEVERITY_ALL;
|
|
import java.util.*;
|
|
|
/**
|
* The Level class defines a set of standard logging levels that
|
* can be used to control logging output. The logging Level objects
|
* are ordered and are specified by ordered integers. Enabling logging
|
* at a given level also enables logging at all higher levels.
|
*/
|
public class LogLevel
|
{
|
private static ArrayList<LogLevel> known = new ArrayList<LogLevel>();
|
|
/**
|
* OFF is a special level that can be used to turn off logging.
|
* This level is initialized to <CODE>Integer.MAX_VALUE</CODE>.
|
*/
|
public static final LogLevel DISABLED = new LogLevel(
|
LOG_SEVERITY_DISABLED,Integer.MAX_VALUE);
|
|
|
|
/**
|
* ALL indicates that all messages should be logged.
|
* This level is initialized to <CODE>Integer.MIN_VALUE</CODE>.
|
*/
|
public static final LogLevel ALL = new LogLevel(
|
LOG_SEVERITY_ALL, Integer.MIN_VALUE);
|
|
|
|
/**
|
* The non-localized name of the level.
|
*/
|
private final String name;
|
|
/**
|
* The integer value of the level.
|
*/
|
private final int value;
|
|
|
/**
|
* Create a named Level with a given integer value.
|
* <p>
|
* Note that this constructor is "protected" to allow subclassing.
|
*
|
* @param name the name of the Level, for example "SEVERE".
|
* @param value an integer value for the level.
|
*/
|
protected LogLevel(String name, int value) {
|
if (name == null) {
|
throw new NullPointerException();
|
}
|
this.name = name;
|
this.value = value;
|
|
known.add(this);
|
}
|
|
/**
|
* Return the non-localized string name of the Level.
|
*
|
* @return non-localized name
|
*/
|
public String getName() {
|
return name;
|
}
|
|
/**
|
* Retrieve the string reprentation of this log level.
|
*
|
* @return the non-localized name of the Level, for example "INFO".
|
*/
|
public final String toString() {
|
return name;
|
}
|
|
/**
|
* Get the integer value for this level. This integer value
|
* can be used for efficient ordering comparisons between
|
* Level objects.
|
* @return the integer value for this level.
|
*/
|
public final int intValue() {
|
return value;
|
}
|
|
/**
|
* Parse a level name string into a LogLevel.
|
* <p>
|
* The argument string may consist of either a level name
|
* or an integer value.
|
* <p>
|
* For example:
|
* <ul>
|
* <li> "SEVERE"
|
* <li> "1000"
|
* </ul>
|
* @param name string to be parsed
|
* @throws IllegalArgumentException if the value is not valid.
|
* Valid values are integers between <CODE>Integer.MIN_VALUE</CODE>
|
* and <CODE>Integer.MAX_VALUE</CODE>, and all known level names.
|
* Known names are the levels defined by this class (i.e. <CODE>FINE</CODE>,
|
* <CODE>FINER</CODE>, <CODE>FINEST</CODE>), or created by this class with
|
* appropriate package access, or new levels defined or created
|
* by subclasses.
|
*
|
* @return The parsed value. Passing an integer that corresponds to a
|
* known name (eg 700) will return the associated name
|
* (eg <CODE>CONFIG</CODE>). Passing an integer that does not (eg 1)
|
* will return a new level name initialized to that value.
|
*/
|
public static synchronized LogLevel parse(String name)
|
throws IllegalArgumentException {
|
// Check that name is not null.
|
name.length();
|
|
// Look for a known Level with the given non-localized name.
|
for (int i = 0; i < known.size(); i++) {
|
LogLevel l = known.get(i);
|
if (name.equalsIgnoreCase(l.name)) {
|
return l;
|
}
|
}
|
|
// Now, check if the given name is an integer. If so,
|
// first look for a Level with the given value and then
|
// if necessary create one.
|
try {
|
int x = Integer.parseInt(name);
|
for (int i = 0; i < known.size(); i++) {
|
LogLevel l = known.get(i);
|
if (l.value == x) {
|
return l;
|
}
|
}
|
// Create a new Level.
|
return new LogLevel(name, x);
|
} catch (NumberFormatException ex) {
|
// Not an integer.
|
// Drop through.
|
}
|
|
// OK, we've tried everything and failed
|
throw new IllegalArgumentException("Bad level \"" + name + "\"");
|
}
|
|
/**
|
* Compare two objects for value equality.
|
*
|
* @param ox the LogLevel object to test.
|
* @return true if and only if the two objects have the same level value.
|
*/
|
public boolean equals(Object ox) {
|
try {
|
LogLevel lx = (LogLevel)ox;
|
return (lx.value == this.value);
|
} catch (Exception ex) {
|
return false;
|
}
|
}
|
|
/**
|
* Retrives the hashcode for this log level. It is just the integer value.
|
*
|
* @return the hashCode for this log level.
|
*/
|
public int hashCode()
|
{
|
return this.value;
|
}
|
|
/**
|
* Returns the string representations of all the levels. All strings will
|
* be in lower case.
|
* @return The string representations of the levels in lower case.
|
*/
|
public static HashSet<String> getLevelStrings()
|
{
|
HashSet<String> strings = new HashSet<String>();
|
|
for (int i = 0; i < known.size(); i++)
|
{
|
strings.add(known.get(i).name.toLowerCase());
|
}
|
|
return strings;
|
}
|
}
|