package com.horstmann.violet.framework.plugin;
import java.io.File;
import java.io.FileFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.VFS;
import org.apache.commons.vfs.impl.VFSClassLoader;
import com.horstmann.violet.framework.file.persistence.IFilePersistenceService;
import com.horstmann.violet.framework.file.persistence.Violet016BackportFormatService;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.InjectedBean;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.ManagedBean;
import com.horstmann.violet.framework.plugin.extensionpoint.Violet016FileFilterExtensionPoint;
@ManagedBean
public class PluginLoader extends ClassLoader
{
public void installPlugins()
{
ServiceLoader<IDiagramPlugin> list = ServiceLoader.load(IDiagramPlugin.class, this.getClass().getClassLoader());
for (IDiagramPlugin aPlugin : list)
{
this.pluginRegistry.register(aPlugin);
if (aPlugin instanceof Violet016FileFilterExtensionPoint)
{
Violet016FileFilterExtensionPoint extensionPoint = (Violet016FileFilterExtensionPoint) aPlugin;
Map<String, String> mappingToKeepViolet016Compatibility = extensionPoint.getMappingToKeepViolet016Compatibility();
Violet016BackportFormatService.addViolet016CompatibilityEntries(mappingToKeepViolet016Compatibility);
}
}
}
private ClassLoader getExternalClassLoader()
{
String pluginDirName = System.getProperty("violet.plugin.dir");
if (pluginDirName == null) return new URLClassLoader(new URL[0]);
File pluginDir = new File(pluginDirName);
File[] pluginJars = pluginDir.listFiles(new FileFilter()
{
public boolean accept(File pathname)
{
return pathname.toString().endsWith(".jar");
}
});
URL[] pluginJarUrls = new URL[pluginJars.length];
for (int i = 0; i < pluginJars.length; i++)
try
{
pluginJarUrls[i] = pluginJars[i].toURI().toURL();
}
catch (MalformedURLException ex)
{
ex.printStackTrace();
}
return new URLClassLoader(pluginJarUrls);
}
private ClassLoader getJarInJarClassLoader()
{
try
{
FileSystemManager fsManager = VFS.getManager();
List<FileObject> innerJarFiles = new ArrayList<FileObject>();
String classPathContent = System.getProperty("java.class.path");
String[] classPathFiles = classPathContent.split(File.pathSeparator);
for (String aClassPathFile : classPathFiles)
{
File testingFile = new File(aClassPathFile);
if (!testingFile.exists())
{
continue;
}
if (testingFile.isDirectory())
{
continue;
}
if (testingFile.getName().toLowerCase().endsWith(".jar"))
{
continue;
}
JarFile jarFile = new JarFile(testingFile);
Enumeration<JarEntry> jarEntries = jarFile.entries();
while (jarEntries.hasMoreElements())
{
JarEntry entry = jarEntries.nextElement();
if (entry.isDirectory()) continue;
if (!entry.getName().toLowerCase().endsWith(".jar")) continue;
FileObject innetJarFile = fsManager.resolveFile("jar:" + entry.getName());
innerJarFiles.add(innetJarFile);
}
}
VFSClassLoader cl = new VFSClassLoader(innerJarFiles.toArray(new FileObject[innerJarFiles.size()]), fsManager);
return cl;
}
catch (Exception e1)
{
throw new RuntimeException(e1);
}
}
/** Registry where we register loaded plugins */
@InjectedBean
private PluginRegistry pluginRegistry;
/** Service to convert IGraph to XML content (and XML to IGraph of course) */
@InjectedBean
private IFilePersistenceService filePersistenceService;
}