Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / psgsim / PSGPlatform.java
diff --git a/contrib/psg/src/psgsim/PSGPlatform.java b/contrib/psg/src/psgsim/PSGPlatform.java
new file mode 100644 (file)
index 0000000..90c7c87
--- /dev/null
@@ -0,0 +1,329 @@
+package psgsim;
+
+import java.io.*;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.jdom2.*;
+import org.jdom2.output.*;
+import org.simgrid.msg.Host;
+import org.simgrid.msg.Msg;
+
+import peersim.config.Configuration;
+import peersim.core.Control;
+import peersim.core.Protocol;
+
+/**
+ * A class store different configuration information for simulation. It creates
+ * the deployment file according to this informations.
+ * 
+ * @author Khaled Baati 26/10/2014
+ * @version version 1.1
+ */
+
+public class PSGPlatform {
+
+       enum timeUnit {
+               us, ms, sec;
+       }
+
+       /** unit of measure. **/
+       static int unit;
+
+       /** the clock. **/
+       static double time;
+
+       /** the default unit of measure **/
+       static final String sec = "sec";
+
+       /** All protocols defined in the configuration file. **/
+       static Protocol[] protocolsName;
+
+       /** A numeric identifier associated for each protocol. **/
+       static int[] pid;
+
+       /** List of hos.t **/
+       static Host[] hostList;
+
+       /** A collection map represents the Control and its associated step. **/
+       static Map<Control, Double> controlStepMap = new LinkedHashMap<Control, Double>();
+
+       /** A collection map represents the protocol and its associated pid. **/
+       static TreeMap<Protocol, Integer> protocolsPidsMap = new TreeMap<Protocol, Integer>(
+                       new Comparator<Protocol>() {
+                               public int compare(Protocol p1, Protocol p2) {
+                                       return p1.toString().compareTo(p2.toString());
+                               }
+                       });
+
+       /** A collection map represents all CDProtocol and its associated step **/
+       static TreeMap<Protocol, Double> cdProtocolsStepMap = new TreeMap<Protocol, Double>(
+                       new Comparator<Protocol>() {
+                               public int compare(Protocol p1, Protocol p2) {
+                                       return p1.toString().compareTo(p2.toString());
+                               }
+                       });
+       /** the default platform file **/
+       static final String platformFile = "platforms/psg.xml";
+
+       /** the deployment file **/
+       static final String deploymentFile = "deployment.xml";
+
+       static Element racine;
+       static Document document;
+       static boolean interfED = false;
+       static boolean interfCD = false;
+
+       /** Prepare the deployment file **/
+       static {
+               DocType dtype = new DocType("platform",
+                               "http://simgrid.gforge.inria.fr/simgrid.dtd");
+               racine = new Element("platform");
+               document = new Document(racine, dtype);
+               Attribute version = new Attribute("version", "3");
+               racine.setAttribute(version);
+       }
+
+       // ========================== methods ==================================
+       // =====================================================================
+
+       /**
+        * Convert PS unit time to Simgrid unit time
+        * 
+        * @param valeur
+        *            the value to convert
+        * @return time converted
+        */
+       public static double psToSgTime(long valeur) {
+               timeUnit unit = unit();
+               switch (unit) {
+               case us:
+                       return ((double) valeur) / 1000000;
+               case ms:
+                       return ((double) valeur) / 1000;
+               default:
+                       return (double) valeur;
+
+               }
+       }
+
+       /**
+        * Convert Simgrid unit time to PS unit time
+        * 
+        * @param valeur
+        *            the value to convert
+        * @return time converted
+        */
+       public static long sgToPsTime(double valeur) {
+               timeUnit unit = unit();
+               switch (unit) {
+               case us:
+                       return (long) valeur * 1000000;
+               case ms:
+                       return (long) valeur * 1000;
+               default:
+                       return (long) valeur;
+
+               }
+       }
+
+       /**
+        * 
+        * @return the duration of simulation.
+        */
+       public static long getDuration() {
+               return Configuration.getLong("simulation.duration");
+       }
+
+       /**
+        * 
+        * @return PeerSim Time
+        */
+       public static long getTime() {
+               return sgToPsTime(Msg.getClock());
+       }
+
+       /**
+        * 
+        * @return the Simgrid Clock
+        */
+       public static double getClock() {
+               return Msg.getClock();
+       }
+
+       /**
+        * Load and run initializers.
+        */
+       public static void init() {
+               Object[] inits = Configuration.getInstanceArray("init");
+               String names[] = Configuration.getNames("init");
+               for (int i = 0; i < inits.length; ++i) {
+                       System.err.println("- Running initializer " + names[i] + ": "
+                                       + inits[i].getClass().toString());
+                       ((Control) inits[i]).execute();
+               }
+       }
+
+       /**
+        * Load all controls and stores them in {@link #controlStepMap} collection
+        * to be scheduled, and executed in {@link psgsim.PSGProcessController}.
+        */
+       public static void control() {
+               // load controls
+               String[] names = Configuration.getNames("control");
+               Control control;
+               for (int i = 0; i < names.length; ++i) {
+                       control = (Control) Configuration.getInstance(names[i]);
+                       Long stepControl = Configuration.getLong(names[i] + "." + "step");
+                       controlStepMap.put(control, psToSgTime(stepControl));
+               }
+       }
+
+       /**
+        * Lookup all protocols in the configuration file
+        */
+       public static void protocols() {
+               String[] names = Configuration.getNames("protocol");
+               Class[] interfaces;
+               protocolsName = new Protocol[names.length];
+               pid = new int[names.length];
+               boolean save = false;
+               for (int i = 0; i < names.length; i++) {
+                       protocolsName[i] = (Protocol) Configuration.getInstance(names[i]);
+                       if (i == names.length - 1)
+                               save = true;
+                       userProtocol(protocolsName[i], names[i], save);
+                       pid[i] = i;
+                       protocolsPidsMap.put(protocolsName[i], pid[i]);
+               }
+
+       }
+
+       /**
+        * Lookup CDProtocol and EDProtocol among all protocols
+        * 
+        * @param prot
+        *            the protocol class
+        * @param names
+        *            the protocol name
+        * @param save
+        *            parameter equal true when parsing all protocols
+        */
+       public static void userProtocol(Protocol prot, String names, boolean save) {
+               Class[] interfaces = prot.getClass().getInterfaces();
+               for (int j = 0; j < interfaces.length; j++) {
+                       if (interfaces[j].getName().endsWith("EDProtocol")) {
+                               interfED = true;
+                       }
+                       if (interfaces[j].getName().endsWith("CDProtocol")) {
+                               String protName = names.substring("protocol".length() + 1);
+                               long step = Configuration.getLong("protocol" + "." + protName
+                                               + "." + "step");
+                               cdProtocolsStepMap.put(prot, psToSgTime(step));
+                       }
+               }
+               if (save) {
+                       edProt();
+               }
+       }
+
+       /**
+        * 
+        */
+       private static void edProt() {
+               Host hostVal;
+               hostList = Host.all();
+               for (int i = 0; i < PSGSimulator.size; i++) {
+                       hostVal = hostList[i];
+                       Element process = new Element("process");
+                       racine.addContent(process);
+                       Attribute host = new Attribute("host", hostVal.getName());
+                       Attribute function = new Attribute("function",
+                                       "psgsim.PSGProcessEvent");
+                       process.setAttribute(host);
+                       process.setAttribute(function);
+               }
+               save(deploymentFile);
+
+       }
+
+       /**
+        * 
+        */
+       @Deprecated
+       private static void cdProt() {
+               for (int i = 0; i < PSGSimulator.size; i++) {
+                       Element process = new Element("process");
+                       racine.addContent(process);
+                       Attribute host = new Attribute("host", String.valueOf(i));
+                       Attribute function = new Attribute("function",
+                                       "psgsim.PSGProcessCycle");
+                       process.setAttribute(host);
+                       process.setAttribute(function);
+
+               }
+               save("deployment.xml");
+
+       }
+
+       /**
+        * Reads given configuration property: "platform". If not found, returns the
+        * default value.
+        * 
+        * @return the platform file
+        */
+       public static String platformFile() {
+               String defFile = platformFile;
+               String file = Configuration.getString("platform", defFile);
+               return file;
+       }
+
+       /**
+        * Reads given configuration property: "unit". If not found, returns the
+        * default value (ms).
+        * 
+        * @return the unit of measure
+        */
+       public static timeUnit unit() {
+               String defUnit = sec;
+               String unit = Configuration.getString("unit", defUnit);
+               timeUnit t = timeUnit.valueOf(unit);
+               return t;
+       }
+
+       /**
+        * Create the deployment file
+        * 
+        * @param file
+        *            the name of the deployment file
+        */
+       public static void save(String file) {
+               try {
+                       // On utilise ici un affichage classique avec getPrettyFormat()
+                       XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
+                       out.output(document, new FileOutputStream(file));
+               } catch (java.io.IOException e) {
+               }
+       }
+
+       /**
+        * Delete the deployment file
+        * 
+        * @param path
+        *            the path of the deployment file
+        */
+       public static void delete(String path) {
+               File file = new File(path);
+               try {
+                       file.delete();
+               } catch (Exception e) {
+                       System.err.println("deployment file not found");
+
+               }
+               System.err.println(path + "file deleted");
+
+       }
+
+}