/* * 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 java.util.Properties; import java.util.regex.Pattern; import org.apache.jena.rdf.model.Model ; import org.apache.jena.rdf.model.RDFWriter ; import org.apache.jena.rdf.model.test.ModelTestBase ; import org.apache.jena.rdfxml.xmloutput.impl.BaseXMLWriter ; import org.apache.jena.rdfxml.xmloutput.impl.SimpleLogger ; public class XMLOutputTestBase extends ModelTestBase { protected final String lang; public XMLOutputTestBase( String name, String lang ) { super( name ); this.lang = lang; } static SimpleLogger realLogger; static boolean sawErrors; static SimpleLogger falseLogger = new SimpleLogger() { @Override public void warn(String s) { sawErrors = true; } @Override public void warn(String s, Exception e) { sawErrors = true; } }; static void blockLogger() { realLogger = BaseXMLWriter.setLogger( falseLogger ); sawErrors = false; } static boolean unblockLogger() { BaseXMLWriter.setLogger( realLogger ); return sawErrors; } static protected class Change { public void modify( RDFWriter w ) {} public void modify( Model m ) {} public void modify( Model m, RDFWriter w ) { modify(m); modify(w); } public static Change none() { return new Change(); } public static Change setProperty( final String property, final String value ) { return new Change() { @Override public void modify( RDFWriter writer ) { writer.setProperty( property, value ); } }; } public static Change setProperty( final String property, final boolean value ) { return new Change() { @Override public void modify( RDFWriter writer ) { writer.setProperty( property, value ); } }; } public static Change setPrefix( final String prefix, final String URI ) { return new Change() { @Override public void modify( Model m ) { m.setNsPrefix( prefix, URI ); } }; } public static Change blockRules( String ruleName ) { return setProperty( "blockrules", ruleName ); } public Change andSetPrefix( String prefix, String URI ) { return and( Change.setPrefix( prefix, URI ) ); } private Change and( final Change change ) { return new Change() { @Override public void modify( Model m, RDFWriter w ) { Change.this.modify( m, w ); change.modify( m, w ); } }; } } /** * @param code Stuff to do to the writer. * @param filename Read this file, write it out, read it in. * @param regex Written file must match this. */ protected void check( String filename, String regex, Change code) throws IOException { check( filename, regex, null, code ); } protected void check( String filename, String regexPresent, String regexAbsent, Change code ) throws IOException { check( filename, null, regexPresent, regexAbsent, false, code); } protected void check( String filename, String encoding, String regexPresent, String regexAbsent, Change code) throws IOException { check(filename, encoding, regexPresent, regexAbsent, false, code); } protected void check ( String filename, String regexAbsent, Change code, String base ) throws IOException { check( filename, null, regexAbsent, null, false, Change.none(), base ); check( filename, null, null, regexAbsent, false, code, base ); } protected void check( String filename, String encoding, String regexPresent, String regexAbsent, boolean errs, Change code) throws IOException { check(filename, encoding, regexPresent, regexAbsent, errs, code, "file:"+filename); } protected void check(String filename, String encoding, String regexPresent, String regexAbsent, boolean errorExpected, Change code, String base) throws IOException { blockLogger(); boolean errorsFound; Model m = createMemModel(); try(InputStream in = new FileInputStream(filename)) { m.read(in,base); } @SuppressWarnings("resource") Writer sw; ByteArrayOutputStream bos = null; if (encoding == null) sw = new StringWriter(); else { bos = new ByteArrayOutputStream(); sw = new OutputStreamWriter(bos, encoding); } Properties p = (Properties) System.getProperties().clone(); RDFWriter writer = m.getWriter(lang); code.modify( m, writer ); writer.write( m, sw, base ); sw.close(); String contents; if (encoding == null) contents = sw.toString(); else { contents = bos.toString(encoding); } try { Model m2 = createMemModel(); m2.read(new StringReader(contents), base); assertTrue("Data got changed.",m.isIsomorphicWith(m2)); if (regexPresent != null) assertTrue( "Should find /" + regexPresent + "/", Pattern.compile(regexPresent,Pattern.DOTALL).matcher(contents).find() // matcher.contains(contents, awk.compile(regexPresent)) ); if (regexAbsent != null) assertTrue( "Should not find /" + regexAbsent + "/", !Pattern.compile(regexAbsent,Pattern.DOTALL).matcher(contents).find() // !matcher.contains(contents, awk.compile(regexAbsent)) ); contents = null; } finally { errorsFound = unblockLogger(); System.setProperties(p); if (contents != null) { System.err.println("==================="); System.err.println("Offending content - " + toString()); System.err.println("==================="); System.err.println(contents); System.err.println("==================="); } } assertEquals("Errors (not) detected.", errorExpected, errorsFound); } }