/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.descriptors.invalidation; import org.eclipse.persistence.internal.identitymaps.CacheKey; import org.eclipse.persistence.descriptors.invalidation.CacheInvalidationPolicy; /** * PUBLIC: * A CacheInvalidationPolicy which allows objects to live for a specific amount of time * after they are read. A TimeToLiveCacheInvalidationPolicy is instantiated with a specific * number of milliseconds. This represents how long after an object is read it will expire. * @see CacheInvalidationPolicy */ public class TimeToLiveCacheInvalidationPolicy extends CacheInvalidationPolicy { /** Number of milliseconds before invalidation. */ protected long timeToLive = 0; /** * INTERNAL: * Default Constructor for Project XML * Unless the timeToLive is set by method, objects will expire immediately */ public TimeToLiveCacheInvalidationPolicy() { } /** * PUBLIC: * Construct a TimeToLiveCacheInvalidationPolicy * @param timeToLive the number of milliseconds an object affected by this policy will live. */ public TimeToLiveCacheInvalidationPolicy(long timeToLive) { this.timeToLive = timeToLive; } /** * INTERNAL: * Return the next expiry time. */ public long getExpiryTimeInMillis(CacheKey key) { if (this.isInvalidationRandomized) { // If using randomized invalidation, subtract 0-10% of the timeToLive int randomDelta = this.random.nextInt((int)this.timeToLive / 10); return key.getReadTime() + (this.timeToLive - randomDelta); } else { return key.getReadTime() + this.timeToLive; } } /** * PUBLIC: * Return the time-to-live specified for this policy. */ public long getTimeToLive() { return timeToLive; } /** * INTERNAL: * Return true if this object is set as invalid or has expired. */ public boolean isInvalidated(CacheKey key, long currentTimeMillis) { if (key.getInvalidationState() == CacheKey.CACHE_KEY_INVALID) { return true; } return getExpiryTimeInMillis(key) <= currentTimeMillis; } /** * PUBLIC: * Set the time-to-live specified by this policy. */ public void setTimeToLive(long timeToLive) { this.timeToLive = timeToLive; } public Object clone() { TimeToLiveCacheInvalidationPolicy clone = null; try { clone = (TimeToLiveCacheInvalidationPolicy)super.clone(); clone.timeToLive = this.timeToLive; } catch (Exception exception) { throw new InternalError("clone failed"); } return clone; } }