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