summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/patch/ReleasesList.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/installer/patch/ReleasesList.pm')
-rw-r--r--solenv/bin/modules/installer/patch/ReleasesList.pm210
1 files changed, 210 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/patch/ReleasesList.pm b/solenv/bin/modules/installer/patch/ReleasesList.pm
new file mode 100644
index 000000000000..320e86400998
--- /dev/null
+++ b/solenv/bin/modules/installer/patch/ReleasesList.pm
@@ -0,0 +1,210 @@
+#**************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#**************************************************************
+
+package installer::patch::ReleasesList;
+
+use XML::LibXML;
+use File::Spec;
+use strict;
+
+=head1 NAME
+
+ package installer::patch::ReleasesList - Functions for accessing the instsetoo_native/data/releases.xml file
+
+=cut
+
+
+my $Instance = undef;
+
+=head2 Instance()
+
+ Return the singleton instance.
+
+=cut
+sub Instance()
+{
+ if ( ! defined $Instance)
+ {
+ $Instance = new installer::patch::ReleasesList();
+ }
+ return $Instance;
+}
+
+
+
+
+=head2 new($class)
+
+ Internal constructor. Don't call.
+
+=cut
+sub new ($)
+{
+ my ($class) = @_;
+
+ my $self = {};
+ bless($self, $class);
+
+ $self->Read();
+
+ return $self;
+}
+
+
+
+
+=head2 GetFirstChild ($node, $child_name)
+
+ Internal function that returns the first child. Use only when the
+ first child is the (expected) only child in a list.
+
+=cut
+sub GetFirstChild ($$)
+{
+ my ($node, $child_name) = @_;
+
+ if ( ! defined $node)
+ {
+ return undef;
+ }
+ else
+ {
+ my @child_nodes = $node->getElementsByTagName($child_name);
+ if (scalar @child_nodes == 0)
+ {
+ return undef;
+ }
+ else
+ {
+ return $child_nodes[0];
+ }
+ }
+}
+
+
+
+
+=head2 GetText ($node)
+
+ Internal function that returns the trimmed text content of a node.
+
+=cut
+sub GetText ($)
+{
+ my ($node) = @_;
+
+ if ( ! defined $node)
+ {
+ return "";
+ }
+ else
+ {
+ my $text = $node->textContent();
+ $text =~ s/(^\s+|\s+$)//g;
+ return $text;
+ }
+}
+
+
+
+
+=head2 Read($self)
+
+ Read the releases.xml file as doctree and parse its content.
+
+=cut
+sub Read ($)
+{
+ my ($self) = @_;
+
+ my $filename = File::Spec->catfile($ENV{'SRC_ROOT'}, "instsetoo_native", "data", "releases.xml");
+ my $parser = XML::LibXML->new();
+ my $document = $parser->parse_file($filename);
+ foreach my $release_node ($document->getElementsByTagName("release"))
+ {
+ my $version_node = GetFirstChild($release_node, "version");
+ my $version = GetText($version_node);
+ next if $version eq "";
+
+ foreach my $download_node (GetFirstChild($release_node, "download"))
+ {
+ my $package_node = GetFirstChild($download_node, "package-format");
+ my $package_format = GetText($package_node);
+ next if $package_format eq "";
+
+ my $download_data = ParseDownloadData($download_node);
+ if (defined $download_data)
+ {
+ $self->{$version}->{$package_format} = $download_data;
+ }
+ }
+ }
+
+}
+
+
+
+
+=head2 ParseDownloadData ($download_node)
+
+ Parse the data for one set of download data (there is one per release and package format).
+
+=cut
+sub ParseDownloadData ($)
+{
+ my ($download_node) = @_;
+
+ my $url_node = GetFirstChild($download_node, "url-template");
+ my $url_template = GetText($url_node);
+ if ($url_template eq "")
+ {
+ print STDERR "releases data file corrupt (no URL template)\n";
+ return undef;
+ }
+
+ my $download_data = {};
+ foreach my $item_node (@{$download_node->getElementsByTagName("item")})
+ {
+ my $language = GetText(GetFirstChild($item_node, "language"));
+ my $checksum_node = GetFirstChild($item_node, "checksum");
+ if ( ! defined $checksum_node)
+ {
+ print STDERR "releases data file corrupt (item has no 'checksum' node)\n";
+ return undef;
+ }
+ my $checksum_type = $checksum_node->getAttribute("type");
+ my $checksum_value = GetText($checksum_node);
+ my $file_size = GetText(GetFirstChild($item_node, "size"));
+
+ my $url = $url_template;
+ $url =~ s/\%L/$language/g;
+ $download_data->{$language} = {
+ 'URL' => $url,
+ 'checksum-type' => $checksum_type,
+ 'checksum-value' => $checksum_value,
+ 'file-size' => $file_size
+ };
+ }
+
+ return $download_data;
+}
+
+1;