]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm
updating mapper to match fields
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Utils / Fieldmapper.pm
1 package Fieldmapper;
2 use JSON;
3 use vars qw/$fieldmap @class_name_list/;
4
5 $fieldmap = 
6 {
7         'Fieldmapper::metabib::metarecord' =>
8         {
9                 hint            => 'cbs1',
10                 api_level       => 1,
11                 fields          =>
12                 {
13                         id              => { position =>  0, virtual => 0 },
14                         fingerprint     => { position =>  1, virtual => 0 },
15                         master_record   => { position =>  2, virtual => 0 },
16                         mods            => { position =>  3, virtual => 0 },
17
18                         isnew           => { position =>  4, virtual => 1 },
19                         ischanged       => { position =>  5, virtual => 1 },
20                         isdeleted       => { position =>  6, virtual => 1 },
21                 },
22         },
23
24         'Fieldmapper::config::bib_source' =>
25         {
26                 hint            => 'cbs1',
27                 api_level       => 1,
28                 fields          =>
29                 {
30                         id      => { position =>  0, virtual => 0 },
31                         quality => { position =>  1, virtual => 0 },
32                         source  => { position =>  2, virtual => 0 },
33                 },
34         },
35
36         'Fieldmapper::config::metabib_field' =>
37         {
38                 hint            => 'cmf1',
39                 api_level       => 1,
40                 fields          =>
41                 {
42                         id      => { position =>  0, virtual => 0 },
43                         class   => { position =>  1, virtual => 0 },
44                         name    => { position =>  2, virtual => 0 },
45                         xpath   => { position =>  3, virtual => 0 },
46                 },
47         },
48
49         'Fieldmapper::biblio::record_node' =>
50         {
51                 hint            => 'brn1',
52                 api_level       => 1,
53                 fields          =>
54                 {
55                         id              => { position =>  0, virtual => 0 },
56                         owner_doc       => { position =>  1, virtual => 0 },
57                         intra_doc_id    => { position =>  2, virtual => 0 },
58                         parent_node     => { position =>  3, virtual => 0 },
59                         node_type       => { position =>  4, virtual => 0 },
60                         namespace_uri   => { position =>  5, virtual => 0 },
61                         name            => { position =>  6, virtual => 0 },
62                         value           => { position =>  7, virtual => 0 },
63
64                         isnew           => { position =>  8, virtual => 1 },
65                         ischanged       => { position =>  9, virtual => 1 },
66                         isdeleted       => { position => 10, virtual => 1 },
67                         children        => { position => 11, virtual => 1 },
68                 },
69         },
70
71         'Fieldmapper::biblio::record_entry' =>
72         {
73                 hint            => 'bre1',
74                 api_level       => 1,
75                 fields          =>
76                 {
77                         id              => { position =>  0, virtual => 0 },
78                         tcn_source      => { position =>  1, virtual => 0 },
79                         tcn_value       => { position =>  2, virtual => 0 },
80                         creator         => { position =>  3, virtual => 0 },
81                         editor          => { position =>  4, virtual => 0 },
82                         create_date     => { position =>  5, virtual => 0 },
83                         edit_date       => { position =>  6, virtual => 0 },
84                         source          => { position =>  7, virtual => 0 },
85                         active          => { position =>  8, virtual => 0 },
86                         deleted         => { position =>  9, virtual => 0 },
87
88                         isnew           => { position => 10, virtual => 1 },
89                         ischanged       => { position => 11, virtual => 1 },
90                         isdeleted       => { position => 12, virtual => 1 },
91                 },
92         },
93
94         'Fieldmapper::actor::user' =>
95         {
96                 hint            => 'au1',
97                 api_level       => 1,
98                 fields          =>
99                 {
100                         id                      => { position =>  0, virtual => 0 },
101                         usrid                   => { position =>  1, virtual => 0 },
102                         usrname                 => { position =>  2, virtual => 0 },
103                         email                   => { position =>  3, virtual => 0 },
104                         prefix                  => { position =>  4, virtual => 0 },
105                         first_given_name        => { position =>  5, virtual => 0 },
106                         second_given_name       => { position =>  6, virtual => 0 },
107                         family_name             => { position =>  7, virtual => 0 },
108                         suffix                  => { position =>  8, virtual => 0 },
109                         address                 => { position =>  9, virtual => 0 },
110                         home_ou                 => { position => 10, virtual => 0 },
111                         gender                  => { position => 11, virtual => 0 },
112                         dob                     => { position => 12, virtual => 0 },
113                         active                  => { position => 13, virtual => 0 },
114                         master_acount           => { position => 14, virtual => 0 },
115                         super_user              => { position => 15, virtual => 0 },
116                         usrgroup                => { position => 16, virtual => 0 },
117                         passwd                  => { position => 17, virtual => 0 },
118
119                         isnew                   => { position => 18, virtual => 1 },
120                         ischanged               => { position => 19, virtual => 1 },
121                         isdeleted               => { position => 20, virtual => 1 },
122                 },
123         },
124 };
125
126 sub new {
127         my $self = shift;
128         my $value = shift;
129         $value = [] unless (defined $value);
130         return bless $value => $self->class_name;
131 }
132
133 sub javascript {
134         my $class_name = shift;
135         return 'var fieldmap = ' . JSON->perl2JSON($fieldmap) . ';'
136 }
137
138 sub DESTROY {}
139
140 sub AUTOLOAD {
141         my $obj = shift;
142         my $value = shift;
143         (my $field = $AUTOLOAD) =~ s/^.*://o;
144         my $class_name = $obj->class_name;
145
146         die "No field by the name $field in $class_name!"
147                 unless (exists $$fieldmap{$class_name}{fields}{$field});
148
149         my $pos = $$fieldmap{$class_name}{fields}{$field}{position};
150
151         {       no strict 'subs';
152                 *{$obj->class_name."::$field"} = sub {
153                         my $self = shift;
154                         my $new_val = shift;
155                         $self->[$pos] = $new_val if (defined $new_val);
156                         return $self->[$pos];
157                 };
158         }
159
160         return $obj->$field($value);
161 }
162
163 sub class_name {
164         my $class_name = shift;
165         return ref($class_name) || $class_name;
166 }
167
168 sub real_fields {
169         my $self = shift;
170         my $class_name = $self->class_name;
171         my $fields = $$fieldmap{$class_name}{fields};
172
173         my @f = grep {
174                         !$$fields{$_}{virtual}
175                 } sort {$$fields{$a}{position} <=> $$fields{$b}{position}} keys %$fields;
176
177         return @f;
178 }
179
180 sub api_level {
181         my $self = shift;
182         return $fieldmap->{$self->class_name}->{api_level};
183 }
184
185 sub json_hint {
186         my $self = shift;
187         return $fieldmap->{$self->class_name}->{hint};
188 }
189
190
191 #-------------------------------------------------------------------------------
192 # Now comes the evil!  Generate classes
193
194 for my $pkg ( keys %$fieldmap ) {
195         eval <<"        PERL";
196                 package $pkg;
197                 use base 'Fieldmapper';
198         PERL
199
200         push @class_name_list, $pkg;
201
202         JSON->register_class_hint(
203                 hint => $pkg->json_hint,
204                 name => $pkg,
205                 type => 'array',
206         );
207
208 }
209 print Fieldmapper->javascript() if ($ENV{GEN_JS});
210
211 1;