package org.rzo.yajsw.boot; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import org.rzo.yajsw.Constants; import org.rzo.yajsw.app.WrapperJVMMain; import org.apache.commons.lang.text.StrSubstitutor; public class WrapperLoader { private static boolean checkPath(String path) { int ix = path.indexOf("!"); if (ix == -1) { System.out.println("<yajsw>/wrapper.jar not found, please check classpath. aborting wrapper !"); Runtime.getRuntime().halt(999);// -> groovy eclipse plugin crashes return false; } return true; } /** * Gets the wrapper jar. * * @return the wrapper jar */ public static String getWrapperJar() { String cn = Constants.class.getCanonicalName(); String rn = cn.replace('.', '/') + ".class"; String path = "."; try { path = Constants.class.getClassLoader().getResource(rn).getPath(); if (!checkPath(path)) return null; path = path.substring(0, path.indexOf("!")); path = new URI(path).getPath(); path.replaceAll("%20", " "); //System.out.println("wrapper jar "+path); // if (path.startsWith("/")) // path = path.substring(1); return path; } catch (Exception e1) { e1.printStackTrace(); } return null; } public static String getWrapperAppJar() { String cn = WrapperJVMMain.class.getCanonicalName(); String rn = cn.replace('.', '/') + ".class"; String path = "."; try { path = WrapperJVMMain.class.getClassLoader().getResource(rn).getPath(); if (!checkPath(path)) return null; path = path.substring(0, path.indexOf("!")); path = new URI(path).getPath(); path.replaceAll("%20", " "); //System.out.println("wrapper jar "+path); // if (path.startsWith("/")) // path = path.substring(1); return path; } catch (Exception e1) { e1.printStackTrace(); } return null; } public static ArrayList getGroovyClasspath() { ArrayList result = new ArrayList(); String wrapperHome = getWrapperHome(); File groovyLib = new File(wrapperHome, "lib"); if (! groovyLib.exists()) { System.out.println("<yajsw>/lib folder not found. Please check that relative the lib folder is in the same folder as <yajsw>/wrapper.jar"); return result; } File[] groovyLibs = groovyLib.listFiles(); for (File file : groovyLibs) { if (file.isDirectory()) result.addAll(getFiles(file)); else try { result.add(file.toURI().toURL()); } catch (MalformedURLException e) { System.out.println("Error in getGroovyClasspath: "+e.getMessage()); } } return result; } private static Collection getFiles(File parent) { ArrayList result = new ArrayList(); File[] files = parent.listFiles(); for (File file : files) { if (file.isDirectory()) result.addAll(getFiles(file)); else try { result.add(file.toURI().toURL()); } catch (MalformedURLException e) { System.out.println("Error in getGroovyClasspath: "+e.getMessage()); } } return result; } public static URL[] getWrapperClasspath(String type, boolean logErrors) { String wrapperJar; if ("App".equals(type)) wrapperJar = getWrapperAppJar(); else wrapperJar = getWrapperJar(); Manifest manifest; try { manifest = new JarFile(wrapperJar).getManifest(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } Attributes attr = manifest.getMainAttributes(); String cl = attr.getValue("Class-Path-" + type); if (cl == null) return null; ArrayList classpath = new ArrayList(); classpath.add(new File(wrapperJar)); String[] clArr = cl.split(" "); File parent = new File(wrapperJar).getParentFile(); StrSubstitutor x=new StrSubstitutor(); x.setEnableSubstitutionInVariables(true); for (int i = 0; i < clArr.length; i++) { String file = clArr[i]; File myFile; try { String replacement=x.replace(file); if (!x.equals(file)) { myFile =new File(file); } else { myFile = new File(parent, file); } if (!myFile.exists() && logErrors) System.out.println("WARNING: lib not found: " + myFile.getCanonicalPath()); classpath.add(myFile); } catch (Exception e) { e.printStackTrace(); } } // add rt.jar if ("App".equals(type)) try { String rt = getRTJar(); File rtf = new File(rt); if (!rtf.exists()) System.out.println("could not find rt.jar"); else classpath.add(rtf); } catch (Exception ex) { ex.printStackTrace(); } URL[] urlsArr = new URL[classpath.size()]; int i = 0; for (Iterator it = classpath.iterator(); it.hasNext(); i++) try { urlsArr[i] = ((File) it.next()).toURI().toURL(); // System.out.println("classpath: "+urlsArr[i]); } catch (Exception e) { // log.throwing(WrapperMain.class.getName(), "main", e); e.printStackTrace(); } return urlsArr; } public static URLClassLoader getWrapperClassLoader() { URL[] core = getWrapperClasspath("Wrapper-Core", true); URL[] extended = getWrapperClasspath("Wrapper-Extended", false); if (core==null) core=new URL[0]; if (extended==null) extended=new URL[0]; URL[] urls = new URL[core.length+ extended.length]; System.arraycopy(core, 0, urls, 0, core.length); System.arraycopy(extended, 0, urls, core.length, extended.length); return new WrapperClassLoader(urls, Thread.currentThread().getContextClassLoader()); } public static String getWrapperHome() { return new File(getWrapperJar()).getParent(); } public static String getRTJar() { String cn = Object.class.getCanonicalName(); String rn = cn.replace('.', '/') + ".class"; String path = "."; try { path = WrapperJVMMain.class.getClassLoader().getResource(rn).getPath(); if (!checkPath(path)) return null; path = path.substring(0, path.indexOf("!")); path = new URI(path).getPath(); path.replaceAll("%20", " "); //System.out.println("wrapper jar "+path); // if (path.startsWith("/")) // path = path.substring(1); return path; } catch (Exception e1) { e1.printStackTrace(); } return null; } }