Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/tmcsim/paramicscommunicator/ParamicsFileWriter.java

    r25 r2  
    11package tmcsim.paramicscommunicator; 
     2 
    23 
    34import java.io.File; 
     
    1011import java.util.logging.Level; 
    1112import java.util.logging.Logger; 
     13 
    1214import org.apache.xml.serialize.OutputFormat; 
    1315import org.apache.xml.serialize.XMLSerializer; 
    1416import org.w3c.dom.Element; 
     17 
    1518import tmcsim.paramicscommunicator.FileIOUpdate.IO_TYPE; 
    1619 
    1720/** 
    18  * The ParamicsFileWriter handles writing messages to a target file which is 
    19  * read by Paramics. Messages are received through the writeMessage() method. 
     21 * The ParamicsFileWriter handles writing messages to a target file which 
     22 * is read by Paramics. Messages are received through the writeMessage() method. 
    2023 * This object handles queueing messages and writing as the file becomes 
    21  * available. New data is written to the target file when it has been modified 
    22  * (cleared) by Paramics. If this does not happen, messages are queued and a 
    23  * timer is used to periodically determine if the file has become available for 
    24  * writing. 
    25  * 
     24 * available.  New data is written to the target file when it has been 
     25 * modified (cleared) by Paramics.  If this does not happen, messages 
     26 * are queued and a timer is used to periodically determine if the 
     27 * file has become available for writing. 
     28 *  
    2629 * @author Matthew Cechini 
    2730 * @version 
    2831 */ 
    29 public class ParamicsFileWriter extends Observable 
    30 { 
    31  
    32     /** 
    33      * Duration (in ms) that the TimerTask will be scheduled to retry writing to 
    34      * the target file. Default = 2000ms 
     32public class ParamicsFileWriter extends Observable { 
     33     
     34    /**  
     35     * Duration (in  ms) that the TimerTask will be scheduled to 
     36     * retry writing to the target file. Default = 2000ms 
    3537     */ 
    3638    private static long TIMER_DURATION = 2000; 
    37     /** 
    38      * Error Logger. 
    39      */ 
     39     
     40    /** Error Logger. */ 
    4041    private Logger paramLogger = Logger.getLogger("tmcsim.paramicscommunicator"); 
    41     /** 
    42      * Linked List of messages that have been received 
    43      */ 
     42     
     43    /** Linked List of messages that have been received */ 
    4444    private LinkedList<Element> queuedMessages = null; 
    45     /** 
    46      * 
    47      */ 
     45     
     46    /**  */ 
    4847    private String writerID = null; 
    49     /** 
    50      * File name of the file where data is written 
    51      */ 
     48 
     49    /** File name of the file where data is written */ 
    5250    private String outputFile = null; 
    53     /** 
    54      * FileWriter used to write data to the output file. 
    55      */ 
     51     
     52    /** FileWriter used to write data to the output file. */ 
    5653    private FileWriter fileWriter = null; 
    57     /** 
    58      * Value (seconds since 1/1/1970) of output file's last modifcation time 
    59      */ 
    60     private long lastModified = 0; 
    61     /** 
    62      * Timer used to schedule file writing tasks. 
    63      */ 
     54     
     55    /** Value (seconds since 1/1/1970) of output file's last modifcation time */ 
     56    private long lastModified = 0;   
     57     
     58    /** Timer used to schedule file writing tasks. */ 
    6459    private Timer writerTimer = null; 
    65     /** 
    66      * Synchronizing lock to protect File IO and message queuing. 
    67      */ 
    68     private Object lock = null; 
    69  
     60     
    7061    /** 
    7162     * A TimerTask to retry writing messages that have been queued within this 
    72      * ParamicsWriter. If a message has been queued, see if the target file has 
    73      * been modified since last write. If so, write the first queued message to 
    74      * the file and remove the message from the queue. If writing is 
    75      * unsuccessful, do not remove the message from the queue. If there are no 
    76      * more messages in the queue, cancel this timer. 
    77      */ 
    78     private class WriterTimerTask extends TimerTask 
    79     { 
    80  
    81         public void run() 
    82         { 
    83  
    84             synchronized (lock) 
    85             { 
    86                 paramLogger.log(Level.INFO, "ParamicsFileWriter, WriterTimerTask " 
    87                         + "run() started, current queue size = " + queuedMessages.size()); 
    88  
     63     * ParamicsWriter.  If a message has been queued, see if the target file 
     64     * has been modified since last write.  If so, write the first queued message 
     65     * to the file and remove the message from the queue.  If writing is unsuccessful, 
     66     * do not remove the message from the queue.  If there are no more messages in  
     67     * the queue, cancel this timer. 
     68     */ 
     69    private class WriterTimerTask extends TimerTask { 
     70        public void run() { 
     71 
     72            synchronized(lock) { 
     73             
    8974                //if we've queued something, continue. 
    90                 if (queuedMessages.size() > 0) 
    91                 { 
    92  
     75                if(queuedMessages.size() > 0) {          
     76                     
    9377                    //if file has been modified, write to it 
    94                     if (lastModified < new File(outputFile).lastModified()) 
    95                     { 
    96                         try 
    97                         { 
     78                    if(lastModified < new File(outputFile).lastModified()) 
     79                    {        
     80                        try { 
    9881                            writeToFile(queuedMessages.getFirst()); 
    9982                            queuedMessages.remove(0); 
    100                         } catch (IOException ioe) 
    101                         { 
    102                             paramLogger.logp(Level.SEVERE, "ParamicsFileWriter.WriterTimerTask", 
    103                                     "run()", "Exception in writing to the target file: " 
    104                                     + outputFile + ".  Queue size = " + queuedMessages.size(), ioe); 
    10583                        } 
    106  
     84                        catch (IOException ioe) { 
     85                            paramLogger.logp(Level.SEVERE, "ParamicsFileWriter.WriterTimerTask",  
     86                                    "run()", "Exception in writing to the target file: " +  
     87                                    outputFile + ".  Queue size = " + queuedMessages.size(), ioe); 
     88                        } 
     89                         
    10790                        //all queued messages gone, cancel timer 
    108                         if (queuedMessages.size() == 0) 
    109                         { 
     91                        if(queuedMessages.size() == 0) 
    11092                            this.cancel(); 
    111                         } 
    112                     } 
     93                    }    
    11394                } 
    114             } 
     95            }                
    11596        } 
    11697    } 
    117  
    118     /** 
    119      * Constructor. Initialize data objects. If the target file exists, delete 
    120      * it, and then create a new file. 
     98     
     99    /** Synchronizing lock to protect File IO and message queuing. */ 
     100    private Object lock = null;      
     101     
     102    /** 
     103     * Constructor.  Initialize data objects.  If the target file exists, delete  
     104     * it, and then create a new file.   
    121105     * 
    122106     * @param workingDir Directory path where the output file is to be written 
    123107     * @param mess The ParamicsCommMessage containing the outputFile filename. 
    124108     */ 
    125     public ParamicsFileWriter(String id, String workingDir, String targetFile) 
    126     { 
    127  
    128         try 
    129         { 
     109    public ParamicsFileWriter(String id, String workingDir, String targetFile) { 
     110 
     111        try { 
    130112            writerID = id; 
    131  
    132             queuedMessages = new LinkedList<Element>(); 
    133             lock = new Object(); 
    134  
    135             outputFile = workingDir + targetFile; 
    136  
    137             File tempFile = new File(outputFile); 
    138             if (tempFile.exists()) 
    139             { 
     113     
     114            queuedMessages  = new LinkedList<Element>();     
     115            lock            = new Object(); 
     116                         
     117            outputFile      = workingDir + targetFile;   
     118             
     119            File tempFile = new File(outputFile);            
     120            if(tempFile.exists()) { 
    140121                tempFile.delete(); 
    141122            } 
    142123 
    143             tempFile.createNewFile(); 
    144  
    145             writerTimer = new Timer(); 
    146  
    147         } catch (IOException ioe) 
    148         { 
    149             paramLogger.logp(Level.SEVERE, "ParamicsFileWriter", "Constructor", 
     124            tempFile.createNewFile();            
     125                                                 
     126            writerTimer     = new Timer(); 
     127             
     128        } catch (IOException ioe) { 
     129            paramLogger.logp(Level.SEVERE, "ParamicsFileWriter", "Constructor",  
    150130                    "Unable to create Paramics File Writer.", ioe); 
    151131        } 
    152  
     132         
    153133    } 
    154  
     134     
     135     
    155136    /** 
    156137     * Method is called when a message has been received from the CAD Simulator. 
    157      * If the message queue is not empty, add the new message to the queue. If 
    158      * the output file has not been modified (read) since last write, add the 
    159      * message to the queue and set a timer to repeatedly check for modification 
    160      * to the output file. Else, write the new message to the file. If there is 
    161      * an error in writing the data, queue the message start a timer to retry 
    162      * the writing. 
     138     * If the message queue is not empty, add the new message to the queue. 
     139     * If the output file has not been modified (read) since last write, 
     140     * add the message to the queue and set a timer to repeatedly check for  
     141     * modification to the output file.  Else, write the new message to the file.   
     142     * If there is an error in writing the data, queue the message start a timer 
     143     * to retry the writing. 
    163144     * 
    164      * @param newMessage The received message which is to be written to the 
    165      * output file. 
    166      */ 
    167     public void writeMessage(Element messageElem) 
    168     { 
    169  
    170         synchronized (lock) 
    171         { 
    172             paramLogger.log(Level.INFO, "ParamicsFileWriter, writeMessage " 
    173                     + "current queue size = " + queuedMessages.size()); 
    174  
    175             //messages already queued... get in line. 
    176             if (queuedMessages.size() > 0) 
    177             { 
     145     * @param newMessage The received message which is to be written to  
     146     * the output file. 
     147     */ 
     148    public void writeMessage(Element messageElem) { 
     149         
     150        synchronized(lock) { 
     151             
     152            //messages already queued... get in line.            
     153            if(queuedMessages.size() > 0) { 
    178154                queuedMessages.add(messageElem); 
    179155 
    180                 paramLogger.log(Level.INFO, "Queueing message, new queue " 
    181                         + "size = " + queuedMessages.size()); 
    182             } //No modification since last write. (first queue) 
    183             else if (lastModified >= new File(outputFile).lastModified()) 
    184             { 
    185                 paramLogger.log(Level.INFO, "ParamicsFileWriter, writeMessage " 
    186                         + "adding msg to queue."); 
    187                 queuedMessages.add(messageElem); 
    188  
    189                 writerTimer.scheduleAtFixedRate(new WriterTimerTask(), 
     156                paramLogger.log(Level.INFO, "Queueing message, new queue " + 
     157                        "size = " + queuedMessages.size()); 
     158            }                
     159            //No modification since last write. (first queue)                
     160            else if (lastModified >= new File(outputFile).lastModified()) { 
     161                queuedMessages.add(messageElem);                 
     162                                 
     163                writerTimer.scheduleAtFixedRate(new WriterTimerTask(),  
    190164                        0L, TIMER_DURATION); 
    191165 
    192166                paramLogger.log(Level.INFO, "First message queued"); 
    193             } //free and clear, write. 
    194             else 
    195             { 
    196                 paramLogger.log(Level.INFO, "ParamicsFileWriter, writeMessage " 
    197                         + "try to writeToFile" + outputFile); 
    198                 try 
    199                 { 
     167            }            
     168            //free and clear, write. 
     169            else { 
     170                try { 
    200171                    writeToFile(messageElem); 
    201                 } catch (IOException ioe) 
    202                 { 
    203                     paramLogger.logp(Level.SEVERE, "ParamicsFileWriter", 
    204                             "writeMessage()", "Exception in writing to the " 
    205                             + "target file: " + outputFile, ioe); 
    206  
     172                } 
     173                catch(IOException ioe) { 
     174                    paramLogger.logp(Level.SEVERE, "ParamicsFileWriter",  
     175                            "writeMessage()", "Exception in writing to the " + 
     176                            "target file: " + outputFile, ioe); 
     177                     
    207178                    queuedMessages.add(messageElem); 
    208  
    209                     writerTimer.scheduleAtFixedRate(new WriterTimerTask(), 
     179                     
     180                    writerTimer.scheduleAtFixedRate(new WriterTimerTask(),  
    210181                            0L, TIMER_DURATION); 
    211182                } 
    212                 paramLogger.log(Level.INFO, "ParamicsFileWriter, writeMessage " 
    213                         + "writeToFile succeeded."); 
    214183            } 
    215184        } 
    216185    } 
    217  
     186         
    218187    /** 
    219188     * Method writes data to the output file. 
    220      * 
     189     *  
    221190     * @param output Data to be written to the file. 
    222191     */ 
    223     private void writeToFile(Element output) throws IOException 
    224     { 
    225  
     192    private void writeToFile(Element output) throws IOException {        
     193         
    226194        fileWriter = new FileWriter(outputFile); 
    227  
    228         OutputFormat of = new OutputFormat("XML", "ISO-8859-1", true); 
     195         
     196        OutputFormat of = new OutputFormat("XML","ISO-8859-1",true); 
    229197        of.setIndent(1); 
    230198        of.setIndenting(true); 
    231  
     199         
    232200        XMLSerializer serializer = new XMLSerializer(fileWriter, of); 
    233201        serializer.asDOMSerializer(); 
    234202        serializer.serialize(output); 
    235203 
    236         /** 
    237          * Added by Nathaniel Lehrer 
    238          */ 
    239         try 
    240         { 
     204        /** Added by Nathaniel Lehrer */ 
     205        try { 
    241206            java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream(); 
    242207            new XMLSerializer(outputStream, of).serialize(output); 
    243208            tmcsim.paramicslog.ParamicsLog.getInstance().writeToLog(outputStream.toString()); 
    244         } catch (Exception e) 
    245         { 
     209        } catch(Exception e) { 
    246210            System.out.println(e); 
    247211        } 
    248         /** 
    249          * End Add by Nathaniel Lehrer 
    250          */ 
     212        /** End Add by Nathaniel Lehrer */ 
     213         
    251214        fileWriter.flush(); 
    252215        fileWriter.close(); 
    253  
    254         lastModified = new File(outputFile).lastModified(); 
    255  
     216         
     217        lastModified = new File(outputFile).lastModified();      
     218         
    256219        setChanged(); 
    257220        notifyObservers(new FileIOUpdate(IO_TYPE.WRITE, writerID, new File(outputFile).length())); 
    258  
    259     } 
     221                             
     222    }                
    260223} 
Note: See TracChangeset for help on using the changeset viewer.