org.odftoolkit.odfxsltrunner.ODFURIResolver Maven / Gradle / Ivy
/**
* **********************************************************************
*
* 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;
}
}