costin      01/06/09 14:29:03

  Modified:    jasper34/runtime/org/apache/jasper34/runtime
                        HttpJspBase.java JspRuntimeLibrary.java
  Log:
  Initial code to use the new line map.
  
  We don't do anything special - this is just the original code that does
  the mapping.
  
  Very inefficient ( 2 Writers, Readers, many Srings, linear search ) - it can
  be changed later ( possibly in a general purpose util ). This is called only
  on error - shouldn't be a frequent operation.
  
  The code should do a println with the detected location in the JSP file
  
  ( small bug - the line is 0-based, need to increment it )
  
  Revision  Changes    Path
  1.5       +22 -0     
jakarta-tomcat-jasper/jasper34/runtime/org/apache/jasper34/runtime/HttpJspBase.java
  
  Index: HttpJspBase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/runtime/org/apache/jasper34/runtime/HttpJspBase.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HttpJspBase.java  2001/06/08 05:41:14     1.4
  +++ HttpJspBase.java  2001/06/09 21:29:02     1.5
  @@ -129,6 +129,10 @@
                out=pageContext.getOut();
                _jspService(pageContext, request, response );
            } catch (Exception ex) {
  +             // Experimental/test line mappings
  +             JspRuntimeLibrary.handleExceptionMapping( this, 
  +                                                       ex );
  +
                if (pageContext != null)
                    pageContext.handlePageException(ex);
            } catch (Error error) {
  @@ -183,6 +187,24 @@
       }
   
   
  +    /** Return extra dependencies for this file ( TLDs, included files )
  +     */
       public String[] _getDepends() { return null; }
  +
  +    /** Return the static chunks to be used with sendChunk()
  +     */
       public String[] _getChunks() { return null; }
  +
  +    /** line mapping - the files used in lineMap
  +     */
  +    public String[] _getFileMap() { return null; }
  +
  +    /** Line map.
  +     { java_start, java_end,
  +       jsp_file_start_idx, jsp_file_start_line, jsp_file_start_col,
  +       jsp_file_end_idx, jsp_file_end_line, jsp_file_end_col
  +     }
  +     @see GeneratorBase.generateLineMap 
  +    */
  +    public int[][] _getLineMap() { return null; }
   }
  
  
  
  1.4       +86 -10    
jakarta-tomcat-jasper/jasper34/runtime/org/apache/jasper34/runtime/JspRuntimeLibrary.java
  
  Index: JspRuntimeLibrary.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/runtime/org/apache/jasper34/runtime/JspRuntimeLibrary.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JspRuntimeLibrary.java    2001/05/28 06:48:15     1.3
  +++ JspRuntimeLibrary.java    2001/06/09 21:29:02     1.4
  @@ -64,19 +64,14 @@
   
   import java.lang.reflect.Method;
   
  -import java.io.Writer;
  -import java.io.Reader;
  -import java.io.IOException;
  -import java.io.InputStreamReader;
  +import java.io.*;
   
   import java.beans.PropertyDescriptor;
   import java.beans.IndexedPropertyDescriptor;
   
  -import javax.servlet.ServletException;
  -import javax.servlet.ServletRequest;
  -import javax.servlet.ServletContext;
  -import javax.servlet.http.HttpServletRequest;
  -import javax.servlet.http.HttpSession;
  +import javax.servlet.*;
  +import javax.servlet.http.*;
  +import javax.servlet.jsp.*;
   
   //import org.apache.jasper.JasperException;
   
  @@ -651,7 +646,88 @@
        methods.put( prop, method );
        return method;
       }
  -    
  +
  +    public static void handleExceptionMapping( HttpJspBase jsp,
  +                                            Throwable ex )
  +    {
  +     int map[][]=jsp._getLineMap();
  +     String fmap[]=jsp._getFileMap();
  +
  +     if( map==null ) return;
  +
  +
  +     String trace=getTrace( ex );
  +     if( trace==null ) return;
  +
  +     String classN=jsp.getClass().getName();
  +
  +     //log( "Trace " + trace );
  +     //log("Finding " + classN );
  +
  +     try {
  +         BufferedReader br=new BufferedReader(new StringReader( trace ));
  +         String line;
  +         while( true ) {
  +             line=br.readLine();
  +             if(line==null ) break;
  +             
  +             if( line.indexOf( classN ) < 0 ) {
  +                 // log( "Not Found " + line );
  +                 continue;
  +             }
  +             //log( "Found " + line );
  +             int col=line.indexOf( ':' );
  +             int end=line.indexOf(')' );
  +             if( col<0 || end<0 ) break;
  +             
  +             String nr=line.substring( col+1, end );
  +             int lineNr= Integer.parseInt( nr );
  +             // Now do the mapping
  +             //log( "Java line number " + lineNr + " " + map );
  +             int mapping[]= findMapping( map, lineNr );
  +             if( mapping== null ) return;
  +             log( "JSP location: " +
  +                  fmap[mapping[2]] + ":" + mapping[3] );
  +         }
  +         br.close();
  +     } catch( Exception ex1 ) {
  +         ex1.printStackTrace();
  +     }
  +    }
  +
  +    // Linear search - this happens only on error, and we're
  +    // still experimenting
  +    private static int[] findMapping( int map[][], int lineNr ) {
  +     if( map==null ) return null;
  +     for( int i=map.length-1; i>=0; i-- ) {
  +         if( map[i] == null ) continue;
  +         if( map[i][0] <= lineNr &&
  +             map[i][1] > lineNr ) {
  +             return map[i];
  +         }
  +         //log( "Not found " + map[i][0] + " " + map[i][1] );
  +     }
  +     return null;
  +    }
  +
  +    public static String getTrace( Throwable ex ) {
  +     try {
  +         StringWriter traceWriter=new StringWriter();
  +         PrintWriter traceWriterPW=new PrintWriter( traceWriter );
  +         
  +         ex.printStackTrace( traceWriterPW );
  +         traceWriterPW.flush();
  +         String trace=traceWriter.toString();
  +         traceWriterPW.close();
  +         return trace;
  +     } catch( Exception ex1 ) {
  +         return null;
  +     }
  +    }
  +
  +    private static void log(String s ) {
  +     System.out.println("JspRuntimeLibrary: " + s );
  +    }
   }
   
   
  
  
  

Reply via email to