/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco 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
*
*******************************************************************************/
package com.cisco.yangide.core.buffer;
import java.text.NumberFormat;
import java.util.Enumeration;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import com.cisco.yangide.core.IOpenable;
import com.cisco.yangide.core.model.YangElement;
/**
* @author Konstantin Zaitsev
* @date Jun 24, 2014
*/
public class BufferManager {
protected static BufferManager DEFAULT_BUFFER_MANAGER;
protected static boolean VERBOSE;
/**
* LRU cache of buffers. The key and value for an entry in the table is the identical buffer.
*/
private BufferCache openBuffers = new BufferCache(60);
/**
* Adds a buffer to the table of open buffers.
*/
public void addBuffer(IBuffer buffer) {
if (VERBOSE) {
String owner = ((YangElement) buffer.getOwner()).toStringWithAncestors();
System.out.println("Adding buffer for " + owner); //$NON-NLS-1$
}
synchronized (this.openBuffers) {
this.openBuffers.put(buffer.getOwner(), buffer);
}
// close buffers that were removed from the cache if space was needed
this.openBuffers.closeBuffers();
if (VERBOSE) {
System.out
.println("-> Buffer cache filling ratio = " + NumberFormat.getInstance().format(this.openBuffers.fillingRatio()) + "%"); //$NON-NLS-1$//$NON-NLS-2$
}
}
public static IBuffer createBuffer(IOpenable owner) {
IResource resource = owner.getResource();
return new Buffer(resource instanceof IFile ? (IFile) resource : null, owner, owner.isReadOnly());
}
public static IBuffer createNullBuffer(IOpenable owner) {
IResource resource = owner.getResource();
return new NullBuffer(resource instanceof IFile ? (IFile) resource : null, owner, owner.isReadOnly());
}
/**
* Returns the open buffer associated with the given owner, or <code>null</code> if the owner
* does not have an open buffer associated with it.
*/
public IBuffer getBuffer(IOpenable owner) {
synchronized (this.openBuffers) {
return (IBuffer) this.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 an enumeration of all open buffers.
* <p>
* The <code>Enumeration</code> answered is thread safe.
*
* @see OverflowingLRUCache
* @return Enumeration of IBuffer
*/
public Enumeration<?> getOpenBuffers() {
Enumeration<?> result;
synchronized (this.openBuffers) {
this.openBuffers.shrink();
result = this.openBuffers.elements();
}
// close buffers that were removed from the cache if space was needed
this.openBuffers.closeBuffers();
return result;
}
/**
* Removes a buffer from the table of open buffers.
*/
public void removeBuffer(IBuffer buffer) {
synchronized (this.openBuffers) {
this.openBuffers.remove(buffer.getOwner());
}
// close buffers that were removed from the cache (should be only one)
this.openBuffers.closeBuffers();
}
}