JENA-818 : Handle language strings, and ^^rdf:langString without lang. Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/4352b0f4 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/4352b0f4 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/4352b0f4
Branch: refs/heads/hadoop-rdf Commit: 4352b0f481a33c19d9488b87847ce2dd58ad3286 Parents: 225eea9 Author: Andy Seaborne <[email protected]> Authored: Fri Nov 21 18:37:00 2014 +0000 Committer: Andy Seaborne <[email protected]> Committed: Fri Nov 21 18:37:00 2014 +0000 ---------------------------------------------------------------------- .../apache/jena/riot/out/NodeFormatterBase.java | 48 +++++++++++++------ .../jena/graph/impl/LiteralLabelFactory.java | 37 +++++++++++---- .../hpl/jena/graph/impl/LiteralLabelImpl.java | 8 ++-- .../com/hp/hpl/jena/rdf/model/impl/Util.java | 40 +++++++++------- .../hpl/jena/rdfxml/xmloutput/impl/Basic.java | 20 ++++---- .../jena/rdfxml/xmloutput/impl/Unparser.java | 50 ++++++++------------ 6 files changed, 119 insertions(+), 84 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-arq/src/main/java/org/apache/jena/riot/out/NodeFormatterBase.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/riot/out/NodeFormatterBase.java b/jena-arq/src/main/java/org/apache/jena/riot/out/NodeFormatterBase.java index 6ea8dd7..1b4b5f9 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/out/NodeFormatterBase.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/out/NodeFormatterBase.java @@ -21,6 +21,7 @@ package org.apache.jena.riot.out; import org.apache.jena.atlas.io.AWriter ; import com.hp.hpl.jena.JenaRuntime ; +import com.hp.hpl.jena.datatypes.RDFDatatype ; import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ; import com.hp.hpl.jena.graph.Node ; import com.hp.hpl.jena.sparql.ARQInternalErrorException ; @@ -53,27 +54,46 @@ public abstract class NodeFormatterBase implements NodeFormatter @Override public void formatBNode(AWriter w, Node n) { formatBNode(w, n.getBlankNodeLabel()) ; } +// /** A Node is a simple string if: +// * <li>(RDF 1.0) No datatype and no language tag. +// * <li>(RDF 1.1) xsd:string +// */ +// private static boolean isSimpleString(Node n) { +// RDFDatatype dt = n.getLiteralDatatype() ; +// if ( dt == null ) +// return ! isLangString(n) ; +// if ( JenaRuntime.isRDF11 ) +// return dt.equals(XSDDatatype.XSDstring) ; +// return false ; +// } +// +// /** A Node is a language string if it has a language tag. (RDF 1.0 and RDF 1.1) */ +// private static boolean isLangString(Node n) { +// String lang = n.getLiteralLanguage() ; +// if ( lang == null ) +// return false ; +// return ! lang.equals("") ; +// } + @Override public void formatLiteral(AWriter w, Node n) { - String dt = n.getLiteralDatatypeURI() ; + RDFDatatype dt = n.getLiteralDatatype() ; String lang = n.getLiteralLanguage() ; String lex = n.getLiteralLexicalForm() ; - // In RDF 1.1, print xsd:string and language strings without datatype explicitly. - // dt should not be null for RDF 1.1 but let's play carefully. - boolean shortString = JenaRuntime.isRDF11 ? (dt == null || dt.equals(XSDDatatype.XSDstring.getURI())) - : (dt == null) ; - - if ( shortString ) - { - if ( lang == null || lang.equals("") ) - formatLitString(w, lex) ; - else - formatLitLang(w, lex,lang) ; + if ( lang != null && ! lang.equals("") ) { + formatLitLang(w, lex, lang) ; + } else if ( dt == null ) { + // RDF 1.0, simple literal. + formatLitString(w, lex) ; + } else if ( JenaRuntime.isRDF11 && dt.equals(XSDDatatype.XSDstring) ) { + // RDF 1.1, xsd:string - outptu as short string. + formatLitString(w, lex) ; + } else { + // Datatype, no language tag, not short string. + formatLitDT(w, lex, dt.getURI()) ; } - else - formatLitDT(w, lex, dt) ; } @Override http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelFactory.java ---------------------------------------------------------------------- diff --git a/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelFactory.java b/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelFactory.java index 69c9ae1..97dfbf0 100644 --- a/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelFactory.java +++ b/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelFactory.java @@ -18,23 +18,39 @@ package com.hp.hpl.jena.graph.impl; -import com.hp.hpl.jena.datatypes.DatatypeFormatException; -import com.hp.hpl.jena.datatypes.RDFDatatype; +import com.hp.hpl.jena.JenaRuntime ; +import com.hp.hpl.jena.datatypes.DatatypeFormatException ; +import com.hp.hpl.jena.datatypes.RDFDatatype ; +import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ; +import com.hp.hpl.jena.graph.NodeFactory ; +import com.hp.hpl.jena.vocabulary.RDF ; public class LiteralLabelFactory { + private static final RDFDatatype dtSLangString = NodeFactory.getType(RDF.Nodes.langString.getURI()) ; + + private static RDFDatatype fixDatatype(RDFDatatype dtype, String lang) { + if ( dtype != null ) + return dtype ; + if ( JenaRuntime.isRDF11 ) + dtype = (lang == null || lang.equals("")) ? XSDDatatype.XSDstring : dtSLangString ; + return dtype ; + } + public static LiteralLabel createLiteralLabel( String lex, String lang, RDFDatatype dtype ) throws DatatypeFormatException - { return new LiteralLabelImpl( lex, lang, dtype ); } + { + dtype = fixDatatype(dtype, lang) ; + return new LiteralLabelImpl( lex, lang, dtype ); } /** * Build a plain literal label from its lexical form. * @param lex the lexical form of the literal * @param lang the optional language tag, only relevant for plain literals */ - public static LiteralLabel create(String lex, String lang) - { - return new LiteralLabelImpl(lex, lang, null); + public static LiteralLabel create(String lex, String lang) { + RDFDatatype dt = fixDatatype(null, lang) ; + return new LiteralLabelImpl(lex, lang, dt); } /** @@ -46,6 +62,7 @@ public class LiteralLabelFactory * @param dtype the type of the literal, null for old style "plain" literals */ public static LiteralLabel create(Object value, String lang, RDFDatatype dtype) throws DatatypeFormatException { + dtype = fixDatatype(dtype, lang) ; return new LiteralLabelImpl(value, lang, dtype) ; } @@ -56,6 +73,8 @@ public class LiteralLabelFactory * @param value the literal value to encapsulate */ public static LiteralLabel create(Object value) { + if ( value instanceof String ) + create((String)value, null) ; return new LiteralLabelImpl(value) ; } @@ -63,8 +82,10 @@ public class LiteralLabelFactory * Creates either a plain literal or an XMLLiteral. * @param xml If true then s is exclusive canonical XML of type rdf:XMLLiteral, and no checking will be invoked. */ - public static LiteralLabel create(String s, String lg, boolean xml) { - return new LiteralLabelImpl(s, lg, xml) ; + public static LiteralLabel create(String s, String lang, boolean xml) { + if ( xml ) + return new LiteralLabelImpl(s, lang, xml) ; + return create(s, lang) ; } http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelImpl.java ---------------------------------------------------------------------- diff --git a/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelImpl.java b/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelImpl.java index c4c46b0..b31288c 100644 --- a/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelImpl.java +++ b/jena-core/src/main/java/com/hp/hpl/jena/graph/impl/LiteralLabelImpl.java @@ -182,14 +182,14 @@ final /*public*/ class LiteralLabelImpl implements LiteralLabel { * @param xml If true then s is exclusive canonical XML of type rdf:XMLLiteral, and no checking will be invoked. */ - LiteralLabelImpl(String s, String lg, boolean xml) { - setLiteralLabel_3(s, lg, xml) ; + LiteralLabelImpl(String s, String lang, boolean xml) { + setLiteralLabel_3(s, lang, xml) ; } - private void setLiteralLabel_3(String s, String lg, boolean xml) { + private void setLiteralLabel_3(String s, String lang, boolean xml) { // Constructor extraction: Preparation for moving into Node_Literal. this.lexicalForm = s; - this.lang = (lg == null ? "" : lg); + this.lang = (lang == null ? "" : lang); if (xml) { // XML Literal this.dtype = XMLLiteralType.theXMLLiteralType; http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-core/src/main/java/com/hp/hpl/jena/rdf/model/impl/Util.java ---------------------------------------------------------------------- diff --git a/jena-core/src/main/java/com/hp/hpl/jena/rdf/model/impl/Util.java b/jena-core/src/main/java/com/hp/hpl/jena/rdf/model/impl/Util.java index ece5e9a..623174a 100644 --- a/jena-core/src/main/java/com/hp/hpl/jena/rdf/model/impl/Util.java +++ b/jena-core/src/main/java/com/hp/hpl/jena/rdf/model/impl/Util.java @@ -17,11 +17,15 @@ */ package com.hp.hpl.jena.rdf.model.impl; -import java.util.regex.*; +import java.util.regex.Matcher ; +import java.util.regex.Pattern ; -import org.apache.xerces.util.XMLChar; +import org.apache.xerces.util.XMLChar ; -import com.hp.hpl.jena.shared.*; +import com.hp.hpl.jena.JenaRuntime ; +import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ; +import com.hp.hpl.jena.rdf.model.Literal ; +import com.hp.hpl.jena.shared.CannotEncodeCharacterException ; /** Some utility functions. */ @@ -197,21 +201,21 @@ public class Util extends Object { return result + s.substring(lastPos, s.length()); } - /** Call System.getProperty and suppresses SecurityException, (simply returns null). - *@return The property value, or null if none or there is a SecurityException. - */ - public static String XgetProperty(String p) { - return XgetProperty( p, null ); - } - /** Call System.getProperty and suppresses SecurityException, (simply returns null). - *@return The property value, or null if none or there is a SecurityException. - */ - public static String XgetProperty(String p, String def) { - try { - return System.getProperty(p, def); - } catch (SecurityException e) { - return def; + /** Return true if the literal should be written as a string, without datatype or lang. (RDF 1.0 and RDF 1.1) */ + public static boolean isSimpleString(Literal lit) { + if ( lit.getDatatypeURI() == null ) { + return ! isLangString(lit) ; } + if ( JenaRuntime.isRDF11 && lit.getDatatypeURI().equals(XSDDatatype.XSDstring.getURI()) ) + return true; + return false ; + } + + /** Return true if the literals shodul be written with a language string. (RDF 1.0 and RDF 1.1) */ + public static boolean isLangString(Literal lit) { + String lang = lit.getLanguage() ; + if ( lang == null ) + return false ; + return ! lang.equals("") ; } - } http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Basic.java ---------------------------------------------------------------------- diff --git a/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Basic.java b/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Basic.java index 8b3869c..73d03fe 100644 --- a/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Basic.java +++ b/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Basic.java @@ -163,20 +163,22 @@ public class Basic extends BaseXMLWriter protected void writeLiteral( Literal l, PrintWriter writer ) { String lang = l.getLanguage(); String form = l.getLexicalForm(); - if (!lang.equals("")) { + if (Util.isLangString(l)) { writer.print(" xml:lang=" + attributeQuoted( lang )); - } - if (l.isWellFormedXML() && !blockLiterals) { + } else if (l.isWellFormedXML() && !blockLiterals) { + // RDF XML Literals inline. writer.print(" " + rdfAt("parseType") + "=" + attributeQuoted( "Literal" )+">"); writer.print( form ); + return ; } else { - // No lang. - String dt = l.getDatatypeURI(); - if ( ! Unparser.isSimpleString(l) ) - writer.print( " " + rdfAt( "datatype" ) + "=" + substitutedAttribute( dt ) ); - writer.print(">"); - writer.print( Util.substituteEntitiesInElementContent( form ) ); + // Datatype (if not xsd:string and RDF 1.1) + String dt = l.getDatatypeURI(); + if ( ! Util.isSimpleString(l) ) + writer.print( " " + rdfAt( "datatype" ) + "=" + substitutedAttribute( dt ) ); } + // Content. + writer.print(">"); + writer.print( Util.substituteEntitiesInElementContent( form ) ); } } http://git-wip-us.apache.org/repos/asf/jena/blob/4352b0f4/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Unparser.java ---------------------------------------------------------------------- diff --git a/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Unparser.java b/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Unparser.java index feab029..c523c70 100644 --- a/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Unparser.java +++ b/jena-core/src/main/java/com/hp/hpl/jena/rdfxml/xmloutput/impl/Unparser.java @@ -115,24 +115,22 @@ package com.hp.hpl.jena.rdfxml.xmloutput.impl; * * [6.34] literal ::= (any well-formed XML) */ -import java.io.PrintWriter; -import java.util.*; - -import org.apache.xerces.util.XMLChar; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.jena.iri.IRI; - -import com.hp.hpl.jena.JenaRuntime ; -import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ; -import com.hp.hpl.jena.rdf.model.*; -import com.hp.hpl.jena.rdf.model.impl.PropertyImpl; -import com.hp.hpl.jena.rdf.model.impl.Util; -import com.hp.hpl.jena.shared.BrokenException; -import com.hp.hpl.jena.shared.JenaException; -import com.hp.hpl.jena.shared.PropertyNotFoundException; -import com.hp.hpl.jena.util.iterator.*; -import com.hp.hpl.jena.vocabulary.RDF; +import java.io.PrintWriter ; +import java.util.* ; + +import org.apache.jena.iri.IRI ; +import org.apache.xerces.util.XMLChar ; +import org.slf4j.Logger ; +import org.slf4j.LoggerFactory ; + +import com.hp.hpl.jena.rdf.model.* ; +import com.hp.hpl.jena.rdf.model.impl.PropertyImpl ; +import com.hp.hpl.jena.rdf.model.impl.Util ; +import com.hp.hpl.jena.shared.BrokenException ; +import com.hp.hpl.jena.shared.JenaException ; +import com.hp.hpl.jena.shared.PropertyNotFoundException ; +import com.hp.hpl.jena.util.iterator.* ; +import com.hp.hpl.jena.vocabulary.RDF ; /** * An Unparser will output a model in the abbreviated syntax. * @@ -458,24 +456,14 @@ class Unparser { return true; } - /** Return true if to be written as a string, without datatype or lang */ - /*package*/ static boolean isSimpleString(Literal lit) { - if ( lit.getDatatypeURI() == null ) - return true; - if ( JenaRuntime.isRDF11 && lit.getDatatypeURI().equals(XSDDatatype.XSDstring.getURI()) ) - return true; - if ( JenaRuntime.isRDF11 && lit.getDatatypeURI().equals(RDF.langString.getId()) ) - return true; - - return false ; - } - private boolean wPropertyEltDatatype(WType wt, Property prop, Statement s, RDFNode r) { if (! (r instanceof Literal) ) return false ; Literal lit = ((Literal) r) ; - if ( isSimpleString(lit) ) + if ( Util.isSimpleString(lit) ) + return false; + if ( Util.isLangString(lit) ) return false; // print out with "datatype="
