/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package net.sourceforge.phpdt.internal.core;
import java.util.Enumeration;
import net.sourceforge.phpdt.core.IBuffer;
import net.sourceforge.phpdt.core.IBufferFactory;
import net.sourceforge.phpdt.core.IJavaElement;
import net.sourceforge.phpdt.core.IOpenable;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
/**
* The buffer manager manages the set of open buffers. It implements an LRU
* cache of buffers.
*/
public class BufferManager implements IBufferFactory {
protected static BufferManager DEFAULT_BUFFER_MANAGER;
/**
* LRU cache of buffers. The key and value for an entry in the table is the
* identical buffer.
*/
protected OverflowingLRUCache openBuffers = new BufferCache(60);
/**
* Creates a new buffer manager.
*/
public BufferManager() {
}
/**
* Adds a buffer to the table of open buffers.
*/
protected void addBuffer(IBuffer buffer) {
openBuffers.put(buffer.getOwner(), buffer);
}
/**
* @see IBufferFactory#createBuffer(IOpenable)
*/
public IBuffer createBuffer(IOpenable owner) {
IJavaElement element = (IJavaElement) owner;
IResource resource = element.getResource();
return new Buffer(resource instanceof IFile ? (IFile) resource : null,
owner, element.isReadOnly());
}
/**
* Returns the open buffer associated with the given owner, or
* null
if the owner does not have an open buffer associated
* with it.
*/
public IBuffer getBuffer(IOpenable owner) {
return (IBuffer) openBuffers.get(owner);
}
/**
* Returns the default buffer manager.
*/
public synchronized static BufferManager getDefaultBufferManager() {
if (DEFAULT_BUFFER_MANAGER == null) {
DEFAULT_BUFFER_MANAGER = new BufferManager();
}
return DEFAULT_BUFFER_MANAGER;
}
/**
* Returns the default buffer factory.
*/
public IBufferFactory getDefaultBufferFactory() {
return this;
}
/**
* Returns an enumeration of all open buffers.
*
* The Enumeration
answered is thread safe.
*
* @see OverflowingLRUCache
* @return Enumeration of IBuffer
*/
public Enumeration getOpenBuffers() {
synchronized (openBuffers) {
openBuffers.shrink();
return openBuffers.elements();
}
}
/**
* Removes a buffer from the table of open buffers.
*/
protected void removeBuffer(IBuffer buffer) {
openBuffers.remove(buffer.getOwner());
}
}