]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm
code to remove old version of wormed metabib::full_rec
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Utils / Fieldmapper.pm
1 package Fieldmapper;
2 use JSON;
3 use Data::Dumper;
4 use base 'OpenSRF::Application';
5
6 use OpenSRF::Utils::Logger;
7 my $log = 'OpenSRF::Utils::Logger';
8
9 use OpenILS::Application::Storage::CDBI;
10 use OpenILS::Application::Storage::CDBI::actor;
11 use OpenILS::Application::Storage::CDBI::biblio;
12 use OpenILS::Application::Storage::CDBI::config;
13 use OpenILS::Application::Storage::CDBI::metabib;
14
15 use vars qw/$fieldmap $VERSION/;
16
17 _init();
18
19 sub publish_fieldmapper {
20         my ($self,$client,$class) = @_;
21
22         return $fieldmap unless (defined $class);
23         return undef unless (exists($$fieldmap{$class}));
24         return {$class => $$fieldmap{$class}};
25 }
26 __PACKAGE__->register_method(
27         api_name        => 'opensrf.open-ils.system.fieldmapper',
28         api_level       => 1,
29         method          => 'publish_fieldmapper',
30 );
31
32 #
33 # To dump the Javascript version of the fieldmapper struct use the command:
34 #
35 #       PERL5LIB=~/cvs/ILS/OpenSRF/src/perlmods/:~/cvs/ILS/Open-ILS/src/perlmods/ GEN_JS=1 perl -MOpenILS::Utils::Fieldmapper -e 'print "\n";'
36 #
37 # ... adjusted for your CVS sandbox, of course.
38 #
39
40 sub classes {
41         return () unless (defined $fieldmap);
42         return keys %$fieldmap;
43 }
44
45 sub _init {
46         return if (defined $fieldmap);
47
48         $fieldmap = 
49         {
50                 'Fieldmapper::actor::user'                      => { hint => 'au'   },
51                 'Fieldmapper::actor::org_unit'                  => { hint => 'aou'  },
52                 'Fieldmapper::actor::org_unit_type'             => { hint => 'aout' },
53                 
54                 'Fieldmapper::biblio::record_node'              => { hint               => 'brn',
55                                                                      proto_fields       => { children => 1 } },
56                 'Fieldmapper::biblio::record_entry'             => { hint => 'bre'  },
57                 'Fieldmapper::biblio::record_mods'              => { hint => 'brm'  },
58                 'Fieldmapper::biblio::record_marc'              => { hint => 'brx'  },
59
60                 'Fieldmapper::config::bib_source'               => { hint => 'cbs'  },
61                 'Fieldmapper::config::metabib_field'            => { hint => 'cmf'  },
62
63                 'Fieldmapper::metabib::metarecord'              => { hint => 'mmr'  },
64                 'Fieldmapper::metabib::title_field_entry'       => { hint => 'mtfe' },
65                 'Fieldmapper::metabib::author_field_entry'      => { hint => 'mafe' },
66                 'Fieldmapper::metabib::subject_field_entry'     => { hint => 'msfe' },
67                 'Fieldmapper::metabib::keyword_field_entry'     => { hint => 'mkfe' },
68                 'Fieldmapper::metabib::full_rec'                => { hint => 'mfr'  },
69         };
70
71         #-------------------------------------------------------------------------------
72         # Now comes the evil!  Generate classes
73
74         for my $pkg ( keys %$fieldmap ) {
75                 (my $cdbi = $pkg) =~ s/^Fieldmapper:://o;
76
77                 eval <<"                PERL";
78                         package $pkg;
79                         use base 'Fieldmapper';
80                 PERL
81
82                 $$fieldmap{$pkg}{cdbi} = $cdbi;
83
84                 my $pos = 0;
85                 for my $vfield ( qw/isnew ischanged isdeleted/ ) {
86                         $$fieldmap{$pkg}{fields}{$vfield} = { position => $pos, virtual => 1 };
87                         $pos++;
88                 }
89
90                 if (exists $$fieldmap{$pkg}{proto_fields}) {
91                         for my $pfield ( keys %{ $$fieldmap{$pkg}{proto_fields} } ) {
92                                 $$fieldmap{$pkg}{fields}{$pfield} = { position => $pos, virtual => $$fieldmap{$pkg}{proto_fields}{$pfield} };
93                                 $pos++;
94                         }
95                 }
96
97                 for my $col ( $cdbi->columns('All') ) {
98                         $$fieldmap{$pkg}{fields}{$col} = { position => $pos, virtual => 0 };
99                         $pos++;
100                 }
101
102                 JSON->register_class_hint(
103                         hint => $pkg->json_hint,
104                         name => $pkg,
105                         type => 'array',
106                 );
107
108         }
109
110         print Fieldmapper->javascript() if ($ENV{GEN_JS});
111 }
112
113 sub new {
114         my $self = shift;
115         my $value = shift;
116         $value = [] unless (defined $value);
117         return bless $value => $self->class_name;
118 }
119
120 sub javascript {
121         my $class_name = shift;
122         return 'var fieldmap = ' . JSON->perl2JSON($fieldmap) . ';'
123 }
124
125 sub DESTROY {}
126
127 sub AUTOLOAD {
128         my $obj = shift;
129         my $value = shift;
130         (my $field = $AUTOLOAD) =~ s/^.*://o;
131         my $class_name = $obj->class_name;
132
133
134         if ($field =~ /^clear_/o) {
135                 {       no strict 'subs';
136                         *{$obj->class_name."::$field"} = sub {
137                                 my $self = shift;
138                                 $self->[$pos] = undef;
139                                 return 1;
140                         };
141                 }
142                 return $obj->$field();
143         }
144
145         die "No field by the name $field in $class_name!"
146                 unless (exists $$fieldmap{$class_name}{fields}{$field});
147
148         my $pos = $$fieldmap{$class_name}{fields}{$field}{position};
149
150         {       no strict 'subs';
151                 *{$obj->class_name."::$field"} = sub {
152                         my $self = shift;
153                         my $new_val = shift;
154                         $self->[$pos] = $new_val if (defined $new_val);
155                         return $self->[$pos];
156                 };
157         }
158         return $obj->$field($value);
159 }
160
161 sub class_name {
162         my $class_name = shift;
163         return ref($class_name) || $class_name;
164 }
165
166 sub real_fields {
167         my $self = shift;
168         my $class_name = $self->class_name;
169         my $fields = $$fieldmap{$class_name}{fields};
170
171         my @f = grep {
172                         !$$fields{$_}{virtual}
173                 } sort {$$fields{$a}{position} <=> $$fields{$b}{position}} keys %$fields;
174
175         return @f;
176 }
177
178 sub api_level {
179         my $self = shift;
180         return $fieldmap->{$self->class_name}->{api_level};
181 }
182
183 sub json_hint {
184         my $self = shift;
185         return $fieldmap->{$self->class_name}->{hint};
186 }
187
188
189 1;