/*
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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;
}
}