001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.taskdefs.optional.jsp.compilers;
019:
020: import org.apache.tools.ant.AntClassLoader;
021: import org.apache.tools.ant.BuildException;
022: import org.apache.tools.ant.Task;
023: import org.apache.tools.ant.taskdefs.optional.jsp.JspNameMangler;
024: import org.apache.tools.ant.taskdefs.optional.jsp.Jasper41Mangler;
025:
026: /**
027: * Creates the necessary compiler adapter, given basic criteria.
028: *
029: */
030: public final class JspCompilerAdapterFactory {
031:
032: /** This is a singleton -- can't create instances!! */
033: private JspCompilerAdapterFactory() {
034: }
035:
036: /**
037: * Based on the parameter passed in, this method creates the necessary
038: * factory desired.
039: *
040: * The current mapping for compiler names are as follows:
041: * <ul><li>jasper = jasper compiler (the default)
042: * <li><i>a fully quallified classname</i> = the name of a jsp compiler
043: * adapter
044: * </ul>
045: *
046: * @param compilerType either the name of the desired compiler, or the
047: * full classname of the compiler's adapter.
048: * @param task a task to log through.
049: * @return the compiler
050: * @throws BuildException if the compiler type could not be resolved into
051: * a compiler adapter.
052: */
053: public static JspCompilerAdapter getCompiler(String compilerType,
054: Task task) throws BuildException {
055: return getCompiler(compilerType, task, task.getProject()
056: .createClassLoader(null));
057: }
058:
059: /**
060: * Based on the parameter passed in, this method creates the necessary
061: * factory desired.
062: *
063: * The current mapping for compiler names are as follows:
064: * <ul><li>jasper = jasper compiler (the default)
065: * <li><i>a fully quallified classname</i> = the name of a jsp compiler
066: * adapter
067: * </ul>
068: *
069: * @param compilerType either the name of the desired compiler, or the
070: * full classname of the compiler's adapter.
071: * @param task a task to log through.
072: * @param loader AntClassLoader with which the compiler should be loaded
073: * @return the compiler
074: * @throws BuildException if the compiler type could not be resolved into
075: * a compiler adapter.
076: */
077: public static JspCompilerAdapter getCompiler(String compilerType,
078: Task task, AntClassLoader loader) throws BuildException {
079:
080: if (compilerType.equalsIgnoreCase("jasper")) {
081: //tomcat4.0 gets the old mangler
082: return new JasperC(new JspNameMangler());
083: }
084: if (compilerType.equalsIgnoreCase("jasper41")) {
085: //tomcat4.1 gets the new one
086: return new JasperC(new Jasper41Mangler());
087: }
088: return resolveClassName(compilerType, loader);
089: }
090:
091: /**
092: * Tries to resolve the given classname into a compiler adapter.
093: * Throws a fit if it can't.
094: *
095: * @param className The fully qualified classname to be created.
096: * @param classloader Classloader with which to load the class
097: * @throws BuildException This is the fit that is thrown if className
098: * isn't an instance of JspCompilerAdapter.
099: */
100: private static JspCompilerAdapter resolveClassName(
101: String className, AntClassLoader classloader)
102: throws BuildException {
103: try {
104: Class c = classloader.findClass(className);
105: Object o = c.newInstance();
106: return (JspCompilerAdapter) o;
107: } catch (ClassNotFoundException cnfe) {
108: throw new BuildException(className + " can\'t be found.",
109: cnfe);
110: } catch (ClassCastException cce) {
111: throw new BuildException(className
112: + " isn\'t the classname of "
113: + "a compiler adapter.", cce);
114: } catch (Throwable t) {
115: // for all other possibilities
116: throw new BuildException(className
117: + " caused an interesting " + "exception.", t);
118: }
119: }
120:
121: }
|