From: <rfr...@us...> - 2009-10-22 08:27:06
|
Revision: 16398 http://jedit.svn.sourceforge.net/jedit/?rev=16398&view=rev Author: rfrancois Date: 2009-10-22 08:26:57 +0000 (Thu, 22 Oct 2009) Log Message: ----------- factoring out the native library hack Modified Paths: -------------- plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/JRIEngineService.java plugins/orchestra/trunk/services.xml Added Paths: ----------- plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/NativeLibraryHack.java Modified: plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/JRIEngineService.java =================================================================== --- plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/JRIEngineService.java 2009-10-21 21:46:35 UTC (rev 16397) +++ plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/JRIEngineService.java 2009-10-22 08:26:57 UTC (rev 16398) @@ -1,5 +1,6 @@ package com.addictedtor.orchestra.rengine.jri; +import java.io.* ; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -14,6 +15,8 @@ import com.addictedtor.orchestra.rengine.REngineService; +import org.gjt.sp.util.Log ; + public class JRIEngineService extends REngineService { static String R_HOME = "/usr/local/lib/R/" ; @@ -36,58 +39,12 @@ @SuppressWarnings("unchecked") private static void initEngine(){ - /* so that System.load("jri") failing does not cause System.exit(1), see Rengine */ - System.setProperty("jri.ignore.ule", "yes" ) ; - - /* TODO: ask these to R using RCmdBatch */ try{ - String[] libs = new String[]{ - R_HOME + "lib", - R_HOME + "library/rJava/libs", - R_HOME + "library/rJava/jri" - }; - addLibPaths( libs ) ; - - } catch( Exception e){ + NativeLibraryHack.addLibPaths( new String[]{ R_HOME + "library/rJava/jri" } ) ; + } catch( IOException e){ e.printStackTrace() ; } - System.loadLibrary( "R" ) ; - - /* use reflection to load the RJavaClassLoader */ - Class RJCL = null ; - Constructor<?> cons = null ; - ClassLoader rjcl = null ; - try{ - /* the RJavaClassLoader class */ - RJCL = Class.forName("RJavaClassLoader" ) ; - - Class<?>[] clazzes = new Class<?>[]{ String.class, String.class } ; - cons = RJCL.getConstructor( clazzes ) ; - - rjcl = (ClassLoader) cons.newInstance( - R_HOME + "library/rJava" , - R_HOME + "library/rJava/libs" ) ; - - /* use the rjcl to load the jri library without relying on java.library.path */ - - Method findlib = RJCL.getDeclaredMethod( "findLibrary", new Class<?>[]{ String.class } ) ; - boolean access = findlib.isAccessible() ; - findlib.setAccessible(true ) ; - - String lib = (String) findlib.invoke( rjcl, new Object[]{ "rJava" } ) ; - System.load( lib ) ; - - /* restore accessibility */ - findlib.setAccessible( access ) ; - - } catch( Exception e){ - e.printStackTrace() ; - } - - /* otherwise JRIEngine won't load */ - Rengine.jriLoaded = true ; - JRIEngine eng = null ; String[] args = { "--save" } ; try{ @@ -107,6 +64,7 @@ engine = eng ; + /* now load the plugin that is on the R package side */ String orchestra_rpackage = null ; try{ orchestra_rpackage = engine.parseAndEval( "system.file( package = 'orchestra' )" ).asString() ; @@ -117,46 +75,5 @@ } - public static void addLibPaths(String[] newlibs ) throws IOException { - try { - Field field = ClassLoader.class.getDeclaredField("usr_paths"); - field.setAccessible(true); - String[] paths = (String[])field.get(null); - - Vector<String> vec = new Vector<String>() ; - StringBuffer buf = new StringBuffer() ; - int count = 0; - for( int i=0; i<paths.length; i++){ - vec.add( paths[i] ) ; - if( count != 0) buf.append( ":" ) ; - buf.append( paths[i ] ) ; - count++ ; - } - boolean changeNeeded = false ; - - for( String lib : newlibs ){ - if( !vec.contains( lib ) ){ - changeNeeded = true ; - vec.add( lib ) ; - if( count != 0 ) buf.append(":") ; - buf.append( lib ) ; - } - } - if( !changeNeeded ){ - return ; - } - String[] tmp = new String[vec.size()] ; - vec.toArray( tmp ) ; - field.set(null,tmp); - - System.setProperty( "java.library.path" , buf.toString() ) ; - - } catch (IllegalAccessException e) { - throw new IOException("Failed to get permissions to set library path"); - } catch (NoSuchFieldException e) { - throw new IOException("Failed to get field handle to set library path"); - } - } - } Added: plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/NativeLibraryHack.java =================================================================== --- plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/NativeLibraryHack.java (rev 0) +++ plugins/orchestra/trunk/com/addictedtor/orchestra/rengine/jri/NativeLibraryHack.java 2009-10-22 08:26:57 UTC (rev 16398) @@ -0,0 +1,82 @@ +package com.addictedtor.orchestra.rengine.jri; + +import java.io.IOException; +import java.util.Vector ; +import java.lang.reflect.Field ; +import java.lang.reflect.Method ; + +/** + * Hack allowing to append paths to java.library.path at runtime + */ +public class NativeLibraryHack { + + /** + * Returns the current set of paths used by the JVM to + * lookup for native libraries + */ + public static String[] getLibPaths( ) { + String[] paths = null ; + try { + Field field = ClassLoader.class.getDeclaredField("usr_paths"); + boolean access = field.isAccessible() ; + field.setAccessible(true); + try{ paths = (String[])field.get(null); } finally{ field.setAccessible(access); } + } catch( Exception e){ + e.printStackTrace() ; + } + return paths ; + } + + /** + * Adds paths to the set of paths used by the JVM to perform + * native library lookup. + * + * @param newlibs new library paths + */ + public static void addLibPaths(String[] newlibs ) throws IOException { + try { + Field field = ClassLoader.class.getDeclaredField("usr_paths"); + boolean access = field.isAccessible() ; + field.setAccessible(true); + String[] paths = (String[])field.get(null); + field.setAccessible(access); + + Vector<String> vec = new Vector<String>() ; + StringBuffer buf = new StringBuffer() ; + int count = 0; + for( int i=0; i<paths.length; i++){ + vec.add( paths[i] ) ; + if( count != 0) buf.append( ":" ) ; + buf.append( paths[i ] ) ; + count++ ; + } + boolean changeNeeded = false ; + + for( String lib : newlibs ){ + if( !vec.contains( lib ) ){ + changeNeeded = true ; + vec.add( lib ) ; + if( count != 0 ) buf.append(":") ; + buf.append( lib ) ; + } + } + if( !changeNeeded ){ + return ; + } + String[] tmp = new String[vec.size()] ; + vec.toArray( tmp ) ; + field.set(null,tmp); + + /* reflect the change in the java.library.path system property */ + System.setProperty( "java.library.path" , buf.toString() ) ; + + + } catch (IllegalAccessException e) { + throw new IOException("Failed to get permissions to set library path"); + } catch (NoSuchFieldException e) { + throw new IOException("Failed to get field handle to set library path"); + } + } + +} + Modified: plugins/orchestra/trunk/services.xml =================================================================== --- plugins/orchestra/trunk/services.xml 2009-10-21 21:46:35 UTC (rev 16397) +++ plugins/orchestra/trunk/services.xml 2009-10-22 08:26:57 UTC (rev 16398) @@ -5,5 +5,12 @@ <SERVICE CLASS="com.addictedtor.orchestra.rengine.REngineService" NAME="jri"> new com.addictedtor.orchestra.rengine.jri.JRIEngineService(); </SERVICE> + + <!-- + <SERVICE CLASS="org.gjt.sp.jedit.NativeLibraryLookupService" NAME="com.addictedtor.orchestra.OrchestraPlugin"> + new com.addictedtor.orchestra.OrchestraLibraryLookup() ; + </SERVICE> + --> </SERVICES> + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |