📄 xsltview.java
字号:
* @see #setSourceKey
* @see #convertSource
*/
protected Source locateSource(Map model) throws Exception {
if (this.sourceKey != null) {
return convertSource(model.get(this.sourceKey));
}
Object source = CollectionUtils.findValueOfType(model.values(), getSourceTypes());
return (source != null ? convertSource(source) : null);
}
/**
* Return the array of {@link Class Classes} that are supported when converting to an
* XSLT {@link Source}.
* <p>Currently supports {@link Source}, {@link Document}, {@link Node},
* {@link Reader}, {@link InputStream} and {@link Resource}.
* @return the supported source types
*/
protected Class[] getSourceTypes() {
return new Class[] {Source.class, Document.class, Node.class, Reader.class, InputStream.class, Resource.class};
}
/**
* Convert the supplied {@link Object} into an XSLT {@link Source} if the
* {@link Object} type is {@link #getSourceTypes() supported}.
* @param source the original source object
* @return the adapted XSLT Source
* @throws IllegalArgumentException if the given Object is not of a supported type
*/
protected Source convertSource(Object source) throws Exception {
if (source instanceof Source) {
return (Source) source;
}
else if (source instanceof Document) {
return new DOMSource(((Document) source).getDocumentElement());
}
else if (source instanceof Node) {
return new DOMSource((Node) source);
}
else if (source instanceof Reader) {
return new StreamSource((Reader) source);
}
else if (source instanceof InputStream) {
return new StreamSource((InputStream) source);
}
else if (source instanceof Resource) {
return new StreamSource(((Resource) source).getInputStream());
}
else {
throw new IllegalArgumentException("Value '" + source + "' cannot be converted to XSLT Source");
}
}
/**
* Configure the supplied {@link Transformer} instance.
* <p>The default implementation copies parameters from the model into the
* Transformer's {@link Transformer#setParameter parameter set}.
* This implementation also copies the {@link #setOutputProperties output properties}
* into the {@link Transformer} {@link Transformer#setOutputProperty output properties}.
* Indentation properties are set as well.
* @param model merged output Map (never <code>null</code>)
* @param response current HTTP response
* @param transformer the target transformer
* @see #copyModelParameters(Map, Transformer)
* @see #copyOutputProperties(Transformer)
* @see #configureIndentation(Transformer)
*/
protected void configureTransformer(Map model, HttpServletResponse response, Transformer transformer) {
copyModelParameters(model, transformer);
copyOutputProperties(transformer);
configureIndentation(transformer);
}
/**
* Configure the indentation settings for the supplied {@link Transformer}.
* @param transformer the target transformer
* @throws IllegalArgumentException if the supplied {@link Transformer} is <code>null</code>
* @see TransformerUtils#enableIndenting(javax.xml.transform.Transformer)
* @see TransformerUtils#disableIndenting(javax.xml.transform.Transformer)
*/
protected final void configureIndentation(Transformer transformer) {
if (this.indent) {
TransformerUtils.enableIndenting(transformer);
}
else {
TransformerUtils.disableIndenting(transformer);
}
}
/**
* Copy the configured output {@link Properties}, if any, into the
* {@link Transformer#setOutputProperty output property set} of the supplied
* {@link Transformer}.
* @param transformer the target transformer
*/
protected final void copyOutputProperties(Transformer transformer) {
if (this.outputProperties != null) {
Enumeration en = this.outputProperties.propertyNames();
while (en.hasMoreElements()) {
String name = (String) en.nextElement();
transformer.setOutputProperty(name, this.outputProperties.getProperty(name));
}
}
}
/**
* Copy all entries from the supplied Map into the
* {@link Transformer#setParameter(String, Object) parameter set}
* of the supplied {@link Transformer}.
* @param model merged output Map (never <code>null</code>)
* @param transformer the target transformer
*/
protected final void copyModelParameters(Map model, Transformer transformer) {
copyMapEntriesToTransformerParameters(model, transformer);
}
/**
* Configure the supplied {@link HttpServletResponse}.
* <p>The default implementation of this method sets the
* {@link HttpServletResponse#setContentType content type} and
* {@link HttpServletResponse#setCharacterEncoding encoding}
* from the "media-type" and "encoding" output properties
* specified in the {@link Transformer}.
* @param model merged output Map (never <code>null</code>)
* @param response current HTTP response
* @param transformer the target transformer
*/
protected void configureResponse(Map model, HttpServletResponse response, Transformer transformer) {
String contentType = getContentType();
String mediaType = transformer.getOutputProperty(OutputKeys.MEDIA_TYPE);
String encoding = transformer.getOutputProperty(OutputKeys.ENCODING);
if (StringUtils.hasText(mediaType)) {
contentType = mediaType;
}
if (StringUtils.hasText(encoding)) {
// Only apply encoding if content type is specified but does not contain charset clause already.
if (contentType != null && contentType.toLowerCase().indexOf(WebUtils.CONTENT_TYPE_CHARSET_PREFIX) == -1) {
contentType = contentType + WebUtils.CONTENT_TYPE_CHARSET_PREFIX + encoding;
}
}
response.setContentType(contentType);
}
/**
* Load the {@link Templates} instance for the stylesheet at the configured location.
*/
private Templates loadTemplates() throws ApplicationContextException {
Source stylesheetSource = getStylesheetSource();
try {
Templates templates = this.transformerFactory.newTemplates(stylesheetSource);
if (logger.isDebugEnabled()) {
logger.debug("Loading templates '" + templates + "'");
}
return templates;
}
catch (TransformerConfigurationException ex) {
throw new ApplicationContextException("Can't load stylesheet from '" + getUrl() + "'", ex);
}
finally {
closeSourceIfNecessary(stylesheetSource);
}
}
/**
* Create the {@link Transformer} instance used to prefer the XSLT transformation.
* <p>The default implementation simply calls {@link Templates#newTransformer()}, and
* configures the {@link Transformer} with the custom {@link URIResolver} if specified.
* @param templates the XSLT Templates instance to create a Transformer for
*/
protected Transformer createTransformer(Templates templates) throws TransformerConfigurationException {
Transformer transformer = templates.newTransformer();
if (this.uriResolver != null) {
transformer.setURIResolver(this.uriResolver);
}
return transformer;
}
/**
* Get the XSLT {@link Source} for the XSLT template under the {@link #setUrl configured URL}.
*/
protected Source getStylesheetSource() {
String url = getUrl();
if (logger.isDebugEnabled()) {
logger.debug("Loading XSLT stylesheet from '" + url + "'");
}
try {
Resource stylesheetResource = getApplicationContext().getResource(url);
String systemId = url.substring(0, url.lastIndexOf('/') + 1);
return new StreamSource(stylesheetResource.getInputStream(), systemId);
}
catch (IOException ex) {
throw new ApplicationContextException("Can't load XSLT stylesheet from '" + url + "'", ex);
}
}
/**
* Copy all {@link Map.Entry entries} from the supplied {@link Map} into the
* {@link Transformer#setParameter(String, Object) parameter set} of the supplied
* {@link Transformer}.
*/
private void copyMapEntriesToTransformerParameters(Map map, Transformer transformer) {
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
transformer.setParameter(ObjectUtils.nullSafeToString(entry.getKey()), entry.getValue());
}
}
/**
* Close the underlying resource managed by the supplied {@link Source} if applicable.
* <p>Only works for {@link StreamSource StreamSources}.
* @param source the XSLT Source to close (may be <code>null</code>)
*/
private void closeSourceIfNecessary(Source source) {
if (source instanceof StreamSource) {
StreamSource streamSource = (StreamSource) source;
if (streamSource.getReader() != null) {
try {
streamSource.getReader().close();
}
catch (IOException ex) {
}
}
if (streamSource.getInputStream() != null) {
try {
streamSource.getInputStream().close();
}
catch (IOException ex) {
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -