1 | #!/usr/bin/env perl
|
---|
2 |
|
---|
3 | use strict;
|
---|
4 | use warnings;
|
---|
5 | use utf8;
|
---|
6 |
|
---|
7 | use lib 'perllib';
|
---|
8 | use Greenstone::XML::Tidy;
|
---|
9 | use Greenstone::Interface;
|
---|
10 | use Greenstone::Site;
|
---|
11 | use Hash::Ordered;
|
---|
12 |
|
---|
13 | my $delete = 0;
|
---|
14 | my $file = "/usr/share/greenstone/web/WEB-INF/servlets.xml";
|
---|
15 | my $description = "";
|
---|
16 | my $class = "org.greenstone.gsdl3.LibraryServlet";
|
---|
17 | my ($name, $site, $interface);
|
---|
18 |
|
---|
19 | while (@ARGV) {
|
---|
20 | for (shift) {
|
---|
21 | if (/^-delete$/) {
|
---|
22 | $delete = 1;
|
---|
23 | } elsif (/^-file$/) {
|
---|
24 | ($file = shift) or die "Expected -file <file>\n";
|
---|
25 | } elsif (/^-name$/) {
|
---|
26 | ($name = shift) or die "Expected -name <name>\n";
|
---|
27 | } elsif (/^-desc\(ription\)?$/) {
|
---|
28 | ($description = shift) or die "Expected -desc <description>\n";
|
---|
29 | } elsif (/^-class$/) {
|
---|
30 | ($class = shift) or die "Expected -class <class>\n";
|
---|
31 | } elsif (/^-site$/) {
|
---|
32 | ($site = shift) or die "Expected -site <site>\n";
|
---|
33 | } elsif (/^-interface$/) {
|
---|
34 | ($interface = shift) or die "Expected -interface <interface>\n";
|
---|
35 | } else {
|
---|
36 | die "Unknown flag '$_'\n";
|
---|
37 | }
|
---|
38 | }
|
---|
39 | }
|
---|
40 |
|
---|
41 | if ($delete) {
|
---|
42 | my $servlets = read_xml $file;
|
---|
43 |
|
---|
44 | my $deleted = 0;
|
---|
45 |
|
---|
46 | my $servlet_array = $servlets->get ("servlet");
|
---|
47 | if (ref $servlet_array eq 'ARRAY') {
|
---|
48 | my @array = grep { $_->get ("servlet-name") ne $name } @$servlet_array;
|
---|
49 | $deleted = (scalar @array < scalar @$servlet_array);
|
---|
50 | $servlets->set ("servlet" => \@array);
|
---|
51 | } elsif ($servlet_array->get ("servlet-name") eq $name) {
|
---|
52 | $servlets->delete ("servlet");
|
---|
53 | $deleted = 1;
|
---|
54 | }
|
---|
55 |
|
---|
56 | die "Servlet not found\n" unless $deleted;
|
---|
57 |
|
---|
58 | write_xml ($servlets, $file);
|
---|
59 | } else {
|
---|
60 | (defined $name and defined $site and defined $interface) or die "Requires name, site, interface\n";
|
---|
61 |
|
---|
62 | Greenstone::Site->new ($site)->exists or die "Site '$site' does not exist\n";
|
---|
63 | Greenstone::Interface->new ($interface)->exists or die "Interface '$interface' does not exist\n";
|
---|
64 |
|
---|
65 | my $servlets = read_xml $file;
|
---|
66 |
|
---|
67 | my $servlet_array = $servlets->get ("servlet");
|
---|
68 | unless (ref $servlet_array eq 'ARRAY') {
|
---|
69 | $servlet_array = [ $servlet_array ];
|
---|
70 | }
|
---|
71 | for my $servlet (@$servlet_array) {
|
---|
72 | $servlet->get ("servlet-name") eq $name and die "A servlet already exists with that name\n";
|
---|
73 | my $servlet_params = $servlet->get ("init-param");
|
---|
74 | unless (ref $servlet_params eq 'ARRAY') {
|
---|
75 | $servlet_params = [ $servlet_params ];
|
---|
76 | }
|
---|
77 | my ($servlet_site, $servlet_interface);
|
---|
78 | for my $param (@$servlet_params) {
|
---|
79 | my $key = $param->get ("param-name");
|
---|
80 | my $val = $param->get ("param-value");
|
---|
81 | if ($key eq "site_name") {
|
---|
82 | $servlet_site = $val;
|
---|
83 | } elsif ($key eq "interface_name") {
|
---|
84 | $servlet_interface = $val;
|
---|
85 | }
|
---|
86 | }
|
---|
87 | $servlet_site eq $site and $servlet_interface eq $interface and
|
---|
88 | die "A servlet already exists with that combination of site and interface\n";
|
---|
89 | }
|
---|
90 |
|
---|
91 | # Actually make the servlet now
|
---|
92 |
|
---|
93 | sub init_param {
|
---|
94 | return Hash::Ordered->new (
|
---|
95 | 'param-name' => shift,
|
---|
96 | 'param-value'=> shift,
|
---|
97 | );
|
---|
98 | }
|
---|
99 |
|
---|
100 | write_xml (
|
---|
101 | Hash::Ordered->new (
|
---|
102 | 'servlet' => Hash::Ordered->new (
|
---|
103 | 'servlet-name' => $name,
|
---|
104 | 'description' => $description,
|
---|
105 | 'servlet-class'=> $class,
|
---|
106 | 'init-param' => [
|
---|
107 | init_param ('site_name', $site),
|
---|
108 | init_param ('interface_name', $interface),
|
---|
109 | ],
|
---|
110 | ),
|
---|
111 | ),
|
---|
112 | $file,
|
---|
113 | '>>'
|
---|
114 | );
|
---|
115 | }
|
---|