blob: c85ebcde25aee2b3154061848ec3364f4422137d [file] [log] [blame]
/************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
*
* Use is subject to license terms.
*
* Licensed 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. You can also
* obtain a copy of the License at http://odftoolkit.org/docs/license.txt
*
* 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.odftoolkit.odfvalidator;
import java.io.InputStream;
import java.io.Reader;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
class SchemaResourceResolver implements LSResourceResolver
{
private String m_aBaseURI = null;
private Logger m_aLogger = null;
private DOMImplementationLS m_aDOMImplLS = null;
private boolean m_bGetDOMImplLSFailed = false;
class LSInputImpl implements LSInput
{
private InputStream m_aInputStream = null;
private String m_aSystemId = null;
public Reader getCharacterStream() {
return null;
}
public void setCharacterStream(Reader aCharacterStream) {
throw new UnsupportedOperationException("Not supported yet.");
}
public InputStream getByteStream() {
return m_aInputStream;
}
public void setByteStream(InputStream aByteStream) {
m_aInputStream = aByteStream;
}
public String getStringData() {
return null;
}
public void setStringData(String stringData) {
throw new UnsupportedOperationException("Not supported yet.");
}
public String getSystemId() {
return m_aSystemId;
}
public void setSystemId(String aSystemId) {
m_aSystemId = aSystemId;
}
public String getPublicId() {
return null;
}
public void setPublicId(String publicId) {
throw new UnsupportedOperationException("Not supported yet.");
}
public String getBaseURI() {
return null;
}
public void setBaseURI(String baseURI) {
throw new UnsupportedOperationException("Not supported yet.");
}
public String getEncoding() {
return null;
}
public void setEncoding(String encoding) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean getCertifiedText() {
return false;
}
public void setCertifiedText(boolean certifiedText) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
public SchemaResourceResolver( Logger aLogger, String aBaseURI )
{
m_aBaseURI = aBaseURI;
m_aLogger = aLogger;
}
public LSInput resolveResource(String aType, String aNamespaceURI, String aPublicId, String aSystemId, String aBaseURI)
{
LSInput aInput = null;
if( aBaseURI == null )
aBaseURI = m_aBaseURI;
if( aSystemId != null && aBaseURI != null &&
InternalResources.isInternalResourceIdentifer(aBaseURI) )
{
String aURI = aBaseURI.substring(0, aBaseURI.lastIndexOf('/')+1).concat(aSystemId);
String aPath = InternalResources.getResourcePath(aURI);
InputStream aInStream = getClass().getResourceAsStream(aPath);
if( aInStream != null )
{
aInput = createLSInput();
aInput.setSystemId(aURI);
aInput.setByteStream(aInStream);
String aMsg = "resolving '" + aURI + "'";
m_aLogger.logInfo( aMsg , false);
}
else
{
m_aLogger.logFatalError("Missing internal schema file: ".concat(aPath));
}
}
return aInput;
}
private LSInput createLSInput()
{
LSInput aLSInput = null;
if( m_aDOMImplLS == null && !m_bGetDOMImplLSFailed )
{
DOMImplementationRegistry aDOMReg = null;
try
{
aDOMReg = DOMImplementationRegistry.newInstance();
}
catch( ClassNotFoundException e )
{
m_aLogger.logFatalError(e.getMessage());
}
catch( InstantiationException e )
{
m_aLogger.logFatalError(e.getMessage());
}
catch( IllegalAccessException e )
{
m_aLogger.logFatalError(e.getMessage());
}
DOMImplementation aDOMImpl = aDOMReg.getDOMImplementation( "LS 3.0");
if( aDOMImpl != null )
{
m_aDOMImplLS = (DOMImplementationLS)aDOMImpl;
}
else
{
m_bGetDOMImplLSFailed = true;
m_aLogger.logInfo("Could not find DOM LS 3.0 Implementation, using own implementation", false);
}
}
if( m_aDOMImplLS != null )
{
aLSInput = m_aDOMImplLS.createLSInput();
}
else
{
aLSInput = new LSInputImpl();
}
return aLSInput;
}
}