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.appbasics.security.audit;
 
 import java.util.List;
 
 
 
The class handles all audit items

Author(s):
Philip Helger
 
 public final class AuditManager extends AbstractSimpleDAO implements IAuditManager
 {
   private static final class AuditHasFilename implements IHasFilename
   {
     private final String m_sBaseDir;
 
     AuditHasFilename (@Nullable final String sBaseDir)
     {
        = sBaseDir;
     }
 
     @Nullable
     public String getFilename ()
     {
       // No base dir -> in memory only
       if (StringHelper.hasNoText ())
         return null;
       return  + PDTIOHelper.getCurrentDateForFilename () + ".xml";
     }
 
     @Override
     public boolean equals (final Object o)
     {
       if (o == this)
         return true;
       if (!(o instanceof AuditHasFilename))
         return false;
       final AuditHasFilename rhs = (AuditHasFilenameo;
       return EqualsUtils.equals (rhs.m_sBaseDir);
     }
 
     @Override
     public int hashCode ()
     {
       return new HashCodeGenerator (this).append ().getHashCode ();
     }
 
     @Override
     public String toString ()
     {
       return new ToStringGenerator (this).append ("baseDir").toString ();
     }
   }
 
  public static final String ELEMENT_ITEMS = "items";
  public static final String ELEMENT_ITEM = "item";
  public static final String ATTR_DT = "dt";
  public static final String ATTR_USER = "user";
  public static final String ATTR_TYPE = "type";
  /* initially was called "succes" by error */
  public static final String ATTR_SUCCESS = "success";
  private static final Logger s_aLogger = LoggerFactory.getLogger (AuditManager.class);
  private final AuditItemList m_aItems = new AuditItemList ();
  private final AsynchronousAuditor m_aAuditor;

  
Constructor

Parameters:
sBaseDir The base directory, relative to the com.helger.appbasics.app.io.WebFileIO.getDataIO() base directory. May be null to indicate an in-memory auditor only.
aUserIDProvider The current user ID provider. May not be null.
Throws:
com.helger.appbasics.app.dao.impl.DAOException In case reading failed
  public AuditManager (@Nullable final String sBaseDir, @Nonnull final ICurrentUserIDProvider aUserIDProviderthrows DAOException
  {
    super (new AuditHasFilename (sBaseDir));
    ValueEnforcer.notNull (aUserIDProvider"UserIDProvider");
    // Ensure base path is present
    if (StringHelper.hasText (sBaseDir))
      WebFileIO.getDataIO ().createDirectory (sBaseDirtrue);
    {
      public void run (@Nonnull final List <IAuditItemaAuditItemsthrows Exception
      {
        if (!aAuditItems.isEmpty ())
        {
          .writeLock ().lock ();
          try
          {
            for (final IAuditItem aItem : aAuditItems)
              .internalAddItem (aItem);
          }
          finally
          {
            .writeLock ().unlock ();
          }
          markAsChanged ();
        }
      }
    };
     = new AsynchronousAuditor (aUserIDProvideraPerformer);
    initialRead ();
  }
  {
    return ;
  }
  protected EChange onRead (@Nonnull final IMicroDocument aDoc)
  {
    for (final IMicroElement eItem : aDoc.getDocumentElement ().getAllChildElements ())
    {
      final String sDT = eItem.getAttributeValue ();
      final Long aDT = StringParser.parseLongObj (sDT);
      if (aDT == null)
      {
        .warn ("Failed to parse date time '" + sDT + "'");
        continue;
      }
      final String sUserID = eItem.getAttributeValue ();
      if (StringHelper.hasNoText (sUserID))
      {
        .warn ("Failed find user ID");
        continue;
      }
      final String sType = eItem.getAttributeValue ();
      final EAuditActionType eType = EAuditActionType.getFromIDOrNull (sType);
      if (eType == null)
      {
        .warn ("Failed to parse change type '" + sType + "'");
        continue;
      }
      final String sSuccess = eItem.getAttributeValue ();
      final ESuccess eSuccess = ESuccess.valueOf (StringParser.parseBool (sSuccess));
      final String sAction = eItem.getTextContent ();
      .internalAddItem (new AuditItem (PDTFactory.createDateTimeFromMillis (aDT.longValue ()),
                                               sUserID,
                                               eType,
                                               eSuccess,
                                               sAction));
    }
    // write-only :)
    return .;
  }
  {
    final IMicroDocument aDoc = new MicroDocument ();
    final IMicroElement eCIL = aDoc.appendElement ();
    // Is sorted internally!
    for (final IAuditItem aAuditItem : .getAllItems ())
    {
      final IMicroElement eItem = eCIL.appendElement ();
      eItem.setAttribute (, Long.toString (aAuditItem.getDateTime ().getMillis ()));
      eItem.setAttribute (aAuditItem.getUserID ());
      eItem.setAttribute (aAuditItem.getType ().getID ());
      eItem.setAttribute (, Boolean.toString (aAuditItem.getSuccess ().isSuccess ()));
      eItem.appendText (aAuditItem.getAction ());
    }
    return aDoc;
  }
  protected void onFilenameChange (@Nullable final String sPreviousFilename, @Nonnull final String sNewFilename)
  {
    // Called within a write lock
    if (sPreviousFilename != null)
    {
      // Don't update for the first read, as this would remove all previously
      // read items
    }
  }
  public int getAuditItemCount ()
  {
    .readLock ().lock ();
    try
    {
      return .getItemCount ();
    }
    finally
    {
      .readLock ().unlock ();
    }
  }
  public List <IAuditItemgetLastAuditItems (@Nonnegative final int nMaxItems)
  {
    .readLock ().lock ();
    try
    {
      return .getLastItems (nMaxItems);
    }
    finally
    {
      .readLock ().unlock ();
    }
  }
  public void stop ()
  {
    // Do not call in write-lock as this call blocks until the auditor is
    // stopped
    .stop ();
  }
  public boolean equals (final Object o)
  {
    if (o == this)
      return true;
    if (!super.equals (o))
      return false;
    final AuditManager rhs = (AuditManagero;
    return .equals (rhs.m_aItems);
  }
  public int hashCode ()
  {
    return HashCodeGenerator.getDerived (super.hashCode ()).append ().getHashCode ();
  }
  public String toString ()
  {
    return ToStringGenerator.getDerived (super.toString ())
                            .append ("items")
                            .append ("auditor")
                            .toString ();
  }
New to GrepCode? Check out our FAQ X