Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (C) 2014-2015 Philip Helger (www.helger.com) philip[at]helger[dot]com Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 
 package com.helger.webbasics.smtp;
 
 import java.util.List;
 
 
A special com.helger.web.smtp.failed.FailedMailQueue that supports persistent storage.

Author(s):
Philip Helger
 
 public class FailedMailQueueWithDAO extends FailedMailQueue
 {
   private final class FMQDAO extends AbstractSimpleDAO
   {
     private static final String ELEMENT_FAILEDMAILS = "failedmails";
     private static final String ELEMENT_FAILEDMAILDATA = "failedmaildata";
 
     public FMQDAO (@Nullable final String sFilename)
     {
       super (sFilename);
     }

    
Initial read - just to make initialRead accessible

 
     void myInitialRead () throws DAOException
     {
       initialRead ();
     }

    
Mark as changed - just to make markAsChanged accessible
 
     void myMarkChanged ()
     {
       super.markAsChanged ();
     }
 
     @Override
     @Nonnull
     protected EChange onRead (@Nonnull final IMicroDocument aDoc)
     {
       for (final IMicroElement eFMD : aDoc.getDocumentElement ().getAllChildElements ())
       {
         final FailedMailData aFMD = MicroTypeConverter.convertToNative (eFMDFailedMailData.class);
         if (aFMD != null)
           FailedMailQueueWithDAO.this.add (aFMD);
       }
       return .;
     }
 
     @Override
     @Nonnull
     protected IMicroDocument createWriteData ()
     {
       final IMicroDocument aDoc = new MicroDocument ();
       final IMicroElement eRoot = aDoc.appendElement ();
      for (final FailedMailData aFMD : FailedMailQueueWithDAO.this.getAllFailedMails ())
        eRoot.appendChild (MicroTypeConverter.convertToMicroElement (aFMD));
      return aDoc;
    }
  }
  private static final long serialVersionUID = -4807647156903750122L;
  private transient FMQDAO m_aDAO;
  public FailedMailQueueWithDAO (@Nullable final String sFilename)
  {
    try
    {
       = new FMQDAO (sFilename);
      // Read outside FMQDAO constructor, so that the DAO can be used
      .myInitialRead ();
    }
    catch (final DAOException ex)
    {
      throw new InitializationException ("Failed to init FailedMailQueueWithDAO with filename '" + sFilename + "'"ex);
    }
  }
  private void writeObject (@Nonnull final ObjectOutputStream aOOSthrows IOException
  {
    aOOS.defaultWriteObject ();
  }
  private void readObject (@Nonnull final ObjectInputStream aOISthrows IOExceptionClassNotFoundException
  {
    aOIS.defaultReadObject ();
    final String sFilename = aOIS.readUTF ();
    try
    {
       = new FMQDAO (sFilename);
      // Read outside FMQDAO constructor, so that the DAO can be used
      .myInitialRead ();
    }
    catch (final DAOException ex)
    {
      throw new InitializationException ("Failed to init FailedMailQueueWithDAO with filename '" + sFilename + "'"ex);
    }
  }
  private void _markAsChanged ()
  {
    .writeLock ().lock ();
    try
    {
      // Must be called in a lock
      .myMarkChanged ();
    }
    finally
    {
      .writeLock ().unlock ();
    }
  }
  public void add (@Nonnull final FailedMailData aFailedMailData)
  {
    super.add (aFailedMailData);
    _markAsChanged ();
  }
  public FailedMailData remove (@Nullable final String sID)
  {
    final FailedMailData ret = super.remove (sID);
    if (ret != null)
      _markAsChanged ();
    return ret;
  }
  public List <FailedMailDataremoveAll ()
  {
    final List <FailedMailDataret = super.removeAll ();
    if (!ret.isEmpty ())
      _markAsChanged ();
    return ret;
  }
New to GrepCode? Check out our FAQ X