package railo.commons.io.res.util; import java.io.IOException; import java.io.InputStream; import railo.commons.io.res.Resource; /** * this class holds information about a snippet from text with its start and end line numbers */ public class ResourceSnippet implements java.io.Serializable { private String text = null; private int startLine = 0, endLine =0; public final static ResourceSnippet Empty = new ResourceSnippet( "", 0, 0 ); public ResourceSnippet(String text, int startLine, int endLine) { this.text = text; this.startLine = startLine; this.endLine = endLine; } /** returns the actual text of the snippet */ public String getContent() { return text; } /** returns the start line number */ public int getStartLine() { return startLine; } /** returns the end line number */ public int getEndLine() { return endLine; } public static String getContents( InputStream is, String charset ) { String result; java.util.Scanner scanner = new java.util.Scanner( is, charset ).useDelimiter( "\\A" ); result = scanner.hasNext() ? scanner.next() : ""; if ( is != null ) try { is.close(); } catch ( IOException ex ) {} return result; } public static String getContents( Resource res, String charset ) { try { return getContents( res.getInputStream(), charset ); } catch (IOException ex) { return ""; } } public static ResourceSnippet createResourceSnippet( String src, int startChar, int endChar ) { String text = ""; if ( endChar > startChar && endChar < src.length() ) text = src.substring( startChar, endChar ); return new ResourceSnippet( text, getLineNumber( src, startChar ), getLineNumber( src, endChar ) ); } /** extract a ResourceSnippet from InputStream at the given char positions * * @param is - InputStream of the Resource * @param startChar - start position of the snippet * @param endChar - end position of the snippet * @param charset - use server's charset, default should be UTF-8 * @return */ public static ResourceSnippet createResourceSnippet( InputStream is, int startChar, int endChar, String charset ) { return createResourceSnippet( getContents( is, charset ), startChar, endChar ); } /** extract a ResourceSnippet from a Resource at the given char positions * * @param res - Resource from which to extract the snippet * @param startChar - start position of the snippet * @param endChar - end position of the snippet * @param charset - use server's charset, default should be UTF-8 * @return */ public static ResourceSnippet createResourceSnippet( Resource res, int startChar, int endChar, String charset ) { try { return createResourceSnippet( res.getInputStream(), startChar, endChar, charset ); } catch ( IOException ex ) { return ResourceSnippet.Empty; } } /** returns the line number of the given char in the text */ public static int getLineNumber( String text, int posChar ) { int len = Math.min( posChar, text.length() ); int result = 1; for ( int i=0; i<len; i++ ) { if ( text.charAt( i ) == '\n' ) result++; } return result; } }