/* * 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.xmlinput.states; import org.apache.jena.rdfxml.xmlinput.ARPErrorNumbers ; import org.apache.jena.rdfxml.xmlinput.impl.* ; import org.xml.sax.Attributes; import org.xml.sax.SAXParseException; public abstract class Frame extends ParserSupport implements Names, FrameI, ARPErrorNumbers { final FrameI parent; protected boolean nonWhiteMsgGiven = false; public Taint taint = new TaintImpl(); @Override public FrameI getParent() { return parent; } public Frame(FrameI p, AttributeLexer ap) throws SAXParseException { super(p.getXMLHandler(), ap.xml(p.getXMLContext())); parent = p; } public Frame(FrameI p, AbsXMLContext x) { super(p.getXMLHandler(), x); parent = p; } public Frame(XMLHandler a, AbsXMLContext x) { super(a, x); parent = null; } protected void warning(int i, String msg) throws SAXParseException { warning(taint, i, msg); } @Override public void afterChild() { taint = new TaintImpl(); } @Override public void comment(char[] ch, int start, int length) throws SAXParseException { // generally ignore } // public void checkIdSymbol(String id) throws SAXParseException { // checkIdSymbol(xml,id); // } /** * endElement is called on the state of the frame created by the matching * startElement. * * @throws SAXParseException * */ @Override public void endElement() throws SAXParseException { // often nothing } @Override public void processingInstruction(String target, String data) throws SAXParseException { // generally ignored, maybe not what was intended. warning(null, WARN_PROCESSING_INSTRUCTION_IN_RDF, "A processing instruction is in RDF content. No processing was done. " + suggestParsetypeLiteral()); } void processPropertyAttributes(AttributeLexer ap, Attributes atts, AbsXMLContext x) throws SAXParseException { if (ap.type != null) { ((HasSubjectFrameI) this).aPredAndObj(RDF_TYPE, URIReference .resolve(this, x, ap.type)); } int sz = atts.getLength(); if (ap.count != sz) { for (int i = 0; i < sz; i++) { if (!ap.done(i)) { String uri = atts.getURI(i); String lName = atts.getLocalName(i); URIReference pred = URIReference .fromQName(this, uri, lName); if (uri==null || uri.equals("")) { warning(pred,WARN_UNQUALIFIED_ATTRIBUTE, "Unqualified property attributes are not allowed. Property treated as a relative URI."); } if (rdfns.equals(uri) && !QNameLexer.isKnownRDFProperty(lName)) { warning( pred, WARN_UNKNOWN_RDF_ATTRIBUTE, atts.getQName(i) + " is not a recognized RDF property or type."); } ((HasSubjectFrameI) this).aPredAndObj(pred, new ARPString( this, atts.getValue(i), x)); } } } } @Override public void abort() { // nothing. } protected FrameI rdfStartElement(String uri, String localName, String rawName, Attributes atts) throws SAXParseException { ElementLexer el = new ElementLexer(taint, this, uri, localName, rawName, E_RDF, 0, false); if (el.goodMatch) { AttributeLexer ap = new AttributeLexer(this, A_XMLBASE | A_XMLLANG | A_XML_OTHER, 0); if (ap.processSpecials(taint, atts) != atts.getLength()) { warning(ERR_SYNTAX_ERROR, "Illegal attributes on rdf:RDF"); } // TODO this may be one point to intercept xml:base. arp.startRDF(); return new WantTopLevelDescription(this, ap); } AttributeLexer ap = new AttributeLexer(this, A_XMLBASE | A_XMLLANG, 0); ap.processSpecials(taint, atts); return new LookingForRDF(this, ap); } /** * Additional message if mixed content is found in a syntactically * disallowed place. Subclasses override to suppress message. * */ String suggestParsetypeLiteral() { return " Maybe there should be an rdf:parseType='Literal' for embedding mixed XML content in RDF."; } @Override public void characters(char[] ch, int start, int length) throws SAXParseException { if ((!nonWhiteMsgGiven) && !isWhite(ch, start, length)) { nonWhiteMsgGiven = true; warning(ERR_NOT_WHITESPACE, "Expecting XML start or end element(s). String data \"" + new String(ch, start, length) + "\" not allowed." + suggestParsetypeLiteral() + " Maybe a striping error."); } } }