📄 jenareader.java
字号:
/*
(c) Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
[See end of file]
*/
package com.hp.hpl.jena.rdf.arp;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.datatypes.TypeMapper;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.graph.GraphEvents;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.rdf.arp.impl.RDFXMLParser;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFErrorHandler;
import com.hp.hpl.jena.rdf.model.RDFReader;
import com.hp.hpl.jena.rdf.model.impl.LiteralImpl;
import com.hp.hpl.jena.rdf.model.impl.PropertyImpl;
import com.hp.hpl.jena.rdf.model.impl.RDFDefaultErrorHandler;
import com.hp.hpl.jena.shared.DoesNotExistException;
import com.hp.hpl.jena.shared.JenaException;
import com.hp.hpl.jena.shared.UnknownPropertyException;
import com.hp.hpl.jena.shared.WrappedIOException;
/**
* Interface between Jena and ARP.
*
* @author jjc
*/
public class JenaReader implements RDFReader, ARPErrorNumbers {
/**
* Sets the reader for the languages RDF/XML and RDF/XML-ABBREV to be
* JenaReader.
* @deprecated This is the default behaviour
* @param m
* The Model on which to set the reader properties.
*/
static public void useMe(Model m) {
m.setReaderClassName("RDF/XML", JenaReader.class.getName());
m.setReaderClassName("RDF/XML-ABBREV", JenaReader.class.getName());
}
static private final String saxFeaturesURL = "http://xml.org/sax/features/";
static private final String saxPropertiesURL = "http://xml.org/sax/properties/";
static private final String apacheFeaturesURL = "http://apache.org/xml/features/";
static private final String apachePropertiesURL = "http://apache.org/xml/properties/";
static final String arpPropertiesURL = "http://jena.hpl.hp.com/arp/properties/";
static final int arpPropertiesURLLength = arpPropertiesURL.length();
/**
* Creates new JenaReader
*/
public JenaReader() {
arpf = RDFXMLParser.create();
}
final private RDFXMLParser arpf;
private Model model;
/**
* Reads from url, using url as base, adding triples to model.
* Uses content negotiation to ask for application/rdf+xml, if available.
*
* @param m
* A model to add triples to.
* @param url
* The URL of the RDF/XML document.
*/
public void read(Model m, String url) throws JenaException {
try {
URLConnection conn = new URL(url).openConnection();
conn.setRequestProperty("accept", "application/rdf+xml, application/xml; q=0.8, text/xml; q=0.7, application/rss+xml; q=0.3, */*; q=0.2");
String encoding = conn.getContentEncoding();
if (encoding == null)
read(m, conn.getInputStream(), url);
else
read(m, new InputStreamReader(conn.getInputStream(),
encoding), url);
} catch (FileNotFoundException e) {
throw new DoesNotExistException(url);
} catch (IOException e) {
throw new JenaException(e);
}
}
// static public void main(String [] a){
// String url =
// "http://www.bbc.co.uk/portuguese/index.xml";
//// "http://jena.sourceforge.net/test/mime/test1";
// try {
// URLConnection conn = new URL(url).openConnection();
// conn.setRequestProperty("accept", "application/rdf+xml, application/xml, text/xml, */*; q=0.5");
// System.err.println(conn.getContentType());
// } catch (MalformedURLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
/**
* Converts an ARP literal into a Jena Literal.
*
* @param lit
* The ARP literal.
* @return The Jena Literal.
*/
static private Literal translate(ALiteral lit) {
return new LiteralImpl(lit.toString(), lit.getLang(), lit
.isWellFormedXML(), null);
}
private static Node convert(ALiteral lit) {
String dtURI = lit.getDatatypeURI();
if (dtURI == null)
return Node.createLiteral(lit.toString(), lit.getLang(), false);
if (lit.isWellFormedXML()) {
return Node.createLiteral(lit.toString(), null, true);
}
RDFDatatype dt = TypeMapper.getInstance().getSafeTypeByName(dtURI);
return Node.createLiteral(lit.toString(), null, dt);
}
private static Node convert(AResource r) {
if (!r.isAnonymous())
return Node.createURI(r.getURI());
// String id = r.getAnonymousID();
Node rr = (Node) r.getUserData();
if (rr == null) {
rr = Node.createAnon();
r.setUserData(rr);
}
return rr;
}
static Triple convert(AResource s, AResource p, AResource o) {
return Triple.create(convert(s), convert(p), convert(o));
}
static Triple convert(AResource s, AResource p, ALiteral o) {
return Triple.create(convert(s), convert(p), convert(o));
}
/**
* Converts an ARP resource into a Jena property.
*
* @param r
* The ARP resource.
* @throws JenaException
* If r is anonymous, or similarly ill-formed.
* @return The Jena property.
*/
static private Property translatePred(AResource r) throws JenaException {
return new PropertyImpl(r.getURI());
}
/**
* Reads from reader, using base URI xmlbase, adding triples to model. If
* xmlbase is "" then relative URIs may be added to model.
*
* @param m
* A model to add triples to.
* @param reader
* The RDF/XML document.
* @param xmlBase
* The base URI of the document or "".
*/
private void read(Model m, InputSource inputS, String xmlBase)
throws JenaException {
model = m;
read(model.getGraph(), inputS, xmlBase, model);
}
private JenaHandler handler;
synchronized private void read(final Graph g, InputSource inputS,
String xmlBase, Model m) {
try {
g.getEventManager().notifyEvent(g, GraphEvents.startRead);
inputS.setSystemId(xmlBase);
handler = new JenaHandler(g, m, errorHandler);
handler.useWith(arpf.getHandlers());
arpf.parse(inputS, xmlBase);
handler.bulkUpdate();
} catch (IOException e) {
throw new WrappedIOException(e);
} catch (SAXException e) {
throw new JenaException(e);
} finally {
g.getEventManager().notifyEvent(g, GraphEvents.finishRead);
handler = null;
}
}
/**
* Reads from reader, using base URI xmlbase, adding triples to model. If
* xmlbase is "" then relative URIs may be added to model.
*
* @param m
* A model to add triples to.
* @param reader
* The RDF/XML document.
* @param xmlBase
* The base URI of the document or "".
*/
public void read(final Model m, Reader reader, String xmlBase)
throws JenaException {
read(m, new InputSource(reader), xmlBase);
}
/**
* Reads from reader, using base URI xmlbase, adding triples to graph. If
* xmlbase is "" then relative URIs may be added to graph.
*
* @param g
* A graph to add triples to.
* @param reader
* The RDF/XML document.
* @param xmlBase
* The base URI of the document or "".
*/
public void read(Graph g, Reader reader, String xmlBase)
throws JenaException {
read(g, new InputSource(reader), xmlBase, null);
}
/**
* Reads from inputStream, using base URI xmlbase, adding triples to model.
* If xmlbase is "" then relative URIs may be added to model.
*
* @param m
* A model to add triples to.
* @param in
* The RDF/XML document stream.
* @param xmlBase
* The base URI of the document or "".
*/
public void read(final Model m, InputStream in, String xmlBase)
throws JenaException {
read(m, new InputSource(in), xmlBase);
}
/**
* Reads from inputStream, using base URI xmlbase, adding triples to graph.
* If xmlbase is "" then relative URIs may be added to graph.
*
* @param g
* A graph to add triples to.
* @param in
* The RDF/XML document stream.
* @param xmlBase
* The base URI of the document or "".
*/
public void read(Graph g, InputStream in, String xmlBase) {
read(g, new InputSource(in), xmlBase, null);
}
private RDFErrorHandler errorHandler = new RDFDefaultErrorHandler();
/**
* Change the error handler.
* <p>
* Note that errors of class {@link ParseException}can be promoted using
* the {@link ParseException#promote}method. See ARP documentation for
* {@link org.xml.sax.ErrorHandler}for the details of error promotion.
*
* @param errHandler
* The new error handler.
* @return The old error handler.
*/
public RDFErrorHandler setErrorHandler(RDFErrorHandler errHandler) {
RDFErrorHandler old = this.errorHandler;
this.errorHandler = errHandler;
JenaHandler h = handler;
if (h != null) {
h.setErrorHandler(errHandler);
}
return old;
}
/**
*
* Change a property of the RDF or XML parser.
* <p>
* I do not believe that many of the XML features or properties are in fact
* useful for ARP users. The ARP properties allow fine-grained control over
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -