Coverage Report

Created: 2026-06-15 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/logging-log4cxx/src/main/cpp/class.cpp
Line
Count
Source
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 * contributor license agreements.  See the NOTICE file distributed with
4
 * this work for additional information regarding copyright ownership.
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 * (the "License"); you may not use this file except in compliance with
7
 * the License.  You may obtain a copy of the License at
8
 *
9
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
18
#include <log4cxx/logstring.h>
19
#include <log4cxx/helpers/class.h>
20
#include <log4cxx/helpers/exception.h>
21
#include <log4cxx/helpers/object.h>
22
#include <map>
23
#include <log4cxx/helpers/stringhelper.h>
24
#include <log4cxx/log4cxx.h>
25
#if !defined(LOG4CXX)
26
  #define LOG4CXX 1
27
#endif
28
#include <log4cxx/private/log4cxx_private.h>
29
30
31
#include <log4cxx/asyncappender.h>
32
#include <log4cxx/consoleappender.h>
33
#include <log4cxx/fileappender.h>
34
#include <log4cxx/db/odbcappender.h>
35
#if defined(WIN32) || defined(_WIN32)
36
  #if !defined(_WIN32_WCE)
37
    #include <log4cxx/nt/nteventlogappender.h>
38
  #endif
39
  #include <log4cxx/nt/outputdebugstringappender.h>
