source: main/trunk/greenstone2/perllib/plugins/AutoLoadConverters.pm@ 24728

Last change on this file since 24728 was 24728, checked in by ak19, 13 years ago

AutoloadConverter messages string properties were not appearing: one was not specified in the properties file, the other was wrongly constructed.

File size: 4.8 KB
Line 
1package AutoLoadConverters;
2
3use strict;
4no strict 'refs';
5no strict 'subs';
6
7use PrintInfo;
8
9use gsprintf 'gsprintf';
10
11sub BEGIN {
12 @AutoLoadConverters::ISA = ('PrintInfo');
13}
14
15# the dynamic conversion args will get added here
16my $arguments = [];
17
18my $options = { 'name' => "AutoLoadConverters",
19 'desc' => "{AutoLoadConverters.desc}",
20 'abstract' => "yes",
21 'inherits' => "yes",
22 'args' => $arguments };
23
24sub dynamically_load_converter
25{
26 my ($autoPackage, $calling_class) = @_;
27
28 my $settings = {};
29
30 my ($autoName) = ($autoPackage =~ m/(^.*)Converter$/);
31 my $autoVar = lc($autoName);
32 $settings->{'converter_name'} = $autoName;
33 $settings->{'converter_var'} = $autoVar;
34
35 eval("require $autoPackage");
36 if ($@) {
37 # Useful debugging statement if there is a syntax error in the plugin
38 #print STDERR "$@\n";
39 $settings->{'converter_installed'} = 0;
40 $settings->{'conversion_available'} = 0;
41 }
42 else {
43 # found the converter
44 $settings->{'conversion_installed'} = 1;
45 print STDERR "AutoLoadConverters: $autoName Extension to Greenstone detected for $calling_class\n";
46 # but can it run???
47 if (eval "\$${autoPackage}::${autoVar}_conversion_available") {
48 $settings->{'conversion_available'} = 1;
49 push(@AutoLoadConverters::ISA, $autoPackage);
50
51 } else {
52 $settings->{'conversion_available'} = 0;
53 print STDERR "... but it appears to be broken\n";
54 &gsprintf(STDERR, "AutoLoadConverters: {AutoloadConverter.noconversionavailable}");
55 my $dictentry_reason = eval "\$${autoPackage}::no_${autoVar}_conversion_reason";
56
57 &gsprintf(STDERR, " ({$autoPackage\.$dictentry_reason})\n");
58
59 }
60 }
61
62 if ($settings->{'conversion_available'}) {
63
64 my $opt_conversion_args =
65 [ { 'name' => "$autoVar\_conversion",
66 'desc' => "{$autoPackage.$autoVar\_conversion}",
67 'type' => "flag",
68 'reqd' => "no" } ];
69
70 $settings->{'converter_arguments'} = $opt_conversion_args;
71
72 }
73 return $settings;
74
75
76}
77
78####
79# This plugin takes an extra initial parameter in its constructor (compared
80# with the norm). The extra parameter is an array of converters
81# it should try to dynamically load
82#####
83
84sub new {
85
86 # Start the AutoExtractMetadata Constructor
87 my $class = shift (@_);
88 my ($pluginlist,$inputargs,$hashArgOptLists,$autoPackages, $auxiliary) = @_;
89
90 push(@$pluginlist, $class);
91 my $classPluginName = $pluginlist->[0];
92
93 push(@{$hashArgOptLists->{"OptList"}},$options);
94
95 # this static list is just for pluginfo on AutoLoadConverters - we will try to explicitly load all packages
96 $autoPackages = ["OpenOfficeConverter", "PDFBoxConverter"] unless defined $autoPackages;
97
98 my @self_array = ();
99 my $temporary_self = {};
100 $temporary_self->{'converter_list'} = [];
101 push (@self_array, $temporary_self);
102 foreach my $packageName (@$autoPackages) {
103 my $package_settings = &dynamically_load_converter($packageName, $classPluginName);
104 my $available_var = $package_settings->{'converter_var'}."_available";
105 if ($package_settings->{'conversion_available'}) {
106 push(@$arguments, @{$package_settings->{'converter_arguments'}});
107 my $package_self = eval "new $packageName(\$pluginlist, \$inputargs, \$hashArgOptLists,1);";
108 push (@self_array, $package_self);
109 $temporary_self->{$available_var} = 1;
110 push(@{$temporary_self->{'converter_list'}}, $packageName);
111 } else {
112 $temporary_self->{$available_var} = 0;
113 }
114 }
115 push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
116 my $self;
117 my $pi_self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
118 push (@self_array, $pi_self);
119 $self = BasePlugin::merge_inheritance(@self_array);
120
121 return bless $self, $class;
122}
123
124sub init {
125 my $self = shift (@_);
126
127 foreach my $converter (@{$self->{'converter_list'}}) {
128 eval "\$self->${converter}::init(\@_);";
129 }
130
131}
132
133sub begin {
134 my $self = shift (@_);
135
136 foreach my $converter(@{$self->{'converter_list'}}) {
137 eval "\$self->${converter}::begin(\@_);";
138 }
139}
140
141sub deinit {
142 my $self = shift (@_);
143
144 foreach my $converter (@{$self->{'converter_list'}}) {
145 eval "\$self->${converter}::deinit(\@_);";
146 }
147
148}
149
150sub tmp_area_convert_file {
151 my $self = shift (@_);
152 my ($output_ext, $input_filename, $textref) = @_;
153
154 foreach my $converter(@{$self->{'converter_list'}}) {
155 my ($var) = ($converter =~ m/(^.*)Converter$/);
156 $var = lc($var);
157 if ($self->{"${var}_conversion"}) {
158 my ($result, $result_str, $new_filename)
159 = eval "\$self->${converter}::convert(\$input_filename, \$output_ext);";
160 if ($result != 0) {
161 return $new_filename;
162 }
163 my $outhandle=$self->{'outhandle'};
164 print $outhandle "$converter Conversion error\n";
165 print $outhandle $result_str;
166 return "";
167 }
168 }
169
170 # if got here, no converter was specified in plugin args
171 return $self->ConvertBinaryFile::tmp_area_convert_file(@_);
172
173}
Note: See TracBrowser for help on using the repository browser.