/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.rdfxml.xmloutput; import java.io.*; import org.apache.jena.rdf.model.* ; import org.apache.jena.rdf.model.test.ModelTestBase ; import org.apache.jena.rdfxml.xmloutput.impl.BaseXMLWriter ; import org.apache.jena.vocabulary.RDF ; /** Tests for entities being created corresponding to prefixes. */ public class TestEntityOutput extends ModelTestBase { public TestEntityOutput( String name ) { super( name ); } public void testSettingWriterEntityProperty() { FakeBaseWriter w = new FakeBaseWriter(); assertEquals( false, w.getShowDoctypeDeclaration() ); assertEquals( "false", w.setProperty( "showDoctypeDeclaration", "true" ) ); assertEquals( true, w.getShowDoctypeDeclaration() ); assertEquals( "true", w.setProperty( "showDoctypeDeclaration", "false" ) ); assertEquals( false, w.getShowDoctypeDeclaration() ); // assertEquals( "false", w.setProperty( "showDoctypeDeclaration", Boolean.TRUE ) ); assertEquals( true, w.getShowDoctypeDeclaration() ); assertEquals( "true", w.setProperty( "showDoctypeDeclaration", Boolean.FALSE ) ); assertEquals( false, w.getShowDoctypeDeclaration() ); } public void testKnownEntityNames() { BaseXMLWriter w = new FakeBaseWriter(); assertEquals( true, w.isPredefinedEntityName( "lt" ) ); assertEquals( true, w.isPredefinedEntityName( "gt" ) ); assertEquals( true, w.isPredefinedEntityName( "amp" ) ); assertEquals( true, w.isPredefinedEntityName( "apos" ) ); assertEquals( true, w.isPredefinedEntityName( "quot" ) ); // assertEquals( false, w.isPredefinedEntityName( "alt" ) ); assertEquals( false, w.isPredefinedEntityName( "amper" ) ); assertEquals( false, w.isPredefinedEntityName( "tapost" ) ); assertEquals( false, w.isPredefinedEntityName( "gte" ) ); // assertEquals( false, w.isPredefinedEntityName( "rdf" ) ); assertEquals( false, w.isPredefinedEntityName( "smerp" ) ); assertEquals( false, w.isPredefinedEntityName( "nl" ) ); assertEquals( false, w.isPredefinedEntityName( "acute" ) ); } public void testRDFNamespaceMissing() { Model m = createMemModel(); modelAdd( m, "x R fake:uri#bogus" ); m.setNsPrefix( "spoo", "fake:uri#" ); m.setNsPrefix( "eh", "eh:/" ); String s = checkedModelToString( m ); assertMatches( "<!DOCTYPE rdf:RDF \\[", s ); assertMatches( "<!ENTITY spoo 'fake:uri#'>", s ); assertMatches( "rdf:resource=\"&spoo;bogus\"", s ); } public void testUsesEntityForPrefix() { Model m = modelWithStatements( "x R fake:uri#bogus" ); m.setNsPrefix( "spoo", "fake:uri#" ); m.setNsPrefix( "eh", "eh:/" ); String s = checkedModelToString( m ); assertMatches( "<!DOCTYPE rdf:RDF \\[", s ); assertMatches( "<!ENTITY spoo 'fake:uri#'>", s ); assertMatches( "rdf:resource=\"&spoo;bogus\"", s ); } public void testCatchesBadEntities() { testCatchesBadEntity( "amp" ); testCatchesBadEntity( "lt" ); testCatchesBadEntity( "gt" ); testCatchesBadEntity( "apos" ); testCatchesBadEntity( "quot" ); } /* Old code produced: <!DOCTYPE rdf:RDF [ <!ENTITY dd 'http://www.example.org/a"b#'> <!ENTITY ampersand 'http://www.example.org/a?a&b#'> <!ENTITY espace 'http://www.example.org/a%20space#'> <!ENTITY zz 'http://www.example.org/a'b#'> <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>]> * */ /** * See * http://www.w3.org/TR/xml/#NT-EntityValue * " & and % ' are all legal URI chars, but illegal * in entity defn. * @throws IOException */ public void testDifficultChars() throws IOException { Model m = createMemModel(); m.read("file:testing/abbreviated/entities.rdf"); try ( StringWriter w = new StringWriter() ) { RDFWriter wr = m.getWriter(); wr.setProperty("showDoctypeDeclaration", "true"); wr.write(m, w, "http://example.org/"); Reader r = new StringReader(w.toString()); Model m2 = createMemModel(); m2.read(r,"http://example.org/"); assertIsoModels("showDoctypeDeclaration problem", m, m2); } } public void testCRinLiterals() { Model m = createMemModel(); Resource r = m.createResource("http://example/r") ; Property p = m.createProperty("http://example/p") ; m.add(r, p, "abc\r\nxyz") ; StringWriter w = new StringWriter(); m.write(w) ; Model m2 = createMemModel(); m2.read(new StringReader(w.toString()), null) ; assertTrue(m.isIsomorphicWith(m2)) ; } private void testCatchesBadEntity( String bad ) { Model m = modelWithStatements( "ampsersand spelt '&'; x R goo:spoo/noo" ); m.setNsPrefix( "rdf", RDF.getURI() ); m.setNsPrefix( bad, "goo:spoo" ); m.setNsPrefix( "eh", "eh:/" ); String s = checkedModelToString( m ); //assertTrue( s.toString().contains( "<!DOCTYPE rdf:RDF [" ) ); // java5-ism assertTrue( s.toString().contains( "<!DOCTYPE rdf:RDF [" ) ); assertMismatches( "<!ENTITY " + bad + " ", s ); assertMismatches( "rdf:resource=\"&" + bad + ";noo\"", s ); } private void checkModelFromXML( Model shouldBe, String s ) { Model m = createMemModel(); m.read( new StringReader( s ), null, "RDF/XML" ); assertIsoModels( "model should be read back correctly", shouldBe, m ); } private String checkedModelToString( Model m ) { String result = modelToString( m ); checkModelFromXML( m, result ); return result; } private String modelToString( Model m ) { StringWriter s = new StringWriter(); RDFWriter w = m.getWriter( "RDF/XML-ABBREV" ); w.setProperty( "showDoctypeDeclaration", Boolean.TRUE ); w.write( m, s, null ); return s.toString(); } private void assertMatches( String pattern, String x ) { if (!x.matches( "(?s).*(" + pattern + ").*" ) ) fail( "pattern {" + pattern + "} does not match string {" + x + "}" ); } private void assertMismatches( String pattern, String x ) { if (x.matches( "(?s).*(" + pattern + ").*" ) ) fail( "pattern {" + pattern + "} should not match string {" + x + "}" ); } private final static class FakeBaseWriter extends BaseXMLWriter { @Override protected void unblockAll() {} @Override protected void blockRule( Resource r ) {} @Override protected void writeBody( Model mdl, PrintWriter pw, String baseUri, boolean inclXMLBase ) {} protected boolean getShowDoctypeDeclaration() { return showDoctypeDeclaration.booleanValue(); } } }