Annotation of parser3/src/classes/dom.C, revision 1.25
1.2 parser 1: /** @file
2: Parser: @b dom parser class.
3:
4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
5:
6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
7: */
1.25 ! parser 8: static const char *RCSId="$Id: dom.C,v 1.24 2001/09/17 16:49:15 parser Exp $";
1.2 parser 9:
10: #if _MSC_VER
11: # pragma warning(disable:4291) // disable warning
12: // "no matching operator delete found; memory will not be freed if initialization throws an exception
13: #endif
14:
15: #include "classes.h"
16: #include "pa_request.h"
17: #include "pa_vdom.h"
1.20 parser 18: #include "pa_xslt_stylesheet_manager.h"
19: #include "pa_stylesheet_connection.h"
1.23 parser 20: #include "dnode.h"
1.2 parser 21:
1.16 parser 22: #include <strstream>
1.2 parser 23: #include <Include/PlatformDefinitions.hpp>
24: #include <util/PlatformUtils.hpp>
25: #include <XalanTransformer/XalanTransformer.hpp>
1.4 parser 26: #include <XalanTransformer/XalanParsedSource.hpp>
1.6 parser 27:
1.2 parser 28: // defines
29:
1.4 parser 30: #define DOM_CLASS_NAME "dom"
1.2 parser 31:
32: // class
33:
1.24 parser 34: class MDom : public MDnode {
1.2 parser 35: public: // VStateless_class
1.11 parser 36: Value *create_new_value(Pool& pool) { return new(pool) VDom(pool); }
1.2 parser 37:
38: public:
39: MDom(Pool& pool);
40:
41: public: // Methoded
42: bool used_directly() { return true; }
43: };
44:
45: // methods
46:
1.16 parser 47: static void _set(Request& r, const String& method_name, MethodParams *params) {
48: Pool& pool=r.pool();
49: VDom& vDom=*static_cast<VDom *>(r.self);
50:
1.17 parser 51: Value& vxml=params->as_junction(0, "xml must be code");
52: Temp_lang temp_lang(r, String::UL_XML);
53: const String& xml=r.process(vxml).as_string();
54:
55: std::istrstream stream(xml.cstr());
1.16 parser 56: XalanParsedSource* parsedSource;
1.22 parser 57: int error=vDom.transformer().parseSource(&stream, parsedSource);
1.16 parser 58:
59: if(error)
60: PTHROW(0, 0,
61: &method_name,
1.22 parser 62: vDom.transformer().getLastError());
1.16 parser 63:
64: // replace any previous parsed source
65: vDom.set_parsed_source(*parsedSource);
66: }
67:
1.2 parser 68: static void _load(Request& r, const String& method_name, MethodParams *params) {
69: Pool& pool=r.pool();
1.10 parser 70: VDom& vDom=*static_cast<VDom *>(r.self);
1.2 parser 71:
1.10 parser 72: // filespec
1.20 parser 73: const String& file_name=params->as_string(0, "file name must not be code");
74: const char *filespec=r.absolute(file_name).cstr(String::UL_FILE_SPEC);
1.2 parser 75:
76: XalanParsedSource* parsedSource;
1.22 parser 77: int error=vDom.transformer().parseSource(filespec, parsedSource);
1.2 parser 78:
79: if(error)
80: PTHROW(0, 0,
1.20 parser 81: &file_name,
1.22 parser 82: vDom.transformer().getLastError());
1.2 parser 83:
1.15 parser 84: // replace any previous parsed source
1.11 parser 85: vDom.set_parsed_source(*parsedSource);
1.2 parser 86: }
87:
1.12 parser 88: static void add_xslt_param(const Hash::Key& aattribute, Hash::Val *ameaning,
1.20 parser 89: void *info) {
1.12 parser 90: XalanTransformer& transformer=*static_cast<XalanTransformer *>(info);
91: const char *attribute_cstr=aattribute.cstr();
92: const char *meaning_cstr=static_cast<Value *>(ameaning)->as_string().cstr();
93:
94: transformer.setStylesheetParam(
1.23 parser 95: XalanDOMString(attribute_cstr),
96: XalanDOMString(meaning_cstr));
1.12 parser 97: }
1.10 parser 98: static void _xslt(Request& r, const String& method_name, MethodParams *params) {
99: Pool& pool=r.pool();
100: VDom& vDom=*static_cast<VDom *>(r.self);
101:
1.12 parser 102: // params
103: if(params->size()>1) {
1.18 parser 104: Value& vparams=params->as_no_junction(1, "transform parameters parameter must not be code");
1.12 parser 105: if(vparams.is_defined())
106: if(Hash *params=vparams.get_hash())
1.22 parser 107: params->for_each(add_xslt_param, &vDom.transformer());
1.12 parser 108: else
109: PTHROW(0, 0,
110: &method_name,
1.18 parser 111: "transform parameters parameter must be hash");
1.12 parser 112: }
113:
1.10 parser 114: // source
1.11 parser 115: XalanParsedSource &parsed_source=vDom.get_parsed_source(pool, &method_name);
1.10 parser 116:
117: // stylesheet
1.20 parser 118: const String& stylesheet_file_name=params->as_string(0, "file name must not be code");
119: const String& stylesheet_filespec=r.absolute(stylesheet_file_name);
120: //_asm int 3;
121: Stylesheet_connection& connection=XSLT_stylesheet_manager->get_connection(stylesheet_filespec);
1.10 parser 122:
123: // target
1.22 parser 124: XalanDocument* target=vDom.parser_liaison().createDocument();
1.10 parser 125: XSLTResultTarget domResultTarget(target);
126:
127: // transform
1.22 parser 128: int error=vDom.transformer().transform(
1.20 parser 129: parsed_source,
130: &connection.stylesheet(),
131: domResultTarget);
132: connection.close();
1.10 parser 133: if(error)
134: PTHROW(0, 0,
1.20 parser 135: &stylesheet_file_name,
1.22 parser 136: vDom.transformer().getLastError());
1.10 parser 137:
138: // write out result
1.11 parser 139: VDom& result=*new(pool) VDom(pool);
140: result.set_document(*target);
141: r.write_no_lang(result);
1.10 parser 142: }
143:
1.2 parser 144: // constructor
145:
1.24 parser 146: MDom::MDom(Pool& apool) : MDnode(apool) {
1.4 parser 147: set_name(*NEW String(pool(), DOM_CLASS_NAME));
1.16 parser 148:
149: // ^dom::set[<some>xml</some>]
150: add_native_method("set", Method::CT_DYNAMIC, _set, 1, 1);
1.2 parser 151:
1.3 parser 152: // ^dom::load[some.xml]
1.2 parser 153: add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1);
1.10 parser 154:
1.20 parser 155: // ^dom.xslt[stylesheet file_name]
156: // ^dom.xslt[stylesheet file_name;params hash]
1.12 parser 157: add_native_method("xslt", Method::CT_DYNAMIC, _xslt, 1, 2);
1.6 parser 158:
1.2 parser 159: }
160: // global variable
161:
162: Methoded *Dom_class;
163:
164: // creator
165:
166: Methoded *MDom_create(Pool& pool) {
167: return Dom_class=new(pool) MDom(pool);
168: }
E-mail: