| /*********************************************************************** |
| * Copyright (c) 2008 by SAP AG, Walldorf. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| ***********************************************************************/ |
| package org.eclipse.jst.jee.ui.internal.navigator; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.content.IContentType; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; |
| import org.eclipse.jdt.ui.JavaUI; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.TreePath; |
| import org.eclipse.jface.viewers.TreeSelection; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil; |
| import org.eclipse.jst.j2ee.internal.actions.AbstractOpenAction; |
| import org.eclipse.jst.j2ee.internal.actions.ComponentEditorInput; |
| import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities; |
| import org.eclipse.jst.j2ee.internal.componentcore.ComponentArchiveOptions; |
| import org.eclipse.jst.j2ee.internal.ejb.provider.J2EEJavaClassProviderHelper; |
| import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; |
| import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink; |
| import org.eclipse.jst.javaee.core.JavaEEObject; |
| import org.eclipse.jst.javaee.core.Listener; |
| import org.eclipse.jst.javaee.ejb.EntityBean; |
| import org.eclipse.jst.javaee.ejb.MessageDrivenBean; |
| import org.eclipse.jst.javaee.ejb.SessionBean; |
| import org.eclipse.jst.javaee.web.Filter; |
| import org.eclipse.jst.javaee.web.Servlet; |
| import org.eclipse.jst.jee.archive.IArchive; |
| import org.eclipse.jst.jee.ui.internal.navigator.appclient.GroupAppClientProvider; |
| import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider; |
| import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanInterfaceNode; |
| import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanNode; |
| import org.eclipse.jst.jee.ui.internal.navigator.ejb.GroupEJBProvider; |
| import org.eclipse.jst.jee.ui.internal.navigator.web.WebAppProvider; |
| import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin; |
| import org.eclipse.ui.IEditorDescriptor; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorRegistry; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.ide.IDE; |
| import org.eclipse.ui.part.FileEditorInput; |
| import org.eclipse.ui.part.ISetSelectionTarget; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; |
| import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper; |
| |
| /** |
| * Open Action for Deployment descriptor tree nodes. |
| * |
| * @author Dimitar Giormov |
| * |
| */ |
| public class OpenJEEResourceAction extends AbstractOpenAction { |
| |
| public static final String ID = "com.sap.ide.j2ee.ui.actions.OpenJEEResourceAction"; //$NON-NLS-1$ |
| public static final String JAVA_EDITOR_ID = "org.eclipse.jst.j2ee.internal.internal.ejb.ui.java.EnterpriseBeanJavaEditor"; //$NON-NLS-1$ |
| public static final String BASE_JAVA_EDITOR_ID = "org.eclipse.jdt.ui.CompilationUnitEditor"; //$NON-NLS-1$ |
| |
| protected static IEditorDescriptor javaEditorDescriptor; |
| protected static IEditorDescriptor baseJavaEditorDescriptor; |
| |
| /** |
| * Create an instance of this class |
| */ |
| public OpenJEEResourceAction() { |
| super("Open"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Returns the action ID. |
| */ |
| public String getID() { |
| return ID; |
| } |
| |
| public static IEditorDescriptor getJavaEditorDescriptor() { |
| if (javaEditorDescriptor == null) |
| javaEditorDescriptor = findEditorDescriptor(JAVA_EDITOR_ID); |
| return javaEditorDescriptor; |
| } |
| |
| public static IEditorDescriptor getBaseJavaEditorDescriptor() { |
| if (baseJavaEditorDescriptor == null) |
| baseJavaEditorDescriptor = findEditorDescriptor(BASE_JAVA_EDITOR_ID); |
| return baseJavaEditorDescriptor; |
| } |
| |
| protected void openAppropriateEditor(String c) { |
| if(getStructuredSelection() instanceof TreeSelection){ |
| IProject project = (IProject) ((TreePath)((TreeSelection)getStructuredSelection()).getPaths()[0]).getSegment(0); |
| IType findType; |
| try { |
| findType = JavaCore.create(project).findType(c); |
| if(findType == null){ |
| return; |
| } |
| openAppropriateEditor(findType.getResource()); |
| } catch (JavaModelException e) { |
| JEEUIPlugin.logError("Error during open editor", e); //$NON-NLS-1$ |
| } |
| |
| } |
| |
| } |
| protected void openAppropriateEditor(IVirtualComponent c) { |
| if (c == null) { |
| return; |
| } |
| IWorkbenchPage page = null; |
| IEditorPart editor = null; |
| try { |
| page = PlatformUI.getWorkbench().getActiveWorkbenchWindow() |
| .getActivePage(); |
| editor = page.openEditor(new ComponentEditorInput(c), |
| currentDescriptor.getId()); |
| if (editor instanceof ISetSelectionTarget) |
| ((ISetSelectionTarget) editor) |
| .selectReveal(getStructuredSelection()); |
| } catch (Exception e) { |
| MessageDialog |
| .openError( |
| page.getWorkbenchWindow().getShell(), |
| J2EEUIMessages |
| .getResourceString("Problems_Opening_Editor_ERROR_"), e.getMessage()); //$NON-NLS-1$ = "Problems Opening Editor" |
| } |
| } |
| |
| protected void openAppropriateEditor(IJavaElement element) { |
| if (element == null) { |
| return; |
| } |
| IWorkbenchPage page = null; |
| try { |
| page = PlatformUI.getWorkbench().getActiveWorkbenchWindow() |
| .getActivePage(); |
| JavaUI.openInEditor(element); |
| } catch (Exception e) { |
| MessageDialog |
| .openError( |
| page.getWorkbenchWindow().getShell(), |
| J2EEUIMessages |
| .getResourceString("Problems_Opening_Editor_ERROR_"), e.getMessage()); //$NON-NLS-1$ = "Problems Opening Editor" |
| } |
| } |
| |
| /** |
| * open the appropriate editor |
| */ |
| protected void openAppropriateEditor(IResource r) { |
| if (r == null) |
| return; |
| IWorkbenchPage page = null; |
| IEditorPart editor = null; |
| try { |
| page = PlatformUI.getWorkbench().getActiveWorkbenchWindow() |
| .getActivePage(); |
| String ID = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(r.getLocation() |
| .toPortableString()).getId(); |
| editor = page.openEditor(new FileEditorInput((IFile) r), ID); |
| if (editor instanceof ISetSelectionTarget) |
| ((ISetSelectionTarget) editor) |
| .selectReveal(getStructuredSelection()); |
| } catch (Exception e) { |
| MessageDialog |
| .openError( |
| page.getWorkbenchWindow().getShell(), |
| J2EEUIMessages |
| .getResourceString("Problems_Opening_Editor_ERROR_"), e.getMessage()); //$NON-NLS-1$ = "Problems Opening Editor" |
| } |
| } |
| |
| /** |
| * The user has invoked this action |
| */ |
| public void run() { |
| if (!isEnabled()) |
| return; |
| |
| if (srcObject instanceof J2EEJavaClassProviderHelper) { |
| ((J2EEJavaClassProviderHelper) srcObject).openInEditor(); |
| return; |
| } |
| |
| //[Bug 240512] deal with if any of these node types ndo not have an associated class |
| if (srcObject instanceof SessionBean || |
| srcObject instanceof MessageDrivenBean || |
| srcObject instanceof EntityBean || |
| srcObject instanceof Servlet || |
| srcObject instanceof Filter || |
| srcObject instanceof Listener){ |
| |
| String name = ""; //$NON-NLS-1$ |
| if( srcObject instanceof SessionBean ){ |
| SessionBean bean = (SessionBean)srcObject; |
| name = bean.getEjbClass(); |
| } else if(srcObject instanceof MessageDrivenBean){ |
| MessageDrivenBean bean = (MessageDrivenBean)srcObject; |
| name = bean.getEjbClass(); |
| } else if(srcObject instanceof EntityBean){ |
| EntityBean bean = (EntityBean)srcObject; |
| name = bean.getEjbClass(); |
| } else if(srcObject instanceof Servlet){ |
| Servlet servlet = (Servlet)srcObject; |
| name = servlet.getServletClass(); |
| } else if(srcObject instanceof Filter) { |
| Filter filter = (Filter)srcObject; |
| name = filter.getFilterClass(); |
| } else if(srcObject instanceof Listener){ |
| Listener listener = (Listener)srcObject; |
| name = listener.getListenerClass(); |
| } |
| |
| IResource resource = WorkbenchResourceHelper.getFile((EObject)srcObject); |
| IProject project = resource.getProject(); |
| IJavaProject javaProject = JavaCore.create(project); |
| if(javaProject.exists()){ |
| IType type = null; |
| try { |
| //if name is null then can't get type |
| if(name != null) { |
| type = javaProject.findType( name ); |
| } |
| |
| //if type is null then can't open its editor, so open editor for the resource |
| if(type != null) { |
| ICompilationUnit cu = type.getCompilationUnit(); |
| EditorUtility.openInEditor(cu); |
| } else{ |
| openAppropriateEditor(resource); |
| } |
| } catch (JavaModelException e) { |
| JEEUIPlugin.logError(e.getMessage(), e); |
| } catch (PartInitException e) { |
| JEEUIPlugin.logError(e.getMessage(), e); |
| } |
| } |
| return; |
| } |
| |
| |
| if (srcObject instanceof EObject) { |
| openEObject((EObject) srcObject); |
| } else if (srcObject instanceof BeanInterfaceNode) { |
| openAppropriateEditor(((BeanInterfaceNode) srcObject).get_fqn()); |
| return; |
| } else if (srcObject instanceof BeanNode) { |
| openAppropriateEditor(((BeanNode) srcObject).getEjbClassQualifiedName()); |
| return; |
| |
| } else if (srcObject instanceof WebAppProvider) { |
| IFile file = ((WebAppProvider) srcObject).getDDFile(); |
| if (file.isAccessible()){ |
| openAppropriateEditor(file); |
| return; |
| } |
| } else if (srcObject instanceof GroupEJBProvider) { |
| openEObject((EObject) ((GroupEJBProvider)srcObject).getEjbJar()); |
| } else if (srcObject instanceof GroupEARProvider) { |
| IFile file = ((GroupEARProvider) srcObject).getDDFile(); |
| if (file.isAccessible()){ |
| openAppropriateEditor(file); |
| return; |
| } |
| } |
| else if (srcObject instanceof GroupAppClientProvider) { |
| IFile file = ((GroupAppClientProvider) srcObject).getDDFile(); |
| if (file.isAccessible()){ |
| openAppropriateEditor(file); |
| return; |
| } |
| }else if (srcObject instanceof Resource) |
| openAppropriateEditor(WorkbenchResourceHelper |
| .getFile((Resource) srcObject)); |
| } |
| |
| private void openEObject(EObject _srcObject) { |
| EObject ro = (EObject) _srcObject; |
| IResource resource = WorkbenchResourceHelper |
| .getFile((EObject) _srcObject); |
| if (resource != null) { |
| openAppropriateEditor(resource); |
| } else { |
| ModuleFile moduleFile = ArchiveUtil.getModuleFile(ro); |
| if (moduleFile != null) { |
| ArchiveOptions options = moduleFile.getOptions(); |
| if (options instanceof ComponentArchiveOptions) { |
| IVirtualComponent component = ((ComponentArchiveOptions) options) |
| .getComponent(); |
| openAppropriateEditor(component); |
| } |
| } else { |
| IArchive archive = JavaEEArchiveUtilities.findArchive(ro); |
| if(archive != null){ |
| IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive); |
| if(component != null){ |
| openAppropriateEditor(component); |
| } |
| } |
| } |
| } |
| |
| } |
| |
| /** |
| * The structured selection has changed in the workbench. Subclasses should |
| * override this method to react to the change. Returns true if the action |
| * should be enabled for this selection, and false otherwise. |
| * |
| * When this method is overridden, the super method must always be invoked. |
| * If the super method returns false, this method must also return false. |
| * |
| * @param sel |
| * the new structured selection |
| */ |
| public boolean updateSelection(IStructuredSelection s) { |
| if (!super.updateSelection(s)) |
| return false; |
| |
| // Make sure this is one of the selections we can handle, |
| // then set the source object as is. The run() will do the hard stuff. |
| Object obj = s.getFirstElement(); |
| setText("Open"); //$NON-NLS-1$ |
| |
| if (obj instanceof J2EEJavaClassProviderHelper) |
| currentDescriptor = getJavaEditorDescriptor(); |
| else if (obj instanceof BeanLink) |
| currentDescriptor = getBaseJavaEditorDescriptor(); |
| else if (obj instanceof EObject) { |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| IFile file = WorkbenchResourceHelper.getFile((EObject) obj); |
| if (file != null) { |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| } else { |
| if(((EObject) obj).eResource() != null){ |
| String name = (new Path(((EObject) obj).eResource().getURI() |
| .toString())).lastSegment(); |
| currentDescriptor = registry.getDefaultEditor(name, null); |
| } |
| } |
| } else if (obj instanceof Resource) { |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| IFile file = WorkbenchResourceHelper.getFile((Resource) obj); |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| } else if (obj instanceof GroupEARProvider) { |
| IFile file = ((GroupEARProvider) obj).getDDFile(); |
| if (file.isAccessible()){ |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| }else{ |
| currentDescriptor = null; |
| return false; |
| } |
| } else if (obj instanceof GroupAppClientProvider) { |
| IFile file = ((GroupAppClientProvider) obj).getDDFile(); |
| if (file.isAccessible()){ |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| }else{ |
| currentDescriptor = null; |
| return false; |
| } |
| } else if (obj instanceof WebAppProvider) { |
| IFile file = ((WebAppProvider) obj).getDDFile(); |
| if (file.isAccessible()){ |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| } |
| } else if (obj instanceof BeanNode) { |
| |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| JavaEEObject enterpriseBean = ((BeanNode) obj).getEnterpriseBean(); |
| IFile file = WorkbenchResourceHelper.getFile((EObject)enterpriseBean); |
| if (file != null) { |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| } else { |
| if(((EObject) enterpriseBean).eResource() != null){ |
| String name = (new Path(((EObject) enterpriseBean).eResource().getURI() |
| .toString())).lastSegment(); |
| currentDescriptor = registry.getDefaultEditor(name, null); |
| } |
| } |
| } else if (obj instanceof BeanInterfaceNode) { |
| |
| IEditorRegistry registry = PlatformUI.getWorkbench() |
| .getEditorRegistry(); |
| JavaEEObject beanInterface = (JavaEEObject) ((BeanInterfaceNode) obj).getAdapterNode(); |
| IFile file = WorkbenchResourceHelper.getFile((EObject)beanInterface); |
| if (file != null) { |
| IContentType contentType = IDE.getContentType(file); |
| currentDescriptor = registry.getDefaultEditor(file.getName(), |
| contentType); |
| } else { |
| if(((EObject) beanInterface).eResource() != null){ |
| String name = (new Path(((EObject) beanInterface).eResource().getURI().toString())).lastSegment(); |
| currentDescriptor = registry.getDefaultEditor(name, null); |
| } else { |
| String fqn = ((BeanInterfaceNode) obj).get_fqn(); |
| if (fqn != null){ |
| currentDescriptor = registry.getDefaultEditor(((BeanInterfaceNode) obj).getText(), null); |
| // return true; |
| } else { |
| return false; |
| } |
| |
| } |
| } |
| } |
| setAttributesFromDescriptor(); |
| srcObject = obj; |
| return true; |
| } |
| } |