import java.util.*; import java.io.*; import MDMSupport.MDMessage; import MDMSupport.MessageTableModel; import com.objectspace.jgl.*; public class FMServer extends _FMSInterfaceImplBase { String path = ""; String sentFolderName = "SENT"; String inboxFolderName = "INBOX"; String offlineFolderName = "OFFLINE"; /** Construct a persistently named object. */ public FMServer(java.lang.String name) { super(name); ADreqHandler = new msgAddDeleteRequestHandler(); TreqHandler = new msgTransferRequestHandler(); ADreqHandler.start(); TreqHandler.start(); Properties props = getProperties(); path = (String)props.get("Path"); sentFolderName = (String)props.get("SFN"); inboxFolderName = (String)props.get("IFN"); offlineFolderName = (String)props.get("OFN"); } /** Construct a transient object. */ public FMServer() { super(); ADreqHandler = new msgAddDeleteRequestHandler(); TreqHandler = new msgTransferRequestHandler(); ADreqHandler.start(); TreqHandler.start(); Properties props = getProperties(); path = (String)props.get("Path"); sentFolderName = (String)props.get("SFN"); inboxFolderName = (String)props.get("IFN"); offlineFolderName = (String)props.get("OFN"); } private Properties getProperties(){ boolean found = true; Properties props=null; ObjectInputStream oin=null; FileInputStream in=null; try{ in=new FileInputStream("FMProperties.props"); } 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{ props=(Properties)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 props; } msgAddDeleteRequestHandler ADreqHandler; msgTransferRequestHandler TreqHandler; //Queue for all the message static HashMap msgAddDeleteRequest = new HashMap(true); static Queue msgTransferRequest = new Queue(); //Return a file object for a specific user and his folder private File getFile(String userName, String folder, String msgId){ if (folder.equalsIgnoreCase("INBOX")) { return new File(path + File.separatorChar + userName + File.separatorChar + inboxFolderName, msgId + ".mdm"); } else if(folder.equalsIgnoreCase("OFFLINE")) { return new File(path + File.separatorChar + userName + File.separatorChar + offlineFolderName, msgId + ".mdm"); } else{ return new File(path + File.separatorChar + userName + File.separatorChar + sentFolderName, msgId + ".mdm"); } } //Update box to file private static void update(File file, MDMessage 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 MDMessage extractBox(File file){ boolean found = true; MDMessage 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=(MDMessage)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; } //Get a message by its ID public Vector getMsgById(String userName, String folder, String Id) { File f1 = getFile(userName, folder, Id); MDMessage b1 = extractBox(f1); return b1; } //Get a message by the file id contained in this public Vector getMsgByFileName(String userName, String folder, String fileName) { return new Vector(); } //Add a message for a specific user in a specific folder public void addMsgBasic(String userName, String folder, String sender,String id,Date date,String message) { 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) { QueuedMDMessage QM = new QueuedMDMessage(userName, folder, msg); msgAddDeleteRequest.add("add", QM); } private void addQueuedMessageToFolder(QueuedMDMessage QM){ System.out.println("Adding a new message to folder: " + QM.folder + " for user " + QM.userName); File checkFolderExists = new File(path + File.separatorChar + QM.userName); if(!checkFolderExists.exists()){ createNewFilesInstantly(QM.userName); } File f1 = getFile(QM.userName, QM.folder, (String)QM.msg.elementAt(1)); update(f1,QM.msg); } //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 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, QM.id_toFolder); f1.delete(); } //Interface required to create the required set of files public void createNewFiles(String userName){ QueuedMDMessage QM = new QueuedMDMessage(userName); msgAddDeleteRequest.add("create", QM); } private void createNewFilesInstantly(String userName){ try{ System.out.println("Processing create new folders request for: " + userName); File f1 = new File(path + File.separatorChar + userName); f1.mkdir(); File f2 = new File(path + File.separatorChar + userName + File.separatorChar + inboxFolderName); f2.mkdir(); File f3 = new File(path + File.separatorChar + userName + File.separatorChar + offlineFolderName); f3.mkdir(); File f4 = new File(path + File.separatorChar + userName + File.separatorChar + sentFolderName); f4.mkdir(); } catch(Exception ex){ ex.printStackTrace(); } } private void createQueuedRequest(QueuedMDMessage QM){ try{ System.out.println("Processing create new folders request for: " + QM.userName); File f1 = new File(path + File.separatorChar + QM.userName); f1.mkdir(); File f2 = new File(path + File.separatorChar + QM.userName + File.separatorChar + inboxFolderName); f2.mkdir(); File f3 = new File(path + File.separatorChar + QM.userName + File.separatorChar + offlineFolderName); f3.mkdir(); File f4 = new File(path + File.separatorChar + QM.userName + File.separatorChar + sentFolderName); f4.mkdir(); } catch(Exception ex){ ex.printStackTrace(); } } //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); } public MessageTableModel getAllMsg(String userName, String folder){ MessageTableModel b1 = new MessageTableModel(); try{ File f1; if (folder.equalsIgnoreCase("INBOX")) { f1 = new File(path + File.separatorChar + userName + File.separatorChar + inboxFolderName); } else if(folder.equalsIgnoreCase("OFFLINE")) { f1 = new File(path + File.separatorChar + userName + File.separatorChar + offlineFolderName); } else{ f1 = new File(path + File.separatorChar + userName + File.separatorChar + sentFolderName); } String[] msgFiles = f1.list(new ExtensionFilter()); for(int i=0 ; i < msgFiles.length ; i++){ MDMessage temp = extractBox(new File(f1.getPath(), msgFiles[i])); b1.addElement(temp); } } catch(Exception ex){ ex.printStackTrace(); } System.out.println("getAllMsg returned " + b1.size() + " messages for user" + userName); return b1; } public MessageTableModel getAllMsgExceptInVector(String userName, String folder, Vector except){ MessageTableModel b1 = new MessageTableModel(); try{ File f1; if (folder.equalsIgnoreCase("INBOX")) { f1 = new File(path + File.separatorChar + userName + File.separatorChar + inboxFolderName); } else if(folder.equalsIgnoreCase("OFFLINE")) { f1 = new File(path + File.separatorChar + userName + File.separatorChar + offlineFolderName); } else{ f1 = new File(path + File.separatorChar + userName + File.separatorChar + sentFolderName); } String[] msgFiles = f1.list(new ExtensionFilter()); for(int i=0 ; i < msgFiles.length ; i++){ if(!except.contains(msgFiles[i])){ MDMessage temp = extractBox(new File(f1.getPath(), msgFiles[i])); b1.addElement(temp); } } } catch(Exception ex){ ex.printStackTrace(); } System.out.println("getAllMsgExceptInVector returned " + b1.size() + " messages for user" + userName); return b1; } public static void main(String[] args){ try{ // Initialize the ORB. org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // Initialize the BOA. org.omg.CORBA.BOA boa = orb.BOA_init(); // Create the account manager object. FMServer manager = new FMServer("FMServer"); // Export the newly created object. boa.obj_is_ready(manager); System.out.println(manager + " is ready."); // Wait for incoming requests boa.impl_is_ready(); } catch(Exception e){ e.printStackTrace(); } } //This thread processes the requests in the queue class msgAddDeleteRequestHandler extends Thread{ Enumeration e; public void run(){ System.out.println("Thread to process add/delete 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){;} } } } } class ExtensionFilter implements FilenameFilter{ private String extension = ".mdm"; public ExtensionFilter(){ } public boolean accept(File dir, String name){ return name.endsWith(extension); } } }