void ConfigType::RegisterObject(const ConfigObject::Ptr& object) { String name = object->GetName(); { ObjectLock olock(this); ObjectMap::iterator it = m_ObjectMap.find(name); if (it != m_ObjectMap.end()) { if (it->second == object) return; BOOST_THROW_EXCEPTION(ScriptError("An object with type '" + m_Name + "' and name '" + name + "' already exists (" + Convert::ToString(it->second->GetDebugInfo()) + "), new declaration: " + Convert::ToString(object->GetDebugInfo()), object->GetDebugInfo())); } m_ObjectMap[name] = object; m_ObjectVector.push_back(object); } }
void ConfigType::RegisterObject(const ConfigObject::Ptr& object) { String name = object->GetName(); { boost::mutex::scoped_lock lock(m_Mutex); auto it = m_ObjectMap.find(name); if (it != m_ObjectMap.end()) { if (it->second == object) return; Type *type = dynamic_cast<Type *>(this); BOOST_THROW_EXCEPTION(ScriptError("An object with type '" + type->GetName() + "' and name '" + name + "' already exists (" + Convert::ToString(it->second->GetDebugInfo()) + "), new declaration: " + Convert::ToString(object->GetDebugInfo()), object->GetDebugInfo())); } m_ObjectMap[name] = object; m_ObjectVector.push_back(object); } }
String icinga::DiagnosticInformation(const std::exception& ex, bool verbose, StackTrace *stack, ContextTrace *context) { std::ostringstream result; String message = ex.what(); const ValidationError *vex = dynamic_cast<const ValidationError *>(&ex); if (message.IsEmpty()) result << boost::diagnostic_information(ex); else result << "Error: " << message; const ScriptError *dex = dynamic_cast<const ScriptError *>(&ex); if (dex && !dex->GetDebugInfo().Path.IsEmpty()) { result << "\nLocation:\n"; ShowCodeFragment(result, dex->GetDebugInfo()); } if (vex) { DebugInfo di; ConfigObject::Ptr dobj = vex->GetObject(); if (dobj) di = dobj->GetDebugInfo(); Dictionary::Ptr currentHint = vex->GetDebugHint(); Array::Ptr messages; if (currentHint) { BOOST_FOREACH(const String& attr, vex->GetAttributePath()) { Dictionary::Ptr props = currentHint->Get("properties"); if (!props) break; currentHint = props->Get(attr); if (!currentHint) break; messages = currentHint->Get("messages"); } } if (messages && messages->GetLength() > 0) { Array::Ptr message = messages->Get(messages->GetLength() - 1); di.Path = message->Get(1); di.FirstLine = message->Get(2); di.FirstColumn = message->Get(3); di.LastLine = message->Get(4); di.LastColumn = message->Get(5); } if (!di.Path.IsEmpty()) { result << "\nLocation:\n"; ShowCodeFragment(result, di); } } const user_error *uex = dynamic_cast<const user_error *>(&ex); const posix_error *pex = dynamic_cast<const posix_error *>(&ex); if (!uex && !pex && verbose) { const StackTrace *st = boost::get_error_info<StackTraceErrorInfo>(ex); if (st) { result << *st; } else { result << std::endl; if (!stack) stack = GetLastExceptionStack(); if (stack) result << *stack; } if (boost::get_error_info<ContextTraceErrorInfo>(ex) == NULL) { result << std::endl; if (!context) context = GetLastExceptionContext(); if (context) result << *context; } } return result.str(); }