blob: 0c27fdabcd836e895b7f0c2fa2371783772ae563 [file]
#ifndef _QmfEngineConsoleEngineImpl_
#define _QmfEngineConsoleEngineImpl_
/*
* 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.
*/
#include "qmf/engine/Console.h"
#include "qmf/engine/MessageImpl.h"
#include "qmf/engine/SchemaImpl.h"
#include "qmf/engine/Typecode.h"
#include "qmf/engine/ObjectImpl.h"
#include "qmf/engine/ObjectIdImpl.h"
#include "qmf/engine/QueryImpl.h"
#include "qmf/engine/ValueImpl.h"
#include "qmf/engine/Protocol.h"
#include "qmf/engine/SequenceManager.h"
#include "qmf/engine/BrokerProxyImpl.h"
#include <qpid/framing/Buffer.h>
#include <qpid/framing/Uuid.h>
#include <qpid/framing/FieldTable.h>
#include <qpid/framing/FieldValue.h>
#include <qpid/sys/Mutex.h>
#include <qpid/sys/Time.h>
#include <qpid/sys/SystemInfo.h>
#include <string.h>
#include <string>
#include <deque>
#include <map>
#include <vector>
#include <iostream>
#include <fstream>
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
namespace qmf {
namespace engine {
struct ConsoleEventImpl {
typedef boost::shared_ptr<ConsoleEventImpl> Ptr;
ConsoleEvent::EventKind kind;
boost::shared_ptr<AgentProxy> agent;
std::string name;
const SchemaClassKey* classKey;
boost::shared_ptr<Object> object;
void* context;
boost::shared_ptr<Event> event;
uint64_t timestamp;
bool hasProps;
bool hasStats;
ConsoleEventImpl(ConsoleEvent::EventKind k) :
kind(k), classKey(0), context(0), timestamp(0) {}
~ConsoleEventImpl() {}
ConsoleEvent copy();
};
class ConsoleImpl : public boost::noncopyable {
public:
ConsoleImpl(const ConsoleSettings& settings = ConsoleSettings());
~ConsoleImpl();
bool getEvent(ConsoleEvent& event) const;
void popEvent();
void addConnection(BrokerProxy& broker, void* context);
void delConnection(BrokerProxy& broker);
uint32_t packageCount() const;
const std::string& getPackageName(uint32_t idx) const;
uint32_t classCount(const char* packageName) const;
const SchemaClassKey* getClass(const char* packageName, uint32_t idx) const;
ClassKind getClassKind(const SchemaClassKey* key) const;
const SchemaObjectClass* getObjectClass(const SchemaClassKey* key) const;
const SchemaEventClass* getEventClass(const SchemaClassKey* key) const;
void bindPackage(const char* packageName);
void bindClass(const SchemaClassKey* key);
void bindClass(const char* packageName, const char* className);
void bindEvent(const SchemaClassKey* key);
void bindEvent(const char* packageName, const char* eventName);
/*
void startSync(const Query& query, void* context, SyncQuery& sync);
void touchSync(SyncQuery& sync);
void endSync(SyncQuery& sync);
*/
private:
friend class BrokerProxyImpl;
friend struct StaticContext;
const ConsoleSettings& settings;
mutable qpid::sys::Mutex lock;
std::deque<ConsoleEventImpl::Ptr> eventQueue;
std::vector<BrokerProxyImpl*> brokerList;
std::vector<std::pair<std::string, std::string> > bindingList; // exchange/key (empty exchange => QMF_EXCHANGE)
// Declare a compare class for the class maps that compares the dereferenced
// class key pointers. The default behavior would be to compare the pointer
// addresses themselves.
struct KeyCompare {
bool operator()(const SchemaClassKey* left, const SchemaClassKey* right) const {
return *left < *right;
}
};
typedef std::map<const SchemaClassKey*, SchemaObjectClass*, KeyCompare> ObjectClassList;
typedef std::map<const SchemaClassKey*, SchemaEventClass*, KeyCompare> EventClassList;
typedef std::map<std::string, std::pair<ObjectClassList, EventClassList> > PackageList;
PackageList packages;
void learnPackage(const std::string& packageName);
void learnClass(SchemaObjectClass* cls);
void learnClass(SchemaEventClass* cls);
bool haveClass(const SchemaClassKey* key) const;
SchemaObjectClass* getSchema(const SchemaClassKey* key) const;
void eventAgentAdded(boost::shared_ptr<AgentProxy> agent);
void eventAgentDeleted(boost::shared_ptr<AgentProxy> agent);
void eventNewPackage(const std::string& packageName);
void eventNewClass(const SchemaClassKey* key);
void eventObjectUpdate(ObjectPtr object, bool prop, bool stat);
void eventAgentHeartbeat(boost::shared_ptr<AgentProxy> agent, uint64_t timestamp);
void eventEventReceived(boost::shared_ptr<Event> event);
};
}
}
#endif