// ============================================================================ // // 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.dataprofiler.core.ui; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.ui.model.WorkbenchContentProvider; import org.talend.commons.emf.FactoriesUtil; import org.talend.dq.helper.resourcehelper.RepResourceFileHelper; import org.talend.dq.writer.EMFSharedResources; import org.talend.resource.ResourceManager; /** * * DOC mzhao class global comment. Detailled comment */ public class ResoureceChangedListener extends WorkbenchContentProvider { private static Logger log = Logger.getLogger(ResoureceChangedListener.class); protected EMFSharedResources util = EMFSharedResources.getInstance(); // private IWorkspace wsp = ResourceManager.getRootProject().getWorkspace(); @Override public void processDelta(final IResourceDelta rootDelta) { final List<IFile> added = new ArrayList<IFile>(); final List<IFile> removed = new ArrayList<IFile>(); // wsp.removeResourceChangeListener(this); IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() { public boolean visit(IResourceDelta delta) { IResource resource = delta.getResource(); if (FactoriesUtil.isEmfFile(resource.getFileExtension())) { if (delta.getKind() == IResourceDelta.ADDED) { added.add((IFile) resource); } if (delta.getKind() == IResourceDelta.REMOVED) { removed.add((IFile) resource); } } return true; } }; try { IResourceDelta docDelta = initFolderForVisitor(rootDelta); if (docDelta == null) { return; } else { docDelta.accept(visitor); } } catch (CoreException e1) { log.error(e1); } List<Runnable> refreshedRannables = new ArrayList<Runnable>(); for (IFile file : removed) { try { refreshedRannables.add(getDeleteRunnable(file)); } catch (Exception e) { log.error(e); } } for (IFile file : added) { Resource resource = null; try { // URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), false); // if (isExist(uri)) { resource = RepResourceFileHelper.getInstance().getFileResource(file); if (resource != null && checkResource(resource)) { refreshedRannables.add(getRefreshRunnable(resource)); } } catch (Exception e) { log.error(e); e.printStackTrace(); } } if (refreshedRannables != null && refreshedRannables.size() > 0) { postEventExecute(refreshedRannables); } // reRegisterListner(); } /** * DOC klliu Comment method "initFolderForVisitor". * * @param rootDelta */ private IResourceDelta initFolderForVisitor(IResourceDelta rootDelta) { IResourceDelta findMember = null; IResourceDelta[] affectedChildren = rootDelta.getAffectedChildren(); for (IResourceDelta child : affectedChildren) { String osString = child.getFullPath().toOSString(); if (!osString.equals("\\.JETEmitters") && !osString.equals("\\.metadata") && !osString.equals("\\.Java")) { IResourceDelta[] folderDeltas = child.getAffectedChildren(); String[] folderNames = { "TDQ_Data Profiling", "connections", "TDQ_Libraries" }; IProject rootProject = ResourceManager.getRootProject(); IFolder folder = null; for (String folderName : folderNames) { for (IResourceDelta folderDelta : folderDeltas) { if (folderDelta.getResource().getName().toString().contains(folderName)) { folder = rootProject.getFolder(folderName); IPath fullPath = folder.getFullPath(); findMember = rootDelta.findMember(fullPath); } } } } } return findMember; } private boolean checkResource(Resource resource) { URI uri = resource.getURI(); if (uri.isFile()) { return new File(uri.toFileString()).exists(); } else { IPath fullPath = new Path(uri.toPlatformString(false)); return ResourceManager.getRoot().getFile(fullPath).exists(); } } // private void reRegisterListner() { // WorkspaceJob cleanJob = new WorkspaceJob("Register resource listener") { // // public boolean belongsTo(Object family) { // return ResourcesPlugin.FAMILY_MANUAL_BUILD.equals(family); // } // // public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { // wsp.addResourceChangeListener(ResoureceChangedListener.this); // return Status.OK_STATUS; // } // }; // cleanJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().buildRule()); // cleanJob.setUser(true); // cleanJob.schedule(); // // } private void postEventExecute(final List<Runnable> refreshedRunnables) { WorkspaceJob cleanJob = new WorkspaceJob("Workspace refresh") { public boolean belongsTo(Object family) { return ResourcesPlugin.FAMILY_MANUAL_BUILD.equals(family); } public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { runUpdates(refreshedRunnables); return Status.OK_STATUS; } }; cleanJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().buildRule()); cleanJob.setUser(true); cleanJob.schedule(); } private void runUpdates(List<Runnable> runnables) { Iterator<Runnable> runnableIterator = runnables.iterator(); while (runnableIterator.hasNext()) { ((Runnable) runnableIterator.next()).run(); } } private Runnable getDeleteRunnable(final IFile file) { return new Runnable() { public void run() { IFile propFile = ResourcesPlugin.getWorkspace().getRoot() .getFile(file.getFullPath().removeFileExtension().addFileExtension(FactoriesUtil.PROPERTIES_EXTENSION)); if (propFile.exists()) { try { propFile.delete(true, new NullProgressMonitor()); } catch (CoreException e) { log.error(e); } } } }; } private Runnable getRefreshRunnable(final Resource resource) { return new Runnable() { public void run() { // do nothing. } }; } }