// ============================================================================ // // 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.impl.recyclebin; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.talend.commons.exception.PersistenceException; import org.talend.commons.utils.workbench.resources.ResourceUtils; import org.talend.core.model.general.Project; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ItemState; 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.RepositoryViewObject; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.mdm.repository.core.IServerObjectRepositoryType; import org.talend.mdm.repository.core.impl.AbstractContentProvider; import org.talend.mdm.repository.core.service.ContainerCacheService; import org.talend.mdm.repository.models.FolderRepositoryObject; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.repository.ProjectManager; import org.talend.repository.model.IProxyRepositoryFactory; /** * DOC hbhong class global comment. Detailled comment <br/> * */ public class RecycleBinContentProvider extends AbstractContentProvider { private static final String MDM_PREFIX = "MDM"; //$NON-NLS-1$ private static final String JOB_PREFIX = "process"; //$NON-NLS-1$ private static final String DQ_PREFIX = "TDQ_"; //$NON-NLS-1$ private Map<ERepositoryObjectType, Map<String, FolderRepositoryObject>> containerMap = new HashMap<ERepositoryObjectType, Map<String, FolderRepositoryObject>>(); private static final Pattern mdmPattern = Pattern.compile("(MDM/\\w*+)((/(\\w*))+)"); //$NON-NLS-1$ private static final Pattern jobPattern = Pattern.compile("(process)((/(\\w*))+)"); //$NON-NLS-1$ private static final Pattern matchRulePattern = Pattern.compile("(TDQ_Libraries/Rules/Match)((/(\\w*))+)"); //$NON-NLS-1$ private static Logger log = Logger.getLogger(RecycleBinContentProvider.class); IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); private void addToMap(FolderRepositoryObject viewObj, String path) { ERepositoryObjectType repObjType = viewObj.getRepositoryObjectType(); Map<String, FolderRepositoryObject> map = containerMap.get(repObjType); if (map == null) { map = new HashMap<String, FolderRepositoryObject>(); containerMap.put(repObjType, map); } map.put(path, viewObj); } private void buildAllDeletedFolders(FolderRepositoryObject rootViewObj) { Project currentProject = ProjectManager.getInstance().getCurrentProject(); List<String> paths = currentProject.getEmfProject().getDeletedFolders(); String[] deletedFolderPaths = sortFolderPath(paths); containerMap.clear(); rootViewObj.getChildren().clear(); IProject fsProject = null; try { fsProject = ResourceUtils.getProject(currentProject); } catch (PersistenceException e) { log.error(e.getMessage(), e); } for (String path : deletedFolderPaths) { IFolder folder = fsProject.getFolder(path); if (folder != null && folder.getLocation().toFile().exists()) { Matcher matcher = null; if (path.startsWith(MDM_PREFIX)) { matcher = mdmPattern.matcher(path); } else if (path.startsWith(JOB_PREFIX)) { matcher = jobPattern.matcher(path); } else if (path.startsWith(DQ_PREFIX)) { matcher = matchRulePattern.matcher(path); } if (matcher != null && matcher.find()) { String parentFolder = matcher.group(1); String itemPath = matcher.group(2); String folderName = matcher.group(4); ERepositoryObjectType type = RepositoryResourceUtil.getTypeByPath(parentFolder); FolderRepositoryObject parentContainer = getParenContainer(rootViewObj, type, itemPath, true); if (type != null && itemPath != null && folderName != null) { FolderRepositoryObject viewObj = RepositoryResourceUtil.createDeletedFolderViewObject(type, itemPath, folderName, parentContainer); addToMap(viewObj, itemPath); } } } } } private void buildAllDeletedObjects(FolderRepositoryObject rootViewObj) { for (ERepositoryObjectType type : IServerObjectRepositoryType.ALL_TYPES) { try { List<IRepositoryViewObject> viewObjs = factory.getAll(type, true); for (IRepositoryViewObject viewObj : viewObjs) { Property property = viewObj.getProperty(); ItemState state = property.getItem().getState(); if (state.isDeleted()) { String path = state.getPath(); String prefix = "/"; //$NON-NLS-1$ if (!path.startsWith(prefix)) { path = prefix + path; } FolderRepositoryObject container = getParenContainer(rootViewObj, type, path, false); // get from cache IRepositoryViewObject cacheViewObj = ContainerCacheService.get(property); if (cacheViewObj == null) { cacheViewObj = new RepositoryViewObject(property); ContainerCacheService.put(property, cacheViewObj); } container.getChildren().add(cacheViewObj); } } } catch (PersistenceException e) { log.error(e.getMessage(), e); } } } @Override public Object[] getChildren(Object element) { IRepositoryViewObject viewObj = (IRepositoryViewObject) element; ERepositoryObjectType type = viewObj.getRepositoryObjectType(); if (viewObj instanceof FolderRepositoryObject) { FolderRepositoryObject containerObj = (FolderRepositoryObject) viewObj; if (type == IServerObjectRepositoryType.TYPE_RECYCLE_BIN) { buildAllDeletedFolders(containerObj); buildAllDeletedObjects(containerObj); } return containerObj.getChildren().toArray(); } return new Object[0]; } private FolderRepositoryObject getParenContainer(FolderRepositoryObject rootItem, ERepositoryObjectType type, String currentPath, boolean isFolder) { String parentPath = isFolder ? getParentPath(currentPath) : currentPath; if (parentPath != null) { Map<String, FolderRepositoryObject> map = containerMap.get(type); if (map != null) { FolderRepositoryObject item = map.get(parentPath); if (item != null) { return item; } } } return rootItem; } private String getParentPath(String path) { int index = path.lastIndexOf(IPath.SEPARATOR); if (index > 0) { return path.substring(0, index); } return null; } @Override protected List<IRepositoryViewObject> getViewObjFromSystemFolder(Item parentItem) { return null; } public Class<?> getWSObjectClass() { return null; } private String[] sortFolderPath(List folderPaths) { Iterator il = folderPaths.iterator(); List<String> result = new ArrayList<String>(folderPaths.size()); while (il.hasNext()) { String path = (String) il.next(); if (path.startsWith(MDM_PREFIX) || path.startsWith(JOB_PREFIX) || path.startsWith(DQ_PREFIX)) { result.add(path); } } String[] objs = result.toArray(new String[0]); Arrays.sort(objs); return objs; } }