blob: f4088a79e6059b7469373dac4a8264e8e60b18c7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "Level.h"
#include <decaf/lang/Integer.h>
#include <decaf/lang/exceptions/NumberFormatException.h>
#include <decaf/util/concurrent/Mutex.h>
#include <vector>
using namespace decaf;
using namespace decaf::lang;
using namespace decaf::lang::exceptions;
using namespace decaf::util;
using namespace decaf::util::concurrent;
using namespace decaf::util::logging;
////////////////////////////////////////////////////////////////////////////////
namespace {
std::vector<Level> levels;
}
////////////////////////////////////////////////////////////////////////////////
const Level Level::INHERIT( "INHERIT", 0 );
const Level Level::OFF( "OFF", Integer::MAX_VALUE );
const Level Level::SEVERE( "SEVERE", 1000 );
const Level Level::WARNING( "WARNING", 900 );
const Level Level::INFO( "INFO", 800 );
const Level Level::DEBUG( "DEBUG", 700 );
const Level Level::CONFIG( "CONFIG", 600 );
const Level Level::FINE( "FINE", 500 );
const Level Level::FINER( "FINER", 400 );
const Level Level::FINEST( "FINEST", 300 );
const Level Level::ALL( "ALL", Integer::MIN_VALUE );
////////////////////////////////////////////////////////////////////////////////
Level::Level( const std::string& name, int value ) : name( name ), value( value ) {
levels.push_back( *this );
}
////////////////////////////////////////////////////////////////////////////////
Level::~Level() {
}
////////////////////////////////////////////////////////////////////////////////
int Level::compareTo( const Level& value ) const {
return this->value < value.value ? -1 : this->value > value.value ? 1 : 0;
}
////////////////////////////////////////////////////////////////////////////////
bool Level::equals( const Level& value ) const {
return this->value == value.value;
}
////////////////////////////////////////////////////////////////////////////////
bool Level::operator==( const Level& value ) const {
return this->value == value.value;
}
////////////////////////////////////////////////////////////////////////////////
bool Level::operator<( const Level& value ) const {
return this->value < value.value;
}
////////////////////////////////////////////////////////////////////////////////
Level Level::parse( const std::string& name ) {
bool isNameAnInt;
int nameAsInt;
try {
nameAsInt = Integer::parseInt( name );
isNameAnInt = true;
} catch( NumberFormatException& e ) {
nameAsInt = 0;
isNameAnInt = false;
}
// synchronized( &levelsLock ) {
//
// std::vector<Level>::const_iterator level = levels.begin();
//
// for( ; level != levels.end(); ++level ) {
// if( name == level->getName() ) {
// return *level;
// }
// }
//
// // If the name was an int then we loop again to check the int value
// // against each level's value.
// if( isNameAnInt ) {
//
// for( level = levels.begin(); level != levels.end(); ++ level ) {
// if( nameAsInt == level->intValue()) {
// return *level;
// }
// }
// }
// }
if( !isNameAnInt ) {
throw IllegalArgumentException(
__FILE__, __LINE__, "Could not find match for Level Name: %s", name.c_str() );
}
return Level( name, nameAsInt );
}