To dynamically load classes in Freeswitch use this Laucher:
/* * Launcher.java * * Created on 13 September 2007, 06:40 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package org.freeswitch; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLConnection; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * * @author dacha */ public class Launcher { static { // Find and load mod_java String javaLibraryPaths = System.getProperty("java.library.path"); String pathSeparator = System.getProperty("path.separator"); String libraryPaths[] = javaLibraryPaths.split(pathSeparator); String libraryName = System.mapLibraryName("mod_java"); int modJavaIndex = libraryName.indexOf("mod_java"); if (modJavaIndex >= 0) libraryName = libraryName.substring(modJavaIndex); for (String libraryPath : libraryPaths) { String fullLibraryPath = libraryPath + File.separatorChar + libraryName; if (new File(fullLibraryPath).exists()) { System.load(fullLibraryPath); break; } } } public static void launch(String sessionUuid, String args) throws Exception { String argv[] = args.split("[ ]"); if (argv.length == 0) { System.out.println("Too few arguments to mod java"); System.out.println("Usage: java /path/to/file.jar fully.qualified.class arg1 arg2 arg3"); System.out.println("Usage: java fully.qualified.class arg1 arg2 arg3"); return; } Class klazz=null; int argsOffset; System.out.println("argv[0]=" + argv[0]); if (argv[0].endsWith(".jar") || argv[0].endsWith(".JAR")) { System.out.println("in jar"); if (argv.length < 2) throw new Exception("Too few arguments: must specify fully qualified class name when loading from JAR file"); MyClassLoaderFromJar mycjar = new MyClassLoaderFromJar(argv[0]); klazz=mycjar.findClass(argv[1]); argsOffset = argv[0].length() + argv[1].length() + 2; } else { //klazz = Class.forName(argv[0]); try{ ClassLoader parentClassLoader = MyClassLoader.class.getClassLoader(); MyClassLoader classLoader = new MyClassLoader(parentClassLoader); klazz = classLoader.loadClass(argv[0]); } catch (Exception e) { System.out.println("notice cannot load class!!!" + e.getMessage()); } argsOffset = argv[0].length() + 1; } Constructor constructor = klazz.getConstructor(); Object object = constructor.newInstance(); Method run = klazz.getMethod("run", String.class, String.class); String newArgs = ""; if (argsOffset < args.length()) newArgs = args.substring(argsOffset); run.invoke(object, sessionUuid, newArgs); } }
MyClassLoader class is a helper class that goes into mod_java/src/org/freeswitch along with Launcher
package org.freeswitch; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.io.*; import java.net.*; import java.lang.reflect.*; class MyClassLoader extends ClassLoader{ public MyClassLoader(ClassLoader parent) { super(parent); } public Class loadClass(String name) throws ClassNotFoundException { System.setSecurityManager(null); try { System.out.println("in load class"); String url = "file:/usr/local/freeswitch/scripts/" + name + ".class"; URL myUrl = new URL(url); URLConnection connection = myUrl.openConnection(); InputStream input = connection.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int data = input.read(); while(data != -1){ buffer.write(data); data = input.read(); } input.close(); byte[] classData = buffer.toByteArray(); Class cl = defineClass(name, classData, 0, classData.length); System.out.println("class defined!!!!!!!!!!"); return cl; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
MyClassLoaderFromJar is another helper class to load classes from Jar
package org.freeswitch; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.io.*; import java.net.*; import java.lang.reflect.*; import java.util.zip.*; public final class MyClassLoaderFromJar extends ClassLoader { private final ZipFile file; public MyClassLoaderFromJar(String filename) throws IOException { this.file = new ZipFile(filename); } @Override protected Class findClass(String name) throws ClassNotFoundException { System.out.println("in find class"); ZipEntry entry = this.file.getEntry(name.replace('.', '/') + ".class"); if (entry == null) { throw new ClassNotFoundException(name); } System.out.println("entry=" + entry); try { byte[] array = new byte[1024]; InputStream in = this.file.getInputStream(entry); ByteArrayOutputStream out = new ByteArrayOutputStream(array.length); int length = in.read(array); while (length > 0) { out.write(array, 0, length); length = in.read(array); } System.out.println("returning class define"); return defineClass(name, out.toByteArray(), 0, out.size()); } catch (IOException exception) { throw new ClassNotFoundException(name, exception); } } }
No comments:
Post a Comment