Changeset 532


Ignore:
Timestamp:
11/09/09 23:56:19 (2 years ago)
Author:
octorian
Message:

Initial support for caching messages, and structure/content equals() and hashCode() implementations

Location:
trunk/LogicMail/src/org/logicprobe/LogicMail
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LogicMail/src/org/logicprobe/LogicMail/message/MimeMessageContent.java

    r518 r532  
    121121                putRawData(data); 
    122122        } 
     123 
     124        /* (non-Javadoc) 
     125         * @see java.lang.Object#hashCode() 
     126         */ 
     127        public int hashCode() { 
     128                final int prime = 31; 
     129                int result = 1; 
     130                result = prime * result + (int) (uniqueId ^ (uniqueId >>> 32)); 
     131                return result; 
     132        } 
     133 
     134        /* (non-Javadoc) 
     135         * @see java.lang.Object#equals(java.lang.Object) 
     136         */ 
     137        public boolean equals(Object obj) { 
     138                if (this == obj) 
     139                        return true; 
     140                if (obj == null) 
     141                        return false; 
     142                if (getClass() != obj.getClass()) 
     143                        return false; 
     144                MimeMessageContent other = (MimeMessageContent) obj; 
     145                if (uniqueId != other.uniqueId) 
     146                        return false; 
     147                return true; 
     148        } 
    123149} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/message/MimeMessagePart.java

    r518 r532  
    144144                size = input.readInt(); 
    145145        } 
     146 
     147        /* (non-Javadoc) 
     148         * @see java.lang.Object#hashCode() 
     149         */ 
     150        public int hashCode() { 
     151                final int prime = 31; 
     152                int result = 1; 
     153                result = prime * result + (int) (uniqueId ^ (uniqueId >>> 32)); 
     154                return result; 
     155        } 
     156 
     157        /* (non-Javadoc) 
     158         * @see java.lang.Object#equals(java.lang.Object) 
     159         */ 
     160        public boolean equals(Object obj) { 
     161                if (this == obj) 
     162                        return true; 
     163                if (obj == null) 
     164                        return false; 
     165                if (getClass() != obj.getClass()) 
     166                        return false; 
     167                MimeMessagePart other = (MimeMessagePart) obj; 
     168                if (uniqueId != other.uniqueId) 
     169                        return false; 
     170                return true; 
     171        } 
    146172} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/AccountNode.java

    r529 r532  
    626626                messageNode.setMessageSource(e.getMessageSource()); 
    627627                messageNode.putMessageContent(e.getMessageContent()); 
     628                messageNode.commitMessage(); 
    628629                break; 
    629630                case MessageEvent.TYPE_CONTENT_LOADED: 
    630631                messageNode.putMessageContent(e.getMessageContent()); 
     632                messageNode.commitMessage(); 
    631633                break; 
    632634                } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MailFileManager.java

    r530 r532  
    4747import org.logicprobe.LogicMail.conf.MailSettingsListener; 
    4848import org.logicprobe.LogicMail.mail.MessageToken; 
     49import org.logicprobe.LogicMail.message.MimeMessageContent; 
    4950 
    5051/** 
     
    209210        } 
    210211         
     212        public MessageNode readMessageNode(MailboxNode mailboxNode, MessageToken messageToken, boolean loadContent) throws IOException { 
     213                FileConnection fileConnection = getMailboxFileConnection(mailboxNode); 
     214                if(!fileConnection.exists()) { return null; } 
     215                 
     216                String mailboxUrl = fileConnection.getURL(); 
     217                fileConnection.close(); 
     218                String fileUrl = 
     219                                mailboxUrl 
     220                                + messageToken.getMessageUid() 
     221                                + MSG_SUFFIX; 
     222                MessageNode messageNode = readMessageNode(fileUrl); 
     223                if(loadContent) { 
     224                        MimeMessageContent[] content = readMessageContent(mailboxNode, messageToken); 
     225                        messageNode.putMessageContent(content); 
     226                } 
     227                return messageNode; 
     228        } 
     229         
     230        public MimeMessageContent[] readMessageContent(MailboxNode mailboxNode, MessageToken messageToken) throws IOException { 
     231                FileConnection fileConnection = getMailboxFileConnection(mailboxNode); 
     232                if(!fileConnection.exists()) { return null; } 
     233                 
     234                String mailboxUrl = fileConnection.getURL(); 
     235                fileConnection.close(); 
     236                String fileUrl = 
     237                                mailboxUrl 
     238                                + messageToken.getMessageUid() 
     239                                + MSG_SUFFIX; 
     240                MimeMessageContent[] messageContent = readMessageContent(fileUrl, messageToken); 
     241                 
     242                return messageContent; 
     243        } 
     244         
    211245        private FileConnection getMailboxFileConnection(MailboxNode mailboxNode) throws IOException { 
    212246                // Build the account and mailbox UID strings 
     
    283317                return result; 
    284318        } 
     319         
     320        private MimeMessageContent[] readMessageContent(String fileUrl, MessageToken messageToken) { 
     321                FileConnection fileConnection = null; 
     322                Vector content = new Vector(); 
     323                try { 
     324                        fileConnection = (FileConnection)Connector.open(fileUrl); 
     325                        DataInputStream input = fileConnection.openDataInputStream(); 
     326                        MessageNodeReader reader = new MessageNodeReader(input); 
     327                        MessageToken tempToken = reader.read(); 
     328                        if(messageToken.equals(tempToken)) { 
     329                                while(reader.isContentAvailable()) { 
     330                                        content.addElement(reader.getNextContent()); 
     331                                } 
     332                        } 
     333                        input.close(); 
     334                        fileConnection.close(); 
     335                } catch (Exception e) { 
     336                        EventLogger.logEvent(AppInfo.GUID, 
     337                        ("Unable to read content: " + fileUrl 
     338                                + "\r\n" + e.getMessage()).getBytes(), 
     339                        EventLogger.ERROR); 
     340                } finally { 
     341                        if(fileConnection != null) { 
     342                                try { fileConnection.close(); } catch (Exception e) { } 
     343                        } 
     344                } 
     345                MimeMessageContent[] result = new MimeMessageContent[content.size()]; 
     346                content.copyInto(result); 
     347                return result; 
     348        } 
    285349} 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MailboxNode.java

    r529 r532  
    503503                        messageMap.put(message, message); 
    504504                        messageTokenMap.put(message.getMessageToken(), message); 
    505                         if(!message.isCached() && message.isCachable()) { 
    506                                 try { 
    507                                         MailFileManager.getInstance().writeMessage(message); 
    508                                         message.setCached(true); 
    509                                 } catch (IOException e) { 
    510                                         System.err.println("-->Unable to write message: " + e.getMessage()); 
    511                                         e.printStackTrace(); 
    512                                 } catch (Throwable t) { 
    513                                         System.err.println("-->Unable to write message: " + t.getMessage()); 
    514                                         t.printStackTrace(); 
    515                                 } 
    516                         } 
     505                        message.commitMessage(); 
    517506                        return true; 
    518507                } 
  • trunk/LogicMail/src/org/logicprobe/LogicMail/model/MessageNode.java

    r529 r532  
    3131package org.logicprobe.LogicMail.model; 
    3232 
     33import java.io.IOException; 
    3334import java.util.Date; 
    3435import java.util.Enumeration; 
     
    3637import java.util.Vector; 
    3738 
     39import net.rim.device.api.system.EventLogger; 
    3840import net.rim.device.api.util.Arrays; 
    3941import net.rim.device.api.util.Comparator; 
     
    591593                } 
    592594                fireMessageStatusChanged(MessageNodeEvent.TYPE_CONTENT_LOADED); 
     595        } 
     596         
     597        /** 
     598         * Commits the current state of the message to the cache, if applicable. 
     599         *  
     600         * @return True if written to cache, false otherwise 
     601         */ 
     602        boolean commitMessage() { 
     603                boolean result = false; 
     604                synchronized(messageContent) { 
     605                        if(!isCached() && isCachable()) { 
     606                                try { 
     607                                        MailFileManager.getInstance().writeMessage(this); 
     608                                        setCached(true); 
     609                                        result = true; 
     610                                } catch (IOException e) { 
     611                                        System.err.println("-->Unable to write message: " + e.getMessage()); 
     612                                } catch (Throwable t) { 
     613                                        System.err.println("-->Unable to write message: " + t.getMessage()); 
     614                                } 
     615                        } 
     616                } 
     617                return result; 
    593618        } 
    594619         
     
    10571082                                        displayableParts = new MimeMessagePart[partsToFetch.size()]; 
    10581083                                        partsToFetch.copyInto(displayableParts); 
    1059                                         mailStore.requestMessageParts(messageToken, displayableParts); 
     1084                                        (new Thread(new RefreshMessagePartsRunnable(displayableParts))).start(); 
    10601085                                        result = true; 
    10611086                                } 
    10621087                        } 
    10631088                        else { 
     1089                                (new Thread(new RefreshMessageWholeRunnable())).start(); 
     1090                                result = true; 
     1091                        } 
     1092                } 
     1093                return result; 
     1094        } 
     1095 
     1096        private class RefreshMessageWholeRunnable implements Runnable { 
     1097                public void run() { 
     1098                        boolean messageLoaded = false; 
     1099                        try { 
     1100                                MessageNode tempNode = MailFileManager.getInstance().readMessageNode(parent, messageToken, true); 
     1101                                if(tempNode != null) { 
     1102                                        setMessageStructure(tempNode.getMessageStructure()); 
     1103                                        setMessageSource(tempNode.getMessageSource()); 
     1104                                        putMessageContent(tempNode.getAllMessageContent()); 
     1105                                        messageLoaded = true; 
     1106                                } 
     1107                        } catch (IOException e) { 
     1108                                EventLogger.logEvent(AppInfo.GUID, 
     1109                                ("Unable to read message from cache\r\n" 
     1110                                        + e.getMessage()).getBytes(), 
     1111                                EventLogger.ERROR); 
     1112                        } 
     1113                         
     1114                        if(!messageLoaded) { 
     1115                                AbstractMailStore mailStore = parent.getParentAccount().getMailStore(); 
    10641116                                mailStore.requestMessage(messageToken); 
    1065                                 result = true; 
    1066                         } 
    1067                 } 
    1068                 return result; 
     1117                        } 
     1118                } 
     1119        }; 
     1120 
     1121        private class RefreshMessagePartsRunnable implements Runnable { 
     1122                private MimeMessagePart[] displayableParts; 
     1123                RefreshMessagePartsRunnable(MimeMessagePart[] displayableParts) { 
     1124                        this.displayableParts = displayableParts; 
     1125                } 
     1126                public void run() { 
     1127                        Vector contentToLoad = new Vector(displayableParts.length); 
     1128                        for(int i=0; i<displayableParts.length; i++) { 
     1129                                contentToLoad.addElement(displayableParts[i]); 
     1130                        } 
     1131                         
     1132                        try { 
     1133                                MimeMessageContent[] content = MailFileManager.getInstance().readMessageContent(parent, messageToken); 
     1134                                if(content != null) { 
     1135                                        putMessageContent(content); 
     1136                                        for(int i=0; i<content.length; i++) { 
     1137                                                contentToLoad.removeElement(content[i].getMessagePart()); 
     1138                                        } 
     1139                                } 
     1140                        } catch (IOException e) { 
     1141                                EventLogger.logEvent(AppInfo.GUID, 
     1142                                ("Unable to read message from cache\r\n" 
     1143                                        + e.getMessage()).getBytes(), 
     1144                                EventLogger.ERROR); 
     1145                        } 
     1146                         
     1147                        if(!contentToLoad.isEmpty()) { 
     1148                                MimeMessagePart[] partsToLoad = new MimeMessagePart[contentToLoad.size()]; 
     1149                                contentToLoad.copyInto(partsToLoad); 
     1150                                AbstractMailStore mailStore = parent.getParentAccount().getMailStore(); 
     1151                                mailStore.requestMessageParts(messageToken, partsToLoad); 
     1152                        } 
     1153                } 
    10691154        } 
    10701155         
Note: See TracChangeset for help on using the changeset viewer.