Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
import java.reflect
[simgrid.git] / src / java / simgrid / msg / ApplicationHandler.java
index e5fd30d..a3e2acb 100644 (file)
@@ -11,6 +11,7 @@
 
 package simgrid.msg;
 
+import java.util.Vector;
 import org.xml.sax.*;
 import org.xml.sax.helpers.*;
 import java.lang.reflect.*;
@@ -30,68 +31,166 @@ import java.lang.reflect.*;
  */
 public final class ApplicationHandler extends DefaultHandler
 {
-       /* the current process. */
-    public simgrid.msg.Process process;
+       
+       /* 
+        * This class is used to create the processes descibed in the deployment file.
+        */
+       class ProcessFactory
+       {
+               /**
+                * The vector which contains the arguments of the main function 
+                * of the process object.
+                */
+               public Vector<String> args;
+               
+               /**
+                * The name of the host of the process.
+                */     
+               private String hostName;
+               
+               /**
+                * The function of the process.
+                */
+               private String function;
+               
+               /**
+                * Default constructor.
+                */
+               public ProcessFactory(){
+                       this.args = new Vector<String>();
+                       this.hostName = null;
+                       this.function = null;
+               }
+               
+               /**
+                * This method is called by the start element handler.
+                * It sets the host and the function of the process to create,
+                * and clear the vector containing the arguments of the 
+                * previouse process function if needed.
+                *
+                * @host                                The host of the process to create.
+                * @function                    The function of the process to create.
+                *
+                */
+               public void setProcessIdentity(String hostName, String function){
+                       this.hostName = hostName;
+                       this.function = function;
+               
+                       if(!args.isEmpty())
+                               args.clear();
+               }
+               
+               /**
+                * This method is called by the startElement() handler.
+                * It stores the argument of the function of the next
+                * process to create in the vector of arguments.
+                *
+                * @arg                                 The argument to add.
+                *
+                */
+               public void registerProcessArg(String arg){
+                       this.args.add(arg);     
+               }
+       
+               public void createProcess(){
+                       try {
+                               
+                               System.out.println("Create process " + function + " on the host " + hostName);
+                       Class cls = Class.forName(this.function);
+                       simgrid.msg.Process process = (simgrid.msg.Process)cls.newInstance();
+                       process.name = process.getName(); //this.function;
+                       process.id = simgrid.msg.Process.nextProcessId++;
+                       Host host = Host.getByName(this.hostName);
+                       Msg.processCreate(process,host);
+                       
+                       Vector<String> args = processFactory.args;
+                       int size = args.size();
+                       
+                       for(int index = 0; index < size; index++)
+                               process.addArg(args.get(index));
+                               
+               } catch(JniException e)
+               {
+                       System.out.println(e.toString());
+                       e.printStackTrace();    
+                
+               } catch(NativeException e)
+               {
+                       System.out.println(e.toString());
+                       e.printStackTrace();
+               
+               } catch(HostNotFoundException e) {
+                       System.out.println(e.toString());
+                       e.printStackTrace();
+                       
+               } catch(ClassNotFoundException e) {
+                       System.out.println(this.function + " class not found\n The attribut function of the element process  of your deployment file\n must correspond to the name of a Msg Proces class)");
+                       e.printStackTrace();
+
+               } catch(InstantiationException e) {
+                        System.out.println("instantiation exception");
+                        e.printStackTrace();
+                       } catch (IllegalAccessException e) {
+                       System.out.println("illegal access exception");
+                       e.printStackTrace();
+               } catch (IllegalArgumentException e) {  
+                        System.out.println("illegal argument exception");
+                        e.printStackTrace();
+               }
+
+       }
+       }
+       
+       /* 
+        * the ProcessFactory object used to create the processes.
+        */
+       private ProcessFactory processFactory;
     
     public ApplicationHandler() {
         super();
     }
+    /**
+     * instanciates the process factory 
+     */
+    public void startDocument(){
+       this.processFactory = new ProcessFactory();     
+    } 
     
-    public void startDocument() {} // NOTHING TODO
-    public void endDocument() {}   // NOTHING TODO
-    
-    public void characters(char[] chars, int beg, int lgr) {}   // NOTHING TODO
+    public void characters(char[] caracteres, int debut, int longueur) {} // NOTHING TODO
     
    /**
     * element handlers
     */
-    public void startElement(String nameSpace, String localName,String qName,Attributes attr)  {
+    public void startElement(String nameSpace, String localName,String qName,Attributes attr) {
         if(localName.equals("process"))
-            onStartProcess(attr);   
-       else if(localName.equals("argument"))
-            onArgument(attr);
-    }
-    public void endElement(String nameSpace, String localName,String qName)  {
-        if(localName.equals("process"))
-            onEndProcess();   
+            onProcessIdentity(attr);   
+               else if(localName.equals("argument"))
+            onProcessArg(attr);
     }
     
-    /**
-     * process element handler.
+     /**
+     * process attributs handler.
      */
-    public void onStartProcess(Attributes attr) {
-        String hostName = attr.getValue(0);
-        String className = attr.getValue(1);
-               
-        try {
-               
-           Class cls = Class.forName(className);
-               
-           process = (simgrid.msg.Process)cls.newInstance();
-           process.name = className;
-           process.id = simgrid.msg.Process.nextProcessId++;
-           
-           Host host = Host.getByName(hostName);
-               
-           Msg.processCreate(process,host);
-               
-       } catch(Exception e) {
-           e.printStackTrace();
-        } 
+    public void onProcessIdentity(Attributes attr) {
+               processFactory.setProcessIdentity(attr.getValue(0),attr.getValue(1));
+    }
+       
+       /**
+     * process arguments handler.
+     */
+    public void onProcessArg(Attributes attr) {
+        processFactory.registerProcessArg(attr.getValue(0));      
     }
-    
-    public void onEndProcess() {} // NOTHING TODO   
     
     /**
-     * function arguments handler.
+     * creates the process
      */
-    public void onArgument(Attributes attr) {
-       //Msg.info("Add "+attr.getValue(0)+" as argument to "+process.msgName());
-        process.addArg(attr.getValue(0));      
+    public void endElement(String nameSpace, String localName,String qName)  {
+        if(localName.equals("process"))
+{
+               processFactory.createProcess();
+        }      
     }
-    
-   /**
-    * end of element handler.
-    */
-    
+     
+    public void endDocument() {} // NOTHING TODO
 }