blob: ff7a5f27799e8b708708e6742b2d17bbc182b2df [file] [log] [blame]
/***********************************************************************
* 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;
}
}