package railo.loader.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.StringTokenizer; import java.util.TimeZone; import railo.commons.io.res.Resource; /** * Util class for different little jobs */ public class Util { private static File tempFile; private static File homeFile; private final static SimpleDateFormat HTTP_TIME_STRING_FORMAT; static { HTTP_TIME_STRING_FORMAT = new SimpleDateFormat("EE, dd MMM yyyy HH:mm:ss zz",Locale.ENGLISH); HTTP_TIME_STRING_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); } /** * copy a inputstream to a outputstream * @param in * @param out * @throws IOException */ public final static void copy(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[0xffff]; int len; while((len = in.read(buffer)) !=-1) out.write(buffer, 0, len); closeEL(in); closeEL(out); } /** * read String data from a InputStream and returns it as String Object * @param is InputStream to read data from. * @return readed data from InputStream * @throws IOException */ public static String toString(InputStream is) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer content=new StringBuffer(); String line=br.readLine(); if(line!=null) { content.append(line); while((line=br.readLine())!=null) { content.append("\n"+line); } } br.close(); return content.toString(); } public static boolean toBooleanValue(String str) throws IOException { str=str.trim().toLowerCase(); if("true".equals(str)) return true; if("false".equals(str)) return false; if("yes".equals(str)) return true; if("no".equals(str)) return false; throw new IOException("can't cast string to a boolean value"); } /** * close inputstream without a Exception * @param is * @param os */ public static void closeEL(InputStream is,OutputStream os) { closeEL(is); closeEL(os); } /** * close inputstream without a Exception * @param is */ public static void closeEL(InputStream is) { try { if(is!=null)is.close(); } catch (Throwable e) {} } /** * close reader without a Exception * @param is */ public static void closeEL(Reader r) { try { if(r!=null)r.close(); } catch (Throwable e) {} } /** * close reader without a Exception * @param is */ public static void closeEL(Writer w) { try { if(w!=null)w.close(); } catch (Throwable e) {} } /** * close outputstream without a Exception * @param os */ public static void closeEL(OutputStream os) { try { if(os!=null)os.close(); } catch (Throwable e) {} } /** * @param is inputStream to get content From * @param charset * @return returns content from a file inputed by input stream * @throws IOException */ public static String getContentAsString(InputStream is, String charset) throws IOException { BufferedReader br = (charset==null)? new BufferedReader(new InputStreamReader(is)): new BufferedReader(new InputStreamReader(is,charset)); StringBuffer content=new StringBuffer(); String line=br.readLine(); if(line!=null) { content.append(line); while((line=br.readLine())!=null) { content.append("\n"+line); } } br.close(); return content.toString(); } /** * check if string is empty (null or "") * @param str * @return is empty or not */ public static boolean isEmpty(String str) { return str==null || str.length()==0; } /** * check if string is empty (null or "") * @param str * @return is empty or not */ public static boolean isEmpty(String str, boolean trim) { if(!trim) return isEmpty(str); return str==null || str.trim().length()==0; } public static int length(String str) { if(str==null) return 0; return str.length(); } /** * cast a railo string version to a int version * @param version * @return int version */ public static int toInVersion(String version) { int rIndex = version.lastIndexOf(".rcs"); if(rIndex==-1) rIndex = version.lastIndexOf(".rc"); if(rIndex!=-1) { version=version.substring(0,rIndex); } //1.0.0.090 int beginIndex=0; //Major int endIndex=version.indexOf('.',beginIndex); int intVersion=0; intVersion+=Integer.parseInt(version.substring(beginIndex,endIndex))*1000000; // FUTURE 10000000 // Minor beginIndex=endIndex+1; endIndex=version.indexOf('.',beginIndex); intVersion+=Integer.parseInt(version.substring(beginIndex,endIndex))*10000; // FUTURE 100000 // releases beginIndex=endIndex+1; endIndex=version.indexOf('.',beginIndex); intVersion+=Integer.parseInt(version.substring(beginIndex,endIndex))*100; // FUTURE 1000 // patches beginIndex=endIndex+1; intVersion+=Integer.parseInt(version.substring(beginIndex)); return intVersion; //intVersion=(major*1000000)+(minor*10000)+(releases*100)+patches; } public static String toStringVersion(int version) { StringBuffer sb=new StringBuffer(); // Major int tmp=(version/1000000); // FUTURE 10000000 version-=tmp*1000000; // FUTURE 10000000 sb.append(String.valueOf(tmp)); sb.append("."); // Minor tmp=(version/10000); // FUTURE 100000 version-=tmp*10000; // FUTURE 100000 sb.append(len(String.valueOf(tmp),2)); sb.append("."); // releases tmp=(version/100); // FUTURE 1000 version-=tmp*100; // FUTURE 1000 sb.append(len(String.valueOf(tmp),2)); sb.append("."); // patches sb.append(len(String.valueOf(version),3)); return sb.toString(); } private static Object len(String str, int i) { while(str.length()<i) str="0"+str; return str; } /** * @param str String to work with * @param sub1 value to replace * @param sub2 replacement * @param onlyFirst replace only first or all * @return new String */ public static String replace(String str, String sub1, String sub2, boolean onlyFirst) { if(sub1.equals(sub2)) return str; if(!onlyFirst && sub1.length()==1 && sub2.length()==1)return str.replace(sub1.charAt(0),sub2.charAt(0)); StringBuffer sb=new StringBuffer(); int start=0; int pos; int sub1Length=sub1.length(); while((pos=str.indexOf(sub1,start))!=-1){ sb.append(str.substring(start,pos)); sb.append(sub2); start=pos+sub1Length; if(onlyFirst)break; } sb.append(str.substring(start)); return sb.toString(); } /** * replace path placeholder with the real path, placeholders are [{temp-directory},{system-directory},{home-directory}] * @param path * @return updated path */ public static String parsePlaceHolder(String path) { if(path==null) return path; // Temp if(path.startsWith("{temp")) { if(path.startsWith("}",5)) path=new File(getTempDirectory(),path.substring(6)).toString(); else if(path.startsWith("-dir}",5)) path=new File(getTempDirectory(),path.substring(10)).toString(); else if(path.startsWith("-directory}",5)) path=new File(getTempDirectory(),path.substring(16)).toString(); } // System else if(path.startsWith("{system")) { if(path.startsWith("}",7)) path=new File(getSystemDirectory(),path.substring(8)).toString(); else if(path.startsWith("-dir}",7)) path=new File(getSystemDirectory(),path.substring(12)).toString(); else if(path.startsWith("-directory}",7)) path=new File(getSystemDirectory(),path.substring(18)).toString(); } // Home else if(path.startsWith("{home")) { if(path.startsWith("}",5)) path=new File(getHomeDirectory(),path.substring(6)).toString(); else if(path.startsWith("-dir}",5)) path=new File(getHomeDirectory(),path.substring(10)).toString(); else if(path.startsWith("-directory}",5)) path=new File(getHomeDirectory(),path.substring(16)).toString(); } return path; } /** * returns the Temp Directory of the System * @return temp directory */ public static File getTempDirectory() { if(tempFile!=null) return tempFile; String tmpStr = System.getProperty("java.io.tmpdir"); if(tmpStr!=null) { tempFile=new File(tmpStr); if(tempFile.exists()) { tempFile=getCanonicalFileEL(tempFile); return tempFile; } } try { File tmp = File.createTempFile("a","a"); tempFile=tmp.getParentFile(); tempFile=getCanonicalFileEL(tempFile); tmp.delete(); } catch(IOException ioe) {} return tempFile; } /** * returns the Hoome Directory of the System * @return home directory */ public static File getHomeDirectory() { if(homeFile!=null) return homeFile; String homeStr = System.getProperty("user.home"); if(homeStr!=null) { homeFile=new File(homeStr); homeFile=getCanonicalFileEL(homeFile); } return homeFile; } /** * @return return System directory */ public static File getSystemDirectory() { String pathes=System.getProperty("java.library.path"); if(pathes!=null) { String[] arr=pathes.split(File.pathSeparator); //String[] arr=List.toStringArrayEL(List.listToArray(pathes,File.pathSeparatorChar)); for(int i=0;i<arr.length;i++) { if(arr[i].toLowerCase().indexOf("windows\\system")!=-1) { File file = new File(arr[i]); if(file.exists() && file.isDirectory() && file.canWrite()) return getCanonicalFileEL(file); } } for(int i=0;i<arr.length;i++) { if(arr[i].toLowerCase().indexOf("windows")!=-1) { File file = new File(arr[i]); if(file.exists() && file.isDirectory() && file.canWrite()) return getCanonicalFileEL(file); } } for(int i=0;i<arr.length;i++) { if(arr[i].toLowerCase().indexOf("winnt")!=-1) { File file = new File(arr[i]); if(file.exists() && file.isDirectory() && file.canWrite()) return getCanonicalFileEL(file); } } for(int i=0;i<arr.length;i++) { if(arr[i].toLowerCase().indexOf("win")!=-1) { File file = new File(arr[i]); if(file.exists() && file.isDirectory() && file.canWrite()) return getCanonicalFileEL(file); } } for(int i=0;i<arr.length;i++) { File file = new File(arr[i]); if(file.exists() && file.isDirectory() && file.canWrite()) return getCanonicalFileEL(file); } } return null; } /** * Returns the canonical form of this abstract pathname. * @param file file to get canoncial form from it * * @return The canonical pathname string denoting the same file or * directory as this abstract pathname * * @throws SecurityException * If a required system property value cannot be accessed. */ public static File getCanonicalFileEL(File file) { try { return file.getCanonicalFile(); } catch (IOException e) { return file; } } public static String toHTTPTimeString(Date date) { return replace(HTTP_TIME_STRING_FORMAT.format(date),"+00:00","",true); } public static String toHTTPTimeString() { return replace(HTTP_TIME_STRING_FORMAT.format(new Date()),"+00:00","",true); } public static boolean hasUpperCase(String str) { if(isEmpty(str)) return false; return !str.equals(str.toLowerCase()); } public static BufferedInputStream toBufferedInputStream(InputStream is) { if(is instanceof BufferedInputStream) return (BufferedInputStream) is; return new BufferedInputStream(is); } public static BufferedOutputStream toBufferedOutputStream(OutputStream os) { if(os instanceof BufferedOutputStream) return (BufferedOutputStream) os; return new BufferedOutputStream(os); } public static void copy(Resource in, Resource out) throws IOException { InputStream is=null; OutputStream os=null; try { is=toBufferedInputStream(in.getInputStream()); os=toBufferedOutputStream(out.getOutputStream()); } catch(IOException ioe) { closeEL(os); closeEL(is); throw ioe; } copy(is,os); } public static String toVariableName(String str, boolean addIdentityNumber) { StringBuffer rtn=new StringBuffer(); char[] chars=str.toCharArray(); long changes=0; for(int i=0;i<chars.length;i++) { char c=chars[i]; if(i==0 && (c>='0' && c<='9'))rtn.append("_"+c); else if((c>='a' && c<='z') ||(c>='A' && c<='Z') ||(c>='0' && c<='9') || c=='_' || c=='$') rtn.append(c); else { rtn.append('_'); changes+=(c*(i+1)); } } if(addIdentityNumber && changes>0)rtn.append(changes); return rtn.toString(); } public static String first(String str,String delimiter){ StringTokenizer st=new StringTokenizer(str,delimiter); return st.nextToken(); } public static String last(String str,String delimiter){ StringTokenizer st=new StringTokenizer(str,delimiter); String rtn=null; while(st.hasMoreTokens()) rtn= st.nextToken(); return rtn; } public static String removeQuotes(String str, boolean trim) { if(str==null) return str; if(trim)str=str.trim(); if(str.length()<2) return str; char first=str.charAt(0); char last=str.charAt(str.length()-1); if((first=='"' || first=='\'') && first==last) return str.substring(1,str.length()-1); return str; } }