/*
- * Copyright 2001-2009 Internet2
+ * Copyright 2001-2010 Internet2
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#include "internal.h"
+#include "io/GenericRequest.h"
#include "util/TemplateEngine.h"
using namespace xmltooling;
using namespace std;
+namespace {
+ static const pair<const string,string> emptyPair;
+}
+
+TemplateEngine::TemplateEngine()
+{
+ setTagPrefix("mlp");
+}
+
+TemplateEngine::~TemplateEngine()
+{
+}
+
+TemplateEngine::TemplateParameters::TemplateParameters() : m_request(nullptr)
+{
+}
+
+TemplateEngine::TemplateParameters::~TemplateParameters()
+{
+}
+
+const char* TemplateEngine::TemplateParameters::getParameter(const char* name) const
+{
+ map<string,string>::const_iterator i=m_map.find(name);
+ return (i!=m_map.end() ? i->second.c_str() : (m_request ? m_request->getParameter(name) : nullptr));
+}
+
+const multimap<string,string>* TemplateEngine::TemplateParameters::getLoopCollection(const char* name) const
+{
+ map< string,multimap<string,string> >::const_iterator i=m_collectionMap.find(name);
+ return (i!=m_collectionMap.end() ? &(i->second) : nullptr);
+}
+
void TemplateEngine::setTagPrefix(const char* tagPrefix)
{
keytag = string("<") + tagPrefix + " ";
const char*& lastpos,
ostream& os,
const TemplateParameters& parameters,
+ const std::pair<const std::string,std::string>& loopentry,
const XMLToolingException* e
) const
{
const char* line = buf.c_str();
const char* thispos;
- while ((thispos = strchr(lastpos, '<')) != NULL) {
+ while ((thispos = strchr(lastpos, '<')) != nullptr) {
// Output the string up to this token.
if (visible)
os << buf.substr(lastpos-line, thispos-lastpos);
lastpos = thispos + keytag.length();
// search for the end-tag
- if ((thispos = strstr(lastpos, "/>")) != NULL) {
+ if ((thispos = strstr(lastpos, "/>")) != nullptr) {
string key = buf.substr(lastpos-line, thispos-lastpos);
trimspace(key);
- const char* p = parameters.getParameter(key.c_str());
- if (!p && e)
- p = e->getProperty(key.c_str());
- if (p)
- html_encode(os,p);
+ if (key == "$name" && !loopentry.first.empty())
+ html_encode(os,loopentry.first.c_str());
+ else if (key == "$value" && !loopentry.second.empty())
+ html_encode(os,loopentry.second.c_str());
+ else {
+ const char* p = parameters.getParameter(key.c_str());
+ if (!p && e)
+ p = e->getProperty(key.c_str());
+ if (p)
+ html_encode(os,p);
+ }
lastpos = thispos + 2; // strlen("/>")
}
}
lastpos = thispos + iftag.length();
// search for the end of this tag
- if ((thispos = strchr(lastpos, '>')) != NULL) {
+ if ((thispos = strchr(lastpos, '>')) != nullptr) {
string key = buf.substr(lastpos-line, thispos-lastpos);
trimspace(key);
bool cond=false;
if (visible)
cond = parameters.getParameter(key.c_str()) || (e && e->getProperty(key.c_str()));
lastpos = thispos + 1; // strlen(">")
- process(cond, buf, lastpos, os, parameters, e);
+ process(cond, buf, lastpos, os, parameters, loopentry, e);
}
}
#ifdef HAVE_STRCASECMP
lastpos = thispos + ifnottag.length();
// search for the end of this tag
- if ((thispos = strchr(lastpos, '>')) != NULL) {
+ if ((thispos = strchr(lastpos, '>')) != nullptr) {
string key = buf.substr(lastpos-line, thispos-lastpos);
trimspace(key);
bool cond=visible;
if (visible)
cond = !(parameters.getParameter(key.c_str()) || (e && e->getProperty(key.c_str())));
lastpos = thispos + 1; // strlen(">")
- process(cond, buf, lastpos, os, parameters, e);
+ process(cond, buf, lastpos, os, parameters, loopentry, e);
}
}
#ifdef HAVE_STRCASECMP
bool cond = visible;
// search for the end of this tag
- if ((thispos = strchr(lastpos, '>')) != NULL) {
+ if ((thispos = strchr(lastpos, '>')) != nullptr) {
key = buf.substr(lastpos-line, thispos-lastpos);
trimspace(key);
lastpos = thispos + 1; // strlen(">")
}
- const vector<TemplateParameters>& forParams = parameters.getParameterCollection(key.c_str());
- vector<TemplateParameters>::size_type forend = forParams.size();
- if (forend == 0) { // have to go through at least once to match end tags
- cond = false;
- forend = 1;
+ const multimap<string,string>* forParams = parameters.getLoopCollection(key.c_str());
+ if (!forParams || forParams->size() == 0) {
+ process(false, buf, lastpos, os, parameters, emptyPair, e);
}
-
- const char *savlastpos = lastpos;
- for (vector<TemplateParameters>::size_type i=0; i<forend; ++i) {
- static TemplateParameters nullp;
- lastpos = savlastpos;
- process(cond, buf, lastpos, os, (forParams.size()>0 ? forParams[i] : nullp), e);
+ else {
+ const char* savlastpos = lastpos;
+ for (multimap<string,string>::const_iterator i=forParams->begin(); i!=forParams->end(); ++i) {
+ lastpos = savlastpos;
+ process(cond, buf, lastpos, os, parameters, *i, e);
+ }
}
-
}
#ifdef HAVE_STRCASECMP
buf += line + '\n';
const char* pos=buf.c_str();
- process(true, buf, pos, os, parameters, e);
+ process(true, buf, pos, os, parameters, emptyPair, e);
}