package de.axone.tools; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.LinkedList; import de.axone.data.Charsets; public class UrlParser { private boolean startsWithSlash; private boolean endsWithSlash; private ArrayList<String> path; public UrlParser( File file, int trim ){ init( file.getPath(), trim ); } public UrlParser( URL url, int trim ){ init( url.getPath(), trim ); } private void init( String path, int trim ){ path = path.trim(); int len = path.length(); if( len > 0 && path.charAt( 0 ) == '/' ){ startsWithSlash = true; } if( len > 0 && path.charAt( len-1 ) == '/' ){ endsWithSlash = true; } if( startsWithSlash ){ path = path.substring( 1 ); len--; } if( endsWithSlash && len > 0 ){ path = path.substring( 0, path.length()-1 ); //len--; } String[] parts = path.split( "/" ); LinkedList<String> myPath = new LinkedList<String>(); for( String part : parts ) { part = part.trim(); myPath.addLast( part ); } if( myPath.size() == 1 ){ String part = myPath.get( 0 ); if( part.length() == 0 ) myPath.remove( 0 ); } if( trim > 0 ){ for( int t = 0; t < trim; t++ ){ if( myPath.size() > 0 ) myPath.removeLast(); } } else if( trim < 0 ){ for( int t = 0; t < -trim; t++ ){ if( myPath.size() > 0 ) myPath.removeFirst(); } } this.path = new ArrayList<String>( myPath ); } public UrlParser(URL url) { this( url, 0 ); } public int length() { return path.size(); } public String get( int i ) { return path.get( i ); } public String path( String separator, boolean includeExtension ){ return path( separator, 0, includeExtension ); } public String path( String separator, int indent, boolean includeExtension ){ StringBuilder result = new StringBuilder(); for( int i = indent; i < path.size(); i++ ){ String pathItem = path.get( i ); if( i > 0 ) result.append( separator ); if( ( i == path.size() -1 ) && !includeExtension ){ result.append( removeExtension( pathItem ) ); } else { result.append( pathItem ); } } return result.toString(); } public String fileWithoutExtension(){ if( length() == 0 ){ return null; } String lastPart = path.get( length()-1 ); return removeExtension( lastPart ); } public String fileType(){ if( length() == 0 ) return null; String lastPart = path.get( length()-1 ); return contentTypeFor( lastPart ); } public static String removeExtension( String uri ){ int extPos = uri.lastIndexOf( '.' ); if( extPos > 0 ) { String withoutExtension = uri.substring( 0, extPos ); return withoutExtension; } else { return uri; } } public static String extension( String uri ) { int extPos = uri.lastIndexOf( '.' ); int slashPos = uri.lastIndexOf( '/' ); if( extPos > 0 && extPos > slashPos ) { String extension = uri.substring( extPos + 1 ); return extension; } else { return null; } } public static String contentTypeFor( String uri ) { return contentTypeFor( uri, false ); } public static String contentTypeFor( String uri, boolean modern ) { String extension = extension( uri ); if( extension != null ) { /* Images */ if( extension.equalsIgnoreCase( "jpg" ) || extension.equalsIgnoreCase( "jpeg" ) ) { return "image/jpeg"; } else if( extension.equalsIgnoreCase( "png" ) ) { return "image/png"; } else if( extension.equalsIgnoreCase( "gif" ) ) { return "image/gif"; } else if( extension.equalsIgnoreCase( "svg" ) ) { return "image/svg+xml"; } else if( extension.equalsIgnoreCase( "ico" ) ) { return "image/x-icon"; } else if( extension.equalsIgnoreCase( "css" ) ) { return "text/css"; } else if( extension.equalsIgnoreCase( "js" ) ) { return "text/javascript"; /* html */ } else if( extension.equalsIgnoreCase( "htm" ) || extension.equalsIgnoreCase( "html" ) ){ return "text/html"; } else if( extension.equalsIgnoreCase( "xhtml" ) ) { if( modern ){ return "application/xhtml+xml"; } else { return "text/html"; } } else if( extension.equalsIgnoreCase( "txt" ) ) { return "text/plain"; } } return null; } public static String encodingFor( String uri ) { String contentType = contentTypeFor( uri ); if( contentType == null ) return null; if( contentType.matches( "text.*" ) ){ return Charsets.utf8; } return null; } public boolean startsWithSlash(){ return startsWithSlash; } public boolean endsWithSlash(){ return endsWithSlash; } }