157c912f6d1bb420d4b529fe5a5275abd2a3f2c4
[shibboleth/cpp-xmltooling.git] / xmltooling / util / TemplateEngine.h
1 /*
2  *  Copyright 2001-2010 Internet2
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file xmltooling/util/TemplateEngine.h
19  *
20  * Simple template replacement engine.
21  */
22
23 #ifndef __xmltooling_template_h__
24 #define __xmltooling_template_h__
25
26 #include <xmltooling/base.h>
27
28 #include <map>
29 #include <string>
30 #include <iostream>
31 #include <vector>
32
33 #if defined (_MSC_VER)
34     #pragma warning( push )
35     #pragma warning( disable : 4251 )
36 #endif
37
38 namespace xmltooling {
39
40     class XMLTOOL_API GenericRequest;
41
42     /**
43      * Simple template replacement engine. Supports the following:
44      * <ul>
45      *  <li> &lt;mlp key/&gt; </li>
46      *  <li> &lt;mlpif key&gt; stuff &lt;/mlpif&gt;</li>
47      *  <li> &lt;mlpifnot key&gt; stuff &lt;/mlpifnot&gt;</li>
48      *  <li> &lt;mlpfor key&gt; stuff &lt;/mlpfor&gt;</li>
49      *  <li> &lt;mlp $name/&gt; (in for loop only) </li>
50      *  <li> &lt;mlp $value/&gt; (in for loop only) </li>
51      * </ul>
52      *
53      * The default tag prefix is "mlp". This can be overridden for
54      * compatibility.
55      */
56     class XMLTOOL_API TemplateEngine
57     {
58     MAKE_NONCOPYABLE(TemplateEngine);
59     public:
60         /** Default constructor. */
61         TemplateEngine();
62
63         virtual ~TemplateEngine();
64
65         /**
66          * Sets the tag name to use when locating template replacement tags.
67          *
68          * @param tagPrefix base prefix for tags
69          */
70         void setTagPrefix(const char* tagPrefix);
71
72         /**
73          * Interface to parameters to plug into templates.
74          * Allows callers to supply a more dynamic lookup mechanism to supplement a basic map.
75          */
76         class XMLTOOL_API TemplateParameters {
77         public:
78             TemplateParameters();
79             virtual ~TemplateParameters();
80
81             /** Map of known parameters to supply to template. */
82             std::map<std::string,std::string> m_map;
83
84             /** Map of sub-collections used in for loops. */
85             std::map< std::string,std::multimap<std::string,std::string> > m_collectionMap;
86
87             /** Request from client that resulted in template being processed. */
88             const GenericRequest* m_request;
89
90             /**
91              * Returns the value of a parameter to plug into the template.
92              *
93              * @param name  name of parameter
94              * @return value of parameter, or nullptr
95              */
96             virtual const char* getParameter(const char* name) const;
97
98             /**
99              * Returns a named collection of sub-parameters to pass into a loop.
100              *
101              * @param name  name of sub-collection
102              * @return pointer to a multimap of sub-parameters, or nullptr
103              */
104             virtual const std::multimap<std::string,std::string>* getLoopCollection(const char* name) const;
105         };
106
107         /**
108          * Processes template from an input stream and executes replacements and
109          * conditional logic based on parameters.
110          *
111          * @param is            input stream providing template
112          * @param os            output stream to send results of executing template
113          * @param parameters    parameters to plug into template
114          * @param e             optional exception to extract parameters from
115          */
116         virtual void run(
117             std::istream& is,
118             std::ostream& os,
119             const TemplateParameters& parameters,
120             const XMLToolingException* e=nullptr
121             ) const;
122
123         /**
124          * List of non-built-in characters considered "unsafe" and requiring HTML encoding.
125          * The default set is #%&():[]\\`{}
126          */
127         static std::string unsafe_chars;
128
129     private:
130         void trimspace(std::string& s) const;
131         void html_encode(std::ostream& os, const char* start) const;
132         void process(
133             bool visible,
134             const std::string& buf,
135             const char*& lastpos,
136             std::ostream& os,
137             const TemplateParameters& parameters,
138             const std::pair<const std::string,std::string>& loopentry,
139             const XMLToolingException* e
140             ) const;
141
142         std::string keytag,iftag,ifendtag,ifnottag,ifnotendtag,fortag,forendtag;
143     };
144 };
145
146 #if defined (_MSC_VER)
147     #pragma warning( pop )
148 #endif
149
150 #endif /* __xmltooling_template_h__ */