/*MGEN:commentPrefix=//*/ // // 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. // /*MGEN:Root.Disclaimer*/ #include "qpid/management/Manageable.h" #include "qpid/management/Buffer.h" #include "qpid/types/Variant.h" #include "qpid/amqp_0_10/Codecs.h" #include "qpid//*MGEN:Class.AgentHeaderLocation*//ManagementAgent.h" #include "/*MGEN:Class.NameCap*/.h" /*MGEN:Class.MethodArgIncludes*/ #include #include using namespace qmf::/*MGEN:Class.Namespace*/; using qpid::management::ManagementAgent; using qpid::management::Manageable; using qpid::management::ManagementObject; using qpid::management::Args; using qpid::management::Mutex; using std::string; string /*MGEN:Class.NameCap*/::packageName = string ("/*MGEN:Class.NamePackageLower*/"); string /*MGEN:Class.NameCap*/::className = string ("/*MGEN:Class.NameLower*/"); uint8_t /*MGEN:Class.NameCap*/::md5Sum[MD5_LEN] = {/*MGEN:Class.SchemaMD5*/}; /*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (ManagementAgent*, Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) : ManagementObject(_core)/*MGEN:Class.ConstructorInits*/ { /*MGEN:Class.ParentRefAssignment*/ /*MGEN:Class.InitializeElements*/ /*MGEN:IF(Class.ExistOptionals)*/ // Optional properties start out not-present for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++) presenceMask[idx] = 0; /*MGEN:ENDIF*/ /*MGEN:IF(Class.ExistPerThreadStats)*/ perThreadStatsArray = new struct PerThreadStats*[maxThreads]; for (int idx = 0; idx < maxThreads; idx++) perThreadStatsArray[idx] = 0; /*MGEN:ENDIF*/ } /*MGEN:Class.NameCap*/::~/*MGEN:Class.NameCap*/ () { /*MGEN:IF(Class.ExistPerThreadStats)*/ for (int idx = 0; idx < maxThreads; idx++) if (perThreadStatsArray[idx] != 0) delete perThreadStatsArray[idx]; delete[] perThreadStatsArray; /*MGEN:ENDIF*/ } namespace { const string NAME("name"); const string TYPE("type"); const string ACCESS("access"); const string IS_INDEX("index"); const string IS_OPTIONAL("optional"); const string UNIT("unit"); const string MIN("min"); const string MAX("max"); const string MAXLEN("maxlen"); const string DESC("desc"); const string ARGCOUNT("argCount"); const string ARGS("args"); const string DIR("dir"); const string DEFAULT("default"); } void /*MGEN:Class.NameCap*/::registerSelf(ManagementAgent* agent) { agent->registerClass(packageName, className, md5Sum, writeSchema); } void /*MGEN:Class.NameCap*/::writeSchema (std::string& schema) { const int _bufSize=65536; char _msgChars[_bufSize]; ::qpid::management::Buffer buf(_msgChars, _bufSize); ::qpid::types::Variant::Map ft; // Schema class header: buf.putOctet (CLASS_KIND_TABLE); buf.putShortString (packageName); // Package Name buf.putShortString (className); // Class Name buf.putBin128 (md5Sum); // Schema Hash buf.putShort (/*MGEN:Class.ConfigCount*/); // Config Element Count buf.putShort (/*MGEN:Class.InstCount*/); // Inst Element Count buf.putShort (/*MGEN:Class.MethodCount*/); // Method Count // Properties /*MGEN:Class.PropertySchema*/ // Statistics /*MGEN:Class.StatisticSchema*/ // Methods /*MGEN:Class.MethodSchema*/ { uint32_t _len = buf.getPosition(); buf.reset(); buf.getRawData(schema, _len); } } /*MGEN:IF(Class.ExistPerThreadStats)*/ void /*MGEN:Class.NameCap*/::aggregatePerThreadStats(struct PerThreadStats* totals) const { /*MGEN:Class.InitializeTotalPerThreadStats*/ for (int idx = 0; idx < maxThreads; idx++) { struct PerThreadStats* threadStats = perThreadStatsArray[idx]; if (threadStats != 0) { /*MGEN:Class.AggregatePerThreadStats*/ } } } /*MGEN:ENDIF*/ /*MGEN:IF(Root.GenQMFv1)*/ uint32_t /*MGEN:Class.NameCap*/::writePropertiesSize() const { uint32_t size = writeTimestampsSize(); /*MGEN:IF(Class.ExistOptionals)*/ size += /*MGEN:Class.PresenceMaskBytes*/; /*MGEN:ENDIF*/ /*MGEN:Class.SizeProperties*/ return size; } void /*MGEN:Class.NameCap*/::readProperties (const std::string& _sBuf) { char *_tmpBuf = new char[_sBuf.length()]; memcpy(_tmpBuf, _sBuf.data(), _sBuf.length()); ::qpid::management::Buffer buf(_tmpBuf, _sBuf.length()); Mutex::ScopedLock mutex(accessLock); { std::string _tbuf; buf.getRawData(_tbuf, writeTimestampsSize()); readTimestamps(_tbuf); } /*MGEN:IF(Class.ExistOptionals)*/ for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++) presenceMask[idx] = buf.getOctet(); /*MGEN:ENDIF*/ /*MGEN:Class.ReadProperties*/ delete [] _tmpBuf; } void /*MGEN:Class.NameCap*/::writeProperties (std::string& _sBuf) const { const int _bufSize=65536; char _msgChars[_bufSize]; ::qpid::management::Buffer buf(_msgChars, _bufSize); Mutex::ScopedLock mutex(accessLock); configChanged = false; { std::string _tbuf; writeTimestamps(_tbuf); buf.putRawData(_tbuf); } /*MGEN:IF(Class.ExistOptionals)*/ for (uint8_t idx = 0; idx < /*MGEN:Class.PresenceMaskBytes*/; idx++) buf.putOctet(presenceMask[idx]); /*MGEN:ENDIF*/ /*MGEN:Class.WriteProperties*/ uint32_t _bufLen = buf.getPosition(); buf.reset(); buf.getRawData(_sBuf, _bufLen); } void /*MGEN:Class.NameCap*/::writeStatistics (std::string& _sBuf, bool skipHeaders) { const int _bufSize=65536; char _msgChars[_bufSize]; ::qpid::management::Buffer buf(_msgChars, _bufSize); Mutex::ScopedLock mutex(accessLock); instChanged = false; /*MGEN:IF(Class.ExistPerThreadAssign)*/ for (int idx = 0; idx < maxThreads; idx++) { struct PerThreadStats* threadStats = perThreadStatsArray[idx]; if (threadStats != 0) { /*MGEN:Class.PerThreadAssign*/ } } /*MGEN:ENDIF*/ /*MGEN:IF(Class.ExistPerThreadStats)*/ struct PerThreadStats totals; aggregatePerThreadStats(&totals); /*MGEN:ENDIF*/ /*MGEN:Class.Assign*/ if (!skipHeaders) { std::string _tbuf; writeTimestamps (_tbuf); buf.putRawData(_tbuf); } /*MGEN:Class.WriteStatistics*/ // Maintenance of hi-lo statistics /*MGEN:Class.HiLoStatResets*/ /*MGEN:IF(Class.ExistPerThreadResets)*/ for (int idx = 0; idx < maxThreads; idx++) { struct PerThreadStats* threadStats = perThreadStatsArray[idx]; if (threadStats != 0) { /*MGEN:Class.PerThreadHiLoStatResets*/ } } /*MGEN:ENDIF*/ uint32_t _bufLen = buf.getPosition(); buf.reset(); buf.getRawData(_sBuf, _bufLen); } void /*MGEN:Class.NameCap*/::doMethod (/*MGEN:Class.DoMethodArgs*/) { Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD; std::string text; bool _matched = false; const int _bufSize=65536; char _msgChars[_bufSize]; ::qpid::management::Buffer outBuf(_msgChars, _bufSize); /*MGEN:Class.MethodHandlers*/ if (!_matched) { outBuf.putLong(status); outBuf.putShortString(Manageable::StatusText(status, text)); } uint32_t _bufLen = outBuf.getPosition(); outBuf.reset(); outBuf.getRawData(outStr, _bufLen); } /*MGEN:ENDIF*/ std::string /*MGEN:Class.NameCap*/::getKey() const { std::stringstream key; /*MGEN:Class.PrimaryKey*/ return key.str(); } void /*MGEN:Class.NameCap*/::mapEncodeValues (::qpid::types::Variant::Map& _map, bool includeProperties, bool includeStatistics) { using namespace ::qpid::types; Mutex::ScopedLock mutex(accessLock); if (includeProperties) { configChanged = false; /*MGEN:Class.MapEncodeProperties*/ } if (includeStatistics) { instChanged = false; /*MGEN:IF(Class.ExistPerThreadAssign)*/ for (int idx = 0; idx < maxThreads; idx++) { struct PerThreadStats* threadStats = perThreadStatsArray[idx]; if (threadStats != 0) { /*MGEN:Class.PerThreadAssign*/ } } /*MGEN:ENDIF*/ /*MGEN:IF(Class.ExistPerThreadStats)*/ struct PerThreadStats totals; aggregatePerThreadStats(&totals); /*MGEN:ENDIF*/ /*MGEN:Class.Assign*/ /*MGEN:Class.MapEncodeStatistics*/ // Maintenance of hi-lo statistics /*MGEN:Class.HiLoStatResets*/ /*MGEN:IF(Class.ExistPerThreadResets)*/ for (int idx = 0; idx < maxThreads; idx++) { struct PerThreadStats* threadStats = perThreadStatsArray[idx]; if (threadStats != 0) { /*MGEN:Class.PerThreadHiLoStatResets*/ } } /*MGEN:ENDIF*/ } } void /*MGEN:Class.NameCap*/::mapDecodeValues (const ::qpid::types::Variant::Map& _map) { ::qpid::types::Variant::Map::const_iterator _i; Mutex::ScopedLock mutex(accessLock); /*MGEN:IF(Class.ExistOptionals)*/ bool _found; /*MGEN:ENDIF*/ /*MGEN:Class.MapDecodeProperties*/ } void /*MGEN:Class.NameCap*/::doMethod (/*MGEN:Class.DoMapMethodArgs*/) { Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD; std::string text; /*MGEN:Class.MapMethodHandlers*/ outMap["_status_code"] = (uint32_t) status; outMap["_status_text"] = Manageable::StatusText(status, text); }