package org.herac.tuxguitar.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.herac.tuxguitar.util.error.TGErrorManager; public class TGLibraryLoader { private static TGLibraryLoader instance; private TGLibraryLoader(){ super(); } public static TGLibraryLoader instance(){ if(instance == null){ instance = new TGLibraryLoader(); } return instance; } public void loadLibrary(File file){ try{ System.out.println("Loading: " + file.getAbsolutePath()); System.load(file.getAbsolutePath()); }catch(Throwable throwable){ TGErrorManager.getInstance().handleError(throwable); } } public void loadLibraries(File folder, String prefix, String extension){ if(folder != null && folder.exists()){ List libraries = findLibrariesToLoad(folder, prefix, extension); for(int i = 0; i < libraries.size(); i ++){ String library = (String)libraries.get(i); File file = new File(getLibraryFileName(folder, library)); if(file.exists() && !file.isDirectory()){ loadLibrary(file); } } } } private String getLibraryFileName(File folder, String library){ return (folder.getAbsolutePath() + File.separator + library); } private String getLibraryDependenciesFileName(File folder, String library){ return (getLibraryFileName(folder, library) + ".deps"); } private List findLibrariesToLoad(File folder, String prefix, String extension){ List libraries = new ArrayList(); String[] files = folder.list(createFilenameFilter(prefix, extension)); String library = null; while((library = findNextLibraryToLoad(libraries, folder, files)) != null){ libraries.add(library); } return libraries; } private String findNextLibraryToLoad(List libraries, File folder, String[] files){ for(int i = 0; i < files.length; i ++){ if(!libraries.contains(files[i])){ return findNextLibraryToLoad(libraries, folder, files, files[i]); } } return null; } private String findNextLibraryToLoad(List libraries, File folder, String[] files, String expectedLib){ List dependencies = findDependencyLibraries(folder, expectedLib); if( dependencies != null ){ Iterator it = dependencies.iterator(); while(it.hasNext()){ String dependency = (String) it.next(); if(!libraries.contains(dependency)){ for(int i = 0; i < files.length; i ++){ if( dependency.equals(files[i]) ){ return findNextLibraryToLoad(libraries, folder, files, dependency); } } } } } return expectedLib; } private List findDependencyLibraries(File folder, String library){ return findDependencyLibraries(new File(getLibraryDependenciesFileName(folder, library))); } private List findDependencyLibraries(File file){ try { List libraries = new ArrayList(); if( file.exists() ){ BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String library = null; while((library = reader.readLine()) != null){ libraries.add(library.trim()); } reader.close(); } return libraries; } catch (UnsupportedEncodingException e) { TGErrorManager.getInstance().handleError(e); } catch (IOException e) { TGErrorManager.getInstance().handleError(e); } return null; } private FilenameFilter createFilenameFilter(final String prefix, final String extension){ return new FilenameFilter() { @Override public boolean accept(File dir, String name) { if(name == null){ return false; } if(prefix != null && prefix.length() > 0){ int index = name.indexOf(prefix); if(index != 0){ return false; } } if(extension != null && extension.length() > 0){ int index = name.indexOf(extension); if(index != ( name.length() - extension.length() ) ){ return false; } } return true; } }; } }