// ============================================================================
//
// 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.views.resources;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.navigator.CommonDropAdapter;
import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ResourceTransfer;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.core.model.properties.Property;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.helpers.ReportHelper;
import org.talend.dataquality.reports.TdReport;
import org.talend.dq.factory.ModelElementFileFactory;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.ProxyRepositoryManager;
import org.talend.dq.helper.resourcehelper.AnaResourceFileHelper;
import org.talend.dq.helper.resourcehelper.RepResourceFileHelper;
import org.talend.dq.writer.EMFSharedResources;
import org.talend.resource.EResourceConstant;
import org.talend.resource.ResourceManager;
import org.talend.resource.ResourceService;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* DOC rli class global comment. Detailled comment
*
* @deprecated not used any more
*/
public class ResourceDropAdapterAssistant extends CommonDropAdapterAssistant {
protected static Logger log = Logger.getLogger(ResourceDropAdapterAssistant.class);
private static final IResource[] NO_RESOURCES = new IResource[0];
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop (org.eclipse.ui.navigator.CommonDropAdapter,
* org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
*/
@Override
public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object target) {
// use RepositoryNodeDorpAdapterAssistant to handle drag&drop RepositoryNode.
// alwaysOverwrite = false;
if (aDropAdapter.getCurrentTarget() == null || aDropTargetEvent.data == null) {
return Status.CANCEL_STATUS;
}
// IStatus status = null;
IResource[] resources = null;
TransferData currentTransfer = aDropAdapter.getCurrentTransfer();
if (LocalSelectionTransfer.getTransfer().isSupportedType(currentTransfer)) {
resources = getSelectedResources();
} else if (ResourceTransfer.getInstance().isSupportedType(currentTransfer)) {
resources = (IResource[]) aDropTargetEvent.data;
}
if ((target instanceof IFile)) { // && dropRep
TdReport findReport = RepResourceFileHelper.getInstance().findReport(((IFile) target));
List<Analysis> analyses = ReportHelper.getAnalyses(findReport);
Map<String, Analysis> resourcesMap = new HashMap<String, Analysis>();
for (Analysis ana : analyses) {
String uriString = ana.eResource().getURI().toString();
resourcesMap.put(uriString, ana);
}
if (resources != null && resources.length > 0) {
List<Analysis> anaList = new ArrayList<Analysis>();
for (IResource res : resources) {
Analysis findAnalysis = AnaResourceFileHelper.getInstance().findAnalysis((IFile) res);
if (findAnalysis != null) {
String uriKey = findAnalysis.eResource().getURI().toString();
if (resourcesMap.containsKey(uriKey)) {
findReport.removeAnalysis(resourcesMap.get(uriKey));
}
anaList.add(findAnalysis);
}
}
// ReportHelper.addAnalyses(anaList, findReport);
RepResourceFileHelper.getInstance().save(findReport);
}
} else if (resources != null && (target instanceof IFolder)) { // && dropSql
IFolder folder = (IFolder) target;
// IPath location = folder.getFullPath();
for (IResource res : resources) {
if (res.getType() != IResource.FILE) {
return null;
}
if (folder.equals(res.getParent())) {
continue;
}
String name = res.getName();
IFile fileRes = (IFile) res;
IFile movedIFile = folder.getFile(name);
if (!FactoriesUtil.isEmfFile(fileRes.getFileExtension())) {
try {
fileRes.move(movedIFile.getFullPath(), false, null);
fileRes.getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
folder.refreshLocal(IResource.DEPTH_INFINITE, null);
} catch (CoreException e) {
ExceptionHandler.process(e);
}
return Status.OK_STATUS;
}
IContainer srcParent = fileRes.getParent();
URI srcUri = URI.createPlatformResourceURI((fileRes).getFullPath().toString(), false);
Resource resource = EMFSharedResources.getInstance().getResource(srcUri, true);
if (resource != null) {
URI desUri = URI.createPlatformResourceURI(folder.getFullPath().toString(), false);
EMFSharedResources.getInstance().saveToUri(resource, desUri);
// ADD xqliu 2010-09-21 bug 15685
IFile propertyFile = PropertyHelper.getPropertyFile(fileRes);
if (propertyFile != null) {
IFile movedPropertyFile = folder.getFile(propertyFile.getName());
try {
propertyFile.move(movedPropertyFile.getFullPath(), true, null);
} catch (CoreException e) {
ExceptionHandler.process(e);
}
}
// ~ 15685
}
try {
closeEditorIfOpened(fileRes);
fileRes.delete(true, null);
srcParent.refreshLocal(IResource.DEPTH_INFINITE, null);
folder.refreshLocal(IResource.DEPTH_INFINITE, null);
// ADD xqliu 2010-09-25 bug 15685 update the path of ItemState
Property property = PropertyHelper.getProperty(PropertyHelper.getPropertyFile(movedIFile));
property.getItem().getState().setPath(PropertyHelper.computePath(property));
// ~ 15685
} catch (CoreException e) {
ExceptionHandler.process(e);
}
movedIFile = folder.getFile(name);
}
}
ProxyRepositoryManager.getInstance().save();
CorePlugin.getDefault().refreshDQView();
return null;
}
/**
* DOC bZhou Comment method "closeEditorIfOpened".
*
* @param fileRes
*/
private void closeEditorIfOpened(IFile fileRes) {
IWorkbenchPage activePage = CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editorReferences = activePage.getEditorReferences();
for (IEditorReference reference : editorReferences) {
try {
IEditorInput editorInput = reference.getEditorInput();
if (editorInput instanceof FileEditorInput) {
FileEditorInput fileInput = (FileEditorInput) editorInput;
if (fileRes.getName().equals(fileInput.getFile().getName())) {
activePage.closeEditor(reference.getEditor(false), false);
break;
}
}
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
/**
* Returns the resource selection from the LocalSelectionTransfer.
*
* @return the resource selection from the LocalSelectionTransfer
*/
private IResource[] getSelectedResources() {
ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
if (selection instanceof IStructuredSelection) {
return getSelectedResources((IStructuredSelection) selection);
}
return NO_RESOURCES;
}
/**
* Returns the resource selection from the LocalSelectionTransfer.
*
* @return the resource selection from the LocalSelectionTransfer
*/
@SuppressWarnings("unchecked")
private IResource[] getSelectedResources(IStructuredSelection selection) {
ArrayList selectedResources = new ArrayList();
for (Iterator i = selection.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof IResource) {
selectedResources.add(o);
} else if (o instanceof IAdaptable) {
IAdaptable a = (IAdaptable) o;
IResource r = (IResource) a.getAdapter(IResource.class);
if (r != null) {
selectedResources.add(r);
}
}
}
return (IResource[]) selectedResources.toArray(new IResource[selectedResources.size()]);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int,
* org.eclipse.swt.dnd.TransferData)
*/
@Override
public IStatus validateDrop(Object target, int operation, TransferData transferType) {
if (!(target instanceof IResource)) {
return Status.CANCEL_STATUS;
}
IResource targetRes = (IResource) target;
for (IResource res : getSelectedResources()) {
if (res.getType() == IResource.FILE) {
IFile sourceFile = (IFile) res;
switch (targetRes.getType()) {
case IResource.FOLDER:
IFolder targetFolder = (IFolder) targetRes;
if (allowDND(sourceFile, targetFolder)) {
return Status.OK_STATUS;
}
break;
case IResource.FILE:
IFile targetFile = (IFile) targetRes;
if (FactoriesUtil.isAnalysisFile(sourceFile.getFileExtension())
&& FactoriesUtil.isReportFile(targetFile.getFileExtension())) {
return Status.OK_STATUS;
}
break;
default:
break;
}
}
}
return Status.CANCEL_STATUS;
}
/**
* DOC bZhou Comment method "allowDND".
*
* @param sourceFile
* @param targetFolder
* @return
*/
private boolean allowDND(IFile sourceFile, IFolder targetFolder) {
ModelElement modelElement = ModelElementFileFactory.getModelElement(sourceFile);
EResourceConstant typedConstant = EResourceConstant.getTypedConstant(modelElement);
if (typedConstant != null) {
IFolder oneFolder = ResourceManager.getOneFolder(typedConstant);
return oneFolder == null ? false : ResourceService.isSubFolder(oneFolder, targetFolder);
}
return false;
}
}