blob: af83c642381dc762050e8b90064cedbc7f8832cf [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.
*/
#if defined(_MSC_VER)
#pragma warning ( disable: 4231 4251 4275 4786 )
#endif
#include <log4cxx/logstring.h>
#include <log4cxx/rolling/rollingpolicybase.h>
#include <log4cxx/pattern/formattinginfo.h>
#include <log4cxx/helpers/stringhelper.h>
#include <log4cxx/helpers/loglog.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/pattern/patternparser.h>
#include <log4cxx/pattern/integerpatternconverter.h>
#include <log4cxx/pattern/datepatternconverter.h>
using namespace log4cxx;
using namespace log4cxx::rolling;
using namespace log4cxx::helpers;
using namespace log4cxx::pattern;
IMPLEMENT_LOG4CXX_OBJECT(RollingPolicyBase)
RollingPolicyBase::RollingPolicyBase()
{
}
RollingPolicyBase::~RollingPolicyBase()
{
}
void RollingPolicyBase::addRef() const
{
ObjectImpl::addRef();
}
void RollingPolicyBase::releaseRef() const
{
ObjectImpl::releaseRef();
}
void RollingPolicyBase::activateOptions(log4cxx::helpers::Pool& /* pool */)
{
if (fileNamePatternStr.length() > 0)
{
parseFileNamePattern();
}
else
{
LogString msg(LOG4CXX_STR("The FileNamePattern option must be set before using FixedWindowRollingPolicy."));
LogString ref1(LOG4CXX_STR("See also http://logging.apache.org/log4j/codes.html#tbr_fnp_not_set"));
LogLog::warn(msg);
LogLog::warn(ref1);
throw IllegalStateException();
}
}
void RollingPolicyBase::setOption(const LogString& option, const LogString& value)
{
if (StringHelper::equalsIgnoreCase(option,
LOG4CXX_STR("FILENAMEPATTERN"),
LOG4CXX_STR("filenamepattern")))
{
fileNamePatternStr = value;
}
}
void RollingPolicyBase::setFileNamePattern(const LogString& fnp)
{
fileNamePatternStr = fnp;
}
LogString RollingPolicyBase::getFileNamePattern() const
{
return fileNamePatternStr;
}
/**
* Parse file name pattern.
*/
void RollingPolicyBase::parseFileNamePattern()
{
patternConverters.erase(patternConverters.begin(), patternConverters.end());
patternFields.erase(patternFields.begin(), patternFields.end());
PatternParser::parse(fileNamePatternStr,
patternConverters,
patternFields,
getFormatSpecifiers());
}
/**
* Format file name.
*
* @param obj object to be evaluted in formatting, may not be null.
* @param buf string buffer to which formatted file name is appended, may not be null.
*/
void RollingPolicyBase::formatFileName(
ObjectPtr& obj,
LogString& toAppendTo,
Pool& pool) const
{
std::vector<FormattingInfoPtr>::const_iterator formatterIter =
patternFields.begin();
for (std::vector<PatternConverterPtr>::const_iterator
converterIter = patternConverters.begin();
converterIter != patternConverters.end();
converterIter++, formatterIter++)
{
int startField = toAppendTo.length();
(*converterIter)->format(obj, toAppendTo, pool);
(*formatterIter)->format(startField, toAppendTo);
}
}
PatternConverterPtr RollingPolicyBase::getIntegerPatternConverter() const
{
for (std::vector<PatternConverterPtr>::const_iterator
converterIter = patternConverters.begin();
converterIter != patternConverters.end();
converterIter++)
{
IntegerPatternConverterPtr intPattern(*converterIter);
if (intPattern != NULL)
{
return *converterIter;
}
}
PatternConverterPtr noMatch;
return noMatch;
}
PatternConverterPtr RollingPolicyBase::getDatePatternConverter() const
{
for (std::vector<PatternConverterPtr>::const_iterator
converterIter = patternConverters.begin();
converterIter != patternConverters.end();
converterIter++)
{
DatePatternConverterPtr datePattern(*converterIter);
if (datePattern != NULL)
{
return *converterIter;
}
}
PatternConverterPtr noMatch;
return noMatch;
}