blob: 6aaae5c257eb2e4cbabeed80062c11749b551b0e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.jsp;
import java.io.File;
import org.apache.tools.ant.util.StringUtils;
/**
* This is a class derived from the Jasper code
* (org.apache.jasper.compiler.CommandLineCompiler) to map from a JSP filename
* to a valid Java classname.
*
*/
public class JspNameMangler implements JspMangler {
// CheckStyle:ConstantNameCheck OFF - bc
/**
* this is the list of keywords which can not be used as classnames
*/
public static final String[] keywords = {
"assert",
"abstract", "boolean", "break", "byte",
"case", "catch", "char", "class",
"const", "continue", "default", "do",
"double", "else", "extends", "final",
"finally", "float", "for", "goto",
"if", "implements", "import",
"instanceof", "int", "interface",
"long", "native", "new", "package",
"private", "protected", "public",
"return", "short", "static", "super",
"switch", "synchronized", "this",
"throw", "throws", "transient",
"try", "void", "volatile", "while"
};
// CheckStyle:ConstantNameCheck ON
/**
* map from a jsp file to a java filename; does not do packages
*
* @param jspFile file
* @return java filename
*/
public String mapJspToJavaName(File jspFile) {
return mapJspToBaseName(jspFile) + ".java";
}
/**
* map from a jsp file to a base name; does not deal with extensions
*
* @param jspFile jspFile file
* @return exensionless potentially remapped name
*/
private String mapJspToBaseName(File jspFile) {
String className;
className = stripExtension(jspFile);
// since we don't mangle extensions like the servlet does,
// we need to check for keywords as class names
for (int i = 0; i < keywords.length; ++i) {
if (className.equals(keywords[i])) {
className += "%";
break;
}
}
// Fix for invalid characters. If you think of more add to the list.
StringBuffer modifiedClassName = new StringBuffer(className.length());
// first char is more restrictive than the rest
char firstChar = className.charAt(0);
if (Character.isJavaIdentifierStart(firstChar)) {
modifiedClassName.append(firstChar);
} else {
modifiedClassName.append(mangleChar(firstChar));
}
// this is the rest
for (int i = 1; i < className.length(); i++) {
char subChar = className.charAt(i);
if (Character.isJavaIdentifierPart(subChar)) {
modifiedClassName.append(subChar);
} else {
modifiedClassName.append(mangleChar(subChar));
}
}
return modifiedClassName.toString();
}
/**
* get short filename from file
*
* @param jspFile file in
* @return file without any jsp extension
*/
private String stripExtension(File jspFile) {
return StringUtils.removeSuffix(jspFile.getName(), ".jsp");
}
/**
* definition of the char escaping algorithm
*
* @param ch char to mangle
* @return mangled string; 5 digit hex value
*/
private static String mangleChar(char ch) {
// CheckStyle:MagicNumber OFF
if (ch == File.separatorChar) {
ch = '/';
}
String s = Integer.toHexString(ch);
int nzeros = 5 - s.length();
char[] result = new char[6];
result[0] = '_';
for (int i = 1; i <= nzeros; ++i) {
result[i] = '0';
}
int resultIndex = 0;
for (int i = nzeros + 1; i < 6; ++i) {
result[i] = s.charAt(resultIndex++);
}
return new String(result);
// CheckStyle:MagicNumber ON
}
/**
* taking in the substring representing the path relative to the source dir
* return a new string representing the destination path
* not supported, as jasper in tomcat4.0 doesnt either
* @param path not used
* @return null always.
*/
public String mapPath(String path) {
return null;
}
}