001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.web.servlet.view.xslt;
018:
019: import java.util.Properties;
020:
021: import javax.xml.transform.ErrorListener;
022: import javax.xml.transform.URIResolver;
023:
024: import org.springframework.web.servlet.view.AbstractUrlBasedView;
025: import org.springframework.web.servlet.view.UrlBasedViewResolver;
026:
027: /**
028: * {@link org.springframework.web.servlet.ViewResolver} implementation that
029: * resolves instances of {@link XsltView} by translating the supplied view name
030: * into the URL of the XSLT stylesheet.
031: *
032: * @author Rob Harrop
033: * @author Juergen Hoeller
034: * @since 2.0
035: */
036: public class XsltViewResolver extends UrlBasedViewResolver {
037:
038: private String sourceKey;
039:
040: private URIResolver uriResolver;
041:
042: private ErrorListener errorListener;
043:
044: private boolean indent = true;
045:
046: private Properties outputProperties;
047:
048: private boolean cacheTemplates = true;
049:
050: public XsltViewResolver() {
051: setViewClass(XsltView.class);
052: }
053:
054: /**
055: * Set the name of the model attribute that represents the XSLT Source.
056: * If not specified, the model map will be searched for a matching value type.
057: * <p>The following source types are supported out of the box:
058: * {@link javax.xml.transform.Source}, {@link org.w3c.dom.Document},
059: * {@link org.w3c.dom.Node}, {@link java.io.Reader}, {@link java.io.InputStream}
060: * and {@link org.springframework.core.io.Resource}.
061: */
062: public void setSourceKey(String sourceKey) {
063: this .sourceKey = sourceKey;
064: }
065:
066: /**
067: * Set the URIResolver used in the transform.
068: * <p>The URIResolver handles calls to the XSLT <code>document()</code> function.
069: */
070: public void setUriResolver(URIResolver uriResolver) {
071: this .uriResolver = uriResolver;
072: }
073:
074: /**
075: * Set an implementation of the {@link javax.xml.transform.ErrorListener}
076: * interface for custom handling of transformation errors and warnings.
077: * <p>If not set, a default
078: * {@link org.springframework.util.xml.SimpleTransformErrorListener} is
079: * used that simply logs warnings using the logger instance of the view class,
080: * and rethrows errors to discontinue the XML transformation.
081: * @see org.springframework.util.xml.SimpleTransformErrorListener
082: */
083: public void setErrorListener(ErrorListener errorListener) {
084: this .errorListener = errorListener;
085: }
086:
087: /**
088: * Set whether the XSLT transformer may add additional whitespace when
089: * outputting the result tree.
090: * <p>Default is <code>true</code> (on); set this to <code>false</code> (off)
091: * to not specify an "indent" key, leaving the choice up to the stylesheet.
092: * @see javax.xml.transform.OutputKeys#INDENT
093: */
094: public void setIndent(boolean indent) {
095: this .indent = indent;
096: }
097:
098: /**
099: * Set arbitrary transformer output properties to be applied to the stylesheet.
100: * <p>Any values specified here will override defaults that this view sets
101: * programmatically.
102: * @see javax.xml.transform.Transformer#setOutputProperty
103: */
104: public void setOutputProperties(Properties outputProperties) {
105: this .outputProperties = outputProperties;
106: }
107:
108: /**
109: * Turn on/off the caching of the XSLT templates.
110: * <p>The default value is "true". Only set this to "false" in development,
111: * where caching does not seriously impact performance.
112: */
113: public void setCacheTemplates(boolean cacheTemplates) {
114: this .cacheTemplates = cacheTemplates;
115: }
116:
117: protected Class requiredViewClass() {
118: return XsltView.class;
119: }
120:
121: protected AbstractUrlBasedView buildView(String viewName)
122: throws Exception {
123: XsltView view = (XsltView) super.buildView(viewName);
124: view.setSourceKey(this.sourceKey);
125: if (this.uriResolver != null) {
126: view.setUriResolver(this.uriResolver);
127: }
128: if (this.errorListener != null) {
129: view.setErrorListener(this.errorListener);
130: }
131: view.setIndent(this.indent);
132: view.setOutputProperties(this.outputProperties);
133: view.setCacheTemplates(this.cacheTemplates);
134: return view;
135: }
136:
137: }
|