00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "OW_config.h"
00036 #include "OW_LifecycleIndicationPoller.hpp"
00037 #include "OW_CIMException.hpp"
00038 #include "OW_Format.hpp"
00039 #include "OW_CIMObjectPath.hpp"
00040 #include "OW_SortedVectorSet.hpp"
00041 #include "OW_CIMValue.hpp"
00042 #include "OW_MutexLock.hpp"
00043 #include "OW_ResultHandlerIFC.hpp"
00044 #include "OW_CIMOMHandleIFC.hpp"
00045 #include "OW_Logger.hpp"
00046 #include "OW_RequestHandlerIFC.hpp"
00047 #include "OW_CIMDateTime.hpp"
00048
00049 namespace OW_NAMESPACE
00050 {
00051
00052 using namespace WBEMFlags;
00054 LifecycleIndicationPoller::LifecycleIndicationPoller(
00055 const String& ns, const CIMName& className,
00056 UInt32 pollInterval)
00057 : m_ns(ns)
00058 , m_classname(className)
00059 , m_pollInterval(pollInterval)
00060 , m_pollCreation(0)
00061 , m_pollModification(0)
00062 , m_pollDeletion(0)
00063 , m_initializedInstances(false)
00064 {
00065 }
00067 void
00068 LifecycleIndicationPoller::addPollOp(PollOp op)
00069 {
00070 MutexLock l(m_guard);
00071 switch (op)
00072 {
00073 case POLL_FOR_INSTANCE_CREATION:
00074 ++m_pollCreation;
00075 break;
00076 case POLL_FOR_INSTANCE_MODIFICATION:
00077 ++m_pollModification;
00078 break;
00079 case POLL_FOR_INSTANCE_DELETION:
00080 ++m_pollDeletion;
00081 break;
00082 }
00083 }
00085
00086 bool
00087 LifecycleIndicationPoller::removePollOp(PollOp op)
00088 {
00089 MutexLock l(m_guard);
00090 switch (op)
00091 {
00092 case POLL_FOR_INSTANCE_CREATION:
00093 --m_pollCreation;
00094 break;
00095 case POLL_FOR_INSTANCE_MODIFICATION:
00096 --m_pollModification;
00097 break;
00098 case POLL_FOR_INSTANCE_DELETION:
00099 --m_pollDeletion;
00100 break;
00101 }
00102 return !willPoll();
00103 }
00105 bool
00106 LifecycleIndicationPoller::willPoll() const
00107 {
00108 MutexLock l(m_guard);
00109 return m_pollCreation > 0 || m_pollModification > 0 || m_pollDeletion > 0;
00110 }
00112 UInt32
00113 LifecycleIndicationPoller::addPollInterval(UInt32 newPollInterval)
00114 {
00115 MutexLock l(m_guard);
00116 m_pollInterval = newPollInterval < m_pollInterval ? newPollInterval : m_pollInterval;
00117 return m_pollInterval;
00118 }
00119
00121 UInt32
00122 LifecycleIndicationPoller::getPollInterval() const
00123 {
00124 MutexLock l(m_guard);
00125 return m_pollInterval;
00126 }
00127 namespace
00128 {
00130 class InstanceArrayBuilder : public CIMInstanceResultHandlerIFC
00131 {
00132 public:
00133 InstanceArrayBuilder(CIMInstanceArray& cia_)
00134 : cia(cia_)
00135 {}
00136 protected:
00137 virtual void doHandle(const CIMInstance &i)
00138 {
00139 cia.push_back(i);
00140 }
00141 private:
00142 CIMInstanceArray& cia;
00143 };
00144 }
00146 Int32
00147 LifecycleIndicationPoller::getInitialPollingInterval(
00148 const ProviderEnvironmentIFCRef &)
00149 {
00150 return 1;
00151 }
00152 namespace
00153 {
00154 struct sortByInstancePath
00155 {
00156 bool operator()(const CIMInstance& x, const CIMInstance& y) const
00157 {
00158 return CIMObjectPath("", x) < CIMObjectPath("", y);
00159 }
00160 };
00161
00162 const String COMPONENT_NAME("ow.owcimomd.indication.LifecyclePoller");
00163
00164 }
00166 Int32
00167 LifecycleIndicationPoller::poll(const ProviderEnvironmentIFCRef &env)
00168 {
00169 LoggerRef logger(env->getLogger(COMPONENT_NAME));
00170
00171 if (!m_initializedInstances)
00172 {
00173 InstanceArrayBuilder iab(m_prevInsts);
00174 env->getCIMOMHandle()->enumInstances(m_ns, m_classname.toString(), iab, E_SHALLOW, E_NOT_LOCAL_ONLY, E_INCLUDE_QUALIFIERS, E_INCLUDE_CLASS_ORIGIN, 0);
00175 m_initializedInstances = true;
00176 return 1;
00177 }
00178
00179 OW_LOG_DEBUG(logger, Format("LifecycleIndicationPoller::poll creation %1 modification %2 deletion %3", m_pollCreation, m_pollModification, m_pollDeletion));
00180 if (!willPoll())
00181 {
00182
00183 OW_LOG_DEBUG(logger, "LifecycleIndicationPoller::poll nothing to do, returning 0");
00184 return 0;
00185 }
00186
00187
00188 CIMInstanceArray curInstances;
00189 InstanceArrayBuilder iab(curInstances);
00190 CIMOMHandleIFCRef hdl = env->getCIMOMHandle();
00191 try
00192 {
00193 hdl->enumInstances(m_ns, m_classname.toString(), iab, E_SHALLOW, E_NOT_LOCAL_ONLY, E_INCLUDE_QUALIFIERS, E_INCLUDE_CLASS_ORIGIN, 0);
00194 }
00195 catch (const CIMException& e)
00196 {
00197 OW_LOG_ERROR(logger, Format("LifecycleIndicationPoller::poll caught exception: %1", e));
00198 return 0;
00199 }
00200
00201 OW_LOG_DEBUG(logger, Format("LifecycleIndicationPoller::poll got %1 instances", curInstances.size()));
00202
00203
00204 typedef SortedVectorSet<CIMInstance, sortByInstancePath> instSet_t;
00205 instSet_t prevSet(m_prevInsts.begin(), m_prevInsts.end());
00206 instSet_t curSet(curInstances.begin(), curInstances.end());
00207 typedef instSet_t::const_iterator iter_t;
00208 iter_t pi = prevSet.begin();
00209 iter_t ci = curSet.begin();
00210 while (pi != prevSet.end() && ci != curSet.end())
00211 {
00212 if (sortByInstancePath()(*pi, *ci))
00213 {
00214
00215 if (m_pollDeletion)
00216 {
00217 CIMInstance expInst;
00218 expInst.setClassName("CIM_InstDeletion");
00219 expInst.setProperty("SourceInstance", CIMValue(*pi));
00220 expInst.setProperty("IndicationTime", CIMValue(CIMDateTime(DateTime::getCurrent())));
00221 hdl->exportIndication(expInst, m_ns);
00222 }
00223 ++pi;
00224 }
00225 else if (sortByInstancePath()(*ci, *pi))
00226 {
00227
00228 if (m_pollCreation)
00229 {
00230 CIMInstance expInst;
00231 expInst.setClassName("CIM_InstCreation");
00232 expInst.setProperty("SourceInstance", CIMValue(*ci));
00233 expInst.setProperty("IndicationTime", CIMValue(CIMDateTime(DateTime::getCurrent())));
00234 hdl->exportIndication(expInst, m_ns);
00235 }
00236 ++ci;
00237 }
00238 else
00239 {
00240 if (m_pollModification)
00241 {
00242 if (!pi->propertiesAreEqualTo(*ci))
00243 {
00244 CIMInstance expInst;
00245 expInst.setClassName("CIM_InstModification");
00246 expInst.setProperty("PreviousInstance", CIMValue(*pi));
00247 expInst.setProperty("SourceInstance", CIMValue(*ci));
00248 expInst.setProperty("IndicationTime", CIMValue(CIMDateTime(DateTime::getCurrent())));
00249 hdl->exportIndication(expInst, m_ns);
00250 }
00251 }
00252 ++pi;
00253 ++ci;
00254 }
00255 }
00256 while (pi != prevSet.end())
00257 {
00258
00259 if (m_pollDeletion)
00260 {
00261 CIMInstance expInst;
00262 expInst.setClassName("CIM_InstDeletion");
00263 expInst.setProperty("SourceInstance", CIMValue(*pi));
00264 expInst.setProperty("IndicationTime", CIMValue(CIMDateTime(DateTime::getCurrent())));
00265 hdl->exportIndication(expInst, m_ns);
00266 }
00267 ++pi;
00268 }
00269 while (ci != curSet.end())
00270 {
00271
00272 if (m_pollCreation)
00273 {
00274 CIMInstance expInst;
00275 expInst.setClassName("CIM_InstCreation");
00276 expInst.setProperty("SourceInstance", CIMValue(*ci));
00277 expInst.setProperty("IndicationTime", CIMValue(CIMDateTime(DateTime::getCurrent())));
00278 hdl->exportIndication(expInst, m_ns);
00279 }
00280 ++ci;
00281 }
00282
00283
00284 m_prevInsts = curInstances;
00285 return getPollInterval();
00286 }
00287
00288 }
00289