/*
* 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 Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.jsp;
import com.caucho.jsp.java.TagTaglib;
import com.caucho.loader.SimpleLoader;
import com.caucho.util.L10N;
import com.caucho.util.Log;
import com.caucho.vfs.Path;
import javax.servlet.jsp.tagext.TagInfo;
import javax.servlet.jsp.tagext.TagLibraryInfo;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Stores the information for the .tags
*/
public class TagFileManager {
static final L10N L = new L10N(TagFileManager.class);
private static final Logger log = Log.open(TagFileManager.class);
private JspCompiler _jspCompiler;
public TagFileManager(JspCompiler compiler)
{
_jspCompiler = compiler;
}
public TagInfo getTag(String prefix,
String shortName,
String location)
throws JspParseException
{
if (location == null)
return null;
try {
String originalLocation = location;
if (location.startsWith("urn:jsptagdir:"))
location = location.substring("urn:jsptagdir:".length());
TagTaglib taglib = new TagTaglib(prefix, originalLocation);
String uri = location;
TagInfo tag = null;
try {
tag = getTag(uri, taglib);
if (tag != null)
return tag;
} catch (Exception e) {
log.log(Level.FINEST, e.toString(), e);
}
if (! location.endsWith("/"))
location = location + "/";
uri = location + shortName + ".tag";
tag = getTag(uri, taglib);
if (tag != null)
return tag;
uri = location + shortName + ".tagx";
return getTag(uri, taglib);
} catch (Exception e) {
throw JspParseException.create(e);
}
}
public TagInfo getTag(String prefix,
String location)
throws JspParseException
{
TagTaglib taglib = new TagTaglib(prefix, location);
return getTag(location, taglib);
}
public TagInfo getTag(String location,
TagTaglib taglib)
throws JspParseException
{
JspResourceManager resourceManager = _jspCompiler.getResourceManager();
if (resourceManager == null)
return null;
Path path = resourceManager.resolvePath(location);
return getTag(path, location, taglib);
}
public TagInfo getTag(Path path,
String prefix,
String location)
throws JspParseException
{
TagTaglib taglib = new TagTaglib(prefix, location);
return getTag(path, location, taglib);
}
public TagInfo getTag(Path path,
String location,
TagTaglib taglib)
throws JspParseException
{
if (path == null || ! path.canRead())
return null;
try {
if (location.endsWith(".tag")) {
JspCompilerInstance tagCompiler;
tagCompiler = _jspCompiler.getCompilerInstance(path, location);
tagCompiler.setXML(false);
return tagCompiler.compileTag(taglib);
}
else if (location.endsWith(".tagx")) {
JspCompilerInstance tagCompiler;
tagCompiler = _jspCompiler.getCompilerInstance(path, location);
tagCompiler.setXML(true);
return tagCompiler.compileTag(taglib);
}
else
throw new JspParseException(L.l("tag file '{0}' must end with .tag or .tagx",
location));
} catch (Exception e) {
throw JspParseException.create(e);
}
}
public Class loadClass(String className)
throws Exception
{
Path classDir = _jspCompiler.getClassDir();
ClassLoader parentLoader = Thread.currentThread().getContextClassLoader();
ClassLoader jspLoader = SimpleLoader.create(parentLoader,
classDir,
null);
return Class.forName(className, false, jspLoader);
}
}