package kr.co.apexsoft.stella.modeler.explorer.handler;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import kr.co.apexsoft.stella.modeler.explorer.core.ApexStellaProjectMap;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
import org.eclipse.papyrus.infra.onefile.model.PapyrusModelHelper;
import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
public class ApexResourceDeleteHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
boolean isDeleteOk = MessageDialog.openQuestion(window.getShell(),
"Dialog",
"This deletion will remove resources from your file system and can not be recovered.\nAre you sure you want to delete?");
if ( isDeleteOk ) {
// 모델 간 공유된 자원있을 경우 깨질 수 있으므로 Valiation 후 삭제 가능 여부 알려줌
IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
ISelection aSelection = activePage.getSelection();
if ( aSelection instanceof ITreeSelection ) {
ITreeSelection treeSelection = (ITreeSelection)aSelection;
Iterator it = treeSelection.iterator();
while ( it.hasNext() ) {
Object obj = it.next();
deleteResources(activePage, obj);
}
}
}
return null;
}
/**
* 선택에 따라 삭제 처리
*
* @param activePage
* @param obj
*/
private void deleteResources(IWorkbenchPage activePage, Object obj) {
try {
if ( obj instanceof IProject ) { // 프로젝트를 삭제하는 경우
IProject project = (IProject)obj;
deleteProject(activePage, project);
} else if ( obj instanceof IFile ) { // Model을 삭제하는 경우
IFile file = (IFile)obj;
if(OneFileUtils.isDi(file)) {
deleteDi(activePage, file);
}
}
} catch (CoreException e) {
e.printStackTrace();
}
}
/**
* 해당 프로젝트 하위의 리소스 및 프로젝트래퍼, 물리적 파일 삭제
*
* @param activePage
* @param project
* @throws CoreException
*/
private void deleteProject(IWorkbenchPage activePage, IProject project) throws CoreException {
try {
if (project.isAccessible()) {
IResource[] resources = project.members();
List<IFile> diFiles = new ArrayList<IFile>();
for ( IResource resource : resources ) {
if ( resource instanceof IFile ) {
IFile file = (IFile)resource;
if (OneFileUtils.isDi(file)) {
diFiles.add(file);
}
}
}
for (IFile diFile : diFiles) {
deleteDi(activePage, diFile);
}
}
String projectPath = project.getLocationURI().getPath();
ApexStellaProjectMap.getProjectMap().remove(projectPath);
project.delete(true, true, null);
project = null;
} catch (CoreException e) {
e.printStackTrace();
}
}
/**
* 해당 di 와 관련된 모델, 서비스, 물리적 파일 들 삭제 및 에디터 종료
*
* @param activePage
* @param file
* @throws CoreException
*/
private void deleteDi(IWorkbenchPage activePage, IFile file) throws CoreException {
ApexStellaProjectMap.removeModelServices(file);
// Editor close시 ServicesRegistry 등에 의한 해제됨(CoreMultiDiagramEditor.dispose())
IEditorReference[] editorReferences = activePage.getEditorReferences();
for ( IEditorReference editorReference : editorReferences ) {
// 현재 선택된 editor 인지 확인 후 선택된 editor 닫기
IEditorInput input = editorReference.getEditorInput();
if (input instanceof IFileEditorInput) {
IFile f = ((IFileEditorInput)input).getFile();
if (file.equals(f)) {
activePage.closeEditors(new IEditorReference[] {editorReference}, false);
}
}
}
deleteAssociatedFiles(file);
}
/**
* 해당 di와 파일명이 같은 .notation, .uml 파일 삭제
*
* @param file
* @throws CoreException
*/
private void deleteAssociatedFiles(IFile file) throws CoreException {
IPapyrusFile papyrusFile = PapyrusModelHelper.getPapyrusModelFactory().createIPapyrusFile(file);
IResource[] associatedFiles = papyrusFile.getAssociatedResources();
for ( IResource res : associatedFiles ) {
res.delete(true, null);
}
}
}