/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package nu_javafx_sample.loadexternal;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import neembuu.uploader.interfaces.Account;
import neembuu.uploader.interfaces.Uploader;
/**
*
* @author Shashank
*/
public class LazyUploaderPlugin {
private final PluginMetaData metaData;
private Validate validate = Validate.NOT_VALIDATED;
public enum Validate {
NOT_VALIDATED, VALIDATED, CORRUPT
}
public String getName(){
return metaData.getName();
}
private Class uploader;
private Class account;
private Close close; interface Close {void close()throws Exception;}
public void validate(){
synchronized (metaData){
if(validate!=Validate.NOT_VALIDATED)return;
}
String uploadderClNm = metaData.getImplementation("neembuu.uploader.interfaces.Uploader");
String accountClzzNm = metaData.getImplementation("neembuu.uploader.interfaces.Account");
try{
final FileSystem zipfs = FileSystems.newFileSystem(metaData.getModuleFile(),null);
close = new Close() { @Override public void close()throws Exception { zipfs.close(); } };
ZipClassLoader zcl = new ZipClassLoader(zipfs);
uploader = zcl.loadClass(uploadderClNm);
account = zcl.loadClass(accountClzzNm);
}catch(Exception a){
a.printStackTrace();
validate = Validate.CORRUPT;
try {close(); }catch(Exception a2){a2.printStackTrace();}
return;
}
validate = Validate.VALIDATED;
}
public void close()throws Exception{
close.close();
}
public LazyUploaderPlugin(PluginMetaData metaData) {
this.metaData = metaData;
}
public PluginMetaData getMetaData() {
return metaData;
}
public Uploader newUploader(Object... params)throws NoSuchMethodException,InstantiationException,IllegalAccessException,InvocationTargetException{
validate();
Uploader u = (Uploader)this.uploader.newInstance();
u.setFile((File)params[0]);
return u;
}
public Account newAccount()throws NoSuchMethodException,InstantiationException,IllegalAccessException,InvocationTargetException{
validate();
return (Account)account.newInstance();
}
}