DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
Issue.cpp
Go to the documentation of this file.
1/*
2 * DUNE DAQ modification notice:
3 * This file has been modified from the original ATLAS ers source for the DUNE DAQ project.
4 * Fork baseline commit: 8267df82a4f6fe6bf02c4014923eba19eddc4614 (2020-04-14).
5 * Renamed since fork: yes (from src/Issue.cxx to src/Issue.cpp).
6 *
7 * Original copyright:
8 * Copyright (C) 2001-2020 CERN for the benefit of the ATLAS collaboration.
9 * Licensed under the Apache License, Version 2.0.
10 */
11
12/*
13 * Issue.cxx
14 * ers
15 *
16 * Created by Matthias Wiesmann on 26.11.04.
17 * Modified by Serguei Kolos on 02.08.05.
18 * Copyright 2004 CERN. All rights reserved.
19 *
20 */
21
22#include <algorithm>
23#include <csignal>
24#include <ctime>
25#include <iomanip>
26#include <sstream>
27#include <time.h>
28
29#include <ers/Issue.hpp>
30#include <ers/IssueFactory.hpp>
31#include <ers/OutputStream.hpp>
33#include <ers/ers.hpp>
34#include <ers/internal/Util.hpp>
35
36using namespace ers;
37
39
40namespace {
41int
42get_default_qualifiers(std::vector<std::string>& qualifiers)
43{
44 static const char* environment = ::getenv("DUNEDAQ_ERS_QUALIFIERS");
45 if (environment) {
46 ers::tokenize(environment, ",", qualifiers);
47 }
48 return 1;
49}
50
51void
52add_default_qualifiers(Issue& issue)
53{
54 static std::vector<std::string> qualifiers;
55 // static int _unused_ = get_default_qualifiers( qualifiers );
56 get_default_qualifiers(qualifiers);
57 for (std::vector<std::string>::const_iterator it = qualifiers.begin(); it != qualifiers.end(); ++it) {
58 issue.add_qualifier(*it);
59 }
60}
61}
62
63Issue::Issue(const Issue& other)
64 : std::exception(other)
65 , m_cause(other.m_cause.get() ? other.m_cause->clone() : 0)
66 , m_context(other.m_context->clone())
67 , m_message(other.m_message)
69 , m_severity(other.m_severity)
70 , m_time(other.m_time)
71 , m_values(other.m_values)
72{
73 ;
74}
75
80Issue::Issue(const Context& context, const std::string& message)
84 , m_time(system_clock::now())
85{
86 add_qualifier(m_context->package_name());
87 add_default_qualifiers(*this);
88}
89
94Issue::Issue(const Context& context, const std::exception& cause)
97 , m_time(system_clock::now())
98{
99 const Issue* issue = dynamic_cast<const Issue*>(&cause);
100 m_cause.reset(issue ? issue->clone() : new StdIssue(ERS_HERE, cause.what()));
101 add_qualifier(m_context->package_name());
102 add_default_qualifiers(*this);
103}
104
110Issue::Issue(const Context& context, const std::string& message, const std::exception& cause)
114 , m_time(system_clock::now())
115{
116 const Issue* issue = dynamic_cast<const Issue*>(&cause);
117 m_cause.reset(issue ? issue->clone() : new StdIssue(ERS_HERE, cause.what()));
118 add_qualifier(m_context->package_name());
119 add_default_qualifiers(*this);
120}
121
123 const system_clock::time_point& time,
124 const ers::Context& context,
125 const std::string& message,
126 const std::vector<std::string>& qualifiers,
127 const std::map<std::string, std::string>& parameters,
128 const ers::Issue* cause)
129 : m_cause(cause)
134 , m_time(time)
136{
137 ;
138}
139
141{
142 ;
143}
144
145std::time_t
147{
148 return system_clock::to_time_t(m_time);
149}
150
151void
152ers::Issue::get_value(const std::string& key, const char*& value) const
153{
154 string_map::const_iterator it = m_values.find(key);
155 if (it != m_values.end()) {
156 value = it->second.c_str();
157 } else {
158 throw ers::NoValue(ERS_HERE, key);
159 }
160}
161
162void
163ers::Issue::get_value(const std::string& key, std::string& value) const
164{
165 string_map::const_iterator it = m_values.find(key);
166 if (it != m_values.end()) {
167 value = it->second;
168 } else {
169 throw ers::NoValue(ERS_HERE, key);
170 }
171}
172
176void
177Issue::add_qualifier(const std::string& qualifier)
178{
179 if (std::find(m_qualifiers.begin(), m_qualifiers.end(), qualifier) == m_qualifiers.end()) {
180 m_qualifiers.push_back(qualifier);
181 }
182}
183
186{
187 ers::Severity old_severity = m_severity;
189 return old_severity;
190}
191
195void
196Issue::prepend_message(const std::string& msg)
197{
198 m_message = msg + m_message;
199}
200
205void
206Issue::wrap_message(const std::string& begin, const std::string& end)
207{
208 m_message = begin + m_message + end;
209}
210
211namespace ers {
212
217std::ostream&
218operator<<(std::ostream& out, const ers::Issue& issue)
219{
221}
222}
#define ERS_EMPTY
#define ERS_HERE
An abstract interface to access an Issue context.
Definition Context.hpp:40
Base class for any user define issue.
Definition Issue.hpp:76
const Context & context() const
Context of the issue.
Definition Issue.hpp:102
ers::Severity severity() const
severity of the issue
Definition Issue.hpp:110
Severity m_severity
Issue's severity.
Definition Issue.hpp:176
void wrap_message(const std::string &begin, const std::string &end)
Definition Issue.cpp:206
std::unique_ptr< Context > m_context
Context of the current issue.
Definition Issue.hpp:173
virtual ~Issue() noexcept
Definition Issue.cpp:140
void prepend_message(const std::string &message)
Definition Issue.cpp:196
system_clock::time_point m_time
Time when issue was thrown.
Definition Issue.hpp:177
void get_value(const std::string &key, T &value) const
const std::vector< std::string > & qualifiers() const
return array of qualifiers
Definition Issue.hpp:106
const std::string & message() const
General cause of the issue.
Definition Issue.hpp:104
const string_map & parameters() const
return array of parameters
Definition Issue.hpp:108
std::string time(const std::string &format="%Y-%b-%d %H:%M:%S", bool isUTC=false) const
string representation of local time of the issue
Definition Issue.hpp:213
virtual Issue * clone() const =0
std::unique_ptr< const Issue > m_cause
Issue that caused the current issue.
Definition Issue.hpp:172
string_map m_values
List of user defined attributes.
Definition Issue.hpp:178
std::string m_message
Issue's explanation text.
Definition Issue.hpp:174
void add_qualifier(const std::string &qualif)
adds a qualifier to the issue
Definition Issue.cpp:177
ers::Severity set_severity(ers::Severity severity) const
Definition Issue.cpp:185
std::time_t time_t() const
seconds since 1 Jan 1970
Definition Issue.cpp:146
std::vector< std::string > m_qualifiers
List of associated qualifiers.
Definition Issue.hpp:175
Issue(const Context &context, const std::string &message=std::string())
Definition Issue.cpp:80
const Issue * cause() const
return the cause Issue of this Issue
Definition Issue.hpp:100
#define ERS_DECLARE_ISSUE(namespace_name, class_name, message_, attributes)
Definition macro.hpp:71
int verbosity_level()
Definition ers.hpp:140
void tokenize(const std::string &text, const std::string &separators, std::vector< std::string > &tokens)
Definition Util.cpp:18
std::ostream & operator<<(std::ostream &, const ers::Configuration &)
@ Error
Definition Severity.hpp:42
static std::ostream & print(std::ostream &out, const Issue &issue, int verbosity)