40
#endif
41
#include <log4cxx/net/smtpappender.h>
42
#if LOG4CXX_HAS_MULTIPROCESS_ROLLING_FILE_APPENDER
43
#include <log4cxx/rolling/multiprocessrollingfileappender.h>
44
#endif
45
#include <log4cxx/helpers/datagramsocket.h>
46
#include <log4cxx/net/syslogappender.h>
47
#include <log4cxx/net/telnetappender.h>
48
#include <log4cxx/writerappender.h>
49
#include <log4cxx/net/xmlsocketappender.h>
50
#include <log4cxx/layout.h>
51
#include <log4cxx/patternlayout.h>
52
#include <log4cxx/jsonlayout.h>
53
#include <log4cxx/htmllayout.h>
54
#include <log4cxx/simplelayout.h>
55
#include <log4cxx/xml/xmllayout.h>
56
#if LOG4CXX_HAS_FMT_LAYOUT
57
#include <log4cxx/fmtlayout.h>
58
#endif
59
60
#include <log4cxx/filter/levelmatchfilter.h>
61
#include <log4cxx/filter/levelrangefilter.h>
62
#include <log4cxx/filter/stringmatchfilter.h>
63
#include <log4cxx/filter/locationinfofilter.h>
64
#include <log4cxx/rolling/filterbasedtriggeringpolicy.h>
65
#include <log4cxx/rolling/fixedwindowrollingpolicy.h>
66
#include <log4cxx/rolling/manualtriggeringpolicy.h>
67
#include <log4cxx/rolling/rollingfileappender.h>
68
#include <log4cxx/rolling/sizebasedtriggeringpolicy.h>
69
#include <log4cxx/rolling/timebasedrollingpolicy.h>
70
71
#include <log4cxx/xml/domconfigurator.h>
72
#include <log4cxx/propertyconfigurator.h>
73
#include <log4cxx/varia/fallbackerrorhandler.h>
74
75
76
using namespace LOG4CXX_NS;
77
using namespace LOG4CXX_NS::helpers;
78
using namespace LOG4CXX_NS::net;
79
using namespace LOG4CXX_NS::filter;
80
using namespace LOG4CXX_NS::xml;
81
using namespace LOG4CXX_NS::rolling;
82
83
namespace LOG4CXX_NS
84
{
85
uint32_t libraryVersion()
86
0
{
87
  // This function defined in log4cxx.h
88
0
  return LOG4CXX_VERSION;
89
0
}
Unexecuted instantiation: log4cxx::libraryVersion()
Unexecuted instantiation: log4cxx::libraryVersion()
90
}
91
92
#if LOG4CXX_ABI_VERSION <= 15
93
LOG4CXX_EXPORT uint32_t libraryVersion()
94
0
{
95
0
  return  LOG4CXX_NS::libraryVersion();
96
0
}
Unexecuted instantiation: libraryVersion()
Unexecuted instantiation: libraryVersion()
97
#endif
98
99
Class::Class()
100
3.76k
{
101
3.76k
}
102
103
Class::~Class()
104
0
{
105
0
}
106
107
#if LOG4CXX_ABI_VERSION <= 15
108
LogString Class::toString() const
109
0
{
110
0
  return getName();
111
0
}
112
#endif
113
114
Object* Class::newInstance() const
115
0
{
116
0
  throw InstantiationException(LOG4CXX_STR("Cannot create new instances of Class."));
117
#if LOG4CXX_RETURN_AFTER_THROW
118
  return 0;
119
#endif
120
0
}
121
122
123
124
Class::ClassMap& Class::getRegistry()
125
5.19k
{
126
5.19k
  static WideLife<ClassMap> registry;
127
5.19k
  return registry;
128
5.19k
}
129
130
const Class& Class::forName(const LogString& className)
131
403
{
132
403
  LogString lowerName(StringHelper::toLowerCase(className));
133
  //
134
  //  check registry using full class name
135
  //
136
403
  const Class* clazz = getRegistry()[lowerName];
137
138
403
  if (clazz == 0)
139
403
  {
140
403
    LogString::size_type pos = className.find_last_of(LOG4CXX_STR(".$"));
141
142
403
    if (pos != LogString::npos)
143
317
    {
144
317
      LogString terminalName(lowerName, pos + 1, LogString::npos);
145
317
      clazz = getRegistry()[terminalName];
146
147
317
      if (clazz == 0)
148
309
      {
149
309
        registerClasses();
150
309
        clazz = getRegistry()[lowerName];
151
152
309
        if (clazz == 0)
153
309
        {
154
309
          clazz = getRegistry()[terminalName];
155
309
        }
156
309
      }
157
317
    }
158
86
    else
159
86
    {
160
86
      registerClasses();
161
86
      clazz = getRegistry()[lowerName];
162
86
    }
163
403
  }
164
165
403
  if (clazz == 0)
166
395
  {
167
395
    throw ClassNotFoundException(className);
168
395
  }
169
170
8
  return *clazz;
171
403
}
log4cxx::helpers::Class::forName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
131
292
{
132
292
  LogString lowerName(StringHelper::toLowerCase(className));
133
  //
134
  //  check registry using full class name
135
  //
136
292
  const Class* clazz = getRegistry()[lowerName];
137
138
292
  if (clazz == 0)
139
292
  {
140
292
    LogString::size_type pos = className.find_last_of(LOG4CXX_STR(".$"));
141
142
292
    if (pos != LogString::npos)
143
234
    {
144
234
      LogString terminalName(lowerName, pos + 1, LogString::npos);
145
234
      clazz = getRegistry()[terminalName];
146
147
234
      if (clazz == 0)
148
229
      {
149
229
        registerClasses();
150
229
        clazz = getRegistry()[lowerName];
151
152
229
        if (clazz == 0)
153
229
        {
154
229
          clazz = getRegistry()[terminalName];
155
229
        }
156
229
      }
157
234
    }
158
58
    else
159
58
    {
160
58
      registerClasses();
161
58
      clazz = getRegistry()[lowerName];
162
58
    }
163
292
  }
164
165
292
  if (clazz == 0)
166
287
  {
167
287
    throw ClassNotFoundException(className);
168
287
  }
169
170
5
  return *clazz;
171
292
}
log4cxx::helpers::Class::forName(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
Line
Count
Source
131
111
{
132
111
  LogString lowerName(StringHelper::toLowerCase(className));
133
  //
134
  //  check registry using full class name
135
  //
136
111
  const Class* clazz = getRegistry()[lowerName];
137
138
111
  if (clazz == 0)
139
111
  {
140
111
    LogString::size_type pos = className.find_last_of(LOG4CXX_STR(".$"));
141
142
111
    if (pos != LogString::npos)
143
83
    {
144
83
      LogString terminalName(lowerName, pos + 1, LogString::npos);
145
83
      clazz = getRegistry()[terminalName];
146
147
83
      if (clazz == 0)
148
80
      {
149
80
        registerClasses();
150
80
        clazz = getRegistry()[lowerName];
151
152
80
        if (clazz == 0)
153
80
        {
154
80
          clazz = getRegistry()[terminalName];
155
80
        }
156
80
      }
157
83
    }
158
28
    else
159
28
    {
160
28
      registerClasses();
161
28
      clazz = getRegistry()[lowerName];
162
28
    }
163
111
  }
164
165
111
  if (clazz == 0)
166
108
  {
167
108
    throw ClassNotFoundException(className);
168
108
  }
169
170
3
  return *clazz;
171
111
}
172
173
bool Class::registerClass(const Class& newClass)
174
3.76k
{
175
3.76k
  getRegistry()[StringHelper::toLowerCase(newClass.getName())] = &newClass;
176
3.76k
  return true;
177
3.76k
}
178
179
void Class::registerClasses()
180
790
{
181
790
  AsyncAppender::registerClass();
182
790
  ConsoleAppender::registerClass();
183
790
  FileAppender::registerClass();
184
790
  LOG4CXX_NS::db::ODBCAppender::registerClass();
185
#if (defined(WIN32) || defined(_WIN32))
186
#if !defined(_WIN32_WCE)
187
  LOG4CXX_NS::nt::NTEventLogAppender::registerClass();
188
#endif
189
  LOG4CXX_NS::nt::OutputDebugStringAppender::registerClass();
190
#endif
191
790
  SMTPAppender::registerClass();
192
790
  JSONLayout::registerClass();
193
790
  HTMLLayout::registerClass();
194
#if LOG4CXX_HAS_FMT_LAYOUT
195
  FMTLayout::registerClass();
196
#endif
197
790
  PatternLayout::registerClass();
198
790
  SimpleLayout::registerClass();
199
790
  XMLLayout::registerClass();
200
790
  LevelMatchFilter::registerClass();
201
790
  LevelRangeFilter::registerClass();
202
790
  StringMatchFilter::registerClass();
203
790
  LocationInfoFilter::registerClass();
204
790
  LOG4CXX_NS::rolling::RollingFileAppender::registerClass();
205
#if LOG4CXX_HAS_MULTIPROCESS_ROLLING_FILE_APPENDER
206
  LOG4CXX_NS::rolling::MultiprocessRollingFileAppender::registerClass();
207
#endif
208
790
  LOG4CXX_NS::rolling::SizeBasedTriggeringPolicy::registerClass();
209
790
  LOG4CXX_NS::rolling::TimeBasedRollingPolicy::registerClass();
210
790
  LOG4CXX_NS::rolling::ManualTriggeringPolicy::registerClass();
211
790
  LOG4CXX_NS::rolling::FixedWindowRollingPolicy::registerClass();
212
790
  LOG4CXX_NS::rolling::FilterBasedTriggeringPolicy::registerClass();
213
790
#if LOG4CXX_HAS_DOMCONFIGURATOR
214
790
  LOG4CXX_NS::xml::DOMConfigurator::registerClass();
215
790
#endif
216
790
  LOG4CXX_NS::PropertyConfigurator::registerClass();
217
790
  LOG4CXX_NS::varia::FallbackErrorHandler::registerClass();
218
790
#if LOG4CXX_HAS_NETWORKING
219
790
  TelnetAppender::registerClass();
220
790
  XMLSocketAppender::registerClass();
221
790
  SyslogAppender::registerClass();
222
790
#endif
223
790
}
log4cxx::helpers::Class::registerClasses()
Line
Count
Source
180
395
{
181
395
  AsyncAppender::registerClass();
182
395
  ConsoleAppender::registerClass();
183
395
  FileAppender::registerClass();
184
395
  LOG4CXX_NS::db::ODBCAppender::registerClass();
185
#if (defined(WIN32) || defined(_WIN32))
186
#if !defined(_WIN32_WCE)
187
  LOG4CXX_NS::nt::NTEventLogAppender::registerClass();
188
#endif
189
  LOG4CXX_NS::nt::OutputDebugStringAppender::registerClass();
190
#endif
191
395
  SMTPAppender::registerClass();
192
395
  JSONLayout::registerClass();
193
395
  HTMLLayout::registerClass();
194
#if LOG4CXX_HAS_FMT_LAYOUT
195
  FMTLayout::registerClass();
196
#endif
197
395
  PatternLayout::registerClass();
198
395
  SimpleLayout::registerClass();
199
395
  XMLLayout::registerClass();
200
395
  LevelMatchFilter::registerClass();
201
395
  LevelRangeFilter::registerClass();
202
395
  StringMatchFilter::registerClass();
203
395
  LocationInfoFilter::registerClass();
204
395
  LOG4CXX_NS::rolling::RollingFileAppender::registerClass();
205
#if LOG4CXX_HAS_MULTIPROCESS_ROLLING_FILE_APPENDER
206
  LOG4CXX_NS::rolling::MultiprocessRollingFileAppender::registerClass();
207
#endif
208
395
  LOG4CXX_NS::rolling::SizeBasedTriggeringPolicy::registerClass();
209
395
  LOG4CXX_NS::rolling::TimeBasedRollingPolicy::registerClass();
210
395
  LOG4CXX_NS::rolling::ManualTriggeringPolicy::registerClass();
211
395
  LOG4CXX_NS::rolling::FixedWindowRollingPolicy::registerClass();
212
395
  LOG4CXX_NS::rolling::FilterBasedTriggeringPolicy::registerClass();
213
395
#if LOG4CXX_HAS_DOMCONFIGURATOR
214
395
  LOG4CXX_NS::xml::DOMConfigurator::registerClass();
215
395
#endif
216
395
  LOG4CXX_NS::PropertyConfigurator::registerClass();
217
395
  LOG4CXX_NS::varia::FallbackErrorHandler::registerClass();
218
395
#if LOG4CXX_HAS_NETWORKING
219
395
  TelnetAppender::registerClass();
220
395
  XMLSocketAppender::registerClass();
221
395
  SyslogAppender::registerClass();
222
395
#endif
223
395
}
log4cxx::helpers::Class::registerClasses()
Line
Count
Source
180
395
{
181
395
  AsyncAppender::registerClass();
182
395
  ConsoleAppender::registerClass();
183
395
  FileAppender::registerClass();
184
395
  LOG4CXX_NS::db::ODBCAppender::registerClass();
185
#if (defined(WIN32) || defined(_WIN32))
186
#if !defined(_WIN32_WCE)
187
  LOG4CXX_NS::nt::NTEventLogAppender::registerClass();
188
#endif
189
  LOG4CXX_NS::nt::OutputDebugStringAppender::registerClass();
190
#endif
191
395
  SMTPAppender::registerClass();
192
395
  JSONLayout::registerClass();
193
395
  HTMLLayout::registerClass();
194
#if LOG4CXX_HAS_FMT_LAYOUT
195
  FMTLayout::registerClass();
196
#endif
197
395
  PatternLayout::registerClass();
198
395
  SimpleLayout::registerClass();
199
395
  XMLLayout::registerClass();
200
395
  LevelMatchFilter::registerClass();
201
395
  LevelRangeFilter::registerClass();
202
395
  StringMatchFilter::registerClass();
203
395
  LocationInfoFilter::registerClass();
204
395
  LOG4CXX_NS::rolling::RollingFileAppender::registerClass();
205
#if LOG4CXX_HAS_MULTIPROCESS_ROLLING_FILE_APPENDER
206
  LOG4CXX_NS::rolling::MultiprocessRollingFileAppender::registerClass();
207
#endif
208
395
  LOG4CXX_NS::rolling::SizeBasedTriggeringPolicy::registerClass();
209
395
  LOG4CXX_NS::rolling::TimeBasedRollingPolicy::registerClass();
210
395
  LOG4CXX_NS::rolling::ManualTriggeringPolicy::registerClass();
211
395
  LOG4CXX_NS::rolling::FixedWindowRollingPolicy::registerClass();
212
395
  LOG4CXX_NS::rolling::FilterBasedTriggeringPolicy::registerClass();
213
395
#if LOG4CXX_HAS_DOMCONFIGURATOR
214
395
  LOG4CXX_NS::xml::DOMConfigurator::registerClass();
215
395
#endif
216
395
  LOG4CXX_NS::PropertyConfigurator::registerClass();
217
395
  LOG4CXX_NS::varia::FallbackErrorHandler::registerClass();
218
395
#if LOG4CXX_HAS_NETWORKING
219
395
  TelnetAppender::registerClass();
220
395
  XMLSocketAppender::registerClass();
221
395
  SyslogAppender::registerClass();
222
395
#endif
223
395
}
224