/* * 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.impl.* ; import org.xml.sax.Attributes; import org.xml.sax.SAXParseException; abstract public class WantDescription extends Frame implements HasSubjectFrameI { public WantDescription(FrameI s, AbsXMLContext x) { super(s, x); } public WantDescription(FrameI s, AttributeLexer x) throws SAXParseException { super(s, x); } public WantDescription(XMLHandler handler, AbsXMLContext x) { super(handler,x); } ANode subject; boolean subjectIsBlank = false; @Override public FrameI startElement(String uri, String localName, String rawName, Attributes atts) throws SAXParseException { clearSubject(); if (uri==null || uri.equals("")) { warning(WARN_UNQUALIFIED_ELEMENT,"Unqualified typed nodes are not allowed. Type treated as a relative URI."); } AttributeLexer ap = new AttributeLexer(this, A_XMLLANG| A_XMLBASE | A_XML_OTHER | // legal rdf: A_ID | A_NODEID | A_ABOUT | A_TYPE, // bad rdf: A_BADATTRS ); ap.processSpecials(taint,atts); AbsXMLContext x = ap.xml(xml); if (ap.id!=null){ subject = URIReference.fromID(this, x, ap.id); } if (ap.about!=null) { if (subject != null) warning(ERR_SYNTAX_ERROR,"Both ID and about"); subject = URIReference.resolve(this,x,ap.about); } if (ap.nodeID!=null) { if (subject != null) { if (ap.about!=null) warning(ERR_SYNTAX_ERROR,"Both nodeID and about"); if (ap.id != null) warning(ERR_SYNTAX_ERROR,"Both ID and nodeID"); } subject = new ARPResource(arp,ap.nodeID); checkNodeID_XMLName(subject,ap.nodeID); subjectIsBlank = true; } if (subject==null) { subject = new ARPResource(arp); subjectIsBlank = true; } ElementLexer el = new ElementLexer(taint,this,uri,localName, rawName, E_DESCRIPTION, CoreAndOldTerms|E_LI, true); if (taint.isTainted()) subject.taint(); if (!el.goodMatch) { URIReference type = URIReference.fromQName(this,uri,localName); if (el.badMatch && taint.isTainted()) { type.taint(); } triple(subject,RDF_TYPE,type); } processPropertyAttributes(ap,atts,x); return new WantPropertyElement(this,x); } private void clearSubject() { if (subjectIsBlank) arp.endLocalScope(subject); subject = null; subjectIsBlank = false; } @Override public void aPredAndObj(ANode p, ANode o) { triple(subject,p,o); } @Override public void makeSubjectReificationWith(ANode r) { triple(r,RDF_SUBJECT,subject); } @Override public void endElement() throws SAXParseException { clearSubject(); } @Override public void abort() { clearSubject(); } }