mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[302628] Moved to a non-API package.
This commit is contained in:
parent
845bf5a063
commit
79c61294f9
1 changed files with 0 additions and 200 deletions
|
@ -1,200 +0,0 @@
|
|||
package org.eclipse.cdt.dsf.concurrent;
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, Inc. 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:
|
||||
* Wind River Systems - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import org.eclipse.cdt.dsf.internal.DsfPlugin;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* A general purpose cache, which caches the result of a single request.
|
||||
* Sub classes need to implement {@link #retrieve(DataRequestMonitor)} to fetch
|
||||
* data from the data source. Clients are responsible for calling
|
||||
* {@link #disable()} and {@link #reset()} to manage the state of the cache in
|
||||
* response to events from the data source.
|
||||
* <p>
|
||||
* This cache requires an executor to use. The executor is used to synchronize
|
||||
* access to the cache state and data.
|
||||
* </p>
|
||||
* @since 2.1
|
||||
*/
|
||||
@ConfinedToDsfExecutor("fExecutor")
|
||||
public abstract class DataCache<V> {
|
||||
|
||||
final private Executor fExecutor;
|
||||
|
||||
private boolean fValid;
|
||||
|
||||
protected DataRequestMonitor<V> fRm;
|
||||
private V fData;
|
||||
private IStatus fStatus;
|
||||
|
||||
private List<DataRequestMonitor<V>> fWaitingList = new LinkedList<DataRequestMonitor<V>>();
|
||||
|
||||
public DataCache(Executor executor) {
|
||||
fExecutor = executor;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sub-classes should override this method to retrieve the cache data
|
||||
* from its source.
|
||||
*
|
||||
* @param rm Request monitor for completion of data retrieval.
|
||||
*/
|
||||
protected abstract void retrieve(DataRequestMonitor<V> rm);
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if the cache is currently valid. I.e.
|
||||
* whether the cache can return a value immediately without first
|
||||
* retrieving it from the data source.
|
||||
*/
|
||||
public boolean isValid() {
|
||||
return fValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if the cache is currently waiting for data
|
||||
* from the data source.
|
||||
*/
|
||||
public boolean isPending() {
|
||||
return fRm != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current data value held by this cache. Clients should first
|
||||
* call isValid() to determine if the data is up to date.
|
||||
*/
|
||||
public V getData() {
|
||||
return fData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the status of the source request held by this cache. Clients
|
||||
* should first call isValid() to determine if the data is up to date.
|
||||
*/
|
||||
public IStatus getStatus() {
|
||||
return fStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Request data from the cache. The cache is valid, it will complete the
|
||||
* request immediately, otherwise data will first be retrieved from the
|
||||
* source.
|
||||
* @param req
|
||||
*/
|
||||
public void request(final DataRequestMonitor<V> rm) {
|
||||
if (!fValid) {
|
||||
boolean first = fWaitingList.isEmpty();
|
||||
fWaitingList.add(rm);
|
||||
if(first) {
|
||||
fRm = new DataRequestMonitor<V>(fExecutor, null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
if (!isCanceled()) {
|
||||
fValid = true;
|
||||
fRm = null;
|
||||
set(getData(), getStatus());
|
||||
}
|
||||
}
|
||||
};
|
||||
retrieve(fRm);
|
||||
}
|
||||
} else {
|
||||
rm.setData(fData);
|
||||
rm.setStatus(fStatus);
|
||||
rm.done();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void set(V data, IStatus status) {
|
||||
fData = data;
|
||||
fStatus = status;
|
||||
List<DataRequestMonitor<V>> waitingList = fWaitingList;
|
||||
fWaitingList = new LinkedList<DataRequestMonitor<V>>();
|
||||
|
||||
for (DataRequestMonitor<V> rm : waitingList) {
|
||||
rm.setData(data);
|
||||
rm.setStatus(status);
|
||||
rm.done();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the cache with a data value <code>null</code> and an error
|
||||
* status with code {@link IDsfStatusConstants#INVALID_STATE}.
|
||||
*
|
||||
* @see #reset(Object, IStatus)
|
||||
*/
|
||||
public void reset() {
|
||||
reset(null, new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Cache reset", null)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the cache with given data and status. Resetting the cache
|
||||
* forces the cache to be invalid and cancels any current pending requests
|
||||
* from data source.
|
||||
* <p>
|
||||
* This method should be called when the data source has issued an event
|
||||
* indicating that the source data has changed but data may still be
|
||||
* retrieved. Clients may need to re-request data following cache reset.
|
||||
* </p>
|
||||
* @param data The data that should be returned to any clients currently
|
||||
* waiting for cache data.
|
||||
* @status The status that should be returned to any clients currently
|
||||
* waiting for cache data.
|
||||
*/
|
||||
public void reset(V data, IStatus status) {
|
||||
fValid = false;
|
||||
if (fRm != null) {
|
||||
fRm.cancel();
|
||||
fRm = null;
|
||||
}
|
||||
set(data, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables the cache with a data value <code>null</code> and an error
|
||||
* status with code {@link IDsfStatusConstants#INVALID_STATE}.
|
||||
*
|
||||
* @see #disable(Object, IStatus)
|
||||
*/
|
||||
public void disable() {
|
||||
disable(null, new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Cache disable", null)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the cache then disables it. When a cache is disabled it means
|
||||
* that it is valid and requests to the data source will not be sent.
|
||||
* <p>
|
||||
* This method should be called when the data source has issued an event
|
||||
* indicating that the source data has changed and future requests for
|
||||
* data will return the given data and status. Once the source data
|
||||
* becomes available again, clients should call {@link #reset()}.
|
||||
* </p>
|
||||
* @param data The data that should be returned to any clients waiting for
|
||||
* cache data and for clients requesting data until the cache is reset again.
|
||||
* @status The status that should be returned to any clients waiting for
|
||||
* cache data and for clients requesting data until the cache is reset again.
|
||||
*
|
||||
* @see #reset(Object, IStatus)
|
||||
*/
|
||||
public void disable(V data, IStatus status) {
|
||||
reset(data, status);
|
||||
fValid = true;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue