]> git.evergreen-ils.org Git - working/Evergreen.git/blob - OpenSRF/src/gateway/fieldmapper-c-xml-out.pl
6724ff510e4aa3b551bd5a8841e5e9e0945c4493
[working/Evergreen.git] / OpenSRF / src / gateway / fieldmapper-c-xml-out.pl
1 #!/usr/bin/perl
2 use strict;
3 use lib '../perlmods/';
4
5 my $map = {};
6 eval "
7         use lib '../../../Open-ILS/src/perlmods/';
8         use OpenILS::Utils::Fieldmapper;  
9 ";
10 $map = $Fieldmapper::fieldmap unless ($@);
11
12
13 if(!$ARGV[1]) {
14         print "usage: $0 <header_file> <source_file>\n";
15         exit;
16 }
17
18 warn "Generating fieldmapper-c code...\n";
19
20
21 print $ARGV[0] . "\n";
22 print $ARGV[1] . "\n";
23
24 open(HEADER, ">$ARGV[0]");
25 open(SOURCE, ">$ARGV[1]");
26
27 warn "Generating fieldmapper-c code...\n";
28
29 print HEADER <<C;
30 #ifndef _TOXML_H_
31 #define _TOXML_H_
32
33 char* json_string_to_xml(char*);
34
35 #endif
36 C
37
38 print SOURCE <<C;
39
40 #include <string.h>
41
42 /* and the JSON parser, so we can read the response we're XMLizing */
43 #include <string.h>
44 #include "objson/object.h"
45 #include "objson/json_parser.h"
46 #include "opensrf/utils.h"
47
48 char* json_string_to_xml(char*);
49 void _rest_xml_output(growing_buffer*, object*, char*, int, int);
50 char * _lookup_fm_field(char*,int);
51 char* _escape_xml (char*);
52
53 char* json_string_to_xml(char* content) {
54         object * obj;
55         growing_buffer * res_xml;
56         char * output;
57         int i;
58
59         obj = json_parse_string( content );
60         res_xml = buffer_init(1024);
61
62         if (!obj)
63                 return NULL;
64         
65         buffer_add(res_xml, "<response>");
66
67         for( i = 0; i!= obj->size; i++ ) {
68                 _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0,0);
69         }
70
71         buffer_add(res_xml, "</response>");
72
73         output = buffer_data(res_xml);
74         buffer_free(res_xml);
75
76         return output;
77 }
78
79 char* _escape_xml (char* text) {
80         char* out;
81         growing_buffer* b = buffer_init(256);
82         int len = strlen(text);
83         int i;
84         for (i = 0; i < len; i++) {
85                 if (text[i] == '&')
86                         buffer_add(b,strdup("&amp;"));
87                 else if (text[i] == '<')
88                         buffer_add(b,strdup("&lt;"));
89                 else if (text[i] == '>')
90                         buffer_add(b,strdup("&gt;"));
91                 else
92                         buffer_add_char(b,text[i]);
93         }
94         out = buffer_data(b);
95         buffer_free(b);
96         return out;
97 }
98
99 void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index, int notag) {
100         char * tag;
101         int i;
102         
103         if (obj->classname)
104                 notag = 1;
105
106         if(fm_class) {
107                 tag = _lookup_fm_field(fm_class,fm_index);
108         } else {
109                 tag = strdup("datum");
110         }
111         
112         /* add class hints if we have a class name */
113         if(obj->classname) {
114                 if(obj->is_null) {
115                         buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\"/></%s>", tag, obj->classname, tag);
116                         return;
117                 } else {
118                         buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\">", tag, obj->classname);
119                 }
120         }
121
122         /* now add the data */
123         if(obj->is_null) {
124                 if (!notag)
125                         buffer_fadd(buf, "<%s/>",tag);
126         } else if(obj->is_bool && obj->bool_value) {
127                 if (notag)
128                         buffer_add(buf, "true");
129                 else
130                         buffer_fadd(buf, "<%s>true</%s>",tag,tag);
131                 
132         } else if(obj->is_bool && ! obj->bool_value) {
133                 if (notag)
134                         buffer_add(buf, "false");
135                 else
136                         buffer_fadd(buf, "<%s>false</%s>",tag,tag);
137
138         } else if (obj->is_string) {
139                 if (notag) {
140                         //buffer_add(buf,_escape_xml(obj->string_data));
141                         buffer_add(buf,obj->string_data);
142                 } else {
143                         //buffer_fadd(buf,"<%s>%s</%s>",tag,_escape_xml(obj->string_data),tag);
144                         buffer_fadd(buf,"<%s>%s</%s>",tag,obj->string_data,tag);
145                 }
146
147         } else if(obj->is_number) {
148                 if (notag)
149                         buffer_fadd(buf,"%ld",obj->num_value);
150                 else
151                         buffer_fadd(buf,"<%s>%ld</%s>",tag,obj->num_value,tag);
152
153         } else if(obj->is_double) {
154                 if (notag)
155                         buffer_fadd(buf,"%lf",tag,obj->double_value,tag);
156                 else
157                         buffer_fadd(buf,"<%s>%lf</%s>",tag,obj->double_value,tag);
158
159
160         } else if (obj->is_array) {
161                 if (!notag) {
162                         if(!fm_class)
163                                 buffer_add(buf,"<array>");
164                         else
165                                 buffer_fadd(buf,"<%s>",tag);
166                 }
167
168                 for( i = 0; i!= obj->size; i++ ) {
169                         _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i,0);
170                 }
171
172                 if (!notag) {
173                         if(!fm_class)
174                                 buffer_add(buf,"</array>");
175                         else
176                                 buffer_fadd(buf,"</%s>",tag);
177                 }
178
179         } else if (obj->is_hash) {
180
181                 if (!notag) {
182                         if(!fm_class)
183                                 buffer_add(buf,"<hash>");
184                         else
185                                 buffer_fadd(buf,"<%s>",tag);
186                 }
187
188                 object_iterator* itr = new_iterator(obj);
189                 object_node* tmp;
190                 while( (tmp = itr->next(itr)) ) {
191                         if (notag) {
192                                 buffer_fadd(buf,"<%s>",tmp->key);
193                         } else {
194                                 buffer_add(buf,"<pair>");
195                                 buffer_fadd(buf,"<key>%s</key><value>",tmp->key);
196                         }
197
198                         _rest_xml_output(buf, tmp->item, NULL,0,notag);
199
200                         if (notag) {
201                                 buffer_fadd(buf,"</%s>",tmp->key);
202                         } else {
203                                 buffer_add(buf,"</value></pair>");
204                         }
205                 }
206                 free_iterator(itr);
207
208                 if (!notag) {
209                         if(!fm_class)
210                                 buffer_add(buf,"</hash>");
211                         else
212                                 buffer_fadd(buf,"</%s>",tag);
213                 }
214
215         }
216
217         if (obj->classname)
218                 buffer_fadd(buf,"</Object></%s>",tag);
219 }
220
221 char * _lookup_fm_field(char * class, int pos) {
222
223 C
224
225 print SOURCE "  if (class == NULL) return NULL;";
226
227 for my $object (keys %$map) {
228
229         my $short_name                          = $map->{$object}->{hint};
230
231         print SOURCE <<"        C";
232
233         else if (!strcmp(class, "$short_name")) {
234                 switch (pos) {
235         C
236
237         for my $field (keys %{$map->{$object}->{fields}}) {
238                 my $position = $map->{$object}->{fields}->{$field}->{position};
239
240                 print SOURCE <<"                C";
241                         case $position:
242                                 return strdup("$field");
243                                 break;
244                 C
245         }
246         print SOURCE "          }\n";
247         print SOURCE "  }\n";
248 }
249 print SOURCE '  return strdup("datum");'."\n";
250 print SOURCE "}\n";
251
252 close HEADER;
253 close SOURCE;
254
255 warn  "done\n";
256