/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.jsp.cfg;
import com.caucho.config.ConfigException;
import com.caucho.config.types.FileSetType;
import com.caucho.config.types.Period;
import com.caucho.jsp.JspServlet;
import com.caucho.jsp.JspXmlServlet;
import com.caucho.server.dispatch.ServletMapping;
import com.caucho.server.dispatch.UrlMap;
import com.caucho.server.webapp.WebApp;
import com.caucho.util.L10N;
import com.caucho.vfs.Path;
import javax.annotation.PostConstruct;
import javax.servlet.ServletException;
import javax.servlet.descriptor.JspPropertyGroupDescriptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Pattern;
/**
* Configuration for the jsp-property-group.
*/
public class JspPropertyGroup implements JspPropertyGroupDescriptor {
private static final L10N L = new L10N(JspPropertyGroup.class);
private static int _gId;
private WebApp _webApp;
private String _id;
private ArrayList<String> _urlPatterns = new ArrayList<String>();
private String _pageEncoding;
private Boolean _isELIgnored;
private Boolean _isScriptingInvalid = null;
private Boolean _isXml = null;
private ArrayList<String> _includePrelude = new ArrayList<String>();
private ArrayList<String> _includeCoda = new ArrayList<String>();
private String _characterEncoding;
// Resin config
private boolean _precompile = true;
private boolean _fastJstl = true;
private boolean _fastJsf = false;
private boolean _ideHack = false;
private boolean _velocity = false;
private boolean _session = true;
private boolean _staticEncoding = true;
private boolean _recycleTags = true;
private boolean _autoCompile = true;
private boolean _requireSource = false;
private boolean _ignoreELException = true;
private boolean _isValidateTaglibSchema = true;
private boolean _isPrintNullAsBlank = false;
private int _jspMax = 0;
private boolean _disableLog = true;
private long _dependencyCheckInterval = Long.MIN_VALUE;
private boolean _staticPageGeneratesClass = true;
private boolean _loadTldOnInit = false;
private boolean _recompileOnError = false;
private FileSetType _tldFileSet;
private Boolean _isTrimWhitespace = null;
private Boolean _isDeferredSyntaxAllowedAsLiteral = null;
private boolean _isELIgnoredForOldWebApp = false;
// servlet 3.0
private String _defaultContentType;
private String _buffer;
private Boolean _isErrorOnUndeclaredNamespace;
public JspPropertyGroup()
{
}
public JspPropertyGroup(WebApp webApp)
{
_webApp = webApp;
}
/**
* Returns the group's identifier.
*/
public String getId()
{
return _id;
}
/**
* Sets the group's identifier.
*/
public void setId(String id)
{
_id = id;
}
/**
* Sets the group's description
*/
public void setDescription(String description)
{
}
/**
* Sets the group's display name
*/
public void setDisplayName(String displayName)
{
}
/**
* Adds a URL pattern.
*/
public void addURLPattern(String urlPattern)
{
_urlPatterns.add(urlPattern);
}
@Override
public Collection<String> getUrlPatterns()
{
return _urlPatterns;
}
/**
* Sets the default page encoding.
*/
public void setPageEncoding(String pageEncoding)
{
_pageEncoding = pageEncoding;
}
/**
* Returns the default page encoding.
*/
public String getPageEncoding()
{
return _pageEncoding;
}
/**
* Set true if EL expressions are ignored for the JSP page.
*/
public void setELIgnored(boolean isELIgnored)
{
_isELIgnored = isELIgnored ? Boolean.TRUE : Boolean.FALSE;;
}
/**
* Return true if EL expressions are ignored for the JSP page.
*/
public Boolean isELIgnored()
{
return _isELIgnored;
}
@Override
public String getElIgnored()
{
return _isELIgnored == null ? null : _isELIgnored.toString();
}
/**
* Set true when JSP pages should load tld files.
*/
public void setLoadTldOnInit(boolean isPreload)
{
_loadTldOnInit = isPreload;
}
/**
* Set true when JSP pages should load tld files.
*/
public boolean isLoadTldOnInit()
{
return _loadTldOnInit;
}
/**
* Sets the dependency check interval.
*/
public void setDependencyCheckInterval(Period period)
{
_dependencyCheckInterval = period.getPeriod();
}
/**
* Gets the dependency check interval.
*/
public long getDependencyCheckInterval()
{
return _dependencyCheckInterval;
}
/**
* Set true if scripting is invalid for the JSP page.
*/
public void setScriptingInvalid(boolean isScriptingInvalid)
{
_isScriptingInvalid = isScriptingInvalid;
}
/**
* Return true if scripting expressions are invalid for the JSP page.
*/
public boolean isScriptingInvalid()
{
if (_isScriptingInvalid == null)
return false;
return _isScriptingInvalid;
}
@Override
public String getScriptingInvalid()
{
return _isScriptingInvalid == null ? null : _isScriptingInvalid.toString();
}
/**
* Return true if the JSP uses XML format.
*/
public void setIsXml(boolean isXml)
{
_isXml = isXml ? Boolean.TRUE : Boolean.FALSE;
}
/**
* Return true if the JSP uses XML format.
*/
public Boolean isXml()
{
return _isXml;
}
@Override
public String getIsXml()
{
return _isXml == null ? null : _isXml.toString();
}
/**
* Adds a new prelude inclusion.
*/
public void addIncludePrelude(String url)
{
_includePrelude.add(url);
}
/**
* Returns the prelude inclusion.
*/
public ArrayList<String> getIncludePreludeList()
{
return _includePrelude;
}
@Override
public Collection<String> getIncludePreludes()
{
return _includePrelude;
}
/**
* Adds a new coda inclusion.
*/
public void addIncludeCoda(String url)
{
_includeCoda.add(url);
}
/**
* Returns the coda inclusion.
*/
public ArrayList<String> getIncludeCodaList()
{
return _includeCoda;
}
@Override
public Collection<String> getIncludeCodas()
{
return _includeCoda;
}
public String getCharacterEncoding()
{
return _characterEncoding;
}
public void setCharacterEncoding(String characterEncoding)
{
_characterEncoding = characterEncoding;
}
// Resin config
/**
* Set if precompilation is allowed.
*/
public void setPrecompile(boolean precompile)
{
_precompile = precompile;
}
/**
* Return true if precompilation is allowed.
*/
public boolean getPrecompile()
{
return _precompile;
}
/**
* Return true if auto-compilation is allowed.
*/
public boolean isAutoCompile()
{
return _autoCompile;
}
/**
* Set if auto-compile is allowed.
*/
public void setAutoCompile(boolean compile)
{
_autoCompile = compile;
}
/**
* Set if the *.jsp source is required.
*/
public void setRequireSource(boolean requireSource)
{
_requireSource = requireSource;
}
/**
* Set if the *.jsp source is required.
*/
public boolean getRequireSource()
{
return _requireSource;
}
/**
* Set if nulls are printed as space
*/
public void setPrintNullAsBlank(boolean enable)
{
_isPrintNullAsBlank = enable;
}
/**
* Set if nulls are printed as space
*/
public boolean isPrintNullAsBlank()
{
return _isPrintNullAsBlank;
}
/**
* Set true if EL exceptions should be ignored.
*/
public boolean isIgnoreELException()
{
return _ignoreELException;
}
/**
* Set true if EL exceptions should be ignored.
*/
public void setIgnoreELException(boolean ignore)
{
_ignoreELException = ignore;
}
/**
* Set if fast jstl is allowed.
*/
public void setFastJstl(boolean fastJstl)
{
_fastJstl = fastJstl;
}
/**
* Return true if fast jstl is allowed.
*/
public boolean isFastJstl()
{
return _fastJstl;
}
/**
* Set if fast jsf is allowed.
*/
public void setFastJsf(boolean fastJsf)
{
_fastJsf = fastJsf;
}
/**
* Return true if fast jsf is allowed.
*/
public boolean isFastJsf()
{
return _fastJsf;
}
/**
* Set if velocity-style syntax is allowed.
*/
public void setVelocityEnabled(boolean velocity)
{
_velocity = velocity;
}
/**
* Return true if velocity is allowed.
*/
public boolean isVelocityEnabled()
{
return _velocity;
}
/**
* Set if sessions are enabled by default
*/
public void setSession(boolean session)
{
_session = session;
}
/**
* Return true if sessions are enabled by default.
*/
public boolean isSession()
{
return _session;
}
/**
* Set if static encoding is enabled.
*/
public void setStaticEncoding(boolean staticEncoding)
{
_staticEncoding = staticEncoding;
}
/**
* Return true if static encoding is enabled
*/
public boolean isStaticEncoding()
{
return _staticEncoding;
}
/**
* Set if recycle tags is enabled.
*/
public void setRecycleTags(boolean recycleTags)
{
_recycleTags = recycleTags;
}
/**
* Return true if recycle tags is enabled
*/
public boolean isRecycleTags()
{
return _recycleTags;
}
/**
* Sets true for the ide-hack
*/
public void setIdeHack(boolean ideHack)
{
_ideHack = ideHack;
}
/**
* Gets the value of the ide-hack
*/
public boolean getIdeHack()
{
return _ideHack;
}
/**
* Sets the jsp-max
*/
public void setJspMax(int max)
throws ConfigException
{
if (max <= 0)
throw new ConfigException(L.l("`{0}' is too small a value for jsp-max",
max));
_jspMax = max;
}
/**
* Gets the value of the jsp-max
*/
public int getJspMax()
{
return _jspMax;
}
/**
* Returns true if JSP logging should be disabled.
*/
public boolean isDisableLog()
{
return _disableLog;
}
/**
* Sets the deferred-syntax.
*/
public void setDeferredSyntaxAllowedAsLiteral(boolean isAllowed)
{
_isDeferredSyntaxAllowedAsLiteral = isAllowed;
}
/**
* Sets the deferred-syntax.
*/
public boolean isDeferredSyntaxAllowedAsLiteral()
{
return _isDeferredSyntaxAllowedAsLiteral == null ?
false :
_isDeferredSyntaxAllowedAsLiteral;
}
@Override
public String getDeferredSyntaxAllowedAsLiteral()
{
return _isDeferredSyntaxAllowedAsLiteral == null ?
null :
_isDeferredSyntaxAllowedAsLiteral.toString();
}
public String getDefaultContentType()
{
return _defaultContentType;
}
public void setDefaultContentType(String defaultContentType)
{
_defaultContentType = defaultContentType;
}
public String getBuffer()
{
return _buffer;
}
public void setBuffer(String buffer)
{
_buffer = buffer;
}
public boolean isErrorOnUndeclaredNamespace()
{
return _isErrorOnUndeclaredNamespace == null ?
true :
_isErrorOnUndeclaredNamespace.booleanValue();
}
@Override
public String getErrorOnUndeclaredNamespace()
{
return _isErrorOnUndeclaredNamespace == null ?
null :
_isErrorOnUndeclaredNamespace.toString();
}
public void setErrorOnUndeclaredNamespace(Boolean errorOnUndeclaredNamespace)
{
_isErrorOnUndeclaredNamespace = errorOnUndeclaredNamespace;
}
/**
* Sets the recompile-on-errrkReturns true if JSP logging should be disabled.
*/
public void setRecompileOnError(boolean recompile)
{
_recompileOnError = recompile;
}
/**
* Sets the recompile-on-errrkReturns true if JSP logging should be disabled.
*/
public boolean isRecompileOnError()
{
return _recompileOnError;
}
/**
* Set true if the taglibs should have the schema validated
*/
public void setValidateTaglibSchema(boolean isValidate)
{
_isValidateTaglibSchema = isValidate;
}
/**
* Set true if the taglibs should have the schema validated
*/
public boolean isValidateTaglibSchema()
{
return _isValidateTaglibSchema;
}
/**
* Sets the tld fileset.
*/
public void setTldFileSet(FileSetType fileSet)
{
_tldFileSet = fileSet;
}
/**
* Gets the tld fileset.
*/
public FileSetType getTldFileSet()
{
return _tldFileSet;
}
/**
* Sets a restriction of the tld dir.
*/
public void setTldDir(Path tldDir)
{
_tldFileSet = new FileSetType();
_tldFileSet.setDir(tldDir);
}
/**
* Set true if static pages should generate a class
*/
public void setStaticPageGeneratesClass(boolean generate)
{
_staticPageGeneratesClass = generate;
}
/**
* Set true if static pages should generate a class
*/
public boolean getStaticPageGeneratesClass()
{
return _staticPageGeneratesClass;
}
/**
* True if whitespace is trimmed.
*/
public boolean isTrimDirectiveWhitespaces()
{
return _isTrimWhitespace == null ? false : _isTrimWhitespace.booleanValue();
}
/**
* Set if whitespace is trimmed.
*/
public void setTrimDirectiveWhitespaces(boolean isTrim)
{
_isTrimWhitespace = isTrim;
}
@Override
public String getTrimDirectiveWhitespaces()
{
return _isTrimWhitespace == null ? null : _isTrimWhitespace.toString();
}
@PostConstruct
public void init()
throws ServletException
{
if (_webApp != null) {
ServletMapping mapping = _webApp.createServletMapping();
mapping.setServletName("jsp-property-group-" + _gId++);
if (Boolean.TRUE.equals(_isXml))
mapping.setServletClass(JspXmlServlet.class.getName());
else
mapping.setServletClass(JspServlet.class.getName());
for (int i = 0; i < _urlPatterns.size(); i++) {
mapping.addURLPattern(_urlPatterns.get(i));
}
_webApp.addServletMapping(mapping);
}
}
/**
* Returns true if the property group matches the URL.
*/
public boolean match(String url)
{
if (_urlPatterns.size() == 0)
return true;
for (int i = 0; i < _urlPatterns.size(); i++) {
String urlPattern = _urlPatterns.get(i);
String regexpPattern = UrlMap.urlPatternToRegexpPattern(urlPattern);
if (Pattern.compile(regexpPattern).matcher(url).find()) {
return true;
}
}
return false;
}
}