4 use base 'OpenSRF::Application';
6 use OpenSRF::Utils::Logger;
7 my $log = 'OpenSRF::Utils::Logger';
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;
15 use vars qw/$fieldmap $VERSION/;
19 sub publish_fieldmapper {
20 my ($self,$client,$class) = @_;
22 return $fieldmap unless (defined $class);
23 return undef unless (exists($$fieldmap{$class}));
24 return {$class => $$fieldmap{$class}};
26 __PACKAGE__->register_method(
27 api_name => 'opensrf.open-ils.system.fieldmapper',
29 method => 'publish_fieldmapper',
33 # To dump the Javascript version of the fieldmapper struct use the command:
35 # PERL5LIB=~/cvs/ILS/OpenSRF/src/perlmods/:~/cvs/ILS/Open-ILS/src/perlmods/ GEN_JS=1 perl -MOpenILS::Utils::Fieldmapper -e 'print "\n";'
37 # ... adjusted for your CVS sandbox, of course.
41 return () unless (defined $fieldmap);
42 return keys %$fieldmap;
46 return if (defined $fieldmap);
50 'Fieldmapper::actor::user' => { hint => 'au' },
51 'Fieldmapper::actor::org_unit' => { hint => 'aou',
52 proto_fields => { children => 1 } },
53 'Fieldmapper::actor::org_unit_type' => { hint => 'aout',
54 proto_fields => { children => 1 } },
56 'Fieldmapper::biblio::record_node' => { hint => 'brn',
57 proto_fields => { children => 1 } },
58 'Fieldmapper::biblio::record_entry' => { hint => 'bre' },
59 'Fieldmapper::biblio::record_mods' => { hint => 'brm' },
60 'Fieldmapper::biblio::record_marc' => { hint => 'brx' },
62 'Fieldmapper::config::bib_source' => { hint => 'cbs' },
63 'Fieldmapper::config::metabib_field' => { hint => 'cmf' },
65 'Fieldmapper::metabib::metarecord' => { hint => 'mmr' },
66 'Fieldmapper::metabib::title_field_entry' => { hint => 'mtfe' },
67 'Fieldmapper::metabib::author_field_entry' => { hint => 'mafe' },
68 'Fieldmapper::metabib::subject_field_entry' => { hint => 'msfe' },
69 'Fieldmapper::metabib::keyword_field_entry' => { hint => 'mkfe' },
70 'Fieldmapper::metabib::full_rec' => { hint => 'mfr' },
72 'Fieldmapper::asset::copy' => { hint => 'acp' },
73 'Fieldmapper::asset::copy_note' => { hint => 'acpn' },
74 'Fieldmapper::asset::call_number' => { hint => 'acn' },
75 'Fieldmapper::asset::call_number_note' => { hint => 'acnn' },
78 #-------------------------------------------------------------------------------
79 # Now comes the evil! Generate classes
81 for my $pkg ( keys %$fieldmap ) {
82 (my $cdbi = $pkg) =~ s/^Fieldmapper:://o;
86 use base 'Fieldmapper';
89 $$fieldmap{$pkg}{cdbi} = $cdbi;
92 for my $vfield ( qw/isnew ischanged isdeleted/ ) {
93 $$fieldmap{$pkg}{fields}{$vfield} = { position => $pos, virtual => 1 };
97 if (exists $$fieldmap{$pkg}{proto_fields}) {
98 for my $pfield ( keys %{ $$fieldmap{$pkg}{proto_fields} } ) {
99 $$fieldmap{$pkg}{fields}{$pfield} = { position => $pos, virtual => $$fieldmap{$pkg}{proto_fields}{$pfield} };
104 for my $col ( $cdbi->columns('All') ) {
105 $$fieldmap{$pkg}{fields}{$col} = { position => $pos, virtual => 0 };
109 JSON->register_class_hint(
110 hint => $pkg->json_hint,
117 print Fieldmapper->javascript() if ($ENV{GEN_JS});
123 $value = [] unless (defined $value);
124 return bless $value => $self->class_name;
128 my $class_name = shift;
129 return 'var fieldmap = ' . JSON->perl2JSON($fieldmap) . ';'
137 (my $field = $AUTOLOAD) =~ s/^.*://o;
138 my $class_name = $obj->class_name;
141 if ($field =~ /^clear_/o) {
143 *{$obj->class_name."::$field"} = sub {
145 $self->[$pos] = undef;
149 return $obj->$field();
152 die "No field by the name $field in $class_name!"
153 unless (exists $$fieldmap{$class_name}{fields}{$field});
155 my $pos = $$fieldmap{$class_name}{fields}{$field}{position};
158 *{$obj->class_name."::$field"} = sub {
161 $self->[$pos] = $new_val if (defined $new_val);
162 return $self->[$pos];
165 return $obj->$field($value);
169 my $class_name = shift;
170 return ref($class_name) || $class_name;
175 my $class_name = $self->class_name;
176 my $fields = $$fieldmap{$class_name}{fields};
179 !$$fields{$_}{virtual}
180 } sort {$$fields{$a}{position} <=> $$fields{$b}{position}} keys %$fields;
187 return $fieldmap->{$self->class_name}->{api_level};
192 return $fieldmap->{$self->class_name}->{hint};