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