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

Last change on this file since 32122 was 31492, checked in by kjdon, 7 years ago

renamed EncodingUtil to CommonUtil, BasePlugin to BaseImporter. The idea is that only top level plugins that you can specify in your collection get to have plugin in their name. Modified all other plugins to reflect these name changes

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 = BaseImporter::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.