// ============================================================================ // // 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.dq.nodes; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.talend.commons.i18n.internal.DefaultMessagesImpl; import org.talend.commons.ui.runtime.image.ECoreImage; import org.talend.commons.ui.runtime.image.IImage; import org.talend.core.model.general.Project; import org.talend.core.model.properties.FolderItem; import org.talend.core.model.properties.FolderType; import org.talend.core.model.properties.Item; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.Folder; import org.talend.core.model.repository.RepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.dataquality.PluginConstant; import org.talend.dq.helper.ProxyRepositoryManager; import org.talend.repository.ProjectManager; import org.talend.repository.model.IRepositoryNode; /** * DOC klliu class global comment. Detailled comment */ public class RecycleBinRepNode extends DQRepositoryNode { private IImage icon; private String label; private static Logger log = Logger.getLogger(RecycleBinRepNode.class); /** * RecyleBinRepNode constructor. * * @param label * @param inWhichProject */ public RecycleBinRepNode(String label, org.talend.core.model.general.Project inWhichProject) { super(null, null, ENodeType.STABLE_SYSTEM_FOLDER, inWhichProject); this.label = label; this.icon = ECoreImage.RECYCLE_BIN_EMPTY_ICON; } /** * Getter for icon. * * @return the icon */ @Override public IImage getIcon() { return this.icon; } /** * Sets the icon. * * @param icon the icon to set */ @Override public void setIcon(IImage icon) { this.icon = icon; } /** * Getter for label. * * @return the label */ @Override public String getLabel() { if (this.label == null) { this.label = DefaultMessagesImpl.getString("RecycleBin.resBinName"); //$NON-NLS-1$ } return this.label; } /** * Sets the label. * * @param label the label to set */ public void setLabel(String label) { this.label = label; } @Override public boolean isBin() { return true; } /* * (non-Javadoc) * * @see org.talend.repository.model.RepositoryNode#getChildren() */ @Override public List<IRepositoryNode> getChildren() { super.getChildren().clear(); if (ProxyRepositoryManager.getInstance().isMergeRefProject()) { java.util.Set<Project> allProjects = ProxyRepositoryManager.getInstance().getAllProjects(); for (Project project : allProjects) { addItemToRecycleBin(project); } } else { addItemToRecycleBin(getProject()); } return filterRecycleBin(super.getChildren()); } /** * DOC msjian Comment method "addItemToRecycleBin". */ private void addItemToRecycleBin(Project project) { List<DQRepositoryNode> foldersList = new ArrayList<DQRepositoryNode>(); List<FolderItem> folderItems = ProjectManager.getInstance().getFolders(project.getEmfProject()); for (FolderItem folderItem : folderItems) { if (isTDQOrMetadataRootFolder(folderItem)) { addItemToRecycleBin(this, folderItem, foldersList, project); } } } /* * (non-Javadoc) * * @see org.talend.repository.model.RepositoryNode#getChildren(boolean) */ @Override public List<IRepositoryNode> getChildren(boolean withDeleted) { // override this method just used to get super getChildren method return super.getChildren(); } public boolean isTDQOrMetadataRootFolder(FolderItem folderItem) { String path = getFullFolderPath(folderItem, PluginConstant.EMPTY_STRING); if (path != null && (path.startsWith("TDQ") || path.startsWith("metadata"))) { //$NON-NLS-1$ //$NON-NLS-2$ return true; } return false; } private String getFullFolderPath(FolderItem folder, String path) { if (folder.getParent() instanceof FolderItem) { return getFullFolderPath((FolderItem) folder.getParent(), folder.getProperty().getLabel() + "/" + path);//$NON-NLS-1$ } return folder.getProperty().getLabel() + "/" + path;//$NON-NLS-1$ } private void addItemToRecycleBin(DQRepositoryNode parentNode, Item item, List<DQRepositoryNode> foldersList, Project project) { ERepositoryObjectType itemType = ERepositoryObjectType.getItemType(item); DQRepositoryNode currentParentNode = parentNode; if (item instanceof FolderItem) { itemType = getFolderContentType((FolderItem) item); EList<Item> childrenList = ((FolderItem) item).getChildren(); if (item.getState() != null && item.getState().isDeleted()) { // need to display this folder in the recycle bin. Folder folder = new Folder(item.getProperty(), itemType); DQRepositoryNode folderNode = null; for (DQRepositoryNode existingFolder : foldersList) { if (existingFolder.getContentType() == null) { // this can appear temporary when another user has deleted a folder break; } if (existingFolder.getContentType().equals(folder.getRepositoryObjectType()) && existingFolder.getProperties(EProperties.LABEL).equals(folder.getLabel())) { folderNode = existingFolder; break; } } if (folderNode == null) { folderNode = new DQRepositoryNode(folder, parentNode, ENodeType.SIMPLE_FOLDER, project); folderNode.setProperties(EProperties.CONTENT_TYPE, itemType); folderNode.setProperties(EProperties.LABEL, folder.getLabel()); foldersList.add(folderNode); parentNode.getChildren(false).add(folderNode); folderNode.setParent(parentNode); } if (childrenList.isEmpty()) { initChildren((FolderItem) item, itemType); } for (Item curItem : new ArrayList<Item>(((FolderItem) item).getChildren())) { addItemToRecycleBin(folderNode, curItem, foldersList, project); } currentParentNode = folderNode; } else { // TDQ-6184,When user A delete an item from FolderItem,user B should initialize(get) all children from // the FolderItem in some cases. if (childrenList.isEmpty()) { initChildren((FolderItem) item, itemType); } for (Item curItem : new ArrayList<Item>(((FolderItem) item).getChildren())) { addItemToRecycleBin(parentNode, curItem, foldersList, project); } } } else if (item.getState() != null && item.getState().isDeleted()) { // try { // IRepositoryViewObject lastVersion = ProxyRepositoryFactory.getInstance().getLastVersion(getProject(), // item.getProperty().getId()); // String version = lastVersion.getVersion(); // if (item.getProperty() .getVersion() .equals(version)) { DQRepositoryNode repNode = new DQRepositoryNode(new RepositoryViewObject(item.getProperty()), currentParentNode, ENodeType.REPOSITORY_ELEMENT, project); repNode.setProperties(EProperties.CONTENT_TYPE, itemType); repNode.setProperties(EProperties.LABEL, item.getProperty().getLabel()); currentParentNode.getChildren(false).add(repNode); repNode.setParent(currentParentNode); // } // } catch (PersistenceException e) { // ExceptionHandler.process(e); // } } } private ERepositoryObjectType getFolderContentType(FolderItem folderItem) { if (!folderItem.getType().equals(FolderType.SYSTEM_FOLDER_LITERAL)) { if (!(folderItem.getParent() instanceof FolderItem)) { return null; // appears only for a folder for expression builder ! } return getFolderContentType((FolderItem) folderItem.getParent()); } for (ERepositoryObjectType objectType : (ERepositoryObjectType[]) ERepositoryObjectType.values()) { String folderName; try { folderName = ERepositoryObjectType.getFolderName(objectType); } catch (Exception e) { // just catch exception to avoid the types who don't have folders continue; } if (folderName.contains("/")) { //$NON-NLS-1$ String[] folders = folderName.split("/"); //$NON-NLS-1$ FolderItem currentFolderItem = folderItem; boolean found = true; for (int i = folders.length - 1; i >= 0; i--) { if (!currentFolderItem.getProperty().getLabel().equals(folders[i])) { found = false; break; } if (i > 0) { if (!(currentFolderItem.getParent() instanceof FolderItem)) { found = false; break; } currentFolderItem = (FolderItem) currentFolderItem.getParent(); } } if (found) { return objectType; } } else { if (folderName.equals(folderItem.getProperty().getLabel())) { return objectType; } } } if (folderItem.getParent() instanceof FolderItem) { return getFolderContentType((FolderItem) folderItem.getParent()); } return null; } /** * * init the children for local/remote FolderItem. * * @param folderItem * @param itemType */ private void initChildren(FolderItem folderItem, ERepositoryObjectType itemType) { if (folderItem.getChildren().isEmpty()) { try { String path = getFullFolderPath(folderItem, PluginConstant.EMPTY_STRING); ProxyRepositoryFactory.getInstance().getTdqRepositoryViewObjects(itemType, path); } catch (Exception e) { log.error(e, e); } } } }