You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2002/03/26 18:01:33 UTC
DO NOT REPLY [Bug 7488] New: -
JspC generates wrong package with -webapp on PC/DOS/NT/Win2k
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=7488>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=7488
JspC generates wrong package with -webapp on PC/DOS/NT/Win2k
Summary: JspC generates wrong package with -webapp on
PC/DOS/NT/Win2k
Product: Tomcat 4
Version: 4.0.3 Final
Platform: PC
OS/Version: Windows NT/2K
Status: NEW
Severity: Normal
Priority: Other
Component: Jasper
AssignedTo: tomcat-dev@jakarta.apache.org
ReportedBy: alain.coetmeur@caissedesdepots.fr
(bug with patch!)
When I tried to generate JSP-Servlets with
JspC -webapp dir
the generated code could not be compiled because
the package was "org.apache.jsp." with a surious dot at the end.
the reason is in CommandLineContext.getServletPackageName()
which produce this wrong package name, because of the DOS
filename in the jspfilename, and the double "\" used...
this code is first not adapted to NT/DOS filename because
it uses "/" and not File.separatorChar (which is \ on NT).
moreover I've found that invalid package name could be
generated if a subdirectory is named as a java reserved keyword like
'if' or 'int', contains "-" or similar character invalid in java identifiers...
I've patched the whole function so it resolve these problems.
I've tested on NT, but not on Unix, however it should work the same.
note that I use a pair of "$" character as escape characters in package name
(eg a=b\if\earn_much_$_quickly\foo.jsp -> package
a$3d$b.$if$.earn_much_$$_quickly;)
this may conflict with CVS keys, and you may prefer to use '_' as
escape character. however, underscore is a frequent separator
in file name which users may like to be kept the same as a package name...
anyway this is not essential, since
- JSP servlets are seldom put into CVS
- JSP servlets package name are seldom used by humans
here is the modified function
/*
* $Header: /home/cvs/jakarta-tomcat-
4.0/jasper/src/share/org/apache/jasper/CommandLineContext.java,v 1.6.2.1
2002/02/01 22:20:37 kinman Exp $
* $Revision: 1.6.2.1 $
* $Date: 2002/02/01 22:20:37 $
...
*/
package org.apache.jasper;
...
/**
* Holds data used on a per-page compilation context that would otherwise spill
* over to other pages being compiled. Things like the taglib classloaders
* and directives.
*
* @author Danno Ferrin
* @author Pierre Delisle
*/
public class CommandLineContext implements JspCompilationContext {
/**
* The package name for the generated class.
* mangle the package name so there is no conflit with keywords
* or special character, or with spurious dots
* also works on DOS/Windows names
* NB: usage of '/' is not good... rather use File.separatorChar...
* check in the rest of the code!
* @author modified by Alain Coetmeur
*/
public String getServletPackageName() {
//get the path to the jsp file
//System.out.println(getClass().getName()+".getServletPackageName():
file="+getJspFile());
//System.out.println(getClass().getName()+".getServletPackageName():
uriBase="+uriBase);
//System.out.println(getClass().getName()+".getServletPackageName():
uriRoot="+uriRoot);
//int indexOfSlash = getJspFile().lastIndexOf(File.separatorChar);
String pathName=(new File(getJspFile())).getParent();
if(pathName==null) {
pathName = File.separator;
}
//Assemble the package name from the base package name specified on
//the command line and the package name derived from the path to
//the jsp file
String packageName = "";
if (servletPackageName != null && !servletPackageName.equals("")) {
packageName = servletPackageName;
}
packageName += pathName.replace(File.separatorChar, '.');/* unix/nt */
// escapes characted illegal in java identifiers as $hexvalue$,
// and non ascii (problem sometime, often between iso8859/utf8)
// escapes $ as $$ to ensure unicity (paranoid!)
// escapes reserved keyword as $keyword$
// remove double dots (if file path contains double slash by error)
// remove leading dots (if absolute path on unix)
// remove trailing dots (if double slash at end)
//System.out.println(getClass().getName()+".getServletPackageName():
pack0="+packageName);
for(int pos=0;pos<packageName.length();pos++) {
char cur=packageName.charAt(pos);
if(cur=='.') {
if( pos==0 /* remove leading dots */
|| pos>=packageName.length()-1 /* remove trailing dots */
|| packageName.charAt(pos+1)=='.' /* remove double dots */
) {
packageName=packageName.substring(0,pos)+packageName.substring
(pos+1,packageName.length());
pos--;
}
continue;
}
boolean atStart=(pos==0 || packageName.charAt(pos-1)=='.');
boolean foundKeyword=false;
if(atStart) {
for(int i=0;i<CommandLineCompiler.keywords.length;i++) {
String kw=CommandLineCompiler.keywords[i];
if( packageName.startsWith(kw, pos) &&
( (kw.length()==packageName.length()-pos) ||
(kw.length()<packageName.length()-pos && packageName.charAt
(pos+kw.length())=='.')
) ) {
packageName=packageName.substring(0,pos)
+"$"+kw+"$"+packageName.substring(pos+kw.length(),packageName.length());
pos+=kw.length()+1;
foundKeyword=true;
break;
}
}
if(foundKeyword)
{continue;}
}
if(cur!='$' && (int)cur >32 && (int)cur<128 && (
( atStart && Character.isJavaIdentifierStart(cur) )
|| ( !atStart && Character.isJavaIdentifierPart(cur) )
) ) {
continue;
}
String escaped=(cur=='$')?"$$":("$"+Integer.toHexString((int)cur)
+"$");
packageName=packageName.substring(0,pos)+escaped+packageName.substring
(pos+1,packageName.length());
pos+=escaped.length()-1;
}
//System.out.println(getClass().getName()+".getServletPackageName():
pack="+packageName);
return packageName;
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>