import java.rmi.*; import java.rmi.registry.*; import java.util.*; import java.net.*; /* * Driver for starting remote Chicken Sorting filters. */ public class FilterFactory { // makeRouter(), makeStation(), and makeBin() will make use of // this field. The field should be set in main() before these // methods are called. private static Registry registry; private static void makeRouter(String inBufName, int inBufSize, String[] outBufNames, int[] outBufSizes) throws RemoteException { // Fill in } private static void makeStation(String inBufURL, String[] outBufNames, int[] outBufSizes) throws RemoteException, NotBoundException, MalformedURLException { // Fill in } private static void makeBin(String name, int prefMin, int prefMax, String inBufURL, String[] outBufNames, int[] outBufSizes) throws RemoteException, NotBoundException, MalformedURLException { // Fill in } public static void main(String args[]) { try { Integer filePort = Integer.getInteger("fileport"); if (filePort == null) { System.err.println("-Dfileport not specified"); return; } String host = InetAddress.getLocalHost().getCanonicalHostName(); System.setProperty("java.rmi.server.codebase", "http://"+host+":"+filePort+"/"); ClassServer cs = new ClassFileServer(filePort.intValue(), "."); // Fill in --> Setup security manager. Integer regPort = Integer.getInteger("regport"); if (regPort == null) { System.err.println("-Dregport not specified"); return; } // Fill in --> Create RMI registry and assign to the field // 'registry'. // Parse input Set validComputes = new TreeSet(); validComputes.add("Router"); validComputes.add("Station"); validComputes.add("Bin"); int i = 0; while (i < args.length) { if (validComputes.contains(args[i])) { String computeType = args[i]; String binName = null; int prefMin = -1; int prefMax = -1; int inBufSize = -1; if (computeType.equals("Bin")) { binName = args[++i]; prefMin = Integer.parseInt(args[++i]); prefMax = Integer.parseInt(args[++i]); } i++; String inputBufferName = args[i++]; if (computeType.equals("Router")) { inBufSize = Integer.parseInt(args[i++]); } List outputBufferSpecsList = new ArrayList(); while ((i < args.length) && !validComputes.contains(args[i])) { outputBufferSpecsList.add(args[i++]); } Object[] outputBufferSpecs = outputBufferSpecsList.toArray(); String[] outputBufferNames = new String[outputBufferSpecs.length/2]; int[] outputBufferSizes = new int[outputBufferSpecs.length/2]; for (int j=0, k=0; j < outputBufferSpecs.length; j+=2,k++) { outputBufferNames[k] = (String)outputBufferSpecs[j]; outputBufferSizes[k] = Integer.parseInt((String)outputBufferSpecs[j+1]); } if (computeType.equals("Router")) makeRouter(inputBufferName, inBufSize, outputBufferNames, outputBufferSizes); if (computeType.equals("Station")) makeStation(inputBufferName, outputBufferNames, outputBufferSizes); if (computeType.equals("Bin")) makeBin(binName, prefMin, prefMax, inputBufferName, outputBufferNames, outputBufferSizes); } else { System.err.println("Invalid command-line argument: " + args[i]); break; } } } catch (NotBoundException e) { e.printStackTrace(); } catch (java.net.MalformedURLException e) { e.printStackTrace(); } catch (java.net.UnknownHostException e) { e.printStackTrace(); } catch (java.rmi.RemoteException e) { e.printStackTrace(); } catch (java.io.IOException e) { e.printStackTrace(); } try { Thread.sleep(1000*60*5); } catch (InterruptedException e) { } System.err.println("Shutting down after 5 minute timeout"); System.exit(1); } }