// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.core.service;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.ui.navigator.CommonViewer;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.RepositoryObject;
import org.talend.core.model.repository.RepositoryViewObject;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.models.FolderRepositoryObject;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class ContainerCacheService {
/**
*
*/
private static final String DIVIDE = "/"; //$NON-NLS-1$
private static Map<ERepositoryObjectType, Map<String, IRepositoryViewObject>> containerMap = new HashMap<ERepositoryObjectType, Map<String, IRepositoryViewObject>>();
private static Map<String, IRepositoryViewObject> viewObjMap = new HashMap<String, IRepositoryViewObject>();
public static void clearCache() {
viewObjMap.clear();
containerMap.clear();
}
public static void putContainer(IRepositoryViewObject viewObj) {
Item item = viewObj.getProperty().getItem();
if (item instanceof ContainerItem) {
ERepositoryObjectType repObjType = ((ContainerItem) item).getRepObjType();
Map<String, IRepositoryViewObject> map = containerMap.get(repObjType);
if (map == null) {
map = new HashMap<String, IRepositoryViewObject>();
containerMap.put(repObjType, map);
}
//
String path = correctPath(item.getState().getPath());
map.put(path, viewObj);
}
}
public static void put(Property prop, IRepositoryViewObject viewObj) {
if (prop == null || viewObj == null) {
throw new IllegalArgumentException();
}
if (viewObj instanceof RepositoryObject) {
viewObj = new RepositoryViewObject(viewObj.getProperty());
}
viewObjMap.put(prop.getId(), viewObj);
}
public static IRepositoryViewObject put(IRepositoryViewObject viewObj) {
if (viewObj == null) {
throw new IllegalArgumentException();
}
if (viewObj instanceof RepositoryObject) {
viewObj = new RepositoryViewObject(viewObj.getProperty());
}
viewObjMap.put(viewObj.getId(), viewObj);
return viewObj;
}
public static void put(Collection<IRepositoryViewObject> viewObjs) {
for (IRepositoryViewObject viewObj : viewObjs) {
put(viewObj);
}
}
public static void remove(Property prop) {
if (prop != null) {
remove(prop.getId());
}
}
public static void remove(String propId) {
if (propId != null) {
viewObjMap.remove(propId);
}
}
public static void removeContainer(ERepositoryObjectType repObjType, String path) {
Map<String, IRepositoryViewObject> map = containerMap.get(repObjType);
if (map != null) {
for (Iterator<String> il = map.keySet().iterator(); il.hasNext();) {
String next = il.next();
if (next.startsWith(path)) {
IRepositoryViewObject viewObj = map.get(next);
if (viewObj != null && viewObj instanceof FolderRepositoryObject) {
if (viewObj.getChildren() != null) {
for (IRepositoryViewObject child : viewObj.getChildren()) {
remove(child.getProperty());
}
}
}
il.remove();
}
}
}
}
private static String correctPath(String path) {
if (path != null && path.length() > 0) {
if (!path.startsWith(DIVIDE)) {
return DIVIDE + path;
}
}
return path;
}
public static IRepositoryViewObject get(ERepositoryObjectType repObjType, String path) {
Map<String, IRepositoryViewObject> map = containerMap.get(repObjType);
if (map != null) {
path = correctPath(path);
return map.get(path);
}
return null;
}
public static IRepositoryViewObject get(Property prop) {
if (prop == null) {
throw new IllegalArgumentException();
}
return viewObjMap.get(prop.getId());
}
public static IRepositoryViewObject get(String propId) {
if (propId == null) {
throw new IllegalArgumentException();
}
return viewObjMap.get(propId);
}
public static IRepositoryViewObject getParent(IRepositoryViewObject obj) {
ERepositoryObjectType type = obj.getRepositoryObjectType();
Item item = obj.getProperty().getItem();
String path = item.getState().getPath();
if (item instanceof ContainerItem) {
if (path.length() > 1) {
int pos = path.lastIndexOf(DIVIDE);
if (pos >= 0) {
path = path.substring(0, pos);
}
} else {
return null;
}
}
return get(type, path);
}
public static void refreshRepositoryRoot(ERepositoryObjectType type, CommonViewer viewer) {
Object input = viewer.getInput();
if (input != null && input instanceof IRepositoryViewObject[]) {
for (IRepositoryViewObject viewObject : (IRepositoryViewObject[]) input) {
if (refreshRepositoryContainer(viewObject, type, viewer)) {
return;
}
List<IRepositoryViewObject> children = viewObject.getChildren();
if (children != null) {
for (IRepositoryViewObject child : children) {
if (refreshRepositoryContainer(child, type, viewer)) {
return;
}
}
}
}
}
}
public static boolean refreshRepositoryContainer(IRepositoryViewObject viewObj, ERepositoryObjectType type,
CommonViewer viewer) {
if (viewObj instanceof FolderRepositoryObject) {
FolderRepositoryObject containerRepositoryObject = (FolderRepositoryObject) viewObj;
if (containerRepositoryObject.getRepositoryObjectType().equals(type)) {
viewer.refresh(containerRepositoryObject);
return true;
}
}
return false;
}
}