package org.plantuml.idea.rendering;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import java.io.File;
import java.util.ArrayDeque;
import java.util.Iterator;
import static org.plantuml.idea.intentions.ReverseArrowIntention.logger;
public class RenderCache {
private ArrayDeque<RenderCacheItem> cacheItems;
private int maxCacheSize;
private RenderCacheItem displayedItem;
public RenderCache(int maxCacheSize) {
cacheItems = new ArrayDeque<RenderCacheItem>(maxCacheSize);
this.maxCacheSize = maxCacheSize;
}
public void setMaxCacheSize(int maxCacheSize) {
this.maxCacheSize = maxCacheSize;
while (cacheItems.size() > maxCacheSize) {
cacheItems.removeFirst();
}
}
public RenderCacheItem getCachedItem(String sourceFilePath, String source, int selectedPage, int zoom, FileEditorManager fileEditorManager, FileDocumentManager fileDocumentManager) {
RenderCacheItem cacheItem = null;
boolean checkCurrentItemSourceEquals = true;
Iterator<RenderCacheItem> iterator = cacheItems.descendingIterator();
//error not cached in ArrayDeque
if (displayedItem != null
&& displayedItem.getRenderResult().hasError()
&& !displayedItem.renderRequired(source, selectedPage, fileEditorManager, fileDocumentManager)) {
logger.debug("returning displayedItem (error=true, requiresRendering=false)");
return displayedItem;
}
while (iterator.hasNext()) {
RenderCacheItem next = iterator.next();
if (next.getSourceFilePath().equals(sourceFilePath) && next.getZoom() == zoom) {
if (cacheItem == null) {
cacheItem = next;
} else {
if (checkCurrentItemSourceEquals && cacheItem.getSource().equals(source)) {
break;
} else if (next.getSource().equals(source)) {
cacheItem = next;
break;
}
checkCurrentItemSourceEquals = false;
}
}
}
return cacheItem;
}
public void addToCache(RenderCacheItem cacheItem) {
if (cacheItems.size() > 0 && cacheItems.size() + 1 > maxCacheSize) {
cacheItems.removeFirst();
}
cacheItems.add(cacheItem);
}
public boolean isDisplayed(RenderCacheItem cachedItem, int page) {
return displayedItem == cachedItem && cachedItem.getRequestedPage() == page;
}
public RenderCacheItem getDisplayedItem() {
return displayedItem;
}
public void setDisplayedItem(RenderCacheItem displayedItem) {
this.displayedItem = displayedItem;
}
public boolean isOlderRequest(RenderCacheItem cachedItem) {
if (displayedItem != null) {
return displayedItem.getVersion() > cachedItem.getVersion();
} else {
return false;
}
}
public static boolean isChanged(FileDocumentManager fileDocumentManager, File file, Long timestamp, Document document) {
return timestamp < file.lastModified() || (document != null && fileDocumentManager.isDocumentUnsaved(document));
}
public void removeFromCache(RenderCacheItem cachedItem) {
logger.debug("force removing from cache " + cachedItem);
cacheItems.remove(cachedItem);
if (displayedItem == cachedItem) {
displayedItem = null;
}
}
public boolean isSameFile(RenderCacheItem cachedItem) {
if (displayedItem != null && cachedItem != null) {
return displayedItem.getSourceFilePath().equals(cachedItem.getSourceFilePath());
}
return false;
}
public void clear() {
cacheItems.clear();
}
}