// ============================================================================
//
// Copyright (C) 2006-2012 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.core.repository.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.keyvalue.MultiKey;
import org.apache.commons.collections.map.MultiKeyMap;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.repository.ICheckDeleteItemReference;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.ItemReferenceBean;
import org.talend.repository.ui.actions.DeleteActionCache;
/**
* DOC ycbai class global comment. Detailled comment
*/
public class RepositoryNodeDeleteManager {
private static RepositoryNodeDeleteManager instance;
public static final String EXTENTION_ID = "org.talend.core.repository.checkDeleteItemReference"; //$NON-NLS-1$
private static final String ATT_CLASS = "class"; //$NON-NLS-1$
private static final String ATT_PRIORITY = "priority"; //$NON-NLS-1$
private static IConfigurationElement[] configurationElements;
private RepositoryNodeDeleteManager() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
configurationElements = registry.getConfigurationElementsFor(EXTENTION_ID);
}
public static synchronized RepositoryNodeDeleteManager getInstance() {
if (instance == null) {
instance = new RepositoryNodeDeleteManager();
}
return instance;
}
static class DeleteCheck {
public final ICheckDeleteItemReference checkDeleteItemReference;
public final Priority priority;
enum Priority {
LOWEST,
LOW,
NORMAL,
HIGH,
HIGHEST
}
public DeleteCheck(ICheckDeleteItemReference checkDeleteItemReference, Priority priority) {
this.checkDeleteItemReference = checkDeleteItemReference;
this.priority = priority;
}
}
public List<ItemReferenceBean> getUnDeleteItems(List<? extends IRepositoryNode> deleteObjs,
DeleteActionCache deleteActionCache) {
return getUnDeleteItems(deleteObjs, deleteActionCache, true);
}
@SuppressWarnings("unchecked")
public List<ItemReferenceBean> getUnDeleteItems(List<? extends IRepositoryNode> deleteNodes,
DeleteActionCache deleteActionCache, boolean updateDelList) {
List<ItemReferenceBean> beans = new ArrayList<ItemReferenceBean>();
Set<ItemReferenceBean> refBeans = new HashSet<ItemReferenceBean>();
List<DeleteCheck> deleteChecks = new ArrayList<DeleteCheck>();
if (deleteNodes == null || deleteNodes.size() == 0) {
return beans;
}
try {
for (IConfigurationElement element : configurationElements) {
ICheckDeleteItemReference checkDeleteItemReference = (ICheckDeleteItemReference) element
.createExecutableExtension(ATT_CLASS);
String priorityStr = element.getAttribute(ATT_PRIORITY);
DeleteCheck.Priority priority = (priorityStr != null && priorityStr.length() > 0) ? DeleteCheck.Priority
.valueOf(priorityStr.toUpperCase()) : DeleteCheck.Priority.NORMAL;
DeleteCheck deleteCheck = new DeleteCheck(checkDeleteItemReference, priority);
if (!deleteChecks.contains(deleteCheck)) {
deleteChecks.add(deleteCheck);
}
}
sortDeleteChecks(deleteChecks);
for (DeleteCheck deleteCheck : deleteChecks) {
refBeans.addAll(deleteCheck.checkDeleteItemReference.getItemReferenceBeans(deleteNodes, deleteActionCache));
}
MultiKeyMap item2beansMap = new MultiKeyMap();
for (ItemReferenceBean refBean : refBeans) {
List<ItemReferenceBean> beansList = (List<ItemReferenceBean>) item2beansMap.get(refBean.getItemName(),
refBean.getItemVersion(), refBean.getItemType());
if (beansList == null) {
beansList = new ArrayList<ItemReferenceBean>();
item2beansMap.put(refBean.getItemName(), refBean.getItemVersion(), refBean.getItemType(), beansList);
}
if (!beansList.contains(refBean)) {
beansList.add(refBean);
}
}
Iterator it = item2beansMap.keySet().iterator();
while (it.hasNext()) {
Object obj = it.next();
if (obj instanceof MultiKey) {
Object[] keys = ((MultiKey) obj).getKeys();
if (keys.length >= 3) {
String itemName = String.valueOf(keys[0]);
String itemVersion = String.valueOf(keys[1]);
ERepositoryObjectType itemType = (ERepositoryObjectType) keys[2];
ItemReferenceBean parentBean = new ItemReferenceBean();
parentBean.setItemName(itemName);
parentBean.setItemVersion(itemVersion);
parentBean.setItemType(itemType);
parentBean.setHost(true);
parentBean.addChildren((List<ItemReferenceBean>) item2beansMap.get(obj));
beans.add(parentBean);
}
}
}
sortReferenceBeans(beans);
if (updateDelList) {
List<String> unDeleteItemNames = new ArrayList<String>();
for (ItemReferenceBean bean : beans) {
unDeleteItemNames.add(bean.getItemName());
}
Iterator<? extends IRepositoryNode> nodeIter = deleteNodes.iterator();
while (nodeIter.hasNext()) {
IRepositoryNode node = nodeIter.next();
Object label = node.getProperties(EProperties.LABEL);
if (unDeleteItemNames.contains(label)) {
nodeIter.remove();
}
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
return beans;
}
private void sortDeleteChecks(List<DeleteCheck> deleteChecks) {
Collections.sort(deleteChecks, new Comparator<DeleteCheck>() {
@Override
public int compare(DeleteCheck check1, DeleteCheck check2) {
return check1.priority.compareTo(check2.priority);
}
});
}
private void sortReferenceBeans(List<ItemReferenceBean> beans) {
Collections.sort(beans, new Comparator<ItemReferenceBean>() {
@Override
public int compare(ItemReferenceBean bean1, ItemReferenceBean bean2) {
int ordinal1 = bean1.getItemType().ordinal();
int ordinal2 = bean2.getItemType().ordinal();
if (ordinal1 > ordinal2) {
return 1;
} else if (ordinal1 < ordinal2) {
return -1;
} else {
return 0;
}
}
});
}
}