1 /************************************************************************
\r
3 ** Copyright (C) 2010 Strahinja Markovic
\r
5 ** This file is part of FlightCrew.
\r
7 ** FlightCrew is free software: you can redistribute it and/or modify
\r
8 ** it under the terms of the GNU Lesser General Public License as published
\r
9 ** by the Free Software Foundation, either version 3 of the License, or
\r
10 ** (at your option) any later version.
\r
12 ** FlightCrew is distributed in the hope that it will be useful,
\r
13 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 ** GNU Lesser General Public License for more details.
\r
17 ** You should have received a copy of the GNU Lesser General Public License
\r
18 ** along with FlightCrew. If not, see <http://www.gnu.org/licenses/>.
\r
20 *************************************************************************/
\r
23 #include "MetadataAllowedChildren.h"
\r
24 #include <ToXercesStringConverter.h>
\r
25 #include <FromXercesStringConverter.h>
\r
26 #include <XmlUtils.h>
\r
28 namespace FlightCrew
\r
31 // These have to go here; otherwise, we get the static initialization order fiasco
\r
32 const std::string MAIN_XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
\r
33 const std::string OPF_XML_NAMESPACE = "http://www.idpf.org/2007/opf";
\r
34 const std::string DC_XML_NAMESPACE = "http://purl.org/dc/elements/1.1/";
\r
35 const std::string NCX_XML_NAMESPACE = "http://www.daisy.org/z3986/2005/ncx/";
\r
37 const QName DC_METADATA_QNAME = QName( "dc-metadata", OPF_XML_NAMESPACE );
\r
38 const QName X_METADATA_QNAME = QName( "x-metadata", OPF_XML_NAMESPACE );
\r
40 const QName TITLE_QNAME = QName( "title", DC_XML_NAMESPACE );
\r
41 const QName LANGUAGE_QNAME = QName( "language", DC_XML_NAMESPACE );
\r
42 const QName IDENTIFIER_QNAME = QName( "identifier", DC_XML_NAMESPACE );
\r
43 const QName CREATOR_QNAME = QName( "creator", DC_XML_NAMESPACE );
\r
44 const QName SUBJECT_QNAME = QName( "subject", DC_XML_NAMESPACE );
\r
45 const QName DESCRIPTION_QNAME = QName( "description", DC_XML_NAMESPACE );
\r
46 const QName PUBLISHER_QNAME = QName( "publisher", DC_XML_NAMESPACE );
\r
47 const QName CONTRIBUTOR_QNAME = QName( "contributor", DC_XML_NAMESPACE );
\r
48 const QName DATE_QNAME = QName( "date", DC_XML_NAMESPACE );
\r
49 const QName TYPE_QNAME = QName( "type", DC_XML_NAMESPACE );
\r
50 const QName FORMAT_QNAME = QName( "format", DC_XML_NAMESPACE );
\r
51 const QName SOURCE_QNAME = QName( "source", DC_XML_NAMESPACE );
\r
52 const QName RELATION_QNAME = QName( "relation", DC_XML_NAMESPACE );
\r
53 const QName COVERAGE_QNAME = QName( "coverage", DC_XML_NAMESPACE );
\r
54 const QName RIGHTS_QNAME = QName( "rights", DC_XML_NAMESPACE );
\r
55 const QName META_QNAME = QName( "meta", OPF_XML_NAMESPACE );
\r
58 std::vector< Result > MetadataAllowedChildren::ValidateXml(
\r
59 const xc::DOMDocument &document,
\r
62 xc::DOMNodeList *metadatas = document.getElementsByTagNameNS(
\r
63 toX( OPF_XML_NAMESPACE ), toX( "metadata" ) );
\r
65 std::vector< Result > results;
\r
67 if ( metadatas->getLength() < 1 )
\r
71 xc::DOMElement* metadata = static_cast< xc::DOMElement* >( metadatas->item( 0 ) );
\r
72 std::vector< xc::DOMElement* > children = xe::GetElementChildren( *metadata );
\r
74 // A <metadata> element can have either a dc-metadata element and an optional
\r
75 // x-metadata element, OR the standard children (title, creator, language etc.)
\r
76 // plus any other child not in the reserved namespaces.
\r
77 // See the OPF schema:
\r
78 // http://www.idpf.org/doc_library/epub/OPF_2.0.1_draft.htm#AppendixA
\r
80 if ( xe::ElementListContains( children, DC_METADATA_QNAME ) ||
\r
81 xe::ElementListContains( children, X_METADATA_QNAME ) )
\r
83 std::vector< Result > subresults = ValidateDCXChildrenSubset( children );
\r
84 results.insert( results.end(), subresults.begin(), subresults.end() );
\r
89 std::vector< Result > subresults = ValidateStandardChildren( children );
\r
90 results.insert( results.end(), subresults.begin(), subresults.end() );
\r
97 std::vector< Result > MetadataAllowedChildren::ValidateDCXChildrenSubset(
\r
98 std::vector< xc::DOMElement* > children )
\r
100 std::vector< Result > results;
\r
102 for ( uint i = 0; i < children.size(); ++i )
\r
104 xc::DOMElement *child = children[ i ];
\r
105 QName current_qname( fromX( child->getLocalName() ),
\r
106 fromX( child->getNamespaceURI() ) );
\r
108 if ( current_qname != DC_METADATA_QNAME &&
\r
109 current_qname != X_METADATA_QNAME
\r
112 results.push_back( NotAllowedChildResult( *children[ i ] ) );
\r
120 std::vector< Result > MetadataAllowedChildren::ValidateStandardChildren(
\r
121 std::vector< xc::DOMElement* > children )
\r
123 std::vector< Result > results;
\r
125 for ( uint i = 0; i < children.size(); ++i )
\r
127 std::string local_name = fromX( children[ i ]->getLocalName() );
\r
128 std::string namespace_name = fromX( children[ i ]->getNamespaceURI() );
\r
129 QName child_qname( local_name, namespace_name );
\r
131 if ( child_qname != TITLE_QNAME &&
\r
132 child_qname != LANGUAGE_QNAME &&
\r
133 child_qname != IDENTIFIER_QNAME &&
\r
134 child_qname != CREATOR_QNAME &&
\r
135 child_qname != SUBJECT_QNAME &&
\r
136 child_qname != DESCRIPTION_QNAME &&
\r
137 child_qname != PUBLISHER_QNAME &&
\r
138 child_qname != CONTRIBUTOR_QNAME &&
\r
139 child_qname != DATE_QNAME &&
\r
140 child_qname != TYPE_QNAME &&
\r
141 child_qname != FORMAT_QNAME &&
\r
142 child_qname != SOURCE_QNAME &&
\r
143 child_qname != RELATION_QNAME &&
\r
144 child_qname != COVERAGE_QNAME &&
\r
145 child_qname != RIGHTS_QNAME &&
\r
146 child_qname != META_QNAME
\r
149 if ( namespace_name == OPF_XML_NAMESPACE ||
\r
150 namespace_name == DC_XML_NAMESPACE
\r
153 results.push_back( NotAllowedChildResult( *children[ i ] ) );
\r
161 } //namespace FlightCrew