3 use lib '../perlmods/';
7 use lib '../../../Open-ILS/src/perlmods/';
8 use OpenILS::Utils::Fieldmapper;
10 $map = $Fieldmapper::fieldmap unless ($@);
14 print "usage: $0 <header_file> <source_file>\n";
18 warn "Generating fieldmapper-c code...\n";
21 print $ARGV[0] . "\n";
22 print $ARGV[1] . "\n";
24 open(HEADER, ">$ARGV[0]");
25 open(SOURCE, ">$ARGV[1]");
27 warn "Generating fieldmapper-c code...\n";
33 char* json_string_to_xml(char*);
42 /* and the JSON parser, so we can read the response we're XMLizing */
44 #include "objson/object.h"
45 #include "objson/json_parser.h"
46 #include "opensrf/utils.h"
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*);
53 char* json_string_to_xml(char* content) {
55 growing_buffer * res_xml;
59 obj = json_parse_string( content );
60 res_xml = buffer_init(1024);
65 buffer_add(res_xml, "<response>");
67 for( i = 0; i!= obj->size; i++ ) {
68 _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0,0);
71 buffer_add(res_xml, "</response>");
73 output = buffer_data(res_xml);
79 char* _escape_xml (char* text) {
81 growing_buffer* b = buffer_init(256);
82 int len = strlen(text);
84 for (i = 0; i < len; i++) {
86 buffer_add(b,strdup("&"));
87 else if (text[i] == '<')
88 buffer_add(b,strdup("<"));
89 else if (text[i] == '>')
90 buffer_add(b,strdup(">"));
92 buffer_add_char(b,text[i]);
99 void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index, int notag) {
107 tag = _lookup_fm_field(fm_class,fm_index);
109 tag = strdup("datum");
112 /* add class hints if we have a class name */
115 buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\"/></%s>", tag, obj->classname, tag);
118 buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\">", tag, obj->classname);
122 /* now add the data */
125 buffer_fadd(buf, "<%s/>",tag);
126 } else if(obj->is_bool && obj->bool_value) {
128 buffer_add(buf, "true");
130 buffer_fadd(buf, "<%s>true</%s>",tag,tag);
132 } else if(obj->is_bool && ! obj->bool_value) {
134 buffer_add(buf, "false");
136 buffer_fadd(buf, "<%s>false</%s>",tag,tag);
138 } else if (obj->is_string) {
140 //buffer_add(buf,_escape_xml(obj->string_data));
141 buffer_add(buf,obj->string_data);
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);
147 } else if(obj->is_number) {
149 buffer_fadd(buf,"%ld",obj->num_value);
151 buffer_fadd(buf,"<%s>%ld</%s>",tag,obj->num_value,tag);
153 } else if(obj->is_double) {
155 buffer_fadd(buf,"%lf",tag,obj->double_value,tag);
157 buffer_fadd(buf,"<%s>%lf</%s>",tag,obj->double_value,tag);
160 } else if (obj->is_array) {
163 buffer_add(buf,"<array>");
165 buffer_fadd(buf,"<%s>",tag);
168 for( i = 0; i!= obj->size; i++ ) {
169 _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i,0);
174 buffer_add(buf,"</array>");
176 buffer_fadd(buf,"</%s>",tag);
179 } else if (obj->is_hash) {
183 buffer_add(buf,"<hash>");
185 buffer_fadd(buf,"<%s>",tag);
188 object_iterator* itr = new_iterator(obj);
190 while( (tmp = itr->next(itr)) ) {
192 buffer_fadd(buf,"<%s>",tmp->key);
194 buffer_add(buf,"<pair>");
195 buffer_fadd(buf,"<key>%s</key><value>",tmp->key);
198 _rest_xml_output(buf, tmp->item, NULL,0,notag);
201 buffer_fadd(buf,"</%s>",tmp->key);
203 buffer_add(buf,"</value></pair>");
210 buffer_add(buf,"</hash>");
212 buffer_fadd(buf,"</%s>",tag);
218 buffer_fadd(buf,"</Object></%s>",tag);
221 char * _lookup_fm_field(char * class, int pos) {
225 print SOURCE " if (class == NULL) return NULL;";
227 for my $object (keys %$map) {
229 my $short_name = $map->{$object}->{hint};
233 else if (!strcmp(class, "$short_name")) {
237 for my $field (keys %{$map->{$object}->{fields}}) {
238 my $position = $map->{$object}->{fields}->{$field}->{position};
242 return strdup("$field");
249 print SOURCE ' return strdup("datum");'."\n";