import java.util.*; import java.io.*; import java.net.*; class VirtualMachineManager { Map allVMs = null; Map pipes = null; static LoadClass loader; public VirtualMachineManager() { allVMs = Collections.synchronizedMap(new HashMap()); pipes = Collections.synchronizedMap(new HashMap()); try { loader = new LoadClass(); } catch (Exception e) { System.out.println("Error creating kernel!"); System.exit(1); } } public boolean createVM(String id, String filename, String par, String child, String sib, String i, String o, String args) { VirtualMachine returned = null; VirtualMachine finder = null; if (args == null) args = new String(); try { returned = (VirtualMachine)loader.classLoader(filename, args); } catch (Exception e) { System.out.println(e.toString());return false;} String inputSrcID = null; String outputSrcID = null; int keyStart = 0; int keyEnd = 0; String ioID = null; if (returned == null)//if class failed to load { return false; } else { //set input of new virtual machine if (i.equals("System.in")) { returned.in = new BufferedReader(new InputStreamReader(System.in)); } else { keyEnd = i.indexOf("."); if (keyEnd != -1) { ioID = i.substring(keyStart,keyEnd); if (allVMs.containsKey(ioID)) { finder = (VirtualMachine)allVMs.get(ioID); returned.in = finder.in; } else return false; } } //set output of new virtual machne if (o.equals("System.out")) { returned.out = new BufferedWriter(new PrintWriter(System.out)); } else { keyEnd = o.indexOf("."); ioID = o.substring(keyStart,keyEnd); if (allVMs.containsKey(ioID)) { finder = (VirtualMachine)allVMs.get(ioID); returned.out = finder.out; } else return false; } //if new shell being created, ensure kernel being passed if (filename.equals("Shell")) { ((Shell)returned).setKernel(this); } //set child if (child.equals("NULL")) { returned.setChild(null); } else { if (allVMs.containsKey(child)) { finder = (VirtualMachine)allVMs.get(child); returned.setChild(finder); } else return false; } //set sib if (sib.equals("NULL")) { returned.setSibling(null); } else { if (allVMs.containsKey(sib)) { finder = (VirtualMachine)allVMs.get(sib); returned.setSibling(finder); } else return false; } //set par if (par.equals("NULL")) { returned.setParent(null); } else { if (allVMs.containsKey(par)) { finder = (VirtualMachine)allVMs.get(par); returned.setParent(finder); } else return false; } //add to structure allVMs.put(id,returned); return true; } } public void createPipe(String id) { Pipe pipe = new Pipe(); pipes.put(id, pipe); } public void setPipeInput(String vmID, String pID) { VirtualMachine finder = null; Pipe pipe = null; if (pipes.containsKey(pID)) { pipe = (Pipe)pipes.get(pID); if (allVMs.containsKey(vmID)) { finder = (VirtualMachine)allVMs.get(vmID); pipe.pIn = new PipedReader(); pipe.inID = vmID; finder.in = new BufferedReader(pipe.pIn); try { pipe.pIn.connect(pipe.pOut); } catch (IOException e) {System.out.println(e.toString());} } } } public void setPipeOutput(String vmID, String pID) { VirtualMachine finder = null; Pipe pipe = null; if (allVMs.containsKey(vmID)) { finder = (VirtualMachine)allVMs.get(vmID); if (pipes.containsKey(pID)) { pipe = (Pipe)pipes.get(pID); pipe.pOut = new PipedWriter(); pipe.outID = vmID; } finder.out = new BufferedWriter(pipe.pOut); } } public void setInput(String srcVMID, String filename) { VirtualMachine finder = null; if (allVMs.containsKey(srcVMID)) { finder = (VirtualMachine)allVMs.get(srcVMID); try { finder.in = new BufferedReader (new FileReader (filename)); } catch (FileNotFoundException e) {System.out.println(filename + "was not found");} } } public void setOutput(String srcVMID, String filename) { VirtualMachine finder = null; if (allVMs.containsKey(srcVMID)) { finder = (VirtualMachine)allVMs.get(srcVMID); try { finder.out = new BufferedWriter (new FileWriter (filename)); } catch (IOException e) {System.out.println(e.toString());} } } public void executeShell() { VirtualMachine runner = null; String x = "VM1000"; runner = (VirtualMachine)allVMs.get(x); runner.start(); } public void executeScript() { VirtualMachine runner = null; String curntID; HashSet allIDs = null; allIDs = (new HashSet(allVMs.keySet())); for (Iterator i = allIDs.iterator(); i.hasNext();) { curntID = (String)i.next(); if (!(curntID.equals("VM1000"))) { runner = (VirtualMachine)allVMs.get(curntID); runner.start(); } } for (Iterator i = allIDs.iterator(); i.hasNext();) { curntID = (String)i.next(); if (!(curntID.equals("VM1000"))) { runner = (VirtualMachine)allVMs.get(curntID); while (runner.isAlive()) { Thread.currentThread().yield(); } } } } }