/*
* 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.impl;
import org.xml.sax.SAXParseException;
import org.apache.jena.iri.IRI;
import org.apache.jena.rdfxml.xmlinput.ARPErrorNumbers ;
public class XMLBaselessContext extends AbsXMLContext implements ARPErrorNumbers {
final int errno;
final String errmsg;
public XMLBaselessContext(XMLHandler f, int eno) {
this(f,eno,f.sameDocRef());
}
// XMLBaselessContext(XMLHandler f, int eno, String baseURI) {
// this(f,eno,f.iriFactory().create(baseURI).create(""));
// }
XMLBaselessContext(XMLHandler f, int eno, IRI baseURI) {
super(true, null, baseURI,
new TaintImpl(), "",
new TaintImpl());
errno = eno;
switch (errno) {
case ERR_RESOLVING_URI_AGAINST_NULL_BASE:
errmsg = "Base URI is null, but there are relative URIs to resolve.";
break;
case WARN_RESOLVING_URI_AGAINST_EMPTY_BASE:
errmsg = "Base URI is \"\", relative URIs left as relative.";
break;
case ERR_RESOLVING_AGAINST_MALFORMED_BASE:
errmsg = "Resolving against bad URI <"+baseURI+">";
break;
case ERR_RESOLVING_AGAINST_RELATIVE_BASE:
errmsg = "Resolving against relative URI <"+baseURI+">";
break;
default:
throw new IllegalArgumentException("Unknown error code: "+eno);
}
}
private XMLBaselessContext(AbsXMLContext document, IRI uri,
Taint baseT, String lang, Taint langT, XMLBaselessContext parent) {
super(true, document, uri, baseT, lang, langT);
errno = parent.errno;
errmsg = parent.errmsg;
}
@Override
AbsXMLContext clone(IRI u, Taint baseT, String lng,
Taint langT) {
return new XMLBaselessContext(document, u, baseT, lng, langT, this);
}
@Override
public AbsXMLContext withBase(XMLHandler forErrors, String b)
throws SAXParseException {
TaintImpl taintB = new TaintImpl();
IRI newB = resolveAsURI(forErrors, taintB, b, false);
if (newB.isRelative() )
return new XMLBaselessContext(forErrors,errno,newB.create(""));
if (newB.hasViolation(false))
return new XMLBaselessContext(forErrors,ERR_RESOLVING_AGAINST_MALFORMED_BASE,newB);
return new XMLContext(keepDocument(forErrors), document, newB
.create(""), taintB, lang, langTaint);
}
@Override
boolean keepDocument(XMLHandler forErrors) {
return !forErrors.ignoring(IGN_XMLBASE_SIGNIFICANT);
}
boolean isSameAsDocument() {
return this == document;
}
void baseUsed(XMLHandler forErrors, Taint taintMe, String relUri,
String string) throws SAXParseException {
forErrors.warning(taintMe, errno, errmsg + ": <" + relUri + ">");
}
@Override
void checkBaseUse(XMLHandler forErrors, Taint taintMe, String relUri, IRI rslt) throws SAXParseException {
String resolvedURI = rslt.toString();
if (relUri.equals(resolvedURI) && rslt.isAbsolute())
return;
forErrors.warning(taintMe, errno, errmsg + ": <" + relUri + ">");
}
}