/* * Copyright (c) 2008, 2009, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.net4j.util.cache; import org.eclipse.net4j.internal.util.bundle.OM; import org.eclipse.net4j.util.concurrent.Worker; import org.eclipse.net4j.util.om.trace.ContextTracer; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; /** * @author Eike Stepper */ public abstract class Cache<E> extends Worker implements ICache { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, Cache.class); private ICacheMonitor cacheMonitor; private ICacheProbe cacheProbe; private ReferenceQueue<E> referenceQueue = new ReferenceQueue<E>(); public Cache() { } public ICacheMonitor getCacheMonitor() { return cacheMonitor; } public void setCacheMonitor(ICacheMonitor cacheMonitor) { this.cacheMonitor = cacheMonitor; } protected ICacheProbe getCacheProbe() { return cacheProbe; } protected ReferenceQueue<E> getReferenceQueue() { return referenceQueue; } @Override protected void doBeforeActivate() throws Exception { super.doBeforeActivate(); if (cacheMonitor == null) { throw new IllegalStateException("cacheMonitor == null"); //$NON-NLS-1$ } } @Override protected void doActivate() throws Exception { super.doActivate(); cacheProbe = cacheMonitor.registerCache(this); } @Override protected void doDeactivate() throws Exception { cacheMonitor.deregisterCache(this); cacheProbe = null; super.doDeactivate(); } @Override protected void work(WorkContext context) throws Exception { Reference<? extends E> reference = referenceQueue.remove(200); if (reference != null) { unreachableElement(reference); } } protected void unreachableElement(Reference<? extends E> reference) { E element = reference.get(); if (element != null) { unreachableElement(element); } } protected void unreachableElement(E element) { if (TRACER.isEnabled()) { TRACER.trace("Unreachable: " + element); //$NON-NLS-1$ } } }