source: main/trunk/greenstone2/perllib/plugouts/GreenstoneXMLPlugout.pm@ 28642

Last change on this file since 28642 was 28642, checked in by kjdon, 10 years ago

group processing code was GreenstoneXML format so moved it into GreenstoneXMLPlugout. tidying up the code. reordered options. group processing now writes out the correct archivesinf databases.

  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1###########################################################################
2#
3# GreenstoneXMLPlugout.pm -- the plugout module for Greenstone Archives
4# A component of the Greenstone digital library software
5# from the New Zealand Digital Library Project at the
6# University of Waikato, New Zealand.
7#
8# Copyright (C) 2006 New Zealand Digital Library Project
9#
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23#
24###########################################################################
25
26package GreenstoneXMLPlugout;
27
28use strict;
29no strict 'refs';
30no strict 'subs';
31
32eval {require bytes};
33use util;
34use FileUtils;
35use BasePlugout;
36use docprint;
37
38sub BEGIN {
39 @GreenstoneXMLPlugout::ISA = ('BasePlugout');
40}
41
42my $arguments = [
43 { 'name' => "group_size",
44 'desc' => "{BasePlugout.group_size}",
45 'type' => "int",
46 'deft' => "1",
47 'reqd' => "no",
48 'hiddengli' => "no"}
49 ];
50my $options = { 'name' => "GreenstoneXMLPlugout",
51 'desc' => "{GreenstoneXMLPlugout.desc}",
52 'abstract' => "no",
53 'inherits' => "yes",
54 'args' => $arguments };
55
56sub new {
57 my ($class) = shift (@_);
58 my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
59 push(@$plugoutlist, $class);
60
61 push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
62 push(@{$hashArgOptLists->{"OptList"}},$options);
63
64 my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);
65
66 return bless $self, $class;
67}
68
69sub is_group {
70 my $self = shift (@_);
71 return ($self->{'group_size'} > 1);
72}
73
74sub saveas {
75 my $self = shift (@_);
76 my ($doc_obj, $doc_dir) = @_;
77 my $outhandler;
78 my $output_file;
79 if ($self->{'debug'}) {
80 $outhandler = STDOUT;
81 }
82 else {
83
84 $self->process_assoc_files($doc_obj, $doc_dir, '');
85 $self->process_metafiles_metadata ($doc_obj);
86
87 # open up the outhandler
88 if ($self->is_group() && !$self->{'new_doc_dir'}) {
89 # we already have a handle open ??
90 $outhandler = $self->{'group_outhandler'};
91 } else {
92 $output_file = &FileUtils::filenameConcatenate($self->{'output_dir'}, $doc_dir, "doc.xml");
93 # open the new handle
94 $self->open_xslt_pipe($output_file, $self->{'xslt_file'});
95
96 if (defined $self->{'xslt_writer'}){
97 $outhandler = $self->{'xslt_writer'};
98 }
99 else{
100 $outhandler = $self->get_output_handler($output_file);
101 }
102
103 if ($self->is_group()) {
104 $self->{'group_outhandler'} = $outhandler;
105 }
106 }
107 } # else not debug
108 binmode($outhandler,":utf8");
109
110 # only output the header if we have started a new doc
111 if (!$self->is_group() || $self->{'new_doc_dir'}) {
112 $self->output_xml_header($outhandler);
113 }
114
115 my $section_text = &docprint::get_section_xml($doc_obj,$doc_obj->get_top_section());
116 print $outhandler $section_text;
117
118 # only output the footer if we are not doing group stuff. The group file will be finished in close_group_output
119 if (!$self->is_group()) {
120 $self->output_xml_footer($outhandler);
121 }
122
123 # close off the output - in a group process situation, this will be done by close_group_output
124 if (!$self->is_group() && !$self->{'debug'}) {
125 if (defined $self->{'xslt_writer'}){
126 $self->close_xslt_pipe();
127 }
128 else {
129 &FileUtils::closeFileHandle($output_file, \$outhandler) if defined $output_file;
130 }
131 }
132 $self->{'short_doc_file'} = &FileUtils::filenameConcatenate($doc_dir, "doc.xml");
133
134 $self->store_output_info_reference($doc_obj);
135
136}
137
138sub output_xml_header {
139 my $self = shift (@_);
140 my ($outhandle) = @_;
141
142 print $outhandle '<?xml version="1.0" encoding="utf-8" standalone="no"?>' . "\n";
143 print $outhandle "<!DOCTYPE Archive SYSTEM \"http://greenstone.org/dtd/Archive/1.0/Archive.dtd\">\n";
144 print $outhandle "<Archive>\n";
145}
146
147sub output_xml_footer {
148 my $self = shift (@_);
149 my ($outhandle) = @_;
150
151 print $outhandle "</Archive>\n";
152}
153
154sub close_group_output
155{
156 my $self = shift(@_);
157
158 # make sure that the handle has been opened - it won't be if we failed
159 # to import any documents...
160 my $outhandle = $self->{'group_outhandler'};
161 if (defined(fileno($outhandle))) {
162 $self->output_xml_footer($outhandle);
163 &FileUtils::closeFileHandle("", \$outhandle);
164 undef $self->{'group_outhandler'}
165 }
166
167 my $OID = $self->{'gs_OID'};
168 my $short_doc_file = $self->{'short_doc_file'};
169
170 ### TODO - from here is old code. check that it is still valid.
171 if ($self->{'gzip'}) {
172 my $doc_file = $self->{'gs_filename'};
173 `gzip $doc_file`;
174 $doc_file .= ".gz";
175 $short_doc_file .= ".gz";
176 if (!&FileUtils::fileExists($doc_file)) {
177 my $outhandle = $self->{'output_handle'};
178 print $outhandle "error while gzipping: $doc_file doesn't exist\n";
179 return 0;
180 }
181 }
182
183 return 1;
184}
185
186
1871;
188
Note: See TracBrowser for help on using the repository browser.