#! /usr/bin/env perl package Project; use v5.10.1; use strict; use warnings; use Carp; use XML::LibXML; use XML::SAX::ParserFactory; use ACU::Log; package ProjectHandler; use strict; use warnings; use Carp; my @stack_tags = ( "manager", "submission", "slides", "subject", "tutorial", ); my @stackonce_tags = ( "period", "upload", "vcs", "news", "documents", ); my @value_tags = ( "result", "message", "name", "firstname", "lastname", "login", "begin", "end", "date", "tag", "newsgroup" ); sub new ($$) { my $class = shift; my $self = { parsed => shift, saveChars => 0, stack => [], values => "" }; bless $self, $class; return $self; } sub start_element { my ($self, $element) = @_; if ($element->{Name} eq "project" || $element->{Name} eq "Project") { $self->{parsed}{name} = $element->{Attributes}{"{}name"}{Value} if ($element->{Attributes}{"{}name"}); } elsif (grep { $element->{Name} eq $_ } @stack_tags) { my $data = {}; $data->{name} = $element->{Attributes}{"{}name"}{Value} if ($element->{Attributes}{"{}name"}); $data->{type} = $element->{Attributes}{"{}type"}{Value} if ($element->{Attributes}{"{}type"}); $data->{written_in} = $element->{Attributes}{"{}written_in"}{Value} if ($element->{Attributes}{"{}written_in"}); push @{ $self->{stack} }, $data; } elsif (grep { $element->{Name} eq $_ } @value_tags) { $self->{saveChars} = 1; $self->{values} = ""; } elsif ($element->{Name} eq "vcs") { push @{ $self->{stack} }, { url => $element->{Attributes}{"{}url"}{Value}, tag => $element->{Attributes}{"{}tag"}{Value}, token => $element->{Attributes}{"{}token"}{Value} // 0, quota => $element->{Attributes}{"{}quota"}{Value} // 20, type => $element->{Attributes}{"{}type"}{Value} // "git", }; } elsif ($element->{Name} eq "upload") { push @{ $self->{stack} }, { format => $element->{Attributes}{"{}format"}{Value}, url => $element->{Attributes}{"{}url"}{Value}, identifier => $element->{Attributes}{"{}identifier"}{Value}, quota => $element->{Attributes}{"{}quota"}{Value} // 10, }; } elsif (grep { $element->{Name} eq $_ } @stackonce_tags) { push @{ $self->{stack} }, { }; } } sub characters { my ($self, $characters) = @_; if ($self->{saveChars}) { $self->{values} .= $characters->{Data}; } } sub end_element { my ($self, $element) = @_; if ($self->{saveChars}) { if (@{ $self->{stack} } == 0) { $self->{parsed}{$element->{Name}} = $self->{values}; } else { my $pop = pop @{ $self->{stack} }; $pop->{$element->{Name}} = $self->{values}; push @{ $self->{stack} }, $pop; } $self->{saveChars} = 0; } elsif (grep { $element->{Name} eq $_ } @stack_tags) { my $item = pop @{ $self->{stack} }; my $pop = pop @{ $self->{stack} }; if ($element->{Name} eq "submission") { push @{ $self->{stack} }, $pop; $item->{doc} = "$pop->{name}"; $pop = undef; } if ($pop) { if (!exists $pop->{$element->{Name}."s"}) { $pop->{$element->{Name}."s"} = []; } push @{ $pop->{$element->{Name}."s"} }, $item; push @{ $self->{stack} }, $pop; } else { if (!exists $self->{parsed}{$element->{Name}."s"}) { $self->{parsed}{$element->{Name}."s"} = []; } push @{ $self->{parsed}{$element->{Name}."s"} }, $item; } } elsif (grep { $element->{Name} eq $_ } @stackonce_tags) { my $item = pop @{ $self->{stack} }; my $pop = pop @{ $self->{stack} }; if ($pop) { $pop->{$element->{Name}} = $item; push @{ $self->{stack} }, $pop; } else { $self->{parsed}{$element->{Name}} = $item; } } else { return; } } 1;