App-Oozie
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/App/Oozie/XML.pm view on Meta::CPAN
$wf_version = $+{version};
}
if ( ( $name && $name =~ $re_sla_new )
|| ( ! $wf_version && $path =~ $re_sla_path )
) {
$sla_version = $+{version};
}
my @extra_error;
if ( defined $sla_version && $sla_version < MIN_OOZIE_SLA_VERSION ) {
push @extra_error,
'Schema version mismatch for the SLA feature!',
sprintf(
'Your sla definition refers to a schema older than the minimum required version of %s (you have defined %s).',
MIN_OOZIE_SLA_VERSION,
$sla_version,
),
;
}
if ( defined $wf_version && $wf_version < MIN_OOZIE_SCHEMA_VERSION_FOR_SLA ) {
push @extra_error,
'Schema version mismatch for the SLA feature!',
sprintf(
'Your workflow definition refers to a schema older than the minimum required version of %s (you have defined %s).',
MIN_OOZIE_SCHEMA_VERSION_FOR_SLA,
$wf_version,
),
;
}
if ( $dumb_conf ) {
if ( my $forks = $dumb_conf->{fork} ) {
for my $node ( sort keys %{ $forks } ) {
my $paths = $forks->{ $node }{path};
my $total = keys %{ $paths };
if ( $total < 2 ) {
push @extra_error, sprintf <<'NEED_AT_LEAST_TWO', $node;
The fork node `%s` has less than 2 paths. Oozie won't execute such definitions.
Either remove fork node, or change the definiton to have at least 2 paths.
NEED_AT_LEAST_TWO
}
}
}
}
return @extra_error;
}
sub localname {
my ($self) = @_;
my $type = $XML_NAMESPACE{ $self->prefix };
return +( XML::Compile::Util::unpack_type( $type ) )[LAST_ELEM];
}
sub is_foreign_prefix {
my ($self, $prefix) = @_;
my ($ns, $localname) = XML::Compile::Util::unpack_type($XML_NAMESPACE{$self->prefix});
my $nsobj = ( $XML_SCHEMA->namespaces->namespace($ns) )[XML_NS_FIRST_POS];
my %elements =
map { lc $_ => 1 }
map { (XML::Compile::Util::unpack_type($_))[XML_UNPACK_LOCALNAME_POS] }
$nsobj->elements, $nsobj->types;
return not exists $elements{$prefix};
}
sub xml {
my ($self) = @_;
my $data = clone( $self->data );
my $doc = XML::LibXML::Document->new( '1.0', 'UTF-8' );
# visit the cloned datastructure
# and write back the XML for internal "any" nodes
my @queue = ($data);
while ( my $this = shift @queue ) {
if ( is_hashref $this ) {
for my $prefix ( keys %{ $this } ) {
if ( exists $XML_NAMESPACE{$prefix} and $self->is_foreign_prefix($prefix) ) {
$this->{ $XML_NAMESPACE{$prefix} } =
$XML_SCHEMA->writer( $XML_NAMESPACE{$prefix} )
->( $doc, delete $this->{$prefix} );
}
elsif ( is_ref $this->{$prefix} ) {
push @queue, $this->{$prefix};
}
}
}
elsif ( is_arrayref $this ) {
push @queue,
grep {
is_hashref( $_ ) || is_arrayref( $_ )
} @{ $this };
}
}
return $self->writer->( $doc, $data );
}
sub sniff_doc {
my($self, $doc) = @_;
my $logger = $self->logger;
my $verbose = $self->verbose;
my $type = fileno $doc ? 'IO'
: ( ( $doc =~ m{ \A \s* [<] }xms ) or is_scalarref $doc ) ? 'string'
: 'location';
my $xml = XML::LibXML->load_xml($type => $doc);
my $root = $xml->documentElement;
my $namespace = $root->getNamespaceURI;
if ($namespace) {
my ($localname, $version) = (split RE_COLON, $namespace )[XML_LOCALNAME_POS, XML_VERSION_POS];
if ($localname and $version) {
return $localname, $version;
}
else {
$logger->logdie(
sprintf q{Can't parse out localname and version from namespace: %s},
$namespace,
view all matches for this distributionview release on metacpan - search on metacpan
( run in 2.709 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-48ebf85a1963 )