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