blob: 09bd4d7c3579ff577619c90e71149621729c9099 [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.odfxsltrunner;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import org.odftoolkit.odfdom.pkg.OdfPackage;
class ODFURIResolver implements URIResolver
{
private Logger m_aLogger;
private String m_aPackageBase;
private String m_aFileEntryPath;
private OdfPackage m_aPackage;
/** Creates a new instance of ODFURIResolver
*
* @param aPackage the package in which the to be resolved URIs are included
* @param aPackageBase the package base URI
* @param aFileEntryPath the path of the file within the package in which the to be resolved URIs are included
* @param aLogger the logger for error messages
*/
public ODFURIResolver( OdfPackage aPackage, String aPackageBase, String aFileEntryPath, Logger aLogger )
{
m_aPackage = aPackage;
m_aPackageBase = aPackageBase;
m_aFileEntryPath = aFileEntryPath;
m_aLogger = aLogger;
}
/** resolve an URI
*
* @param aHRef the URI to be resolved
* @param aBase the base URI that is provied by the XSLT transformation
*/
public Source resolve(String aHRef, String aBase) throws TransformerException
{
if( aBase.startsWith(m_aPackageBase) &&
!aHRef.contains(":") && !aHRef.startsWith("/") )
{
if( aHRef.length()==0)
{
try
{
return new StreamSource(m_aPackage.getInputStream(m_aFileEntryPath), m_aPackageBase + '/' + m_aFileEntryPath );
}
catch (Exception ex)
{
m_aLogger.logError(ex.getMessage());
return null;
}
}
StringBuffer aHRefBuffer = new StringBuffer( aHRef );
StringBuffer aFileEntryBuffer = new StringBuffer();
if( m_aFileEntryPath.contains("/") )
aFileEntryBuffer.append(m_aFileEntryPath.substring(0, m_aFileEntryPath.lastIndexOf('/')+1));
do
{
if( aHRefBuffer.substring(0, 2).equals("./") )
{
aHRefBuffer.delete(0, 2);
}
else if( aHRefBuffer.toString().equals(".") || aHRefBuffer.toString().equals("..") )
{
m_aLogger.logError("URIs resolving to directories cannot be resolved: " + aHRef );
return null;
}
else if( aHRefBuffer.substring(0, 3).equals("../") )
{
aFileEntryBuffer.delete(0, 3);
if( aFileEntryBuffer.length()==0 )
{
aHRefBuffer.insert(0, "./");
try
{
URI aURI;
aURI = new URI(aBase);
aURI.resolve(aHRefBuffer.toString());
m_aLogger.logInfo( "Resolving " + aHRef + " to " + aURI.toString() );
return new StreamSource( aURI.toString() );
}
catch (URISyntaxException ex)
{
m_aLogger.logError(ex.getMessage());
return null;
}
}
else
{
aFileEntryBuffer.delete(0, aFileEntryBuffer.indexOf("/"+1));
}
}
else
{
aHRefBuffer.insert(0, aFileEntryBuffer.toString());
try
{
String aFileEntryPath = aHRefBuffer.toString();
m_aLogger.logInfo( "Resolving " + aHRef + " to package file entry " + aFileEntryPath );
return new StreamSource(m_aPackage.getInputStream(aFileEntryPath), m_aPackageBase + '/' + aFileEntryPath);
}
catch (Exception ex)
{
m_aLogger.logError(ex.getMessage());
return null;
}
}
}
while( true );
}
return null;
}
}