/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.workspace;
import java.util.HashMap;
import java.util.Map;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.util.OverflowingLRUCache;
/**
* The cache of model elements to their respective info.
*
* @since 8.0
*/
public class ModelWorkspaceCache {
// public static final int PKG_CACHE_SIZE = 500;
public static final int OPENABLE_CACHE_SIZE = 2000;
/**
* Active ModelWorkspace
*/
protected ModelWorkspaceInfo workspaceInfo;
/**
* Cache of open projects and package fragment roots.
*/
protected Map<ModelWorkspaceItem, ModelWorkspaceItemInfo> projectAndRootCache;
/**
* Cache of open compilation unit and class files
*/
protected OverflowingLRUCache<ModelWorkspaceItem, ModelWorkspaceItemInfo> openableCache;
/**
* Cache of open children of openable ModelWorkspaceItem instances
*/
protected Map<ModelWorkspaceItem, ModelWorkspaceItemInfo> childrenCache;
public ModelWorkspaceCache() {
this.projectAndRootCache = new HashMap(50);
// this.pkgCache = new HashMap(PKG_CACHE_SIZE);
this.openableCache = new ModelWorkspaceItemCache(OPENABLE_CACHE_SIZE);
this.childrenCache = new HashMap<ModelWorkspaceItem, ModelWorkspaceItemInfo>(OPENABLE_CACHE_SIZE*20); // average 20 chilren per openable
}
public int pkgSize() {
return 0;
// return this.pkgCache.size();
}
/**
* Returns the info for the element.
* @param item
* @return item info
*/
public ModelWorkspaceItemInfo getInfo(ModelWorkspaceItem item) {
CoreArgCheck.isNotNull(item);
switch (item.getItemType()) {
case ModelWorkspaceItem.MODEL_WORKSPACE:
return this.workspaceInfo;
case ModelWorkspaceItem.MODEL_PROJECT:
case ModelWorkspaceItem.MODEL_FOLDER:
return this.projectAndRootCache.get(item);
case ModelWorkspaceItem.MODEL_RESOURCE:
return this.openableCache.get(item);
default:
return this.childrenCache.get(item);
}
}
/**
* Returns the info for this element without
* disturbing the cache ordering.
*/
protected Object peekAtInfo(ModelWorkspaceItem item) {
CoreArgCheck.isNotNull(item);
switch (item.getItemType()) {
case ModelWorkspaceItem.MODEL_WORKSPACE:
return this.workspaceInfo;
case ModelWorkspaceItem.MODEL_PROJECT:
case ModelWorkspaceItem.MODEL_FOLDER:
return this.projectAndRootCache.get(item);
// case ModelWorkspaceItem.MODEL_PACKAGE_FRAGMENT:
// return this.pkgCache.get(item);
case ModelWorkspaceItem.MODEL_RESOURCE:
return this.openableCache.get(item);
default:
return this.childrenCache.get(item);
}
}
/**
* Remember the info for the element.
*/
protected void putInfo(ModelWorkspaceItem item, ModelWorkspaceItemInfo info) {
CoreArgCheck.isNotNull(item);
CoreArgCheck.isNotNull(info);
switch (item.getItemType()) {
case ModelWorkspaceItem.MODEL_WORKSPACE:
this.workspaceInfo = (ModelWorkspaceInfo) info;
break;
case ModelWorkspaceItem.MODEL_PROJECT:
case ModelWorkspaceItem.MODEL_FOLDER:
this.projectAndRootCache.put(item, info);
break;
case ModelWorkspaceItem.MODEL_RESOURCE:
this.openableCache.put(item,info);
break;
default:
this.childrenCache.put(item, info);
}
}
/**
* Removes the info of the element from the cache.
*/
protected void removeInfo(ModelWorkspaceItem item) {
CoreArgCheck.isNotNull(item);
switch (item.getItemType()) {
case ModelWorkspaceItem.MODEL_WORKSPACE:
this.workspaceInfo = null;
break;
case ModelWorkspaceItem.MODEL_PROJECT:
case ModelWorkspaceItem.MODEL_FOLDER:
this.projectAndRootCache.remove(item);
break;
// case ModelWorkspaceItem.MODEL_PACKAGE_FRAGMENT:
// this.pkgCache.remove(item);
// break;
case ModelWorkspaceItem.MODEL_RESOURCE:
this.openableCache.remove(item);
break;
default:
this.childrenCache.remove(item);
}
}
public void clear(){
childrenCache.clear();
openableCache.clear();
projectAndRootCache.clear();
workspaceInfo = null;
}
}