package pipe.gui;
import pipe.gui.plugin.GuiModule;
import uk.ac.imperial.pipe.models.petrinet.PetriNet;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* This class represents a module dynamically loaded at run-time
* and is repsonsible for executing the module
*/
public class ModuleMethod
{
/**
* Class logger
*/
private static final Logger LOGGER = Logger.getLogger(ModuleMethod.class.getName());
private final Method modMeth;
private final Class<? extends GuiModule> clazz;
private String name;
/* Sets up the Class and Method that this class encapsulates
* @param cl The Class that the Method belongs to
* @param m The Method that this class represents
*/
public ModuleMethod(Class<? extends GuiModule> clazz, Method m)
{
this.clazz = clazz;
modMeth = m;
name = m.getName();
}
/**
* Returns the name of the modMeth
*/
public String toString()
{
return name;
}
/**
*
* @param _name method name
*/
public void setName(String _name)
{
name = _name;
}
/**
* Executes the module.
* @param petriNet the current Petri net to pass into the {@link pipe.gui.plugin.GuiModule}
*/
public void execute(PetriNet petriNet)
{
try
{
Constructor<? extends GuiModule> ctr = clazz.getDeclaredConstructor(new Class[0]);
Object moduleObj = ctr.newInstance();
// handy debug to see what's being passed to the module
//System.out.println("models obj being passed to module: ");
//args[0].print();
// invoke the name method for display
modMeth.invoke(moduleObj, petriNet);
} catch (IllegalAccessException | NoSuchMethodException | SecurityException | InvocationTargetException | InstantiationException | IllegalArgumentException e) {
LOGGER.log(Level.SEVERE, "Error in module method invocation: " + e.getMessage());
}
}
/**
* @return Returns the modClass.
*/
public Class<?> getModClass()
{
return clazz;
}
}