00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef MESSAGELOGRESOURCE_H
00011 #define MESSAGELOGRESOURCE_H
00012
00013 #include "MessageLog.h"
00014 #include "MessageLogMgr.h"
00015 #include "Resource.h"
00016 #include "SessionManager.h"
00017
00018 #include <string>
00019
00020 class Step;
00021
00022 class MessageObject
00023 {
00024 public:
00025 struct Args
00026 {
00027 Args(std::string stepName, std::string component, std::string key, std::string defaultFailureMsg,
00028 std::string messageLogName, bool createStep) :
00029 mStepName(stepName),
00030 mFailureMsg(defaultFailureMsg),
00031 mComponent(component),
00032 mKey(key),
00033 mCreateStep(createStep)
00034 {
00035 if (messageLogName.empty())
00036 {
00037 Service<SessionManager> pManager;
00038 mMessageLogName = pManager->getName();
00039 }
00040 else
00041 {
00042 mMessageLogName = messageLogName;
00043 }
00044 }
00045
00046 std::string mMessageLogName;
00047 std::string mStepName;
00048 std::string mFailureMsg;
00049 std::string mComponent;
00050 std::string mKey;
00051 bool mCreateStep;
00052 };
00053
00054 Message* obtainResource(const Args& args) const
00055 {
00056 Service<MessageLogMgr> pMgr;
00057
00058 if (args.mMessageLogName.empty())
00059 {
00060 return NULL;
00061 }
00062
00063 MessageLog* pLog = pMgr->getLog(args.mMessageLogName);
00064 if (pLog == NULL)
00065 {
00066 pLog = pMgr->createLog(args.mMessageLogName);
00067 if (pLog == NULL)
00068 {
00069 return NULL;
00070 }
00071 }
00072
00073 Message* pStep = NULL;
00074 if (args.mCreateStep)
00075 {
00076 pStep = pLog->createStep(args.mStepName, args.mComponent, args.mKey);
00077 }
00078 else
00079 {
00080 pStep = pLog->createMessage(args.mStepName, args.mComponent, args.mKey);
00081 }
00082
00083 return pStep;
00084 }
00085
00086 void releaseResource(const Args& args, Message* pStep) const
00087 {
00088 if ((pStep != NULL) && (args.mCreateStep == true))
00089 {
00090
00091
00092
00093
00094 static_cast<Step*>(pStep)->finalize(Message::Failure, args.mFailureMsg);
00095 }
00096 }
00097 };
00098
00099 class StepResource : public Resource<Step,MessageObject>
00100 {
00101 public:
00102 StepResource(std::string stepName, std::string component, std::string key, std::string defaultFailureMsg = "",
00103 std::string messageLogName = "") :
00104 Resource<Step, MessageObject>(MessageObject::Args(stepName, component, key, defaultFailureMsg,
00105 messageLogName, true))
00106 {
00107 }
00108
00109 StepResource(Step* curStep, std::string defaultFailureMsg = "") :
00110 Resource<Step, MessageObject>(curStep, MessageObject::Args("", "", "", defaultFailureMsg, "", true))
00111 {
00112 }
00113 };
00114
00115 class MessageResource : public Resource<Message, MessageObject>
00116 {
00117 public:
00118 MessageResource(std::string stepName, std::string component, std::string key, std::string messageLogName = "") :
00119 Resource<Message, MessageObject>(MessageObject::Args(stepName, component, key, "", messageLogName, false))
00120 {
00121 }
00122 };
00123
00124 #endif