import java.rmi.*; import java.rmi.server.*; import java.util.*; import java.io.*; import MDMSupport.MDMessage; import MDMSupport.MessageTableModel; import com.objectspace.jgl.*; public class FileManagerServer extends UnicastRemoteObject implements FileManagerServerInterface{ //public class FileManagerServer { msgAddDeleteRequestHandler ADreqHandler; msgTransferRequestHandler TreqHandler; //Queue for all the message static HashMap msgAddDeleteRequest = new HashMap(true); static Queue msgTransferRequest = new Queue(); //RMI related constants static final String SERVERNAME = "rmi://127.0.0.1:2020/MDM"; //Return a file object for a specific user and his folder static String path = "c:/mdm"; static String sentFileName = "_SENT.MDM"; static String inboxFileName = "_INBOX.MDM"; static String offlineFileName = "_OFFLINE.MDM"; private static File getFile(String userName, String folder){ if (folder == "INBOX") { return new File(path, "inbox.mdm"); // return new File(path, userName + inboxFileName); } else if(folder == "OFFLINE") { return new File(path, userName + offlineFileName); } else{ return new File(path, userName + sentFileName); } } //Update box to file private static void update(File file, MessageTableModel mybox){ FileOutputStream ostream = null; ObjectOutputStream p = null; try{ ostream = new FileOutputStream(file); } catch(IOException ex){System.out.println("IOException-III "+ex.getMessage());} catch(SecurityException ex){System.out.println("Security exception-II "+ex.getMessage());} try{ p= new ObjectOutputStream(ostream); } catch(IOException ex){ System.out.println("IOException-IV "+ex.getMessage()); } try{ p.writeObject(mybox); } catch(InvalidClassException ex){ System.out.println("InvalidClassException-II "+ex.getMessage()); } catch(NotSerializableException ex){ System.out.println("NotSerializableException "+ex.getMessage()); } catch(IOException ex){ System.out.println("IOException-V "+ex.getMessage()); } try{ p.flush(); } catch(IOException ex){ System.out.println("IOException-VI "+ex.getMessage()); } try{ ostream.close(); } catch(IOException ex){ System.out.println("IOException-VI "+ex.getMessage()); } } //Extract box from a file private static MessageTableModel extractBox(File file){ boolean found = true; MessageTableModel mybox=null; ObjectInputStream oin=null; FileInputStream in=null; try{ in=new FileInputStream(file); } catch(FileNotFoundException ex){ System.out.println("File not found "+ ex.getMessage()); found=false; } catch(SecurityException ex){System.out.println("Security exception-I "+ex.getMessage());} if(found){ try{ oin=new ObjectInputStream(in); } catch(StreamCorruptedException ex){ System.out.println("StreamCorruptedException-I "+ex.getMessage()); } catch(IOException ex){ System.out.println("IOException-I "+ex.getMessage()); } try{ mybox=(MessageTableModel)oin.readObject(); } catch(ClassNotFoundException ex){ System.out.println("ClassNotFoundException "+ex.getMessage()); } catch(InvalidClassException ex){ System.out.println("InvalidClassException "+ex.getMessage()); } catch(StreamCorruptedException ex){ System.out.println("StreamCorruptedException-II "+ex.getMessage()); } catch(OptionalDataException ex){ System.out.println("OPtionalDataException "+ex.getMessage()); } catch(IOException ex){ System.out.println("IOException-II "+ex.getMessage()); } } return mybox; } //Constructors public FileManagerServer() throws RemoteException{ ADreqHandler = new msgAddDeleteRequestHandler(); TreqHandler = new msgTransferRequestHandler(); ADreqHandler.start(); TreqHandler.start(); } //Get a message by its ID public Vector getMsgById(String userName, String folder, String Id) throws RemoteException{ File f1 = getFile(userName, folder); MessageTableModel b1 = extractBox(f1); return b1.getById(Id); } //Get a message by the file id contained in this public Vector getMsgByFileName(String userName, String folder, String fileName) throws RemoteException{ return new Vector(); } //Add a message for a specific user in a specific folder public void addMsg(String userName, String folder, String sender,String id,Date date,String message) throws RemoteException{ QueuedMDMessage QM = new QueuedMDMessage(userName, folder, new MDMessage(sender,id,date,message)); msgAddDeleteRequest.add("add", QM); } public void addMsg(String userName, String folder, MDMessage msg) throws RemoteException{ QueuedMDMessage QM = new QueuedMDMessage(userName, folder, msg); msgAddDeleteRequest.add("add", QM); } private static void addQueuedMessageToFolder(QueuedMDMessage QM){ System.out.println("Adding a new message to folder: " + QM.folder + " for user " + QM.userName); File f1 = getFile(QM.userName, QM.folder); box b1 = extractBox(f1); b1.addMsg(QM.msg); update(f1,b1); } //Delete message with a specific Id public void deleteMsg(String userName, String folder, String id){ QueuedMDMessage QM = new QueuedMDMessage(userName, folder, id); msgAddDeleteRequest.add("delete", QM); } private static void deleteQueuedMessageFromFolder(QueuedMDMessage QM){ System.out.println("Deleting message: " + QM.id_toFolder + " in folder: " + QM.folder + " for user: " + QM.userName); File f1 = getFile(QM.userName, QM.folder); box b1 = extractBox(f1); b1.deleteMsg(QM.id_toFolder); update(f1,b1); } //Interface required to create the required set of files public void createNewFiles(String userName){ QueuedMDMessage QM = new QueuedMDMessage(userName); msgAddDeleteRequest.add("create", QM); } private static void createQueuedRequest(QueuedMDMessage QM){ System.out.println("Processing create new folders request for: " + QM.userName); box inBox = new box(); box offlineBox = new box(); box sentBox = new box(); File f1 = new File(path, QM.userName + inboxFileName); File f2 = new File(path, QM.userName + offlineFileName); File f3 = new File(path, QM.userName + sentFileName); inBox.addMsg(new MDMessage("MDM", "MDM", new Date(), "MDM Default message")); offlineBox.addMsg(new MDMessage("MDM", "MDM", new Date(), "MDM Default message")); sentBox.addMsg(new MDMessage("MDM", "MDM", new Date(), "MDM Default message")); update(f1, inBox); update(f2, offlineBox); update(f3, sentBox); } //Flush all the messages for the user's specific folder public void flush(String userName, String folder){ System.out.println("Flushing: " + folder + " for user name " + userName); File f1 = getFile(userName, folder); box b1 = extractBox(f1); b1.flush(); b1.addMsg(new MDMessage("MDM", "MDM", new Date(), "MDM Default message")); update(f1,b1); } public static void main(String[] args){ //Set the security manager System.setSecurityManager(new RMISecurityManager()); try{ FileManagerServer fms = new FileManagerServer();; Naming.bind(SERVERNAME, fms); System.out.println("MDM File manager server is now receiving requests: \n"); // fms.createNewFiles("Daljeet"); // fms.flush("Daljeet", "INBOX"); fms.addMsg("Daljeet","INBOX","Yunas","13",new Date(),"message"); // fms.deleteMsg("Daljeet","INBOX","12"); // fms.addMsg("Daljeet","INBOX","Yunas","13",new Date(),"message"); // System.out.println(fms.getMsgById("Daljeet","INBOX","13")); System.out.println(fms.getMsgById("Daljeet","INBOX","12")); // System.exit(1); } catch(Exception e){ e.printStackTrace(); } } class msgAddDeleteRequestHandler extends Thread{ Enumeration e; public void run(){ System.out.println("Thread to process transfer requests started..."); while (true){ if (msgAddDeleteRequest.isEmpty()){ try{ this.sleep(500); } catch(Exception ex){;} } else{ try{ System.out.println("Found a message to be executed..."); e = msgAddDeleteRequest.values("create"); msgAddDeleteRequest.remove("create"); while (e.hasMoreElements()){ createQueuedRequest((QueuedMDMessage)e.nextElement()); } e = msgAddDeleteRequest.values("add"); msgAddDeleteRequest.remove("add"); while (e.hasMoreElements()){ addQueuedMessageToFolder((QueuedMDMessage)e.nextElement()); } e = msgAddDeleteRequest.values("delete"); msgAddDeleteRequest.remove("delete"); while (e.hasMoreElements()){ deleteQueuedMessageFromFolder((QueuedMDMessage)e.nextElement()); } } catch(Exception ex){;} } } } } class msgTransferRequestHandler extends Thread{ public void run(){ System.out.println("Thread to process transfer requests started..."); while (true){ if (msgTransferRequest.isEmpty()){ try{ this.sleep(500); } catch(Exception ex){;} } } } } }