Package org.apache.wicket.session.pagemap

Source Code of org.apache.wicket.session.pagemap.LeastRecentlyAccessedEvictionStrategy

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.wicket.session.pagemap;

import org.apache.wicket.AccessStackPageMap;
import org.apache.wicket.IPageMap;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.AccessStackPageMap.Access;

/**
* A simple eviction strategy that evicts the least recently accessed page
* version from the given page map.
*
* @author Jonathan Locke
*/
public class LeastRecentlyAccessedEvictionStrategy implements IPageMapEvictionStrategy
{
  private static final long serialVersionUID = 1L;

  /** Maximum number of page versions in a page map before evictions start */
  private int maxVersions;

  /**
   * Constructor.
   *
   * @param maxVersions
   *            Maximum number of page versions before eviction occurs
   */
  public LeastRecentlyAccessedEvictionStrategy(int maxVersions)
  {
    if (maxVersions < 1)
    {
      throw new IllegalArgumentException("Value for maxVersions must be >= 1");
    }
    this.maxVersions = maxVersions;
  }

  /**
   * @see org.apache.wicket.session.pagemap.IPageMapEvictionStrategy#evict(org.apache.wicket.PageMap)
   */
  public void evict(final IPageMap pageMap)
  {
    if (pageMap instanceof AccessStackPageMap)
    {
      synchronized (Session.get())
      {
        AccessStackPageMap accessPM = (AccessStackPageMap)pageMap;
        // Do we need to evict under this strategy?
        if (accessPM.getVersions() > maxVersions)
        {
          // Remove oldest entry from access stack
          final AccessStackPageMap.Access oldestAccess = (Access)accessPM.getAccessStack()
              .remove(0);
          final IPageMapEntry oldestEntry = pageMap.getEntry(oldestAccess.getId());

          // If entry is a page (cannot be null if we're evicting)
          if (oldestEntry instanceof Page)
          {
            Page page = (Page)oldestEntry;

            // If there is more than one version of this page
            if (page.getVersions() > 1)
            {
              // expire the oldest version
              page.expireOldestVersion();
            }
            else
            {
              // expire whole page
              accessPM.removeEntry(page);
            }
          }
          else
          {
            // If oldestEntry is not an instance of Page, then it is
            // some
            // custom, user-defined IPageMapEntry class and cannot
            // contain
            // versioning information, so we just remove the entry.
            if (oldestEntry != null)
            {
              accessPM.removeEntry(oldestEntry);
            }
          }
        }
      }
    }
  }

  /**
   * @see java.lang.Object#toString()
   */
  public String toString()
  {
    return "[LeastRecentlyAccessedEvictionStrategy maxVersions = " + maxVersions + "]";
  }
}
TOP

Related Classes of org.apache.wicket.session.pagemap.LeastRecentlyAccessedEvictionStrategy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.