[Bps-public-commit] Parse-ACNS branch, master, updated. 0.03-6-g855fa6b
Ruslan Zakirov
ruz at bestpractical.com
Sun Feb 24 06:55:56 EST 2013
The branch, master has been updated
via 855fa6b0d861884f9e022a4d48db803e438fedbb (commit)
via 0636467e133e4cc1fd1c8c2390e74a66af9356f8 (commit)
via cbc1c7b455e3ba299dd438493443d42dca8135bc (commit)
via 69f1c002d30cb3ab52ed2f965e29a9b6572c6a81 (commit)
via 52c3411df322318b2c8132f7ea634811d2e22574 (commit)
via 1f5dcef9686d8d999971a59d1ab3df86907075e3 (commit)
from 220d8f2bc68dfb69bdd9c8d7d39a864fb1be3ca1 (commit)
Summary of changes:
.gitignore | 1 +
Changes | 4 +
MANIFEST | 16 +-
META.yml | 9 +-
README | 43 +-
inc/Module/Install.pm | 6 +-
inc/Module/Install/Base.pm | 2 +-
inc/Module/Install/Can.pm | 85 ++-
inc/Module/Install/Fetch.pm | 2 +-
inc/Module/Install/Makefile.pm | 27 +-
inc/Module/Install/Metadata.pm | 29 +-
inc/Module/Install/ReadmeFromPod.pm | 112 +++-
inc/Module/Install/Share.pm | 4 +-
inc/Module/Install/Win32.pm | 2 +-
inc/Module/Install/WriteAll.pm | 2 +-
lib/Parse/ACNS.pm | 138 ++++-
share/schema/0.6/{infringement.xsd => acns.xsd} | 0
share/schema/0.7/{infringement.xsd => acns.xsd} | 0
share/schema/1.0/acns.xsd | 526 ++++++++++++++++++
share/schema/1.1/acns.xsd | 572 +++++++++++++++++++
share/schema/1.2/acns.xsd | 710 ++++++++++++++++++++++++
share/schema/compat/acns.xsd | 710 ++++++++++++++++++++++++
share/schema/compat/infringement.xsd | 149 -----
share/schema/xmldsig.xsd | 318 +++++++++++
share/schema/xmlmime.xsd | 49 ++
t/basics.t | 8 +-
t/data/1.1/full.xml | 140 +++++
t/data/1.1/full.yaml | 160 ++++++
t/data/1.2/full.xml | 140 +++++
t/data/1.2/full.yaml | 161 ++++++
t/parse.t | 16 +-
31 files changed, 3895 insertions(+), 246 deletions(-)
rename share/schema/0.6/{infringement.xsd => acns.xsd} (100%)
rename share/schema/0.7/{infringement.xsd => acns.xsd} (100%)
create mode 100644 share/schema/1.0/acns.xsd
create mode 100644 share/schema/1.1/acns.xsd
create mode 100644 share/schema/1.2/acns.xsd
create mode 100644 share/schema/compat/acns.xsd
delete mode 100644 share/schema/compat/infringement.xsd
create mode 100644 share/schema/xmldsig.xsd
create mode 100644 share/schema/xmlmime.xsd
create mode 100644 t/data/1.1/full.xml
create mode 100644 t/data/1.1/full.yaml
create mode 100644 t/data/1.2/full.xml
create mode 100644 t/data/1.2/full.yaml
- Log -----------------------------------------------------------------
commit 1f5dcef9686d8d999971a59d1ab3df86907075e3
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Wed Feb 20 14:28:34 2013 +0400
actually cache parser
diff --git a/lib/Parse/ACNS.pm b/lib/Parse/ACNS.pm
index b42de07..6b10364 100644
--- a/lib/Parse/ACNS.pm
+++ b/lib/Parse/ACNS.pm
@@ -88,7 +88,8 @@ sub init {
$self->{'reader'} = $CACHE{$path}{'reader'};
unless ( $self->{'reader'} ) {
my $schema = XML::Compile::Schema->new( [$path] );
- $self->{'reader'} = $schema->compile( READER => 'Infringement' );
+ $self->{'reader'} = $CACHE{$path}{'reader'}
+ = $schema->compile( READER => 'Infringement' );
}
return $self;
}
commit 52c3411df322318b2c8132f7ea634811d2e22574
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Thu Feb 21 18:22:52 2013 +0400
update M::I
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm
index 8ee839d..4ecf46b 100644
--- a/inc/Module/Install.pm
+++ b/inc/Module/Install.pm
@@ -31,7 +31,7 @@ BEGIN {
# This is not enforced yet, but will be some time in the next few
# releases once we can make sure it won't clash with custom
# Module::Install extensions.
- $VERSION = '1.00';
+ $VERSION = '1.06';
# Storage for the pseudo-singleton
$MAIN = undef;
@@ -451,7 +451,7 @@ sub _version ($) {
}
sub _cmp ($$) {
- _version($_[0]) <=> _version($_[1]);
+ _version($_[1]) <=> _version($_[2]);
}
# Cloned from Params::Util::_CLASS
@@ -467,4 +467,4 @@ sub _CLASS ($) {
1;
-# Copyright 2008 - 2010 Adam Kennedy.
+# Copyright 2008 - 2012 Adam Kennedy.
diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm
index b55bda3..802844a 100644
--- a/inc/Module/Install/Base.pm
+++ b/inc/Module/Install/Base.pm
@@ -4,7 +4,7 @@ package Module::Install::Base;
use strict 'vars';
use vars qw{$VERSION};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
}
# Suspend handler for "redefined" warnings
diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm
index 71ccc27..22167b8 100644
--- a/inc/Module/Install/Can.pm
+++ b/inc/Module/Install/Can.pm
@@ -3,13 +3,12 @@ package Module::Install::Can;
use strict;
use Config ();
-use File::Spec ();
use ExtUtils::MakeMaker ();
use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -29,7 +28,7 @@ sub can_use {
eval { require $mod; $pkg->VERSION($ver || 0); 1 };
}
-# check if we can run some command
+# Check if we can run some command
sub can_run {
my ($self, $cmd) = @_;
@@ -38,14 +37,88 @@ sub can_run {
for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
next if $dir eq '';
- my $abs = File::Spec->catfile($dir, $_[1]);
+ require File::Spec;
+ my $abs = File::Spec->catfile($dir, $cmd);
return $abs if (-x $abs or $abs = MM->maybe_command($abs));
}
return;
}
-# can we locate a (the) C compiler
+# Can our C compiler environment build XS files
+sub can_xs {
+ my $self = shift;
+
+ # Ensure we have the CBuilder module
+ $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 );
+
+ # Do we have the configure_requires checker?
+ local $@;
+ eval "require ExtUtils::CBuilder;";
+ if ( $@ ) {
+ # They don't obey configure_requires, so it is
+ # someone old and delicate. Try to avoid hurting
+ # them by falling back to an older simpler test.
+ return $self->can_cc();
+ }
+
+ # Do we have a working C compiler
+ my $builder = ExtUtils::CBuilder->new(
+ quiet => 1,
+ );
+ unless ( $builder->have_compiler ) {
+ # No working C compiler
+ return 0;
+ }
+
+ # Write a C file representative of what XS becomes
+ require File::Temp;
+ my ( $FH, $tmpfile ) = File::Temp::tempfile(
+ "compilexs-XXXXX",
+ SUFFIX => '.c',
+ );
+ binmode $FH;
+ print $FH <<'END_C';
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+int main(int argc, char **argv) {
+ return 0;
+}
+
+int boot_sanexs() {
+ return 1;
+}
+
+END_C
+ close $FH;
+
+ # Can the C compiler access the same headers XS does
+ my @libs = ();
+ my $object = undef;
+ eval {
+ local $^W = 0;
+ $object = $builder->compile(
+ source => $tmpfile,
+ );
+ @libs = $builder->link(
+ objects => $object,
+ module_name => 'sanexs',
+ );
+ };
+ my $result = $@ ? 0 : 1;
+
+ # Clean up all the build files
+ foreach ( $tmpfile, $object, @libs ) {
+ next unless defined $_;
+ 1 while unlink;
+ }
+
+ return $result;
+}
+
+# Can we locate a (the) C compiler
sub can_cc {
my $self = shift;
my @chunks = split(/ /, $Config::Config{cc}) or return;
@@ -78,4 +151,4 @@ if ( $^O eq 'cygwin' ) {
__END__
-#line 156
+#line 236
diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm
index ec1f106..bee0c4f 100644
--- a/inc/Module/Install/Fetch.pm
+++ b/inc/Module/Install/Fetch.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm
index 5dfd0e9..7052f36 100644
--- a/inc/Module/Install/Makefile.pm
+++ b/inc/Module/Install/Makefile.pm
@@ -8,7 +8,7 @@ use Fcntl qw/:flock :seek/;
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -215,18 +215,22 @@ sub write {
require ExtUtils::MakeMaker;
if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) {
- # MakeMaker can complain about module versions that include
- # an underscore, even though its own version may contain one!
- # Hence the funny regexp to get rid of it. See RT #35800
- # for details.
- my $v = $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/;
- $self->build_requires( 'ExtUtils::MakeMaker' => $v );
- $self->configure_requires( 'ExtUtils::MakeMaker' => $v );
+ # This previous attempted to inherit the version of
+ # ExtUtils::MakeMaker in use by the module author, but this
+ # was found to be untenable as some authors build releases
+ # using future dev versions of EU:MM that nobody else has.
+ # Instead, #toolchain suggests we use 6.59 which is the most
+ # stable version on CPAN at time of writing and is, to quote
+ # ribasushi, "not terminally fucked, > and tested enough".
+ # TODO: We will now need to maintain this over time to push
+ # the version up as new versions are released.
+ $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 );
+ $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 );
} else {
# Allow legacy-compatibility with 5.005 by depending on the
# most recent EU:MM that supported 5.005.
- $self->build_requires( 'ExtUtils::MakeMaker' => 6.42 );
- $self->configure_requires( 'ExtUtils::MakeMaker' => 6.42 );
+ $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 );
+ $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 );
}
# Generate the MakeMaker params
@@ -241,7 +245,6 @@ in a module, and provide its file path via 'version_from' (or
'all_from' if you prefer) in Makefile.PL.
EOT
- $DB::single = 1;
if ( $self->tests ) {
my @tests = split ' ', $self->tests;
my %seen;
@@ -412,4 +415,4 @@ sub postamble {
__END__
-#line 541
+#line 544
diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm
index cfe45b3..58430f3 100644
--- a/inc/Module/Install/Metadata.pm
+++ b/inc/Module/Install/Metadata.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -151,15 +151,21 @@ sub install_as_site { $_[0]->installdirs('site') }
sub install_as_vendor { $_[0]->installdirs('vendor') }
sub dynamic_config {
- my $self = shift;
- unless ( @_ ) {
- warn "You MUST provide an explicit true/false value to dynamic_config\n";
- return $self;
+ my $self = shift;
+ my $value = @_ ? shift : 1;
+ if ( $self->{values}->{dynamic_config} ) {
+ # Once dynamic we never change to static, for safety
+ return 0;
}
- $self->{values}->{dynamic_config} = $_[0] ? 1 : 0;
+ $self->{values}->{dynamic_config} = $value ? 1 : 0;
return 1;
}
+# Convenience command
+sub static_config {
+ shift->dynamic_config(0);
+}
+
sub perl_version {
my $self = shift;
return $self->{values}->{perl_version} unless @_;
@@ -170,7 +176,7 @@ sub perl_version {
# Normalize the version
$version = $self->_perl_version($version);
- # We don't support the reall old versions
+ # We don't support the really old versions
unless ( $version >= 5.005 ) {
die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n";
}
@@ -515,6 +521,7 @@ sub __extract_license {
'GNU Free Documentation license' => 'unrestricted', 1,
'GNU Affero General Public License' => 'open_source', 1,
'(?:Free)?BSD license' => 'bsd', 1,
+ 'Artistic license 2\.0' => 'artistic_2', 1,
'Artistic license' => 'artistic', 1,
'Apache (?:Software )?license' => 'apache', 1,
'GPL' => 'gpl', 1,
@@ -550,9 +557,9 @@ sub license_from {
sub _extract_bugtracker {
my @links = $_[0] =~ m#L<(
- \Qhttp://rt.cpan.org/\E[^>]+|
- \Qhttp://github.com/\E[\w_]+/[\w_]+/issues|
- \Qhttp://code.google.com/p/\E[\w_\-]+/issues/list
+ https?\Q://rt.cpan.org/\E[^>]+|
+ https?\Q://github.com/\E[\w_]+/[\w_]+/issues|
+ https?\Q://code.google.com/p/\E[\w_\-]+/issues/list
)>#gx;
my %links;
@links{@links}=();
@@ -581,7 +588,7 @@ sub bugtracker_from {
sub requires_from {
my $self = shift;
my $content = Module::Install::_readperl($_[0]);
- my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg;
+ my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg;
while ( @requires ) {
my $module = shift @requires;
my $version = shift @requires;
diff --git a/inc/Module/Install/ReadmeFromPod.pm b/inc/Module/Install/ReadmeFromPod.pm
index 348531e..6a80818 100644
--- a/inc/Module/Install/ReadmeFromPod.pm
+++ b/inc/Module/Install/ReadmeFromPod.pm
@@ -7,29 +7,119 @@ use warnings;
use base qw(Module::Install::Base);
use vars qw($VERSION);
-$VERSION = '0.12';
+$VERSION = '0.20';
sub readme_from {
my $self = shift;
return unless $self->is_admin;
- my $file = shift || $self->_all_from
+ # Input file
+ my $in_file = shift || $self->_all_from
or die "Can't determine file to make readme_from";
- my $clean = shift;
- print "Writing README from $file\n";
+ # Get optional arguments
+ my ($clean, $format, $out_file, $options);
+ my $args = shift;
+ if ( ref $args ) {
+ # Arguments are in a hashref
+ if ( ref($args) ne 'HASH' ) {
+ die "Expected a hashref but got a ".ref($args)."\n";
+ } else {
+ $clean = $args->{'clean'};
+ $format = $args->{'format'};
+ $out_file = $args->{'output_file'};
+ $options = $args->{'options'};
+ }
+ } else {
+ # Arguments are in a list
+ $clean = $args;
+ $format = shift;
+ $out_file = shift;
+ $options = \@_;
+ }
+
+ # Default values;
+ $clean ||= 0;
+ $format ||= 'txt';
+
+ # Generate README
+ print "readme_from $in_file to $format\n";
+ if ($format =~ m/te?xt/) {
+ $out_file = $self->_readme_txt($in_file, $out_file, $options);
+ } elsif ($format =~ m/html?/) {
+ $out_file = $self->_readme_htm($in_file, $out_file, $options);
+ } elsif ($format eq 'man') {
+ $out_file = $self->_readme_man($in_file, $out_file, $options);
+ } elsif ($format eq 'pdf') {
+ $out_file = $self->_readme_pdf($in_file, $out_file, $options);
+ }
- require Pod::Text;
- my $parser = Pod::Text->new();
- open README, '> README' or die "$!\n";
- $parser->output_fh( *README );
- $parser->parse_file( $file );
if ($clean) {
- $self->clean_files('README');
+ $self->clean_files($out_file);
}
+
return 1;
}
+
+sub _readme_txt {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README';
+ require Pod::Text;
+ my $parser = Pod::Text->new( @$options );
+ open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n";
+ $parser->output_fh( *$out_fh );
+ $parser->parse_file( $in_file );
+ close $out_fh;
+ return $out_file;
+}
+
+
+sub _readme_htm {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.htm';
+ require Pod::Html;
+ Pod::Html::pod2html(
+ "--infile=$in_file",
+ "--outfile=$out_file",
+ @$options,
+ );
+ # Remove temporary files if needed
+ for my $file ('pod2htmd.tmp', 'pod2htmi.tmp') {
+ if (-e $file) {
+ unlink $file or warn "Warning: Could not remove file '$file'.\n$!\n";
+ }
+ }
+ return $out_file;
+}
+
+
+sub _readme_man {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.1';
+ require Pod::Man;
+ my $parser = Pod::Man->new( @$options );
+ $parser->parse_from_file($in_file, $out_file);
+ return $out_file;
+}
+
+
+sub _readme_pdf {
+ my ($self, $in_file, $out_file, $options) = @_;
+ $out_file ||= 'README.pdf';
+ eval { require App::pod2pdf; }
+ or die "Could not generate $out_file because pod2pdf could not be found\n";
+ my $parser = App::pod2pdf->new( @$options );
+ $parser->parse_from_file($in_file);
+ open my $out_fh, '>', $out_file or die "Could not write file $out_file:\n$!\n";
+ select $out_fh;
+ $parser->output;
+ select STDOUT;
+ close $out_fh;
+ return $out_file;
+}
+
+
sub _all_from {
my $self = shift;
return unless $self->admin->{extensions};
@@ -44,5 +134,5 @@ sub _all_from {
__END__
-#line 112
+#line 254
diff --git a/inc/Module/Install/Share.pm b/inc/Module/Install/Share.pm
index f1e3bdd..4e2b602 100644
--- a/inc/Module/Install/Share.pm
+++ b/inc/Module/Install/Share.pm
@@ -8,7 +8,7 @@ use ExtUtils::Manifest ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
@@ -22,7 +22,7 @@ sub install_share {
}
unless ( defined $dir and -d $dir ) {
require Carp;
- Carp::croak("Illegal or missing directory install_share param");
+ Carp::croak("Illegal or missing directory install_share param: '$dir'");
}
# Split by type
diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm
index edc18b4..eeaa3fe 100644
--- a/inc/Module/Install/Win32.pm
+++ b/inc/Module/Install/Win32.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = 'Module::Install::Base';
$ISCORE = 1;
}
diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm
index d0f6599..85d8018 100644
--- a/inc/Module/Install/WriteAll.pm
+++ b/inc/Module/Install/WriteAll.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
use vars qw{$VERSION @ISA $ISCORE};
BEGIN {
- $VERSION = '1.00';
+ $VERSION = '1.06';
@ISA = qw{Module::Install::Base};
$ISCORE = 1;
}
commit 69f1c002d30cb3ab52ed2f965e29a9b6572c6a81
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Sat Feb 23 15:37:28 2013 +0400
add new schemas and rename to acns.xsd
diff --git a/share/schema/0.6/infringement.xsd b/share/schema/0.6/acns.xsd
similarity index 100%
rename from share/schema/0.6/infringement.xsd
rename to share/schema/0.6/acns.xsd
diff --git a/share/schema/0.7/infringement.xsd b/share/schema/0.7/acns.xsd
similarity index 100%
rename from share/schema/0.7/infringement.xsd
rename to share/schema/0.7/acns.xsd
diff --git a/share/schema/1.0/acns.xsd b/share/schema/1.0/acns.xsd
new file mode 100644
index 0000000..3ecdf70
--- /dev/null
+++ b/share/schema/1.0/acns.xsd
@@ -0,0 +1,526 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2009 (http://www.altova.com) by Craig Seidel (Movielabs) -->
+<!--Created with Liquid XML Studio 6.1.17.0 (http://www.liquid-technologies.com)-->
+<xs:schema xmlns="http://www.movielabs.com/ACNS" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" targetNamespace="http://www.movielabs.com/ACNS" elementFormDefault="qualified">
+ <xs:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
+ <!--ACNS 0.7-->
+ <xs:complexType name="Contact">
+ <xs:all>
+ <xs:element name="Entity" type="xs:string"/>
+ <xs:element name="Contact" type="xs:string" minOccurs="0"/>
+ <xs:element name="Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="Phone" type="xs:string" minOccurs="0"/>
+ <xs:element name="Email" type="xs:string"/>
+ <xs:element name="ContactURL" type="xs:anyURI" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+ <xs:complexType name="Case">
+ <xs:all>
+ <xs:element name="ID" type="xs:string"/>
+ <xs:element name="Ref_URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Status" type="xs:string" minOccurs="0"/>
+ <xs:element name="Severity" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Normal"/>
+ <xs:enumeration value="Low"/>
+ <xs:enumeration value="High"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="Infringement" id="v0.7">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Source">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="IP_Address" type="type_IPAddress"/>
+ <xs:element name="Port" type="type_Port" minOccurs="0"/>
+ <xs:element name="Protocol" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="DNS_Name" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="MAC_Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="IP_Block" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="SubType" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="BaseType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="P2P"/>
+ <xs:enumeration value="SERVER"/>
+ <xs:enumeration value="LINK"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Protocol">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="BITTORRENT"/>
+ <xs:enumeration value="ED2K"/>
+ <xs:enumeration value="GNUTELLA"/>
+ <xs:enumeration value="GNUTELLA2"/>
+ <xs:enumeration value="ARES"/>
+ <xs:enumeration value="WINNY"/>
+ <xs:enumeration value="FASTTRACK"/>
+ <xs:enumeration value="KAD"/>
+ <xs:enumeration value="FTP"/>
+ <xs:enumeration value="HTTP"/>
+ <xs:enumeration value="IRC"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Application" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="URL_Base" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="UserName" type="xs:string" minOccurs="0"/>
+ <xs:element name="Login" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="Username" type="xs:string" use="required"/>
+ <xs:attribute name="Password" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Number_Files" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Deja_Vu" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Yes"/>
+ <xs:enumeration value="No"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Content">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Item" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="History" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Notice" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="ID" type="xs:anySimpleType" use="optional"/>
+ <xs:attribute name="TimeStamp" type="xs:anySimpleType" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="type_infringement_type" minOccurs="0"/>
+ <xs:element name="Detection" type="type_Detection" minOccurs="0"/>
+ <xs:element name="Verification" type="type_Verification" minOccurs="0"/>
+ <xs:element name="InternalTracking" type="type_InternalTracking" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="TextNotice" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 NEW TYPES AND ELEMENTS-->
+ <!--ACNS 2.0 Identification-->
+ <xs:simpleType name="type_IPAddress">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:simpleType name="type_Port">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="65535"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:attributeGroup name="type_OriginalIPPortAttribute">
+ <xs:attribute name="OriginalIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="OriginalPort" type="type_Port" use="required"/>
+ </xs:attributeGroup>
+ <xs:attributeGroup name="type_MappedIPPortAttribute">
+ <xs:attribute name="MappedIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="MappedPort" type="type_Port" use="optional"/>
+ <xs:attribute name="MappedProtocol" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_Content">
+ <xs:sequence>
+ <xs:element name="Item" type="type_Item" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Item">
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="HostURI" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="type_ExplicitType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Movie"/>
+ <xs:enumeration value="Game"/>
+ <xs:enumeration value="Software"/>
+ <xs:enumeration value="Music"/>
+ <xs:enumeration value="Document"/>
+ <xs:enumeration value="Image"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_Hash">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_AlsoSeen">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="type_infringement_type_enumeration">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OTHER"/>
+ <xs:enumeration value="INFRINGEMENT"/>
+ <xs:enumeration value="PRELIT"/>
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="DMCA"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_infringement_type">
+ <xs:simpleContent>
+ <xs:extension base="type_infringement_type_enumeration">
+ <xs:attribute name="Retraction" type="xs:boolean"/>
+ <xs:attribute name="Comments" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_ContentMatched">
+ <xs:attribute name="Audio" type="xs:boolean"/>
+ <xs:attribute name="Video" type="xs:boolean"/>
+ <xs:attribute name="Text" type="xs:boolean"/>
+ <xs:attribute name="Image" type="xs:boolean"/>
+ <xs:attribute name="MatchThreshold">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="100"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Fingerprint" type="xs:boolean"/>
+ <xs:attribute name="Human" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_WatermarkMatched">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="payload" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Asset">
+ <xs:sequence>
+ <xs:element name="OriginalAssetName" type="xs:string"/>
+ <xs:element name="OriginalAssetID" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Detection">
+ <xs:sequence>
+ <xs:element name="Asset" type="type_Asset"/>
+ <xs:element name="ContentMatched" type="type_ContentMatched" minOccurs="0"/>
+ <xs:element name="HashMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="MetadataMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="WatermarkMatched" type="type_WatermarkMatched" minOccurs="0"/>
+ <xs:element name="VerificationID" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Detection" type="type_Detection"/>
+ <xs:complexType name="type_VerificationLevel">
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Verification">
+ <xs:sequence>
+ <xs:element name="VerificationLevel" type="type_VerificationLevel"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Verification" type="type_Verification"/>
+ <!--ACNS 2.0 Notice Acknowlegement-->
+ <xs:complexType name="type_NoticeAck">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complianant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute name="Accepted" type="xs:boolean"/>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="UNKNOWN_RECIPIENT"/>
+ <xs:enumeration value="IP_OUT_OF_RANGE"/>
+ <xs:enumeration value="MULTIPLE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ <xs:attribute name="Sequence" type="xs:int" use="optional"/>
+ </xs:complexType>
+ <xs:element name="NoticeAck" type="type_NoticeAckList"/>
+ <!--ACNS 2.0 Status-->
+ <xs:attributeGroup name="type_contentType">
+ <xs:attribute name="contentType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_BinaryImage">
+ <xs:complexContent>
+ <xs:extension base="xmime:base64Binary"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_CounternoticeContent">
+ <xs:all>
+ <xs:element name="NoticeText" type="xs:string" minOccurs="0"/>
+ <xs:element name="NoticeImage" minOccurs="0">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="type_BinaryImage"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="IOWN"/>
+ <xs:enumeration value="FAIRUSEFREESPEECH"/>
+ <xs:enumeration value="MISIDENTIFIED"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="OtherReason" type="xs:string" use="optional"/>
+ <xs:attribute name="ProperlySigned" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Consent" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Statement" type="xs:string" use="optional"/>
+ </xs:complexType>
+ <xs:complexType name="type_CounterNotice">
+ <xs:all>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Subscriber" type="Contact"/>
+ <xs:element name="CounternoticeContent" type="type_CounternoticeContent"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="DMCA" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeAckList">
+ <xs:sequence>
+ <xs:element ref="NoticeAck" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusRequest">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="ServiceProvider" type="Contact"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_StatusUpdate">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="Disposition">
+ <xs:complexType>
+ <xs:attribute name="Status">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="infoStatus" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="ACTION"/>
+ <xs:enumeration value="TERM"/>
+ <xs:enumeration value="NOACTION"/>
+ <xs:enumeration value="NONEPOS"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Level" type="xs:int"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="NoticeAckList" type="type_NoticeAckList" minOccurs="0"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:element name="StatusRequest" type="type_StatusRequest"/>
+ <xs:element name="StatusUpdate" type="type_StatusUpdate"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice"/>
+ <!--ACNS 2.0 INTERNAL TRACKING (part of 'Infringement')-->
+ <xs:complexType name="type_Subject">
+ <xs:sequence>
+ <xs:element name="SubjectContact" type="Contact"/>
+ <xs:element name="SubjectID">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Disposition">
+ <xs:sequence>
+ <xs:element name="InternalStatus" type="xs:string"/>
+ <xs:element name="Comments" type="xs:string" minOccurs="0"/>
+ <xs:element name="Contact" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute name="Sequence" type="xs:int" use="required"/>
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_IPAssignee">
+ <xs:complexContent>
+ <xs:extension base="type_Subject">
+ <xs:attribute name="Primary" type="xs:boolean"/>
+ <xs:attribute name="Relationship" type="xs:string"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_Mapping">
+ <xs:attributeGroup ref="type_OriginalIPPortAttribute"/>
+ <xs:attributeGroup ref="type_MappedIPPortAttribute"/>
+ <xs:attribute name="Time" type="xs:dateTime" use="required"/>
+ <xs:attribute name="LeaseTime" type="xs:time"/>
+ <xs:attribute name="LeaseHeld" type="xs:time"/>
+ </xs:complexType>
+ <xs:complexType name="type_InternalTracking">
+ <xs:sequence>
+ <xs:element name="PrimarySubject" type="type_Subject"/>
+ <xs:element name="Disposition" type="type_Disposition" minOccurs="0"/>
+ <xs:element name="Mapping" type="type_Mapping" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CurrentSequence" type="xs:int"/>
+ <xs:attribute name="InternalCaseNumber" type="xs:string" use="required"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/share/schema/1.1/acns.xsd b/share/schema/1.1/acns.xsd
new file mode 100644
index 0000000..56ddcd9
--- /dev/null
+++ b/share/schema/1.1/acns.xsd
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2010 rel. 2 (http://www.altova.com) by Craig Seidel (MovieLabs) -->
+<!--Created with Liquid XML Studio 6.1.17.0 (http://www.liquid-technologies.com)-->
+<xs:schema xmlns="http://www.movielabs.com/ACNS" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" targetNamespace="http://www.movielabs.com/ACNS" elementFormDefault="qualified" version="1.1">
+ <xs:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
+ <!--ACNS 2 v1.1-->
+ <xs:complexType name="Contact">
+ <xs:all>
+ <xs:element name="Entity" type="xs:string"/>
+ <xs:element name="Contact" type="xs:string" minOccurs="0"/>
+ <xs:element name="Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="Phone" type="xs:string" minOccurs="0"/>
+ <xs:element name="Email" type="xs:string"/>
+ <xs:element name="ContactURL" type="xs:anyURI" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+ <xs:complexType name="Case">
+ <xs:all>
+ <xs:element name="ID" type="xs:string"/>
+ <xs:element name="Ref_URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Status" type="xs:string" minOccurs="0"/>
+ <xs:element name="Severity" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Normal"/>
+ <xs:enumeration value="Low"/>
+ <xs:enumeration value="High"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="Infringement" id="v0.7">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Source">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="IP_Address" type="type_IPAddress"/>
+ <xs:element name="Port" type="type_Port" minOccurs="0"/>
+ <xs:element name="Protocol" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="DNS_Name" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="MAC_Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="IP_Block" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="SubType" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="BaseType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="P2P"/>
+ <xs:enumeration value="SERVER"/>
+ <xs:enumeration value="LINK"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Protocol">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="BITTORRENT"/>
+ <xs:enumeration value="ED2K"/>
+ <xs:enumeration value="GNUTELLA"/>
+ <xs:enumeration value="GNUTELLA2"/>
+ <xs:enumeration value="ARES"/>
+ <xs:enumeration value="WINNY"/>
+ <xs:enumeration value="FASTTRACK"/>
+ <xs:enumeration value="KAD"/>
+ <xs:enumeration value="FTP"/>
+ <xs:enumeration value="HTTP"/>
+ <xs:enumeration value="IRC"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Application" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="URL_Base" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="UserName" type="xs:string" minOccurs="0"/>
+ <xs:element name="Login" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="Username" type="xs:string" use="required"/>
+ <xs:attribute name="Password" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Number_Files" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Deja_Vu" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Yes"/>
+ <xs:enumeration value="No"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IsSource" type="xs:boolean" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Content">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Item" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ <xs:element name="UseNetHeader" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="History" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Notice" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="ID" type="xs:anySimpleType" use="optional"/>
+ <xs:attribute name="TimeStamp" type="xs:anySimpleType" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="type_infringement_type" minOccurs="0"/>
+ <xs:element name="Detection" type="type_Detection" minOccurs="0"/>
+ <xs:element name="Verification" type="type_Verification" minOccurs="0"/>
+ <xs:element name="InternalTracking" type="type_InternalTracking" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="TextNotice" type="xs:string" minOccurs="0"/>
+ <xs:element name="VerifiedData" type="xs:base64Binary" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 NEW TYPES AND ELEMENTS-->
+ <!--ACNS 2.0 Identification-->
+ <xs:simpleType name="type_IPAddress">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:simpleType name="type_Port">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="65535"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:attributeGroup name="type_OriginalIPPortAttribute">
+ <xs:attribute name="OriginalIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="OriginalPort" type="type_Port" use="required"/>
+ </xs:attributeGroup>
+ <xs:attributeGroup name="type_MappedIPPortAttribute">
+ <xs:attribute name="MappedIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="MappedPort" type="type_Port" use="optional"/>
+ <xs:attribute name="MappedProtocol" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_Content">
+ <xs:sequence>
+ <xs:element name="Item" type="type_Item" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Item">
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="HostURI" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="type_ExplicitType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Movie"/>
+ <xs:enumeration value="Game"/>
+ <xs:enumeration value="Software"/>
+ <xs:enumeration value="Music"/>
+ <xs:enumeration value="Document"/>
+ <xs:enumeration value="Image"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_Hash">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_AlsoSeen">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="type_infringement_type_enumeration">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OTHER"/>
+ <xs:enumeration value="INFRINGEMENT"/>
+ <xs:enumeration value="PRELIT"/>
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="DMCA"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_infringement_type">
+ <xs:simpleContent>
+ <xs:extension base="type_infringement_type_enumeration">
+ <xs:attribute name="Retraction" type="xs:boolean"/>
+ <xs:attribute name="Comments" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_ContentMatched">
+ <xs:attribute name="Audio" type="xs:boolean"/>
+ <xs:attribute name="Video" type="xs:boolean"/>
+ <xs:attribute name="Text" type="xs:boolean"/>
+ <xs:attribute name="Image" type="xs:boolean"/>
+ <xs:attribute name="MatchThreshold">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="100"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Fingerprint" type="xs:boolean"/>
+ <xs:attribute name="Human" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_WatermarkMatched">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="payload" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Asset">
+ <xs:sequence>
+ <xs:element name="OriginalAssetName" type="xs:string"/>
+ <xs:element name="OriginalAssetID" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Detection">
+ <xs:sequence>
+ <xs:element name="Asset" type="type_Asset"/>
+ <xs:element name="ContentMatched" type="type_ContentMatched" minOccurs="0"/>
+ <xs:element name="HashMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="MetadataMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="WatermarkMatched" type="type_WatermarkMatched" minOccurs="0"/>
+ <xs:element name="VerificationID" type="xs:string"/>
+ <xs:element name="VerifiedDataLoc" type="xs:anyURI" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_VerifiedImage">
+ <xs:sequence>
+ <xs:sequence>
+ <xs:element name="VerifiedImageBinary" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attribute name="title" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="VerifiedImageLocation" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI">
+ <xs:attribute name="title"/>
+ <xs:attribute name="username"/>
+ <xs:attribute name="password"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Detection" type="type_Detection"/>
+ <xs:complexType name="type_VerificationLevel">
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Verification">
+ <xs:sequence>
+ <xs:element name="VerificationLevel" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Verification" type="type_Verification"/>
+ <!--ACNS 2.0 Notice Acknowlegement-->
+ <xs:complexType name="type_NoticeAck">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complianant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute name="Accepted" type="xs:boolean"/>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="UNKNOWN_RECIPIENT"/>
+ <xs:enumeration value="IP_OUT_OF_RANGE"/>
+ <xs:enumeration value="MULTIPLE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ <xs:attribute name="Sequence" type="xs:int" use="optional"/>
+ </xs:complexType>
+ <xs:element name="NoticeAck" type="type_NoticeAckList"/>
+ <!--ACNS 2.0 Status-->
+ <xs:attributeGroup name="type_contentType">
+ <xs:attribute name="contentType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_BinaryImage">
+ <xs:complexContent>
+ <xs:extension base="xmime:base64Binary"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_CounternoticeContent">
+ <xs:all>
+ <xs:element name="NoticeText" type="xs:string" minOccurs="0"/>
+ <xs:element name="NoticeImage" minOccurs="0">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="type_BinaryImage"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="IOWN"/>
+ <xs:enumeration value="FAIRUSEFREESPEECH"/>
+ <xs:enumeration value="MISIDENTIFIED"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="OtherReason" type="xs:string" use="optional"/>
+ <xs:attribute name="ProperlySigned" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Consent" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Statement" type="xs:string" use="optional"/>
+ </xs:complexType>
+ <xs:complexType name="type_CounterNotice">
+ <xs:all>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Subscriber" type="Contact"/>
+ <xs:element name="CounternoticeContent" type="type_CounternoticeContent"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="DMCA" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeAckList">
+ <xs:sequence>
+ <xs:element ref="NoticeAck" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusRequest">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="ServiceProvider" type="Contact"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_StatusUpdate">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="Disposition">
+ <xs:complexType>
+ <xs:attribute name="Status">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="infoStatus" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="ACTION"/>
+ <xs:enumeration value="TERM"/>
+ <xs:enumeration value="NOACTION"/>
+ <xs:enumeration value="NONEPOS"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Level" type="xs:int"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="DispositionUsenet" type="type_UsenetDisposition" minOccurs="0"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="NoticeAckList" type="type_NoticeAckList" minOccurs="0"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_UsenetDisposition">
+ <xs:sequence>
+ <xs:element name="Article" type="xs:anyURI"/>
+ <xs:element name="Removed" type="xs:boolean"/>
+ <xs:element name="CancelMsg" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="StatusRequest" type="type_StatusRequest"/>
+ <xs:element name="StatusUpdate" type="type_StatusUpdate"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice"/>
+ <!--ACNS 2.0 INTERNAL TRACKING (part of 'Infringement')-->
+ <xs:complexType name="type_Subject">
+ <xs:sequence>
+ <xs:element name="SubjectContact" type="Contact"/>
+ <xs:element name="SubjectID">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Disposition">
+ <xs:sequence>
+ <xs:element name="InternalStatus" type="xs:string"/>
+ <xs:element name="Comments" type="xs:string" minOccurs="0"/>
+ <xs:element name="Contact" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute name="Sequence" type="xs:int" use="required"/>
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_IPAssignee">
+ <xs:complexContent>
+ <xs:extension base="type_Subject">
+ <xs:attribute name="Primary" type="xs:boolean"/>
+ <xs:attribute name="Relationship" type="xs:string"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_Mapping">
+ <xs:attributeGroup ref="type_OriginalIPPortAttribute"/>
+ <xs:attributeGroup ref="type_MappedIPPortAttribute"/>
+ <xs:attribute name="Time" type="xs:dateTime" use="required"/>
+ <xs:attribute name="LeaseTime" type="xs:time"/>
+ <xs:attribute name="LeaseHeld" type="xs:time"/>
+ </xs:complexType>
+ <xs:complexType name="type_InternalTracking">
+ <xs:sequence>
+ <xs:element name="PrimarySubject" type="type_Subject"/>
+ <xs:element name="Disposition" type="type_Disposition" minOccurs="0"/>
+ <xs:element name="Mapping" type="type_Mapping" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CurrentSequence" type="xs:int"/>
+ <xs:attribute name="InternalCaseNumber" type="xs:string" use="required"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/share/schema/1.2/acns.xsd b/share/schema/1.2/acns.xsd
new file mode 100644
index 0000000..74798d2
--- /dev/null
+++ b/share/schema/1.2/acns.xsd
@@ -0,0 +1,710 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2011 rel. 3 (x64) (http://www.altova.com) by Craig Seidel (private) -->
+<!--Created with Liquid XML Studio 6.1.17.0 (http://www.liquid-technologies.com)-->
+<xs:schema xmlns="http://www.acns.net/ACNS" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:altova="http://www.altova.com/xml-schema-extensions" targetNamespace="http://www.acns.net/ACNS" elementFormDefault="qualified" version="1.2">
+ <xs:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
+ <!--ACNS 2 v1.2-->
+ <xs:attribute name="schemaVersion" type="xs:string" fixed="1.2"/>
+ <xs:complexType name="Contact">
+ <xs:all>
+ <xs:element name="Entity" type="xs:string"/>
+ <xs:element name="Contact" type="xs:string" minOccurs="0"/>
+ <xs:element name="Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="Phone" type="xs:string" minOccurs="0"/>
+ <xs:element name="Email" type="xs:string"/>
+ <xs:element name="ContactURL" type="xs:anyURI" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+ <xs:complexType name="Case">
+ <xs:all>
+ <xs:element name="ID" type="xs:string"/>
+ <xs:element name="Ref_URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Status" type="xs:string" minOccurs="0"/>
+ <xs:element name="Severity" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Normal"/>
+ <xs:enumeration value="Low"/>
+ <xs:enumeration value="High"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="Infringement" id="v0.7">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Source">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="IP_Address" type="type_IPAddress"/>
+ <xs:element name="Port" type="type_Port" minOccurs="0"/>
+ <xs:element name="Protocol" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="DNS_Name" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:whiteSpace value="collapse"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="MAC_Address" type="xs:string" minOccurs="0"/>
+ <xs:element name="IP_Block" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="SubType" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="BaseType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="P2P"/>
+ <xs:enumeration value="SERVER"/>
+ <xs:enumeration value="LINK"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Protocol">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="BITTORRENT"/>
+ <xs:enumeration value="ED2K"/>
+ <xs:enumeration value="GNUTELLA"/>
+ <xs:enumeration value="GNUTELLA2"/>
+ <xs:enumeration value="ARES"/>
+ <xs:enumeration value="WINNY"/>
+ <xs:enumeration value="FASTTRACK"/>
+ <xs:enumeration value="KAD"/>
+ <xs:enumeration value="FTP"/>
+ <xs:enumeration value="HTTP"/>
+ <xs:enumeration value="IRC"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Application" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="URL_Base" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="UserName" type="xs:string" minOccurs="0"/>
+ <xs:element name="Login" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="Username" type="xs:string" use="required"/>
+ <xs:attribute name="Password" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Number_Files" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Deja_Vu" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Yes"/>
+ <xs:enumeration value="No"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="IsSource" type="xs:boolean" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Content">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Item" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" type="xs:nonNegativeInteger" minOccurs="0"/>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ <xs:element name="UseNetHeader" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="History" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Notice" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="ID" type="xs:anySimpleType" use="optional"/>
+ <xs:attribute name="TimeStamp" type="xs:anySimpleType" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="type_infringement_type" minOccurs="0"/>
+ <xs:element name="Detection" type="type_Detection" minOccurs="0"/>
+ <xs:element name="Verification" type="type_Verification" minOccurs="0"/>
+ <xs:element name="InternalTracking" type="type_InternalTracking" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="TextNotice" type="xs:string" minOccurs="0"/>
+ <xs:element name="VerifiedData" type="xs:base64Binary" minOccurs="0"/>
+ <xs:element name="Declarations" type="type_Declaration" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 NEW TYPES AND ELEMENTS-->
+ <!--ACNS 2.0 Identification-->
+ <xs:simpleType name="type_IPAddress">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:simpleType name="type_Port">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="65535"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:attributeGroup name="type_OriginalIPPortAttribute">
+ <xs:attribute name="OriginalIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="OriginalPort" type="type_Port" use="required"/>
+ </xs:attributeGroup>
+ <xs:attributeGroup name="type_MappedIPPortAttribute">
+ <xs:attribute name="MappedIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="MappedPort" type="type_Port" use="optional"/>
+ <xs:attribute name="MappedProtocol" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_Content">
+ <xs:sequence>
+ <xs:element name="Item" type="type_Item" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Item">
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="HostURI" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="type_ExplicitType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Movie"/>
+ <xs:enumeration value="Game"/>
+ <xs:enumeration value="Software"/>
+ <xs:enumeration value="Music"/>
+ <xs:enumeration value="Document"/>
+ <xs:enumeration value="Image"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_Hash">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_AlsoSeen">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="type_infringement_type_enumeration">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OTHER"/>
+ <xs:enumeration value="INFRINGEMENT"/>
+ <xs:enumeration value="PRELIT"/>
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="DMCA"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_infringement_type">
+ <xs:simpleContent>
+ <xs:extension base="type_infringement_type_enumeration">
+ <xs:attribute name="Retraction" type="xs:boolean"/>
+ <xs:attribute name="Comments" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_ContentMatched">
+ <xs:attribute name="Audio" type="xs:boolean"/>
+ <xs:attribute name="Video" type="xs:boolean"/>
+ <xs:attribute name="Text" type="xs:boolean"/>
+ <xs:attribute name="Image" type="xs:boolean"/>
+ <xs:attribute name="MatchThreshold">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="100"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Fingerprint" type="xs:boolean"/>
+ <xs:attribute name="Human" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_WatermarkMatched">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="payload" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Asset">
+ <xs:sequence>
+ <xs:element name="OriginalAssetName" type="xs:string"/>
+ <xs:element name="OriginalAssetID" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Detection">
+ <xs:sequence>
+ <xs:element name="Asset" type="type_Asset"/>
+ <xs:element name="ContentMatched" type="type_ContentMatched" minOccurs="0"/>
+ <xs:element name="HashMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="MetadataMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="WatermarkMatched" type="type_WatermarkMatched" minOccurs="0"/>
+ <xs:element name="VerificationID" type="xs:string"/>
+ <xs:element name="VerifiedDataLoc" type="xs:anyURI" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_VerifiedImage">
+ <xs:sequence>
+ <xs:sequence>
+ <xs:element name="VerifiedImageBinary" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attribute name="title" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="VerifiedImageLocation" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI">
+ <xs:attribute name="title"/>
+ <xs:attribute name="username"/>
+ <xs:attribute name="password"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Detection" type="type_Detection"/>
+ <xs:complexType name="type_VerificationLevel">
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Verification">
+ <xs:sequence>
+ <xs:element name="VerificationLevel" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Declaration">
+ <xs:sequence>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="Body" type="xs:string" minOccurs="0"/>
+ <xs:element name="LinkToBody" type="xs:anyURI" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Verification" type="type_Verification"/>
+ <!--ACNS 2.0 Notice Acknowlegement-->
+ <xs:complexType name="type_NoticeAck">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complianant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute ref="schemaVersion"/>
+ <xs:attribute name="Accepted" type="xs:boolean"/>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="UNKNOWN_RECIPIENT"/>
+ <xs:enumeration value="IP_OUT_OF_RANGE"/>
+ <xs:enumeration value="MULTIPLE"/>
+ <xs:enumeration value="TEXT_XML_MISMATCH"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ <xs:attribute name="Sequence" type="xs:int" use="optional"/>
+ </xs:complexType>
+ <xs:element name="NoticeAck" type="type_NoticeAck"/>
+ <!--ACNS 2.0 Status-->
+ <xs:attributeGroup name="type_contentType">
+ <xs:attribute name="contentType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_BinaryImage">
+ <xs:complexContent>
+ <xs:extension base="xmime:base64Binary"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_CounternoticeContent">
+ <xs:all>
+ <xs:element name="NoticeText" type="xs:string" minOccurs="0"/>
+ <xs:element name="NoticeImage" minOccurs="0">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="type_BinaryImage"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="IOWN"/>
+ <xs:enumeration value="FAIRUSEFREESPEECH"/>
+ <xs:enumeration value="MISIDENTIFIED"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="OtherReason" type="xs:string" use="optional"/>
+ <xs:attribute name="ProperlySigned" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Consent" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Statement" type="xs:string" use="optional"/>
+ </xs:complexType>
+ <xs:complexType name="type_CounterNotice">
+ <xs:sequence>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Subscriber" type="Contact"/>
+ <xs:element name="CounternoticeContent" type="type_CounternoticeContent"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="DMCA" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeAckList">
+ <xs:sequence>
+ <xs:element ref="NoticeAck" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusRequest">
+ <xs:sequence>
+ <xs:choice>
+ <xs:element name="Case" type="Case" maxOccurs="unbounded"/>
+ <xs:sequence>
+ <xs:element name="StartDateTime" type="xs:dateTime"/>
+ <xs:element name="EndDateTime" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:choice>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="ServiceProvider" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_UsenetDisposition">
+ <xs:sequence>
+ <xs:element name="Article" type="xs:anyURI"/>
+ <xs:element name="Removed" type="xs:boolean"/>
+ <xs:element name="CancelMsg" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="StatusRequest" type="type_StatusRequest"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice"/>
+ <!--ACNS Status Update (deprecated)-->
+ <xs:complexType name="type_StatusUpdate">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="Disposition">
+ <xs:complexType>
+ <xs:attribute name="Status">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="infoStatus" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="ACTION"/>
+ <xs:enumeration value="TERM"/>
+ <xs:enumeration value="NOACTION"/>
+ <xs:enumeration value="NONEPOS"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Level" type="xs:int"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="DispositionUsenet" type="type_UsenetDisposition" minOccurs="0"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="NoticeAckList" type="type_NoticeAckList" minOccurs="0"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ <xs:element name="StatusUpdate" type="type_StatusUpdate"/>
+ <!--ACNS Notice Status (preferred)-->
+ <xs:complexType name="type_StatusSource">
+ <xs:sequence>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_GRStatus">
+ <xs:sequence>
+ <xs:element name="NetworkCaseID" minOccurs="0"/>
+ <xs:element name="NetworkInfringementID" type="xs:string" minOccurs="0"/>
+ <xs:element name="NetworkIncidentID" type="xs:string" minOccurs="0"/>
+ <xs:element name="ActionTaken" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Type" type="xs:string"/>
+ <xs:element name="Time" type="xs:dateTime"/>
+ <xs:element name="AdditionalData" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="UserData" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="AnonUserIdentifier" type="xs:string" minOccurs="0"/>
+ <xs:element name="TotalCaseCount" type="xs:int" minOccurs="0"/>
+ <xs:element name="TotalInfringementCount" type="xs:int" minOccurs="0"/>
+ <xs:element name="TotalIncidentCount" type="xs:int" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusDisposition">
+ <xs:sequence>
+ <xs:element name="Type">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Reason" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FirstProcessedDate" type="xs:dateTime"/>
+ <xs:element name="LastModifiedDate" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeStatus">
+ <xs:sequence>
+ <xs:element name="Disposition" type="type_StatusDisposition"/>
+ <xs:choice minOccurs="0">
+ <xs:element name="GRStatus" type="type_GRStatus"/>
+ <xs:element name="UsenetStatus" type="type_UsenetDisposition"/>
+ </xs:choice>
+ <xs:element name="Source" type="type_StatusSource" minOccurs="0"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CaseID" type="xs:string" use="required"/>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:element name="NoticeStatus">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="CaseStatus" type="type_NoticeStatus" maxOccurs="unbounded"/>
+ <xs:sequence minOccurs="0">
+ <xs:element name="StartDateTime" type="xs:dateTime"/>
+ <xs:element name="EndDateTime" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 INTERNAL TRACKING (part of 'Infringement')-->
+ <xs:complexType name="type_Subject">
+ <xs:sequence>
+ <xs:element name="SubjectContact" type="Contact"/>
+ <xs:element name="SubjectID">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Disposition">
+ <xs:sequence>
+ <xs:element name="InternalStatus" type="xs:string"/>
+ <xs:element name="Comments" type="xs:string" minOccurs="0"/>
+ <xs:element name="Contact" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute name="Sequence" type="xs:int" use="required"/>
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_IPAssignee">
+ <xs:complexContent>
+ <xs:extension base="type_Subject">
+ <xs:attribute name="Primary" type="xs:boolean"/>
+ <xs:attribute name="Relationship" type="xs:string"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_Mapping">
+ <xs:attributeGroup ref="type_OriginalIPPortAttribute"/>
+ <xs:attributeGroup ref="type_MappedIPPortAttribute"/>
+ <xs:attribute name="Time" type="xs:dateTime" use="required"/>
+ <xs:attribute name="LeaseTime" type="xs:time"/>
+ <xs:attribute name="LeaseHeld" type="xs:time"/>
+ </xs:complexType>
+ <xs:complexType name="type_InternalTracking">
+ <xs:sequence>
+ <xs:element name="PrimarySubject" type="type_Subject"/>
+ <xs:element name="Disposition" type="type_Disposition" minOccurs="0"/>
+ <xs:element name="Mapping" type="type_Mapping" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CurrentSequence" type="xs:int"/>
+ <xs:attribute name="InternalCaseNumber" type="xs:string" use="required"/>
+ </xs:complexType>
+ <!--*** Message Container ***-->
+ <xs:complexType name="type_Message">
+ <xs:choice>
+ <xs:element ref="Infringement"/>
+ <xs:element ref="NoticeAck"/>
+ <xs:element ref="NoticeStatus"/>
+ <xs:element ref="StatusRequest"/>
+ </xs:choice>
+ <xs:attribute name="Type" type="type_MessageName" use="required"/>
+ <xs:attribute name="ID" type="xs:string"/>
+ <xs:attribute name="Created" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:simpleType name="type_MessageName">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ACNS2.0Notice"/>
+ <xs:enumeration value="ACNS0.7Notice"/>
+ <xs:enumeration value="ACNSNoticeAck"/>
+ <xs:enumeration value="ACNSStatusRequest"/>
+ <xs:enumeration value="ACNSNoticeStatus"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="MessageEnvelope">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Message" type="type_Message" maxOccurs="unbounded"/>
+ <xs:element ref="ds:Signature" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="ReplyEmail" type="xs:string"/>
+ <xs:attribute name="ReplyURI" type="xs:string" use="optional"/>
+ <xs:attribute name="id" type="xs:ID"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/share/schema/compat/infringement.xsd b/share/schema/compat/acns.xsd
similarity index 100%
rename from share/schema/compat/infringement.xsd
rename to share/schema/compat/acns.xsd
diff --git a/share/schema/xmldsig.xsd b/share/schema/xmldsig.xsd
new file mode 100644
index 0000000..df126b3
--- /dev/null
+++ b/share/schema/xmldsig.xsd
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE schema
+ PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
+ [
+ <!ATTLIST schema
+ xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#">
+ <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
+ <!ENTITY % p ''>
+ <!ENTITY % s ''>
+ ]>
+
+<!-- Schema for XML Signatures
+ http://www.w3.org/2000/09/xmldsig#
+ $Revision: 1.1 $ on $Date: 2002/02/08 20:32:26 $ by $Author: reagle $
+
+ Copyright 2001 The Internet Society and W3C (Massachusetts Institute
+ of Technology, Institut National de Recherche en Informatique et en
+ Automatique, Keio University). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/
+
+ This document is governed by the W3C Software License [1] as described
+ in the FAQ [2].
+
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+
+
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+ targetNamespace="http://www.w3.org/2000/09/xmldsig#"
+ version="0.1" elementFormDefault="qualified">
+
+<!-- Basic Types Defined for Signatures -->
+
+<simpleType name="CryptoBinary">
+ <restriction base="base64Binary">
+ </restriction>
+</simpleType>
+
+<!-- Start Signature -->
+
+<element name="Signature" type="ds:SignatureType"/>
+<complexType name="SignatureType">
+ <sequence>
+ <element ref="ds:SignedInfo"/>
+ <element ref="ds:SignatureValue"/>
+ <element ref="ds:KeyInfo" minOccurs="0"/>
+ <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+ <element name="SignatureValue" type="ds:SignatureValueType"/>
+ <complexType name="SignatureValueType">
+ <simpleContent>
+ <extension base="base64Binary">
+ <attribute name="Id" type="ID" use="optional"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+<!-- Start SignedInfo -->
+
+<element name="SignedInfo" type="ds:SignedInfoType"/>
+<complexType name="SignedInfoType">
+ <sequence>
+ <element ref="ds:CanonicalizationMethod"/>
+ <element ref="ds:SignatureMethod"/>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+ <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
+ <complexType name="CanonicalizationMethodType" mixed="true">
+ <sequence>
+ <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+
+ <element name="SignatureMethod" type="ds:SignatureMethodType"/>
+ <complexType name="SignatureMethodType" mixed="true">
+ <sequence>
+ <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
+ <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) external namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+
+<!-- Start Reference -->
+
+<element name="Reference" type="ds:ReferenceType"/>
+<complexType name="ReferenceType">
+ <sequence>
+ <element ref="ds:Transforms" minOccurs="0"/>
+ <element ref="ds:DigestMethod"/>
+ <element ref="ds:DigestValue"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="URI" type="anyURI" use="optional"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+</complexType>
+
+ <element name="Transforms" type="ds:TransformsType"/>
+ <complexType name="TransformsType">
+ <sequence>
+ <element ref="ds:Transform" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="Transform" type="ds:TransformType"/>
+ <complexType name="TransformType" mixed="true">
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ <element name="XPath" type="string"/>
+ </choice>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+
+<!-- End Reference -->
+
+<element name="DigestMethod" type="ds:DigestMethodType"/>
+<complexType name="DigestMethodType" mixed="true">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+</complexType>
+
+<element name="DigestValue" type="ds:DigestValueType"/>
+<simpleType name="DigestValueType">
+ <restriction base="base64Binary"/>
+</simpleType>
+
+<!-- End SignedInfo -->
+
+<!-- Start KeyInfo -->
+
+<element name="KeyInfo" type="ds:KeyInfoType"/>
+<complexType name="KeyInfoType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <element ref="ds:KeyName"/>
+ <element ref="ds:KeyValue"/>
+ <element ref="ds:RetrievalMethod"/>
+ <element ref="ds:X509Data"/>
+ <element ref="ds:PGPData"/>
+ <element ref="ds:SPKIData"/>
+ <element ref="ds:MgmtData"/>
+ <any processContents="lax" namespace="##other"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ </choice>
+ <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+ <element name="KeyName" type="string"/>
+ <element name="MgmtData" type="string"/>
+
+ <element name="KeyValue" type="ds:KeyValueType"/>
+ <complexType name="KeyValueType" mixed="true">
+ <choice>
+ <element ref="ds:DSAKeyValue"/>
+ <element ref="ds:RSAKeyValue"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </complexType>
+
+ <element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
+ <complexType name="RetrievalMethodType">
+ <sequence>
+ <element ref="ds:Transforms" minOccurs="0"/>
+ </sequence>
+ <attribute name="URI" type="anyURI"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+ </complexType>
+
+<!-- Start X509Data -->
+
+<element name="X509Data" type="ds:X509DataType"/>
+<complexType name="X509DataType">
+ <sequence maxOccurs="unbounded">
+ <choice>
+ <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
+ <element name="X509SKI" type="base64Binary"/>
+ <element name="X509SubjectName" type="string"/>
+ <element name="X509Certificate" type="base64Binary"/>
+ <element name="X509CRL" type="base64Binary"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </sequence>
+</complexType>
+
+<complexType name="X509IssuerSerialType">
+ <sequence>
+ <element name="X509IssuerName" type="string"/>
+ <element name="X509SerialNumber" type="integer"/>
+ </sequence>
+</complexType>
+
+<!-- End X509Data -->
+
+<!-- Begin PGPData -->
+
+<element name="PGPData" type="ds:PGPDataType"/>
+<complexType name="PGPDataType">
+ <choice>
+ <sequence>
+ <element name="PGPKeyID" type="base64Binary"/>
+ <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/>
+ <any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </sequence>
+ <sequence>
+ <element name="PGPKeyPacket" type="base64Binary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </sequence>
+ </choice>
+</complexType>
+
+<!-- End PGPData -->
+
+<!-- Begin SPKIData -->
+
+<element name="SPKIData" type="ds:SPKIDataType"/>
+<complexType name="SPKIDataType">
+ <sequence maxOccurs="unbounded">
+ <element name="SPKISexp" type="base64Binary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0"/>
+ </sequence>
+</complexType>
+
+<!-- End SPKIData -->
+
+<!-- End KeyInfo -->
+
+<!-- Start Object (Manifest, SignatureProperty) -->
+
+<element name="Object" type="ds:ObjectType"/>
+<complexType name="ObjectType" mixed="true">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##any" processContents="lax"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
+ <attribute name="Encoding" type="anyURI" use="optional"/>
+</complexType>
+
+<element name="Manifest" type="ds:ManifestType"/>
+<complexType name="ManifestType">
+ <sequence>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+<element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
+<complexType name="SignaturePropertiesType">
+ <sequence>
+ <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+</complexType>
+
+ <element name="SignatureProperty" type="ds:SignaturePropertyType"/>
+ <complexType name="SignaturePropertyType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (1,unbounded) namespaces -->
+ </choice>
+ <attribute name="Target" type="anyURI" use="required"/>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+
+<!-- End Object (Manifest, SignatureProperty) -->
+
+<!-- Start Algorithm Parameters -->
+
+<simpleType name="HMACOutputLengthType">
+ <restriction base="integer"/>
+</simpleType>
+
+<!-- Start KeyValue Element-types -->
+
+<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
+<complexType name="DSAKeyValueType">
+ <sequence>
+ <sequence minOccurs="0">
+ <element name="P" type="ds:CryptoBinary"/>
+ <element name="Q" type="ds:CryptoBinary"/>
+ </sequence>
+ <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
+ <element name="Y" type="ds:CryptoBinary"/>
+ <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
+ <sequence minOccurs="0">
+ <element name="Seed" type="ds:CryptoBinary"/>
+ <element name="PgenCounter" type="ds:CryptoBinary"/>
+ </sequence>
+ </sequence>
+</complexType>
+
+<element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
+<complexType name="RSAKeyValueType">
+ <sequence>
+ <element name="Modulus" type="ds:CryptoBinary"/>
+ <element name="Exponent" type="ds:CryptoBinary"/>
+ </sequence>
+</complexType>
+
+<!-- End KeyValue Element-types -->
+
+<!-- End Signature -->
+
+</schema>
diff --git a/share/schema/xmlmime.xsd b/share/schema/xmlmime.xsd
new file mode 100644
index 0000000..766a07b
--- /dev/null
+++ b/share/schema/xmlmime.xsd
@@ -0,0 +1,49 @@
+<?xml version="1.0" ?>
+<!--
+ W3C XML Schema defined in the Describing Media Content of Binary Data in XML
+ specification
+ http://www.w3.org/TR/xml-media-types
+
+ Copyright © 2005 World Wide Web Consortium,
+
+ (Massachusetts Institute of Technology, European Research Consortium for
+ Informatics and Mathematics, Keio University). All Rights Reserved. This
+ work is distributed under the W3C® Software License [1] in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+ $Id: xmlmime.xsd,v 1.1 2005/04/25 17:08:35 hugo Exp $
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
+ targetNamespace="http://www.w3.org/2005/05/xmlmime" >
+
+ <xs:attribute name="contentType">
+ <xs:simpleType>
+ <xs:restriction base="xs:string" >
+ <xs:minLength value="3" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="expectedContentTypes" type="xs:string" />
+
+ <xs:complexType name="base64Binary" >
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary" >
+ <xs:attribute ref="xmime:contentType" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="hexBinary" >
+ <xs:simpleContent>
+ <xs:extension base="xs:hexBinary" >
+ <xs:attribute ref="xmime:contentType" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+</xs:schema>
\ No newline at end of file
commit cbc1c7b455e3ba299dd438493443d42dca8135bc
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Sun Feb 24 00:24:19 2013 +0400
ignore MYMETA files
diff --git a/.gitignore b/.gitignore
index 7704213..2b3d2ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ pm_to_blib
blib/
*.old
*.bak
+MYMETA.*
commit 0636467e133e4cc1fd1c8c2390e74a66af9356f8
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Sun Feb 24 15:47:35 2013 +0400
implement support for ACNS 2.0 (1.2, 1.1, 1.0 versions)
* compat works, but has to do some namespace tricery
* newer versions has new top level elements, for example
StatusUpdates. For backwards compatibility top level
element is not returned in the result, but it's documented
how to get it.
* no 1.0 example. It should work, but I just couldn't find
a sample.
* Sample within documentation for 1.2 is not conformant with
the schema (typo and two missing mandatory elements). I had
to adjust it.
diff --git a/lib/Parse/ACNS.pm b/lib/Parse/ACNS.pm
index 6b10364..876f323 100644
--- a/lib/Parse/ACNS.pm
+++ b/lib/Parse/ACNS.pm
@@ -20,15 +20,28 @@ Parse::ACNS - parser for Automated Copyright Notice System (ACNS) XML
ACNS stands for Automated Copyright Notice System. It's an open source,
royalty free system that universities, ISP's, or anyone that handles large
volumes of copyright notices can implement on their network to increase
-the efficiency and reduce the costs of responding to the notices...
-See "http://mpto.unistudios.com/xml/" for more details.
+the efficiency and reduce the costs of responding to the notices...
-This module parses ACNS XML into a perl data structure. Supports both 0.6 and
-0.7 version. Parser strictly follows XML Schemas, so throws errors on malformed
-data.
+See L<http://acns.net> for more details.
+
+This module parses ACNS XML into a perl data structure. Supports 1.2, 1.1, 1.0,
+0.7 and 0.6 revisions of the spec. Parser strictly follows XML Schemas, so throws
+errors on malformed data.
However, it B<doesn't> extract ACNS XML from email messages.
+=head1 SOME ACNS BACKGROUND
+
+L<NBC Universal and UMG|http://mpto.unistudios.com/xml/> released two revisions
+of the spec (0.6 and 0.7).
+
+L<Motion Picture Laboratories, Inc.|http://www.movielabs.com/ACNS> took over
+and named it ACNS 2.0 and released revisions 1.0, 1.1 and several sub-revisions with
+letters (1.1f, 1.1j, 1.1p).
+
+Then it was moved once again to L<http://www.acns.net/spec.html> and revision 1.2
+was released.
+
=cut
use File::ShareDir ();
@@ -51,11 +64,16 @@ Constructor, takes list of named arguments.
=over 4
-=item compat - default value, can parse both 0.7 and 0.6 XML by making
-TimeStamp element in Infringement/Content/Item optional. This is the
-only difference between the spec versions.
+=item compat
+
+default value, can parse 1.2 to 0.6 XML. Revision 1.2 is backwards
+compatible with 0.7. Compat schema makes TimeStamp in Infringement/Content/Item
+optional to make it compatible with 0.6 revision. Everything else new in 1.2 is
+optional.
-=item 0.7 or 0.6 - strict parsing of the specified version.
+=item 1.2, 1.1, 1.0, 0.7 or 0.6
+
+strict parsing of the specified version.
=back
@@ -72,25 +90,14 @@ sub init {
my $self = shift;
$self->{'version'} ||= 'compat';
- unless ( $self->{'version'} =~ /^(compat|0\.[67])$/ ) {
+ unless ( $self->{'version'} =~ /^(compat|0\.[67]|1\.[0-2])$/ ) {
require Carp;
Carp::croak(
- "Only compat, 0.7 and 0.6 versions are supported"
+ "Only compat, 1.2, 1.1, 1.0, 0.7 and 0.6 versions are supported"
.", not '". $self->{'version'} ."'"
);
}
- my $path = File::ShareDir::dist_file(
- 'Parse-ACNS',
- File::Spec->catfile( 'schema', $self->{'version'}, 'infringement.xsd' )
- );
-
- $self->{'reader'} = $CACHE{$path}{'reader'};
- unless ( $self->{'reader'} ) {
- my $schema = XML::Compile::Schema->new( [$path] );
- $self->{'reader'} = $CACHE{$path}{'reader'}
- = $schema->compile( READER => 'Infringement' );
- }
return $self;
}
@@ -101,6 +108,16 @@ sub init {
Takes L<XML::LibXML::Document> containing an ACNS XML and returns it as a perl
struture. Read L<XML::LibXML::Parser> on parsing from different sources.
+Newer versions of the spec describe more messages besides
+C<< <Infringement> >>, for example C<< <StatusUpdate> >>. Top level element
+is not returned as part of the result, but you always can get it from XML
+document:
+
+ $xml_doc->documentElement->nodeName;
+
+To simplify implementation of compat version parsing document can be
+changed. At this moment XML namespace is adjusted on all elements.
+
Returned data structure follows XML and its Schema, for example:
{
@@ -157,7 +174,81 @@ Returned data structure follows XML and its Schema, for example:
sub parse {
my $self = shift;
- return $self->{'reader'}->( shift );
+ my $xml = shift;
+ my $element = $xml->documentElement->nodeName;
+ if ( $self->{'version'} eq 'any' ) {
+ foreach my $v (qw(1.2 1.1 1.0 0.7 0.6)) {
+ local $@;
+ my $res;
+ return $res if eval { $res = $self->reader($v, $element)->($xml); 1 };
+ }
+ }
+ elsif ( $self->{'version'} eq 'compat' ) {
+ my $root = $xml->documentElement;
+ my $uri = $root->namespaceURI || '';
+ if ( !$uri || ($uri eq 'http://www.movielabs.com/ACNS' && !$root->can('setNamespaceDeclURI')) ) {
+ my $list = $root->getElementsByTagNameNS($root->namespaceURI, '*');
+ $list->unshift($root);
+ $list->foreach(sub {
+ $_->setNamespace('http://www.acns.net/ACNS', $root->prefix, 1);
+ });
+ }
+ elsif ( $uri eq 'http://www.movielabs.com/ACNS' ) {
+ $root->setNamespaceDeclURI($root->prefix, 'http://www.acns.net/ACNS');
+ }
+ elsif ( $uri eq 'http://www.acns.net/ACNS' ) {
+ # do nothing
+ }
+ else {
+ die "Top level element has '$uri' namespace and it's not something we can parse as ACNS";
+ }
+ return $self->reader($self->{'version'}, $element)->($xml);
+ }
+ else {
+ return $self->reader($self->{'version'}, $element)->($xml);
+ }
+ return undef;
+}
+
+my %NS = (
+ '1.0' => 'http://www.movielabs.com/ACNS',
+ '1.1' => 'http://www.movielabs.com/ACNS',
+ '1.2' => 'http://www.acns.net/ACNS',
+ 'compat' => 'http://www.acns.net/ACNS',
+);
+my %SUPLIMENTARY = (
+ '1.0' => ['xmlmime'],
+ '1.1' => ['xmlmime'],
+ '1.2' => ['xmlmime', 'xmldsig'],
+);
+
+sub reader {
+ my $self = shift;
+ my $version = shift;
+ my $element = shift || 'Infringement';
+
+ return $CACHE{$version}{'element'}{$element}
+ if $CACHE{$version}{'element'}{$element};
+
+ my $schema = $CACHE{$version}{'schema'} ||= do {
+ my @paths;
+ push @paths, File::ShareDir::dist_file(
+ 'Parse-ACNS',
+ File::Spec->catfile( 'schema', $version, 'acns.xsd' )
+ );
+ if ( $SUPLIMENTARY{$version} ) {
+ push @paths, map File::ShareDir::dist_file(
+ 'Parse-ACNS',
+ File::Spec->catfile( 'schema', "$_.xsd" )
+ ), @{$SUPLIMENTARY{$version}};
+ }
+ XML::Compile::Schema->new( \@paths );
+ };
+
+ use XML::Compile::Util qw/pack_type/;
+ return $CACHE{$version}{'element'}{$element}
+ = $schema->compile( READER => pack_type( $NS{$version}, $element ) );
+
}
=head1 AUTHOR
diff --git a/share/schema/compat/acns.xsd b/share/schema/compat/acns.xsd
index f3853b0..46dbfc3 100644
--- a/share/schema/compat/acns.xsd
+++ b/share/schema/compat/acns.xsd
@@ -1,54 +1,54 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Aaron Markham (Universal) -->
-<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2011 rel. 3 (x64) (http://www.altova.com) by Craig Seidel (private) -->
+<!--Created with Liquid XML Studio 6.1.17.0 (http://www.liquid-technologies.com)-->
+<xs:schema xmlns="http://www.acns.net/ACNS" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:altova="http://www.altova.com/xml-schema-extensions" targetNamespace="http://www.acns.net/ACNS" elementFormDefault="qualified" version="1.2">
+ <xs:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
+ <!--ACNS 2 v1.2-->
+ <xs:attribute name="schemaVersion" type="xs:string" fixed="compat"/>
<xs:complexType name="Contact">
- <xs:sequence>
+ <xs:all>
<xs:element name="Entity" type="xs:string"/>
<xs:element name="Contact" type="xs:string" minOccurs="0"/>
<xs:element name="Address" type="xs:string" minOccurs="0"/>
<xs:element name="Phone" type="xs:string" minOccurs="0"/>
<xs:element name="Email" type="xs:string"/>
- </xs:sequence>
+ <xs:element name="ContactURL" type="xs:anyURI" minOccurs="0"/>
+ </xs:all>
</xs:complexType>
- <xs:element name="Infringement" id="compat">
+ <xs:complexType name="Case">
+ <xs:all>
+ <xs:element name="ID" type="xs:string"/>
+ <xs:element name="Ref_URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Status" type="xs:string" minOccurs="0"/>
+ <xs:element name="Severity" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Normal"/>
+ <xs:enumeration value="Low"/>
+ <xs:enumeration value="High"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="Infringement" id="v0.7">
<xs:complexType>
<xs:sequence>
- <xs:element name="Case">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="ID" type="xs:string"/>
- <xs:element name="Ref_URL" type="xs:anyURI" minOccurs="0"/>
- <xs:element name="Status" type="xs:string" minOccurs="0"/>
- <xs:element name="Severity" minOccurs="0">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:enumeration value="Normal"/>
- <xs:enumeration value="Low"/>
- <xs:enumeration value="High"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
+ <xs:element name="Case" type="Case"/>
<xs:element name="Complainant" type="Contact"/>
<xs:element name="Service_Provider" type="Contact"/>
<xs:element name="Source">
<xs:complexType>
- <xs:sequence>
+ <xs:all>
<xs:element name="TimeStamp" type="xs:dateTime"/>
- <xs:element name="IP_Address">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:whiteSpace value="collapse"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
- <xs:element name="Port" minOccurs="0">
+ <xs:element name="IP_Address" type="type_IPAddress"/>
+ <xs:element name="Port" type="type_Port" minOccurs="0"/>
+ <xs:element name="Protocol" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:minInclusive value="0"/>
- <xs:maxInclusive value="65535"/>
+ <xs:maxInclusive value="254"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
@@ -61,7 +61,44 @@
</xs:element>
<xs:element name="MAC_Address" type="xs:string" minOccurs="0"/>
<xs:element name="IP_Block" type="xs:string" minOccurs="0"/>
- <xs:element name="Type" type="xs:string"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="SubType" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="BaseType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="P2P"/>
+ <xs:enumeration value="SERVER"/>
+ <xs:enumeration value="LINK"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Protocol">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="BITTORRENT"/>
+ <xs:enumeration value="ED2K"/>
+ <xs:enumeration value="GNUTELLA"/>
+ <xs:enumeration value="GNUTELLA2"/>
+ <xs:enumeration value="ARES"/>
+ <xs:enumeration value="WINNY"/>
+ <xs:enumeration value="FASTTRACK"/>
+ <xs:enumeration value="KAD"/>
+ <xs:enumeration value="FTP"/>
+ <xs:enumeration value="HTTP"/>
+ <xs:enumeration value="IRC"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Application" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
<xs:element name="URL_Base" type="xs:anyURI" minOccurs="0"/>
<xs:element name="UserName" type="xs:string" minOccurs="0"/>
<xs:element name="Login" minOccurs="0">
@@ -85,7 +122,8 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
- </xs:sequence>
+ <xs:element name="IsSource" type="xs:boolean" minOccurs="0"/>
+ </xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Content">
@@ -95,6 +133,7 @@
<xs:complexType>
<xs:sequence>
<xs:element name="TimeStamp" type="xs:dateTime" minOccurs="0"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Title" type="xs:string" minOccurs="0"/>
<xs:element name="Artist" type="xs:string" minOccurs="0"/>
<xs:element name="FileName">
@@ -102,24 +141,12 @@
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
- <xs:element name="FileSize" minOccurs="0">
- <xs:simpleType>
- <xs:restriction base="xs:int">
- <xs:minInclusive value="0"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
+ <xs:element name="FileSize" type="xs:nonNegativeInteger" minOccurs="0"/>
<xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
<xs:element name="Type" type="xs:string" minOccurs="0"/>
- <xs:element name="Hash" minOccurs="0">
- <xs:complexType>
- <xs:simpleContent>
- <xs:extension base="xs:string">
- <xs:attribute name="Type" type="xs:string" use="required"/>
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- </xs:element>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ <xs:element name="UseNetHeader" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -143,7 +170,541 @@
</xs:complexType>
</xs:element>
<xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ <xs:element name="Type" type="type_infringement_type" minOccurs="0"/>
+ <xs:element name="Detection" type="type_Detection" minOccurs="0"/>
+ <xs:element name="Verification" type="type_Verification" minOccurs="0"/>
+ <xs:element name="InternalTracking" type="type_InternalTracking" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="TextNotice" type="xs:string" minOccurs="0"/>
+ <xs:element name="VerifiedData" type="xs:base64Binary" minOccurs="0"/>
+ <xs:element name="Declarations" type="type_Declaration" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 NEW TYPES AND ELEMENTS-->
+ <!--ACNS 2.0 Identification-->
+ <xs:simpleType name="type_IPAddress">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:simpleType name="type_Port">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="65535"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:attributeGroup name="type_OriginalIPPortAttribute">
+ <xs:attribute name="OriginalIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="OriginalPort" type="type_Port" use="required"/>
+ </xs:attributeGroup>
+ <xs:attributeGroup name="type_MappedIPPortAttribute">
+ <xs:attribute name="MappedIP" type="type_IPAddress" use="required"/>
+ <xs:attribute name="MappedPort" type="type_Port" use="optional"/>
+ <xs:attribute name="MappedProtocol" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="254"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_Content">
+ <xs:sequence>
+ <xs:element name="Item" type="type_Item" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Item">
+ <xs:sequence>
+ <xs:element name="TimeStamp" type="xs:dateTime"/>
+ <xs:element name="AlsoSeen" type="type_AlsoSeen" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Title" type="xs:string" minOccurs="0"/>
+ <xs:element name="Artist" type="xs:string" minOccurs="0"/>
+ <xs:element name="FileName">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FileSize" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="URL" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="HostURI" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="ExplicitType" type="type_ExplicitType" minOccurs="0"/>
+ <xs:element name="Hash" type="type_Hash" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="type_ExplicitType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Movie"/>
+ <xs:enumeration value="Game"/>
+ <xs:enumeration value="Software"/>
+ <xs:enumeration value="Music"/>
+ <xs:enumeration value="Document"/>
+ <xs:enumeration value="Image"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_Hash">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_AlsoSeen">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="type_infringement_type_enumeration">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OTHER"/>
+ <xs:enumeration value="INFRINGEMENT"/>
+ <xs:enumeration value="PRELIT"/>
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="DMCA"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="type_infringement_type">
+ <xs:simpleContent>
+ <xs:extension base="type_infringement_type_enumeration">
+ <xs:attribute name="Retraction" type="xs:boolean"/>
+ <xs:attribute name="Comments" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_ContentMatched">
+ <xs:attribute name="Audio" type="xs:boolean"/>
+ <xs:attribute name="Video" type="xs:boolean"/>
+ <xs:attribute name="Text" type="xs:boolean"/>
+ <xs:attribute name="Image" type="xs:boolean"/>
+ <xs:attribute name="MatchThreshold">
+ <xs:simpleType>
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="100"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Fingerprint" type="xs:boolean"/>
+ <xs:attribute name="Human" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_WatermarkMatched">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="payload" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Asset">
+ <xs:sequence>
+ <xs:element name="OriginalAssetName" type="xs:string"/>
+ <xs:element name="OriginalAssetID" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Detection">
+ <xs:sequence>
+ <xs:element name="Asset" type="type_Asset"/>
+ <xs:element name="ContentMatched" type="type_ContentMatched" minOccurs="0"/>
+ <xs:element name="HashMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="MetadataMatched" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="WatermarkMatched" type="type_WatermarkMatched" minOccurs="0"/>
+ <xs:element name="VerificationID" type="xs:string"/>
+ <xs:element name="VerifiedDataLoc" type="xs:anyURI" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_VerifiedImage">
+ <xs:sequence>
+ <xs:sequence>
+ <xs:element name="VerifiedImageBinary" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attribute name="title" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="VerifiedImageLocation" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI">
+ <xs:attribute name="title"/>
+ <xs:attribute name="username"/>
+ <xs:attribute name="password"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Detection" type="type_Detection"/>
+ <xs:complexType name="type_VerificationLevel">
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:complexType name="type_Verification">
+ <xs:sequence>
+ <xs:element name="VerificationLevel" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attribute name="Type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Declaration">
+ <xs:sequence>
+ <xs:element name="Type" type="xs:string" minOccurs="0"/>
+ <xs:element name="Body" type="xs:string" minOccurs="0"/>
+ <xs:element name="LinkToBody" type="xs:anyURI" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="Verification" type="type_Verification"/>
+ <!--ACNS 2.0 Notice Acknowlegement-->
+ <xs:complexType name="type_NoticeAck">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complianant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:all>
+ <xs:attribute ref="schemaVersion"/>
+ <xs:attribute name="Accepted" type="xs:boolean"/>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="UNKNOWN_RECIPIENT"/>
+ <xs:enumeration value="IP_OUT_OF_RANGE"/>
+ <xs:enumeration value="MULTIPLE"/>
+ <xs:enumeration value="TEXT_XML_MISMATCH"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ <xs:attribute name="Sequence" type="xs:int" use="optional"/>
+ </xs:complexType>
+ <xs:element name="NoticeAck" type="type_NoticeAck"/>
+ <!--ACNS 2.0 Status-->
+ <xs:attributeGroup name="type_contentType">
+ <xs:attribute name="contentType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:attributeGroup>
+ <xs:complexType name="type_BinaryImage">
+ <xs:complexContent>
+ <xs:extension base="xmime:base64Binary"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_CounternoticeContent">
+ <xs:all>
+ <xs:element name="NoticeText" type="xs:string" minOccurs="0"/>
+ <xs:element name="NoticeImage" minOccurs="0">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="type_BinaryImage"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="RejectReason" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="IOWN"/>
+ <xs:enumeration value="FAIRUSEFREESPEECH"/>
+ <xs:enumeration value="MISIDENTIFIED"/>
+ <xs:enumeration value="OTHER"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="OtherReason" type="xs:string" use="optional"/>
+ <xs:attribute name="ProperlySigned" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Consent" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Statement" type="xs:string" use="optional"/>
+ </xs:complexType>
+ <xs:complexType name="type_CounterNotice">
+ <xs:sequence>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Addl_Contact" type="Contact" minOccurs="0"/>
+ <xs:element name="Subscriber" type="Contact"/>
+ <xs:element name="CounternoticeContent" type="type_CounternoticeContent"/>
+ <xs:element name="Notes" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="DMCA" type="xs:boolean"/>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeAckList">
+ <xs:sequence>
+ <xs:element ref="NoticeAck" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusRequest">
+ <xs:sequence>
+ <xs:choice>
+ <xs:element name="Case" type="Case" maxOccurs="unbounded"/>
+ <xs:sequence>
+ <xs:element name="StartDateTime" type="xs:dateTime"/>
+ <xs:element name="EndDateTime" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:choice>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="ServiceProvider" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ <xs:attribute name="TimeStamp" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_UsenetDisposition">
+ <xs:sequence>
+ <xs:element name="Article" type="xs:anyURI"/>
+ <xs:element name="Removed" type="xs:boolean"/>
+ <xs:element name="CancelMsg" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="StatusRequest" type="type_StatusRequest"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice"/>
+ <!--ACNS Status Update (deprecated)-->
+ <xs:complexType name="type_StatusUpdate">
+ <xs:all>
+ <xs:element name="Case" type="Case"/>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="Disposition">
+ <xs:complexType>
+ <xs:attribute name="Status">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="infoStatus" use="optional">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="INFO"/>
+ <xs:enumeration value="ACTION"/>
+ <xs:enumeration value="TERM"/>
+ <xs:enumeration value="NOACTION"/>
+ <xs:enumeration value="NONEPOS"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="Level" type="xs:int"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="DispositionUsenet" type="type_UsenetDisposition" minOccurs="0"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="NoticeAckList" type="type_NoticeAckList" minOccurs="0"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ <xs:element name="StatusUpdate" type="type_StatusUpdate"/>
+ <!--ACNS Notice Status (preferred)-->
+ <xs:complexType name="type_StatusSource">
+ <xs:sequence>
+ <xs:element name="Complainant" type="Contact"/>
+ <xs:element name="Service_Provider" type="Contact"/>
+ <xs:element name="Content" type="type_Content" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_GRStatus">
+ <xs:sequence>
+ <xs:element name="NetworkCaseID" minOccurs="0"/>
+ <xs:element name="NetworkInfringementID" type="xs:string" minOccurs="0"/>
+ <xs:element name="NetworkIncidentID" type="xs:string" minOccurs="0"/>
+ <xs:element name="ActionTaken" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Type" type="xs:string"/>
+ <xs:element name="Time" type="xs:dateTime"/>
+ <xs:element name="AdditionalData" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="UserData" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="AnonUserIdentifier" type="xs:string" minOccurs="0"/>
+ <xs:element name="TotalCaseCount" type="xs:int" minOccurs="0"/>
+ <xs:element name="TotalInfringementCount" type="xs:int" minOccurs="0"/>
+ <xs:element name="TotalIncidentCount" type="xs:int" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_StatusDisposition">
+ <xs:sequence>
+ <xs:element name="Type">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="OPEN"/>
+ <xs:enumeration value="CLOSED"/>
+ <xs:enumeration value="REJECTED"/>
+ <xs:enumeration value="COUNTERNOTICE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Reason" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="FirstProcessedDate" type="xs:dateTime"/>
+ <xs:element name="LastModifiedDate" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_NoticeStatus">
+ <xs:sequence>
+ <xs:element name="Disposition" type="type_StatusDisposition"/>
+ <xs:choice minOccurs="0">
+ <xs:element name="GRStatus" type="type_GRStatus"/>
+ <xs:element name="UsenetStatus" type="type_UsenetDisposition"/>
+ </xs:choice>
+ <xs:element name="Source" type="type_StatusSource" minOccurs="0"/>
+ <xs:element name="HumanInt" type="Contact" minOccurs="0"/>
+ <xs:element name="CounterNotice" type="type_CounterNotice" minOccurs="0"/>
+ <xs:element name="Notes" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CaseID" type="xs:string" use="required"/>
+ <xs:attribute name="TimeStamp" type="xs:dateTime" use="required"/>
+ <xs:attribute name="ReqTime" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:element name="NoticeStatus">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="CaseStatus" type="type_NoticeStatus" maxOccurs="unbounded"/>
+ <xs:sequence minOccurs="0">
+ <xs:element name="StartDateTime" type="xs:dateTime"/>
+ <xs:element name="EndDateTime" type="xs:dateTime"/>
+ </xs:sequence>
+ </xs:sequence>
+ <xs:attribute ref="schemaVersion"/>
+ </xs:complexType>
+ </xs:element>
+ <!--ACNS 2.0 INTERNAL TRACKING (part of 'Infringement')-->
+ <xs:complexType name="type_Subject">
+ <xs:sequence>
+ <xs:element name="SubjectContact" type="Contact"/>
+ <xs:element name="SubjectID">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="type_Disposition">
+ <xs:sequence>
+ <xs:element name="InternalStatus" type="xs:string"/>
+ <xs:element name="Comments" type="xs:string" minOccurs="0"/>
+ <xs:element name="Contact" type="Contact"/>
+ </xs:sequence>
+ <xs:attribute name="Sequence" type="xs:int" use="required"/>
+ <xs:attribute name="Start" type="xs:dateTime" use="required"/>
+ <xs:attribute name="End" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:complexType name="type_IPAssignee">
+ <xs:complexContent>
+ <xs:extension base="type_Subject">
+ <xs:attribute name="Primary" type="xs:boolean"/>
+ <xs:attribute name="Relationship" type="xs:string"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="type_Mapping">
+ <xs:attributeGroup ref="type_OriginalIPPortAttribute"/>
+ <xs:attributeGroup ref="type_MappedIPPortAttribute"/>
+ <xs:attribute name="Time" type="xs:dateTime" use="required"/>
+ <xs:attribute name="LeaseTime" type="xs:time"/>
+ <xs:attribute name="LeaseHeld" type="xs:time"/>
+ </xs:complexType>
+ <xs:complexType name="type_InternalTracking">
+ <xs:sequence>
+ <xs:element name="PrimarySubject" type="type_Subject"/>
+ <xs:element name="Disposition" type="type_Disposition" minOccurs="0"/>
+ <xs:element name="Mapping" type="type_Mapping" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="CurrentSequence" type="xs:int"/>
+ <xs:attribute name="InternalCaseNumber" type="xs:string" use="required"/>
+ </xs:complexType>
+ <!--*** Message Container ***-->
+ <xs:complexType name="type_Message">
+ <xs:choice>
+ <xs:element ref="Infringement"/>
+ <xs:element ref="NoticeAck"/>
+ <xs:element ref="NoticeStatus"/>
+ <xs:element ref="StatusRequest"/>
+ </xs:choice>
+ <xs:attribute name="Type" type="type_MessageName" use="required"/>
+ <xs:attribute name="ID" type="xs:string"/>
+ <xs:attribute name="Created" type="xs:dateTime"/>
+ </xs:complexType>
+ <xs:simpleType name="type_MessageName">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ACNS2.0Notice"/>
+ <xs:enumeration value="ACNS0.7Notice"/>
+ <xs:enumeration value="ACNSNoticeAck"/>
+ <xs:enumeration value="ACNSStatusRequest"/>
+ <xs:enumeration value="ACNSNoticeStatus"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="MessageEnvelope">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Message" type="type_Message" maxOccurs="unbounded"/>
+ <xs:element ref="ds:Signature" minOccurs="0"/>
</xs:sequence>
+ <xs:attribute name="ReplyEmail" type="xs:string"/>
+ <xs:attribute name="ReplyURI" type="xs:string" use="optional"/>
+ <xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:schema>
diff --git a/t/basics.t b/t/basics.t
index 28aa899..7bcc9ac 100644
--- a/t/basics.t
+++ b/t/basics.t
@@ -1,13 +1,17 @@
use strict;
use warnings;
-use Test::More tests => 7;
+use Test::More tests => 19;
use_ok('Parse::ACNS');
-foreach my $v (qw(compat 0.6 0.7)) {
+foreach my $v (qw(compat 0.6 0.7 1.0 1.1 1.2)) {
+ note "testing $v";
my $p = Parse::ACNS->new( version => $v );
ok($p, 'created a new parser instance');
isa_ok($p, 'Parse::ACNS');
+
+ my $reader = $p->reader($v, 'Infringement');
+ ok $reader;
}
diff --git a/t/data/1.1/full.xml b/t/data/1.1/full.xml
new file mode 100644
index 0000000..552ac3e
--- /dev/null
+++ b/t/data/1.1/full.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Infringement xsi:schemaLocation="http://www.acns.net/v1.1/ACNS2v1_1.xsd"
+ xmlns="http://www.movielabs.com/ACNS" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
+<Case>
+<ID>A1234567</ID>
+<Ref_URL>http://www.contentowner.com/trackingid.asp?A1234567</Ref_URL>
+<Status>Open</Status>
+<Severity>Normal</Severity>
+</Case>
+<Complainant>
+<Entity>ScannerVendor, Inc.</Entity>
+<Contact>Jonathan Doe</Contact>
+<Address>100 Anywhere Street, Anywhere, CA 90000, USA</Address>
+<Phone>650-555-5555</Phone>
+<Email>notice at scannervendor.com</Email>
+<ContactURL>https://www.scannervendor.com/complaints.php</ContactURL>
+</Complainant>
+<Service_Provider>
+<Entity>GreatISP</Entity>
+<Contact>Jack Doah</Contact>
+<Address>1234 My Street, Everwhere, NY, 10001, USA</Address>
+<Phone>212-555-5555</Phone>
+<Email>abuse at greatisp.net</Email>
+<ContactURL>http://www.greatisp.net/gotanotice</ContactURL>
+</Service_Provider>
+<Source>
+<TimeStamp>2008-08-30T12:34:53Z</TimeStamp>
+<IP_Address>168.1.1.145</IP_Address>
+<Port>21123</Port>
+<DNS_Name>pcp574.nshville.tn.ispbroadband.net</DNS_Name>
+<MAC_Address>00-00-39-B6-00-A4</MAC_Address>
+<Type>BITTORRENT</Type>
+<SubType Protocol="BITTORRENT" Application="Azureus" BaseType="P2P"></SubType>
+<Number_Files>1</Number_Files>
+</Source>
+<Content>
+<Item>
+<TimeStamp>2008-08-30T12:34:53Z</TimeStamp>
+<AlsoSeen Start="2008-08-30T12:34:53Z" End="2008-08-30T14:32:00Z"></AlsoSeen>
+<AlsoSeen Start="2008-08-30T18:04:22Z" End="2008-08-30T20:45:23Z"></AlsoSeen>
+<Title>8 Mile</Title>
+<FileName>8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent</FileName>
+<FileSize>734013472</FileSize>
+<Type>Movie</Type>
+<ExplicitType>Movie</ExplicitType>
+<Hash Type="SHA1">6AF9F5BF5493B6BB72F15F77C2E541D606328AEA</Hash>
+</Item>
+</Content>
+<History>
+<Notice ID="A1234567" TimeStamp="2008-08-30T20:46:00Z"><![CDATA[
+Dear ISP,
+It has come to our attention that on August 30, 2008 a subscriber was
+uploading the movie 8 Mile using Azureus. We respectfully request that you
+ask your subscriber to delete this file and stop making it available on P2P
+networks.
+The specifics follow:
+Notice: A1234567
+Time first seen: 2008-08-30T12:34:53Z
+Title: 8 Mile
+FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+FileSize" 734013472
+Type: Movie
+SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+If you have any questions, please contact:
+Jonathan Doe
+ScannerVendor,
+100 Anywhere Street
+Anywhere, CA 90000, USA
+650-555-5555
+notice at scannervendor.com
+or use your login to
+https://www.scannervendor.com/complaints.php and reference notice A1234567
+Best Regards,
+Jon
+]]>
+</Notice>
+</History>
+<Type Retraction="false" Comments="Informational Notice">INFO</Type>
+<Detection>
+<Asset>
+<OriginalAssetName>8 Mile</OriginalAssetName>
+<OriginalAssetID type="ISAN">0000-0000-F23C-0000-J-0000-0000-H</OriginalAssetID>
+</Asset>
+<ContentMatched Fingerprint="true" Video="true" Audio="true" MatchThreshold="100" Human="true"/>
+<HashMatched>true</HashMatched>
+<MetadataMatched>true</MetadataMatched>
+<VerificationID> SuperMatcher v2.7 Build 302</VerificationID>
+</Detection>
+<InternalTracking InternalCaseNumber="ISP1234567" CurrentSequence="1">
+<PrimarySubject>
+<SubjectContact>
+<Entity>Subject Contact Inc.</Entity>
+<Contact>Joe Pirate</Contact>
+<Address>100 My Street, Anywhere, CA 90000</Address>
+<Phone>310-555-5555</Phone>
+<Email>joe_pirate at isp.net</Email>
+</SubjectContact>
+<SubjectID type="SubscriberNum">Sub123549991</SubjectID>
+</PrimarySubject>
+<Disposition Start="2008-12-17T09:30:47.0Z" End="2008-12-17T09:30:47.0Z" Sequence="0">
+<InternalStatus>2nd Notice</InternalStatus>
+<Comments>Having difficulty reaching subscriber</Comments>
+<Contact>
+<Entity>ISP Inc</Entity>
+<Contact>Julie Doe, Abuse Coordinator</Contact>
+<Phone>310-555-5556</Phone>
+<Email>julie_doe at isp.net</Email>
+</Contact>
+</Disposition>
+<Mapping OriginalIP="168.0.0.143" OriginalPort="21123"
+MappedIP="10.1.223.17" MappedPort="6881" LeaseTime="12:00:00.0"
+LeaseHeld="16:20:00.0Z" Time="2008-08-30T12:35:00Z" />
+</InternalTracking>
+<TextNotice><![CDATA[
+Dear ISP,
+It has come to our attention that on August 30, 2008 a subscriber was
+uploading the movie 8 Mile using Azureus. We respectfully request that you
+ask your subscriber to delete this file and stop making it available on P2P
+networks.
+The specifics follow:
+Notice: A1234567
+Time first seen: 2008-08-30T12:34:53Z
+Title: 8 Mile
+FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+FileSize" 734013472
+Type: Movie
+SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+If you have any questions, please contact:
+Jonathan Doe
+ScannerVendor,
+100 Anywhere Street
+Anywhere, CA 90000, USA
+650-555-5555
+notice at scannervendor.com
+or use your login to
+https://www.scannervendor.com/complaints.php and reference notice A1234567
+Best Regards,
+Jon
+]]></TextNotice>
+</Infringement>
\ No newline at end of file
diff --git a/t/data/1.1/full.yaml b/t/data/1.1/full.yaml
new file mode 100644
index 0000000..6798dd9
--- /dev/null
+++ b/t/data/1.1/full.yaml
@@ -0,0 +1,160 @@
+---
+Case:
+ ID: A1234567
+ Ref_URL: http://www.contentowner.com/trackingid.asp?A1234567
+ Severity: Normal
+ Status: Open
+Complainant:
+ Address: '100 Anywhere Street, Anywhere, CA 90000, USA'
+ Contact: Jonathan Doe
+ ContactURL: https://www.scannervendor.com/complaints.php
+ Email: notice at scannervendor.com
+ Entity: 'ScannerVendor, Inc.'
+ Phone: 650-555-5555
+Content:
+ Item:
+ - AlsoSeen:
+ - End: 2008-08-30T14:32:00Z
+ Start: 2008-08-30T12:34:53Z
+ _: ''
+ - End: 2008-08-30T20:45:23Z
+ Start: 2008-08-30T18:04:22Z
+ _: ''
+ ExplicitType: Movie
+ FileName: '8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent'
+ FileSize: 734013472
+ Hash:
+ Type: SHA1
+ _: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ TimeStamp: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ Type: Movie
+Detection:
+ Asset:
+ OriginalAssetID:
+ _: 0000-0000-F23C-0000-J-0000-0000-H
+ type: ISAN
+ OriginalAssetName: 8 Mile
+ ContentMatched:
+ Audio: 1
+ Fingerprint: 1
+ Human: 1
+ MatchThreshold: 100
+ Video: 1
+ HashMatched: 1
+ MetadataMatched: 1
+ VerificationID: ' SuperMatcher v2.7 Build 302'
+History:
+ Notice:
+ - ID: A1234567
+ TimeStamp: 2008-08-30T20:46:00Z
+ _: |+2
+
+ Dear ISP,
+ It has come to our attention that on August 30, 2008 a subscriber was
+ uploading the movie 8 Mile using Azureus. We respectfully request that you
+ ask your subscriber to delete this file and stop making it available on P2P
+ networks.
+ The specifics follow:
+ Notice: A1234567
+ Time first seen: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+ FileSize" 734013472
+ Type: Movie
+ SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ If you have any questions, please contact:
+ Jonathan Doe
+ ScannerVendor,
+ 100 Anywhere Street
+ Anywhere, CA 90000, USA
+ 650-555-5555
+ notice at scannervendor.com
+ or use your login to
+ https://www.scannervendor.com/complaints.php and reference notice A1234567
+ Best Regards,
+ Jon
+
+InternalTracking:
+ - CurrentSequence: 1
+ Disposition:
+ Comments: Having difficulty reaching subscriber
+ Contact:
+ Contact: 'Julie Doe, Abuse Coordinator'
+ Email: julie_doe at isp.net
+ Entity: ISP Inc
+ Phone: 310-555-5556
+ End: 2008-12-17T09:30:47.0Z
+ InternalStatus: 2nd Notice
+ Sequence: 0
+ Start: 2008-12-17T09:30:47.0Z
+ InternalCaseNumber: ISP1234567
+ Mapping:
+ LeaseHeld: 16:20:00.0Z
+ LeaseTime: 12:00:00.0
+ MappedIP: 10.1.223.17
+ MappedPort: 6881
+ OriginalIP: 168.0.0.143
+ OriginalPort: 21123
+ Time: 2008-08-30T12:35:00Z
+ PrimarySubject:
+ SubjectContact:
+ Address: '100 My Street, Anywhere, CA 90000'
+ Contact: Joe Pirate
+ Email: joe_pirate at isp.net
+ Entity: Subject Contact Inc.
+ Phone: 310-555-5555
+ SubjectID:
+ _: Sub123549991
+ type: SubscriberNum
+Service_Provider:
+ Address: '1234 My Street, Everwhere, NY, 10001, USA'
+ Contact: Jack Doah
+ ContactURL: http://www.greatisp.net/gotanotice
+ Email: abuse at greatisp.net
+ Entity: GreatISP
+ Phone: 212-555-5555
+Source:
+ DNS_Name: pcp574.nshville.tn.ispbroadband.net
+ IP_Address: 168.1.1.145
+ MAC_Address: 00-00-39-B6-00-A4
+ Number_Files: 1
+ Port: 21123
+ SubType:
+ Application: Azureus
+ BaseType: P2P
+ Protocol: BITTORRENT
+ _: ''
+ TimeStamp: 2008-08-30T12:34:53Z
+ Type: BITTORRENT
+TextNotice: |2
+
+ Dear ISP,
+ It has come to our attention that on August 30, 2008 a subscriber was
+ uploading the movie 8 Mile using Azureus. We respectfully request that you
+ ask your subscriber to delete this file and stop making it available on P2P
+ networks.
+ The specifics follow:
+ Notice: A1234567
+ Time first seen: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+ FileSize" 734013472
+ Type: Movie
+ SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ If you have any questions, please contact:
+ Jonathan Doe
+ ScannerVendor,
+ 100 Anywhere Street
+ Anywhere, CA 90000, USA
+ 650-555-5555
+ notice at scannervendor.com
+ or use your login to
+ https://www.scannervendor.com/complaints.php and reference notice A1234567
+ Best Regards,
+ Jon
+
+Type:
+ Comments: Informational Notice
+ Retraction: 0
+ _: INFO
diff --git a/t/data/1.2/full.xml b/t/data/1.2/full.xml
new file mode 100644
index 0000000..48471df
--- /dev/null
+++ b/t/data/1.2/full.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Infringement xsi:schemaLocation="http://www.acns.net/v1.1/ACNS2v1_1.xsd"
+xmlns="http://www.acns.net/ACNS" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
+<Case>
+<ID>A1234567</ID>
+<Ref_URL>http://www.contentowner.com/trackingid.asp?A1234567</Ref_URL>
+<Status>Open</Status>
+<Severity>Normal</Severity>
+</Case>
+<Complainant>
+<Entity>ScannerVendor, Inc.</Entity>
+<Contact>Jonathan Doe</Contact>
+<Address>100 Anywhere Street, Anywhere, CA 90000, USA</Address>
+<Phone>650-555-5555</Phone>
+<Email>notice at scannervendor.com</Email>
+<ContactURL>https://www.scannervendor.com/complaints.php</ContactURL>
+</Complainant>
+<Service_Provider>
+<Entity>GreatISP</Entity>
+<Contact>Jack Doah</Contact>
+<Address>1234 My Street, Everwhere, NY, 10001, USA</Address>
+<Phone>212-555-5555</Phone>
+<Email>abuse at greatisp.net</Email>
+<ContactURL>http://www.greatisp.net/gotanotice</ContactURL>
+</Service_Provider>
+<Source>
+<TimeStamp>2008-08-30T12:34:53Z</TimeStamp>
+<IP_Address>168.1.1.145</IP_Address>
+<Port>21123</Port>
+<DNS_Name>pcp574.nshville.tn.ispbroadband.net</DNS_Name>
+<MAC_Address>00-00-39-B6-00-A4</MAC_Address>
+<Type>BITTORRENT</Type>
+<SubType Protocol="BITTORRENT" Application="Azureus" BaseType="P2P"></SubType>
+<Number_Files>1</Number_Files>
+</Source>
+<Content>
+<Item>
+<TimeStamp>2008-08-30T12:34:53Z</TimeStamp>
+<AlsoSeen Start="2008-08-30T12:34:53Z" End="2008-08-30T14:32:00Z"></AlsoSeen>
+<AlsoSeen Start="2008-08-30T18:04:22Z" End="2008-08-30T20:45:23Z"></AlsoSeen>
+<Title>8 Mile</Title>
+<FileName>8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent</FileName>
+<FileSize>734013472</FileSize>
+<Type>Movie</Type>
+<ExplicitType>Movie</ExplicitType>
+<Hash Type="SHA1">6AF9F5BF5493B6BB72F15F77C2E541D606328AEA</Hash>
+</Item>
+</Content>
+<History>
+<Notice ID="A1234567" TimeStamp="2008-08-30T20:46:00Z"><![CDATA[
+Dear ISP,
+It has come to our attention that on August 30, 2008 a subscriber was
+uploading the movie 8 Mile using Azureus. We respectfully request that you
+ask your subscriber to delete this file and stop making it available on P2P
+networks.
+The specifics follow:
+Notice: A1234567
+Time first seen: 2008-08-30T12:34:53Z
+Title: 8 Mile
+FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+FileSize" 734013472
+Type: Movie
+SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+If you have any questions, please contact:
+Jonathan Doe
+ScannerVendor,
+100 Anywhere Street
+Anywhere, CA 90000, USA
+650-555-5555
+notice at scannervendor.com
+or use your login to
+https://www.scannervendor.com/complaints.php and reference notice A1234567
+Best Regards,
+Jon
+]]>
+</Notice>
+</History>
+<Type Retraction="false" Comments="Informational Notice">INFO</Type>
+<Detection>
+<Asset>
+<OriginalAssetName>8 Mile</OriginalAssetName>
+<OriginalAssetID type="ISAN">0000-0000-F23C-0000-J-0000-0000-H</OriginalAssetID>
+</Asset>
+<ContentMatched Fingerprint="true" Video="true" Audio="true" MatchThreshold="100" Human="true"/>
+<HashMatched>true</HashMatched>
+<MetadataMatched>true</MetadataMatched>
+<VerificationID> SuperMatcher v2.7 Build 302</VerificationID>
+</Detection>
+<InternalTracking InternalCaseNumber="ISP1234567" CurrentSequence="1">
+<PrimarySubject>
+<SubjectContact>
+<Entity>Subject Contact Inc.</Entity>
+<Contact>Joe Pirate</Contact>
+<Address>100 My Street, Anywhere, CA 90000</Address>
+<Phone>310-555-5555</Phone>
+<Email>joe_pirate at isp.net</Email>
+</SubjectContact>
+<SubjectID type="SubscriberNum">Sub123549991</SubjectID>
+</PrimarySubject>
+<Disposition Start="2008-12-17T09:30:47.0Z" End="2008-12-17T09:30:47.0Z" Sequence="0">
+<InternalStatus>2nd Notice</InternalStatus>
+<Comments>Having difficulty reaching subscriber</Comments>
+<Contact>
+<Entity>ISP Inc</Entity>
+<Contact>Julie Doe, Abuse Coordinator</Contact>
+<Phone>310-555-5556</Phone>
+<Email>julie_doe at isp.net</Email>
+</Contact>
+</Disposition>
+<Mapping OriginalIP="168.0.0.143" OriginalPort="21123"
+MappedIP="10.1.223.17" MappedPort="6881" LeaseTime="12:00:00.0"
+LeaseHeld="16:20:00.0Z" Time="2008-08-30T12:35:00Z" />
+</InternalTracking>
+<TextNotice><![CDATA[
+Dear ISP,
+It has come to our attention that on August 30, 2008 a subscriber was
+uploading the movie 8 Mile using Azureus. We respectfully request that you
+ask your subscriber to delete this file and stop making it available on P2P
+networks.
+The specifics follow:
+Notice: A1234567
+Time first seen: 2008-08-30T12:34:53Z
+Title: 8 Mile
+FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+FileSize" 734013472
+Type: Movie
+SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+If you have any questions, please contact:
+Jonathan Doe
+ScannerVendor,
+100 Anywhere Street
+Anywhere, CA 90000, USA
+650-555-5555
+notice at scannervendor.com
+or use your login to
+https://www.scannervendor.com/complaints.php and reference notice A1234567
+Best Regards,
+Jon
+]]></TextNotice>
+</Infringement>
\ No newline at end of file
diff --git a/t/data/1.2/full.yaml b/t/data/1.2/full.yaml
new file mode 100644
index 0000000..de90688
--- /dev/null
+++ b/t/data/1.2/full.yaml
@@ -0,0 +1,161 @@
+---
+Case:
+ ID: A1234567
+ Ref_URL: http://www.contentowner.com/trackingid.asp?A1234567
+ Severity: Normal
+ Status: Open
+Complainant:
+ Address: '100 Anywhere Street, Anywhere, CA 90000, USA'
+ Contact: Jonathan Doe
+ ContactURL: https://www.scannervendor.com/complaints.php
+ Email: notice at scannervendor.com
+ Entity: 'ScannerVendor, Inc.'
+ Phone: 650-555-5555
+Content:
+ Item:
+ - AlsoSeen:
+ - End: 2008-08-30T14:32:00Z
+ Start: 2008-08-30T12:34:53Z
+ _: ''
+ - End: 2008-08-30T20:45:23Z
+ Start: 2008-08-30T18:04:22Z
+ _: ''
+ ExplicitType: Movie
+ FileName: '8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent'
+ FileSize: 734013472
+ Hash:
+ Type: SHA1
+ _: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ TimeStamp: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ Type: Movie
+Detection:
+ Asset:
+ OriginalAssetID:
+ _: 0000-0000-F23C-0000-J-0000-0000-H
+ type: ISAN
+ OriginalAssetName: 8 Mile
+ ContentMatched:
+ Audio: 1
+ Fingerprint: 1
+ Human: 1
+ MatchThreshold: 100
+ Video: 1
+ HashMatched: 1
+ MetadataMatched: 1
+ VerificationID: ' SuperMatcher v2.7 Build 302'
+History:
+ Notice:
+ - ID: A1234567
+ TimeStamp: 2008-08-30T20:46:00Z
+ _: |+2
+
+ Dear ISP,
+ It has come to our attention that on August 30, 2008 a subscriber was
+ uploading the movie 8 Mile using Azureus. We respectfully request that you
+ ask your subscriber to delete this file and stop making it available on P2P
+ networks.
+ The specifics follow:
+ Notice: A1234567
+ Time first seen: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+ FileSize" 734013472
+ Type: Movie
+ SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ If you have any questions, please contact:
+ Jonathan Doe
+ ScannerVendor,
+ 100 Anywhere Street
+ Anywhere, CA 90000, USA
+ 650-555-5555
+ notice at scannervendor.com
+ or use your login to
+ https://www.scannervendor.com/complaints.php and reference notice A1234567
+ Best Regards,
+ Jon
+
+InternalTracking:
+ - CurrentSequence: 1
+ Disposition:
+ Comments: Having difficulty reaching subscriber
+ Contact:
+ Contact: 'Julie Doe, Abuse Coordinator'
+ Email: julie_doe at isp.net
+ Entity: ISP Inc
+ Phone: 310-555-5556
+ End: 2008-12-17T09:30:47.0Z
+ InternalStatus: 2nd Notice
+ Sequence: 0
+ Start: 2008-12-17T09:30:47.0Z
+ InternalCaseNumber: ISP1234567
+ Mapping:
+ LeaseHeld: 16:20:00.0Z
+ LeaseTime: 12:00:00.0
+ MappedIP: 10.1.223.17
+ MappedPort: 6881
+ OriginalIP: 168.0.0.143
+ OriginalPort: 21123
+ Time: 2008-08-30T12:35:00Z
+ PrimarySubject:
+ SubjectContact:
+ Address: '100 My Street, Anywhere, CA 90000'
+ Contact: Joe Pirate
+ Email: joe_pirate at isp.net
+ Entity: Subject Contact Inc.
+ Phone: 310-555-5555
+ SubjectID:
+ _: Sub123549991
+ type: SubscriberNum
+Service_Provider:
+ Address: '1234 My Street, Everwhere, NY, 10001, USA'
+ Contact: Jack Doah
+ ContactURL: http://www.greatisp.net/gotanotice
+ Email: abuse at greatisp.net
+ Entity: GreatISP
+ Phone: 212-555-5555
+Source:
+ DNS_Name: pcp574.nshville.tn.ispbroadband.net
+ IP_Address: 168.1.1.145
+ MAC_Address: 00-00-39-B6-00-A4
+ Number_Files: 1
+ Port: 21123
+ SubType:
+ Application: Azureus
+ BaseType: P2P
+ Protocol: BITTORRENT
+ _: ''
+ TimeStamp: 2008-08-30T12:34:53Z
+ Type: BITTORRENT
+TextNotice: |2
+
+ Dear ISP,
+ It has come to our attention that on August 30, 2008 a subscriber was
+ uploading the movie 8 Mile using Azureus. We respectfully request that you
+ ask your subscriber to delete this file and stop making it available on P2P
+ networks.
+ The specifics follow:
+ Notice: A1234567
+ Time first seen: 2008-08-30T12:34:53Z
+ Title: 8 Mile
+ FileName: 8_Mile[2002]DvDrip[Eng].4473459.TPB.torrent
+ FileSize" 734013472
+ Type: Movie
+ SHA1 hash: 6AF9F5BF5493B6BB72F15F77C2E541D606328AEA
+ If you have any questions, please contact:
+ Jonathan Doe
+ ScannerVendor,
+ 100 Anywhere Street
+ Anywhere, CA 90000, USA
+ 650-555-5555
+ notice at scannervendor.com
+ or use your login to
+ https://www.scannervendor.com/complaints.php and reference notice A1234567
+ Best Regards,
+ Jon
+
+Type:
+ Comments: Informational Notice
+ Retraction: 0
+ _: INFO
+schemaVersion: 1.2
diff --git a/t/parse.t b/t/parse.t
index e22be7e..1ee12db 100644
--- a/t/parse.t
+++ b/t/parse.t
@@ -1,26 +1,28 @@
use strict;
use warnings;
-use Test::More tests => 9;
+use Test::More tests => 17;
use File::Spec;
use YAML::Any qw(LoadFile);
use_ok('Parse::ACNS');
-foreach my $spec (qw(0.6 0.7)) {
+foreach my $spec (qw(0.6 0.7 1.0 1.1 1.2)) {
foreach my $file ( glob File::Spec->catfile(qw(t data), $spec, '*.xml') ) {
foreach my $version ( $spec, 'compat' ) {
+ note "parsing $file in $version mode";
my $p = Parse::ACNS->new( version => $version );
my $got = $p->parse( XML::LibXML->new->parse_file( $file ) );
ok($got, "parsed '$file' in $version version mode");
- my $expected = LoadFile( substr($file, 0, -3) .'yaml' );
- is_deeply($got, $expected, 'data matches expected');
if ( $ENV{'TEST_VERBOSE'} ) {
require Data::Dumper;
- diag( Data::Dumper::Dumper( $got ) );
+ # diag( Data::Dumper::Dumper( $got ) );
+ }
+ my $expected = LoadFile( substr($file, 0, -3) .'yaml' );
+ if ( $version eq 'compat' ) {
+ delete $_->{'schemaVersion'} for $got, $expected;
}
+ is_deeply($got, $expected, 'data matches expected');
}
}
}
-
-
commit 855fa6b0d861884f9e022a4d48db803e438fedbb
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date: Sun Feb 24 15:55:12 2013 +0400
bump version, 0.04
diff --git a/Changes b/Changes
index 3a67f69..632d8d6 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,7 @@
+0.04 2013-02-24
+
+ * support for ACNS 2.0, schema versions 1.0, 1.1 and 1.2.
+
0.03 2011-02-04
* no changes, just fix for git tags
diff --git a/MANIFEST b/MANIFEST
index f8d7415..eee1be7 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,3 @@
-.gitignore
Changes
inc/Module/Install.pm
inc/Module/Install/Base.pm
@@ -15,12 +14,21 @@ Makefile.PL
MANIFEST This list of files
META.yml
README
-share/schema/0.6/infringement.xsd
-share/schema/0.7/infringement.xsd
-share/schema/compat/infringement.xsd
+share/schema/0.6/acns.xsd
+share/schema/0.7/acns.xsd
+share/schema/1.0/acns.xsd
+share/schema/1.1/acns.xsd
+share/schema/1.2/acns.xsd
+share/schema/compat/acns.xsd
+share/schema/xmldsig.xsd
+share/schema/xmlmime.xsd
t/basics.t
t/data/0.6/full.xml
t/data/0.6/full.yaml
t/data/0.7/full.xml
t/data/0.7/full.yaml
+t/data/1.1/full.xml
+t/data/1.1/full.yaml
+t/data/1.2/full.xml
+t/data/1.2/full.yaml
t/parse.t
diff --git a/META.yml b/META.yml
index 02585af..62247d7 100644
--- a/META.yml
+++ b/META.yml
@@ -3,14 +3,15 @@ abstract: 'parser for Automated Copyright Notice System (ACNS) XML'
author:
- 'Ruslan Zakirov <ruz at bestpractical.com>'
build_requires:
- ExtUtils::MakeMaker: 6.42
+ ExtUtils::MakeMaker: 6.59
File::Spec: 0
Test::More: 0
YAML::Any: 0
configure_requires:
- ExtUtils::MakeMaker: 6.42
+ ExtUtils::MakeMaker: 6.59
distribution_type: module
-generated_by: 'Module::Install version 1.00'
+dynamic_config: 1
+generated_by: 'Module::Install version 1.06'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -31,4 +32,4 @@ requires:
perl: 5.8.0
resources:
license: http://dev.perl.org/licenses/
-version: 0.03
+version: 0.04
diff --git a/README b/README
index cad3d31..1d227b0 100644
--- a/README
+++ b/README
@@ -10,24 +10,41 @@ DESCRIPTION
royalty free system that universities, ISP's, or anyone that handles
large volumes of copyright notices can implement on their network to
increase the efficiency and reduce the costs of responding to the
- notices... See "http://mpto.unistudios.com/xml/" for more details.
+ notices...
- This module parses ACNS XML into a perl data structure. Supports both
- 0.6 and 0.7 version. Parser strictly follows XML Schemas, so throws
- errors on malformed data.
+ See <http://acns.net> for more details.
+
+ This module parses ACNS XML into a perl data structure. Supports 1.2,
+ 1.1, 1.0, 0.7 and 0.6 revisions of the spec. Parser strictly follows XML
+ Schemas, so throws errors on malformed data.
However, it doesn't extract ACNS XML from email messages.
+SOME ACNS BACKGROUND
+ NBC Universal and UMG <http://mpto.unistudios.com/xml/> released two
+ revisions of the spec (0.6 and 0.7).
+
+ Motion Picture Laboratories, Inc. <http://www.movielabs.com/ACNS> took
+ over and named it ACNS 2.0 and released revisions 1.0, 1.1 and several
+ sub-revisions with letters (1.1f, 1.1j, 1.1p).
+
+ Then it was moved once again to <http://www.acns.net/spec.html> and
+ revision 1.2 was released.
+
METHODS
new
Constructor, takes list of named arguments.
version - version of the specification
- compat - default value, can parse both 0.7 and 0.6 XML by making
- TimeStamp element in Infringement/Content/Item optional. This is the
- only difference between the spec versions.
- 0.7 or 0.6 - strict parsing of the specified version.
+ compat
+ default value, can parse 1.2 to 0.6 XML. Revision 1.2 is
+ backwards compatible with 0.7. Compat schema makes TimeStamp in
+ Infringement/Content/Item optional to make it compatible with
+ 0.6 revision. Everything else new in 1.2 is optional.
+
+ 1.2, 1.1, 1.0, 0.7 or 0.6
+ strict parsing of the specified version.
parse
my $data = Parse::ACNS->new->parse( XML::LibXML->load_xml(...) );
@@ -36,6 +53,16 @@ METHODS
perl struture. Read XML::LibXML::Parser on parsing from different
sources.
+ Newer versions of the spec describe more messages besides
+ "<Infringement>", for example "<StatusUpdate>". Top level element is not
+ returned as part of the result, but you always can get it from XML
+ document:
+
+ $xml_doc->documentElement->nodeName;
+
+ To simplify implementation of compat version parsing document can be
+ changed. At this moment XML namespace is adjusted on all elements.
+
Returned data structure follows XML and its Schema, for example:
{
diff --git a/lib/Parse/ACNS.pm b/lib/Parse/ACNS.pm
index 876f323..0509ac8 100644
--- a/lib/Parse/ACNS.pm
+++ b/lib/Parse/ACNS.pm
@@ -4,7 +4,7 @@ use warnings;
package Parse::ACNS;
-our $VERSION = '0.03';
+our $VERSION = '0.04';
=head1 NAME
-----------------------------------------------------------------------
More information about the Bps-public-commit
mailing list