/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.vdb.ui.util; import java.util.ArrayList; import java.util.Collection; 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.IProgressMonitor; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.teiid.designer.core.refactor.AbstractRefactorModelHandler; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.core.workspace.WorkspaceResourceFinderUtil; import org.teiid.designer.ui.UiPlugin; import org.teiid.designer.ui.refactor.RefactorResourcesUtils; import org.teiid.designer.vdb.VdbUtil; import org.teiid.designer.vdb.ui.VdbUiConstants; import org.teiid.designer.vdb.ui.editor.VdbEditor; /** * */ public class VdbUiRefactorHandler extends AbstractRefactorModelHandler { @Override public boolean preProcess(RefactorType refactorType, IResource refactoredResource, IProgressMonitor monitor) { if (RefactorResourcesUtils.isClosedProject(refactoredResource)) { /* * By definition, a closed project will not contain any open VDB editors */ return true; } // Find and show affected VDBs final Collection<IFile> allVdbResourcesInProject = WorkspaceResourceFinderUtil.getProjectFileResources(refactoredResource.getProject(), WorkspaceResourceFinderUtil.VDB_RESOURCE_FILTER); Collection<IFile> targetVdbs = new ArrayList<IFile>(); Collection<VdbEditor> openVdbEditors = new ArrayList<VdbEditor>(); for( IFile theVdb : allVdbResourcesInProject ) { if (refactoredResource instanceof IFolder) { IFolder folder = (IFolder) refactoredResource; try { IResource[] members = folder.members(); for (int i = 0; i < members.length; ++i) { preProcess(refactorType, members[i], monitor); } } catch (CoreException ex) { VdbUiConstants.Util.log(ex); return false; } } else if (refactoredResource instanceof IFile) { try { if( VdbUtil.modelInVdb(theVdb, (IFile)refactoredResource) ) { targetVdbs.add(theVdb); VdbEditor vdbEditor = getVdbEditorForFile(theVdb); if( vdbEditor != null ) { openVdbEditors.add(vdbEditor); } } } catch (Exception ex) { VdbUiConstants.Util.log(ex); return false; } } } if( targetVdbs.isEmpty() ) return true; for( VdbEditor editor : openVdbEditors ) { closeVdbEditor(editor); } return true; } /** * Returns a VDB editor given a vdb resource if editor is open * @param vdb the vdb * @return the vdb editor */ public static VdbEditor getVdbEditorForFile(IResource vdb) { if (vdb != null&& vdb.exists()) { IWorkbenchWindow window = UiPlugin.getDefault().getCurrentWorkbenchWindow(); if (window != null) { final IWorkbenchPage page = window.getActivePage(); if (page != null) { // look through the open editors and see if there is one available for this model file. IEditorReference[] editors = page.getEditorReferences(); for (int i = 0; i < editors.length; ++i) { IEditorPart editor = editors[i].getEditor(false); if (editor != null) { IEditorInput input = editor.getEditorInput(); if (input instanceof IFileEditorInput) { if (vdb.equals(((IFileEditorInput)input).getFile()) || vdb.getFullPath().equals(((IFileEditorInput)input).getFile().getFullPath())) { // found it; if (ModelUtil.isVdbArchiveFile(vdb) ) { return (VdbEditor)editor; } break; } } } } } } } return null; } /** * Simple method to close a VDB editor in a safe runnable thread * @param editor */ public static void closeVdbEditor( final VdbEditor editor ) { SafeRunner.run(new SafeRunnable() { @Override public void run() { UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage().closeEditor(editor, true); } @Override public void handleException( Throwable e ) { // Exception has already being logged by Core. Do nothing. } }); } /** * Simple method to close a VDB editor if open * @param vdb */ public static void closeVdbEditor( final IResource vdb ) { VdbEditor editor = getVdbEditorForFile(vdb); if( editor != null ) { closeVdbEditor(editor); } } }