9 #ifndef anna_comm_ByRangeDelivery_hpp 10 #define anna_comm_ByRangeDelivery_hpp 42 template <
typename TKey,
typename TDelivery = RoundRobinDelivery,
typename TSerializer = anna::functions >
class ByRangeDelivery :
public comm::Service {
49 Range(
const std::string& baseName,
const TKey& _bottom,
const TKey& _top) :
50 bottom(_bottom), top(_top) {
51 std::string name(baseName);
53 name += TSerializer::asString(_bottom);
55 name += TSerializer::asString(_top);
57 delivery =
new TDelivery(name.c_str(),
false);
61 std::string result(
"comm::ByRangeDelivery { Bottom: ");
62 result += TSerializer::asString(bottom);
64 result += TSerializer::asString(top);
66 result += delivery->asString();
67 return result +=
" }";
74 delivery->asXML(result);
91 comm::
Service(name, isCritical),
99 for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
100 delete range(ii)->delivery;
119 std::string msg(asString());
120 msg +=
" | Bottom: ";
121 msg += TSerializer::asString(bottom);
122 msg +=
" | Invalid range (bottom > top)";
126 if((result = find(bottom)) != NULL) {
127 std::string msg(asString());
128 msg +=
" | Bottom: ";
129 msg += TSerializer::asString(bottom);
130 msg +=
" | Overlapped with ";
135 if((result = find(top)) != NULL) {
136 std::string msg(asString());
138 msg += TSerializer::asString(top);
139 msg +=
" | Overlapped with ";
144 a_ranges.push_back(result =
new Range(getName(), bottom, top));
145 return range_begin() + a_ranges.size() - 1;
154 range(ii)->delivery->attach(server);
163 void prepare(
const TKey& key) noexcept(
false) {
164 Range* w = find(key);
167 std::string msg(asString());
169 msg += TSerializer::asString(key);
170 msg +=
" | No range associated";
175 if(a_currentRange == NULL) {
176 std::string msg(asString());
178 msg += TSerializer::asString(key);
179 msg +=
" | No delivery service associated has been found";
186 std::string result = className();
189 result +=
" | Ranges: ";
191 for(const_range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++) {
193 result += range(ii)->asString();
196 return result +=
"}";
204 for(const_range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
205 range(ii)->asXML(node);
216 static const char*
className() {
return "anna::comm::ByRangeDelivery"; }
222 const_range_iterator
range_begin()
const {
return a_ranges.begin(); }
223 const_range_iterator
range_end()
const {
return a_ranges.end(); }
226 static const Range*
range(const_range_iterator& ii) {
return *ii; }
230 for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++)
231 range(ii)->delivery->initialize();
235 range_container a_ranges;
236 Range* a_currentRange;
238 Range* find(
const TKey& key) {
242 for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++) {
245 if(w->
bottom <= key && key <= w->top) {
256 if(a_currentRange == NULL) {
257 std::string msg(asString());
258 msg +=
" | Wrong call to anna::comm::ByRangeDelivery::prepare";
262 return a_currentRange->
delivery->apply();
271 for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++) {
274 if(range(ii)->delivery->fault(resource) ==
true)
278 return (n == nfault);
286 for(range_iterator ii = range_begin(), maxii = range_end(); ii != maxii; ii ++) {
287 if(range(ii)->delivery->recover(resource) ==
true)
range_iterator createRange(const TKey &bottom, const TKey &top) noexcept(false)
Definition: ByRangeDelivery.hpp:114
TDelivery * delivery
Definition: ByRangeDelivery.hpp:47
xml::Attribute * createAttribute(const char *name, const char *value, const Namespace *_namespace=NULL)
virtual std::string asString() const
Node * createChild(const char *name)
static const char * className()
Definition: ByRangeDelivery.hpp:216
std::string asString() const
Definition: ByRangeDelivery.hpp:184
const TKey top
Definition: ByRangeDelivery.hpp:46
Definition: Server.hpp:53
static const Range * range(const_range_iterator &ii)
Definition: ByRangeDelivery.hpp:226
void prepare(const TKey &key) noexcept(false)
Definition: ByRangeDelivery.hpp:163
xml::Node * asXML(xml::Node *parent) const
Definition: ByRangeDelivery.hpp:199
virtual void do_initialize() noexcept(false)
Definition: ByRangeDelivery.hpp:228
Range(const std::string &baseName, const TKey &_bottom, const TKey &_top)
Definition: ByRangeDelivery.hpp:49
std::vector< Range * > range_container
Definition: ByRangeDelivery.hpp:80
static void warning(const std::string &text, const char *fromFile, const int fromLine)
Definition: Logger.hpp:338
static Range * range(range_iterator &ii)
Definition: ByRangeDelivery.hpp:225
range_iterator range_end()
Definition: ByRangeDelivery.hpp:220
range_container::const_iterator const_range_iterator
Definition: ByRangeDelivery.hpp:82
xml::Node * asXML(xml::Node *parent) const
const_range_iterator range_end() const
Definition: ByRangeDelivery.hpp:223
ByRangeDelivery(const char *name, const bool isCritical)
Definition: ByRangeDelivery.hpp:90
void attach(Server *server) noexcept(false)
Definition: Logger.hpp:41
virtual ~ByRangeDelivery()
Definition: ByRangeDelivery.hpp:98
xml::Node * asXML(xml::Node *parent) const
Definition: ByRangeDelivery.hpp:70
range_iterator range_begin()
Definition: ByRangeDelivery.hpp:219
std::string asString() const
Definition: ByRangeDelivery.hpp:60
Definition: Resource.hpp:25
const_range_iterator range_begin() const
Definition: ByRangeDelivery.hpp:222
Definition: ByRangeDelivery.hpp:42
#define ANNA_FILE_LOCATION
Definition: defines.hpp:23
range_container::iterator range_iterator
Definition: ByRangeDelivery.hpp:81
const TKey bottom
Definition: ByRangeDelivery.hpp:45
void attach(range_iterator &ii, Server *server) noexcept(false)
Definition: ByRangeDelivery.hpp:153
Definition: ByRangeDelivery.hpp:44
Definition: RuntimeException.hpp:23
static bool isActive(const Level level)
Definition: Logger.hpp:169
Definition: Service.hpp:28