org.eclipse.jst.j2ee.internal.actions.OpenJ2EEResourceAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.j2ee.internal.actions.OpenJ2EEResourceAction.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2006 IBM Corporation and others.
 * 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.j2ee.internal.actions;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
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.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
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.jem.java.JavaClass;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
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.ejb.EJBJar;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
import org.eclipse.jst.j2ee.internal.componentcore.ComponentArchiveOptions;
import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
import org.eclipse.jst.j2ee.internal.ejb.provider.J2EEJavaClassProviderHelper;
import org.eclipse.jst.j2ee.internal.plugin.BinaryEditorUtilities;
import org.eclipse.jst.j2ee.internal.plugin.J2EEEditorUtility;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
import org.eclipse.jst.j2ee.webapplication.Servlet;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
import org.eclipse.jst.j2ee.webservice.wsdd.EJBLink;
import org.eclipse.jst.j2ee.webservice.wsdd.ServletLink;
import org.eclipse.jst.jee.archive.IArchive;
import org.eclipse.jst.jee.archive.IArchiveResource;
import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
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.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;

/**
 * Action for opening a J2EE resource from the J2EE navigator.
 */
public class OpenJ2EEResourceAction extends AbstractOpenAction {

    public static final String ID = "org.eclipse.jst.j2ee.internal.internal.ui.actions.OpenJ2EEResourceAction"; //$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 OpenJ2EEResourceAction() {
        super(J2EEUIMessages.getResourceString(J2EEUIMessages.OPEN_J2EE_RESOURCE_ACTION_0));
    }

    /**
     * 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(IVirtualComponent c) {
        if (c == null) {
            return;
        }
        IWorkbenchPage page = null;
        IEditorPart editor = null;
        try {
            page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

            IEditorInput editorInput = null;

            //[Bug 237794] if component c is a JEE 5 archive then editorInput needs to be a BinaryEditorInput
            if (c.isBinary()) {
                JavaEEQuickPeek qp = JavaEEBinaryComponentHelper.getJavaEEQuickPeek(c);
                //[Bug 239440] because Connectors are opened with the basic XML editor and not a specialized editor they need binary editor input
                if (qp.getJavaEEVersion() == JavaEEQuickPeek.JEE_5_0_ID
                        || qp.getJavaEEVersion() == JavaEEQuickPeek.JEE_6_0_ID
                        || qp.getType() == JavaEEQuickPeek.CONNECTOR_TYPE) {
                    String path = ((EObject) srcObject).eResource().getURI().toString();
                    editorInput = BinaryEditorUtilities.getBinaryEditorInput(c, path);
                }
            }

            //this is for all other cases
            if (editorInput == null) {
                editorInput = new ComponentEditorInput(c);
            }

            editor = page.openEditor(editorInput, currentDescriptor.getId());
            if (editor instanceof ISetSelectionTarget)
                ((ISetSelectionTarget) editor).selectReveal(getStructuredSelection());
        } catch (Exception e) {
            MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().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();
            if (currentDescriptor != null) {
                editor = page.openEditor(new FileEditorInput((IFile) r), currentDescriptor.getId());
                if (editor instanceof ISetSelectionTarget)
                    ((ISetSelectionTarget) editor).selectReveal(getStructuredSelection());
            }
        } catch (Exception e) {
            MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                    J2EEUIMessages.getResourceString("Problems_Opening_Editor_ERROR_"), e.getMessage()); //$NON-NLS-1$ = "Problems Opening Editor"
        }
    }

    /**
     * The user has invoked this action
     */
    @Override
    public void run() {
        if (!isEnabled())
            return;

        if (srcObject instanceof J2EEJavaClassProviderHelper) {
            ((J2EEJavaClassProviderHelper) srcObject).openInEditor();
            return;
        }

        if (isEJB3BeanObject(srcObject)) {
            String name = ""; //$NON-NLS-1$
            if (srcObject instanceof org.eclipse.jst.javaee.ejb.SessionBean) {
                org.eclipse.jst.javaee.ejb.SessionBean bean = (org.eclipse.jst.javaee.ejb.SessionBean) srcObject;
                name = bean.getEjbClass();
            } else if (srcObject instanceof org.eclipse.jst.javaee.ejb.MessageDrivenBean) {
                org.eclipse.jst.javaee.ejb.MessageDrivenBean bean = (org.eclipse.jst.javaee.ejb.MessageDrivenBean) srcObject;
                name = bean.getEjbClass();
            } else if (srcObject instanceof org.eclipse.jst.javaee.ejb.EntityBean) {
                org.eclipse.jst.javaee.ejb.EntityBean bean = (org.eclipse.jst.javaee.ejb.EntityBean) srcObject;
                name = bean.getEjbClass();
            }
            openResourceInEditor(name, (EObject) srcObject);
            return;
        }

        if (srcObject instanceof org.eclipse.jst.javaee.web.Servlet) {
            String name = ""; //$NON-NLS-1$
            name = ((org.eclipse.jst.javaee.web.Servlet) srcObject).getServletClass();
            openResourceInEditor(name, (EObject) srcObject);
            return;
        }
        if (srcObject instanceof org.eclipse.jst.javaee.web.Filter) {
            String name = ""; //$NON-NLS-1$
            name = ((org.eclipse.jst.javaee.web.Filter) srcObject).getFilterClass();
            openResourceInEditor(name, (EObject) srcObject);
            return;
        }

        if (srcObject instanceof org.eclipse.jst.javaee.core.Listener) {
            String name = ""; //$NON-NLS-1$
            name = ((org.eclipse.jst.javaee.core.Listener) srcObject).getListenerClass();
            openResourceInEditor(name, (EObject) srcObject);
            return;
        }

        if (srcObject instanceof EObject) {
            EObject ro = (EObject) srcObject;
            IProject p = ProjectUtilities.getProject(ro);

            if (ro instanceof BeanLink) {
                openBeanLinkInJavaEditor((BeanLink) ro, p);
                return;
            }
            IResource resource = WorkbenchResourceHelper.getFile((EObject) srcObject);
            if (resource != null && resource.exists()) {
                openAppropriateEditor(resource);
            } else if (ro.eResource() != null) {
                ModuleFile moduleFile = ArchiveUtil.getModuleFile(ro);
                if (moduleFile != null) {
                    ArchiveOptions options = moduleFile.getOptions();
                    if (options instanceof ComponentArchiveOptions) {
                        IVirtualComponent component = ((ComponentArchiveOptions) options).getComponent();
                        openAppropriateEditor(component);
                    }
                } else {
                    //if can't get a ModuleFile then get the component from the archive
                    IArchive archive = JavaEEArchiveUtilities.findArchive(ro);
                    if (archive != null) {
                        IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive);
                        if (component != null) {
                            openAppropriateEditor(component);
                        }
                    }
                }
            }
        } else if (srcObject instanceof Resource) {
            openAppropriateEditor(WorkbenchResourceHelper.getFile((Resource) srcObject));
        }
    }

    /**
     * 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
     */
    @Override
    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();

        if (obj instanceof J2EEJavaClassProviderHelper) {
            currentDescriptor = getJavaEditorDescriptor();
        } else if (obj instanceof BeanLink) {
            currentDescriptor = getBaseJavaEditorDescriptor();
        } else if (isEJB3BeanObject(obj)) {
            //[241685] if it is a EJB 3 bean the class is specially opened by the run() method
            srcObject = obj;
            return true;
        } else if (obj instanceof org.eclipse.jst.javaee.web.Servlet
                || obj instanceof org.eclipse.jst.javaee.web.Filter
                || obj instanceof org.eclipse.jst.javaee.core.Listener) {
            srcObject = obj;
            return true;
        } else if (obj instanceof EObject) {
            IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
            IFile file = WorkbenchResourceHelper.getFile((EObject) obj);
            if (file != null) {
                if (file.exists()) {
                    IContentType contentType = IDE.getContentType(file);
                    currentDescriptor = registry.getDefaultEditor(file.getName(), contentType);
                } else {
                    currentDescriptor = null;
                    return false;
                }
            } else if (((EObject) obj).eResource() != null) {
                //[Bug 237794] if the file is null then it maybe a binary resource in an archive
                //   attempt to get the resource from the archive and the content type from that
                EObject eObj = (EObject) obj;
                IArchive archive = JavaEEArchiveUtilities.findArchive(eObj);
                if (archive != null) {
                    IPath path = new Path(((EObject) obj).eResource().getURI().toString());
                    if (archive.containsArchiveResource(path)) {
                        InputStream stream = null;
                        try {
                            IArchiveResource resource = archive.getArchiveResource(path);
                            stream = resource.getInputStream();
                            IContentType type = Platform.getContentTypeManager().findContentTypeFor(stream,
                                    path.lastSegment());
                            currentDescriptor = registry.getDefaultEditor(path.lastSegment(), type);
                        } catch (FileNotFoundException e) {
                            J2EEUIPlugin.logError(-1, e.getMessage(), e);
                        } catch (IOException e) {
                            J2EEUIPlugin.logError(-1, e.getMessage(), e);
                        } finally {
                            if (stream != null) {
                                try {
                                    stream.close();
                                } catch (IOException e) {
                                    J2EEUIPlugin.logError(-1, e.getMessage(), e);
                                }
                            }
                        }

                    }
                }
            }
        } 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 {
            currentDescriptor = null;
            return false;
        }
        setAttributesFromDescriptor();
        srcObject = obj;
        return true;
    }

    /**
     * @param link
     */
    private void openBeanLinkInJavaEditor(BeanLink link, IProject p) {
        String linkName = null;
        JavaClass javaClass = null;
        IVirtualComponent comp = ComponentUtilities.findComponent(link);
        // Handle EJB Link case
        if (link instanceof EJBLink) {
            linkName = ((EJBLink) link).getEjbLink();
            EJBArtifactEdit artifactEdit = null;
            try {
                artifactEdit = EJBArtifactEdit.getEJBArtifactEditForRead(comp);
                EJBJar ejbJar = artifactEdit.getEJBJar();
                if (ejbJar == null)
                    return;
                EnterpriseBean bean = ejbJar.getEnterpriseBeanNamed(linkName);
                if (bean == null)
                    return;
                javaClass = bean.getEjbClass();
            } finally {
                if (artifactEdit != null)
                    artifactEdit.dispose();
            }
        }
        // Handle Servlet Link case
        else {
            linkName = ((ServletLink) link).getServletLink();
            WebArtifactEdit artifactEdit = null;
            try {
                artifactEdit = WebArtifactEdit.getWebArtifactEditForRead(comp);
                WebApp webApp = artifactEdit.getWebApp();
                if (webApp == null)
                    return;
                Servlet servlet = webApp.getServletNamed(linkName);
                if (servlet == null)
                    return;
                javaClass = servlet.getServletClass();
            } finally {
                if (artifactEdit != null)
                    artifactEdit.dispose();
            }
        }
        // Open java editor on the selected objects associated java file
        try {
            J2EEEditorUtility.openInEditor(javaClass, p);
        } catch (Exception cantOpen) {
            J2EEUIPlugin.logError(-1, cantOpen.getMessage(), cantOpen);
        }
    }

    protected EObject getRootObject(Object obj) {
        if (obj instanceof EObject) {
            EObject refObj = (EObject) obj;
            while (refObj != null && refObj.eContainer() != null)
                refObj = refObj.eContainer();
            return refObj;
        }
        return null;
    }

    /**
     * Determines if the given object is a EJB 3 Bean
     * [241685] first added
     * 
     * @param obj determine weather this object is an EJB 3 bean or not
     * @return true if obj is a EJB 3 bean, false otherwise
     */
    private boolean isEJB3BeanObject(Object obj) {
        boolean isBean = obj instanceof org.eclipse.jst.javaee.ejb.SessionBean
                || obj instanceof org.eclipse.jst.javaee.ejb.MessageDrivenBean
                || obj instanceof org.eclipse.jst.javaee.ejb.EntityBean;

        return isBean;
    }

    protected void openResourceInEditor(String name, EObject object) {
        IResource resource = WorkbenchResourceHelper.getFile(object);
        if (resource == null)
            return;

        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) {
                    if (!type.isBinary()) {
                        ICompilationUnit cu = type.getCompilationUnit();
                        EditorUtility.openInEditor(cu);
                    } else {
                        IClassFile classFile = type.getClassFile();
                        EditorUtility.openInEditor(classFile);
                    }

                } else {
                    if (resource.exists() && resource.getType() == IResource.FILE) {
                        IFile file = (IFile) resource;
                        IContentType contentType = IDE.getContentType(file);
                        currentDescriptor = PlatformUI.getWorkbench().getEditorRegistry()
                                .getDefaultEditor(file.getName(), contentType);
                    }
                    openAppropriateEditor(resource);
                }
            } catch (JavaModelException e) {
                J2EEUIPlugin.logError(-1, e.getMessage(), e);
            } catch (PartInitException e) {
                J2EEUIPlugin.logError(-1, e.getMessage(), e);
            }

        }
    }
}