/* * 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.n3; import java.net.* ; import java.nio.charset.StandardCharsets ; import java.io.* ; import org.apache.jena.graph.GraphEvents ; import org.apache.jena.rdf.model.* ; import org.apache.jena.shared.* ; import org.apache.jena.util.FileUtils ; import org.slf4j.LoggerFactory; /** Abstract class that sorts out input streams, readers and base URIs, to call a * single worker function with model, UTF8 reader and visated base */ @SuppressWarnings("deprecation") public abstract class JenaReaderBase implements RDFReader { protected RDFErrorHandler errorHandler = null ; public JenaReaderBase() {} @Override final public void read(Model model, Reader r, String base) { checkReader(r) ; readImpl(model, r, base) ; } @Override final public void read(Model model, java.lang.String url) { try { URLConnection conn = new URL(url).openConnection(); String encoding = conn.getContentEncoding(); if ( encoding == null ) read(model, new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8), url); else { LoggerFactory.getLogger(this.getClass()).warn("URL content is not UTF-8") ; read(model, new InputStreamReader(conn.getInputStream(),encoding), url); } } catch (JenaException e) { if ( errorHandler == null ) throw e; errorHandler.error(e) ; } catch (Exception ex) { if ( errorHandler == null ) throw new JenaException(ex) ; errorHandler.error(ex) ; } } @Override final public void read(Model model, InputStream in, String base) { readImpl(model, FileUtils.asBufferedUTF8(in), base) ; } @Override final public RDFErrorHandler setErrorHandler(RDFErrorHandler errHandler) { RDFErrorHandler old = errorHandler ; errorHandler = errHandler ; return old ; } @Override final public Object setProperty(String propName, Object propValue) { return null ; } protected void checkReader(Reader r) { if ( r instanceof FileReader ) { FileReader f = (FileReader)r ; if ( f.getEncoding().equalsIgnoreCase(StandardCharsets.UTF_8.name()) ) LoggerFactory.getLogger(this.getClass()).warn("FileReader is not UTF-8") ; } } private void readImpl(Model model, Reader reader, String base) { // The reader has been checked, if possible, by now or // constructed correctly by code here. if ( base != null ) base = N3IRIResolver.resolveGlobal(base) ; try { model.notifyEvent( GraphEvents.startRead ); readWorker(model, reader, base) ; } catch (JenaException e) { if ( errorHandler == null ) throw e; errorHandler.error(e) ; } catch (Exception ex) { if ( errorHandler == null ) throw new JenaException(ex) ; errorHandler.error(ex) ; } finally { model.notifyEvent( GraphEvents.finishRead ); } } protected abstract void readWorker(Model model, Reader reader, String base) throws Exception; }