/***********************************************************************
 * 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 java.util.List;

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.J2EEConstants;
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.model.ModelProviderManager;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
import org.eclipse.jst.javaee.core.EjbLocalRef;
import org.eclipse.jst.javaee.core.InjectionTarget;
import org.eclipse.jst.javaee.core.JavaEEObject;
import org.eclipse.jst.javaee.core.Listener;
import org.eclipse.jst.javaee.core.ResourceRef;
import org.eclipse.jst.javaee.core.internal.impl.EjbLocalRefImpl;
import org.eclipse.jst.javaee.core.internal.impl.ResourceRefImpl;
import org.eclipse.jst.javaee.ejb.EJBJar;
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.javaee.web.WebApp;
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.ra.RaGroupContentProvider;
import org.eclipse.jst.jee.ui.internal.navigator.web.WebAppProvider;
import org.eclipse.jst.jee.ui.internal.navigator.web.WebArtifactNode;
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){
			TreePath path = ((TreeSelection) getStructuredSelection()).getPaths()[0];
			IProject project = null;
			
			while (path != null) {
				Object segment = path.getLastSegment();
				if (segment instanceof IProject) {
					project = (IProject) segment;
					break;
				}
				path = path.getParentPath();
			}

			if (project != null) {
				try {
					IType 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(
					PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
					J2EEUIMessages
					.getResourceString("Problems_Opening_Editor_ERROR_"), e.getMessage()); //$NON-NLS-1$ = "Problems Opening Editor"
		}
	}

	protected void openAppropriateEditor(IJavaElement element) {
		if (element == null) {
			return;
		}
		try {
			JavaUI.openInEditor(element);
		} 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();
			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(
					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;
		}
		
		//[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);
			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) {
						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) {
			if(srcObject instanceof EjbLocalRefImpl || srcObject instanceof ResourceRefImpl){
				IResource resource = WorkbenchResourceHelper.getFile((EObject)srcObject);
				if (resource == null)
				{
					openEObject((EObject) srcObject);
					return;
				}
				IProject project = resource.getProject();
		
				if (JavaEEProjectUtilities.isEJBProject(project)) {
					EJBJar ejbJar = (EJBJar)ModelProviderManager.getModelProvider(project).getModelObject(new Path(J2EEConstants.EJBJAR_DD_URI));
					
					if(srcObject instanceof EjbLocalRefImpl){
						openEjbLocalRefNode(resource, ejbJar);
					} else if(srcObject instanceof ResourceRefImpl){
						openResourceRefNode(resource, ejbJar);
					}
				} else if  (JavaEEProjectUtilities.isDynamicWebProject(project)) {
					//check reference type and open via appropriate logic
					if (srcObject instanceof EjbLocalRef) {
						openEjbLocalReferenceNodeInWebProject((EjbLocalRef)srcObject, resource);
					} else if (srcObject instanceof ResourceRef) {
						openResourceReferenceNodeInWebProject((ResourceRef)srcObject, resource);
					}
				} else {
					openEObject((EObject) srcObject);
				}
			} else {			
			    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 WebArtifactNode){ 
 			openEObject((EObject) ((WebArtifactNode)srcObject).getJavaEEObject()); 

		} 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 AbstractGroupProvider){ 
			openEObject((EObject) ((AbstractGroupProvider)srcObject).getJavaEEObject()); 
		} else if (srcObject instanceof Resource)
			openAppropriateEditor(WorkbenchResourceHelper
					.getFile((Resource) srcObject));
	}

	
	private void openResourceReferenceNodeInWebProject(ResourceRef resourceReference,
			IResource resource) {
		String referenceName = resourceReference.getResRefName();
		List<InjectionTarget> injTargets  = resourceReference.getInjectionTargets();
		
		//check where this reference is declared:
		//1. From web.xml - the web.xml should be opened
		//2. From injection in source code - the appropriate source code should be opened
		//3. Both - the web.xml should be opened, as it takes precedence (overwrites) the injection
		if (isTheReferencePartOfWebXmlResourceReferences(referenceName, resource.getProject())) {
			openAppropriateEditor(resource);
		} else {
			if (injTargets != null && injTargets.size() > 0) {
				for (InjectionTarget injection : injTargets) {
					openAppropriateEditor(injection.getInjectionTargetClass());
				}
			}
		}
		
	}

	private void openEjbLocalReferenceNodeInWebProject(EjbLocalRef ejbLocalReference,
			IResource resource) {
		
		
		String referenceName = ejbLocalReference.getEjbRefName();
		List<InjectionTarget> injTargets  = ejbLocalReference.getInjectionTargets();
		
		//check where this reference is declared:
		//1. From web.xml - the web.xml should be opened
		//2. From injection in source code - the appropriate source code should be opened
		//3. Both - the web.xml should be opened, as it takes precedence (overwrites) the injection
		if (isTheReferencePartOfWebXmlEJBReferences(referenceName, resource.getProject())) {
			openAppropriateEditor(resource);
		} else {
			if (injTargets != null && injTargets.size() > 0) {
				for (InjectionTarget injection : injTargets) {
					openAppropriateEditor(injection.getInjectionTargetClass());
				}
			}
		}
		
	}

	/**
	 * Searches for an ejb reference within &lt;ejb-local-ref&gt; tag<br/>
	 * in web.xml for a given web project
	 * @param referenceName reference to be searched for
	 * @param project web project
	 * @return <i>true</i> if a reference has been found , <i>false</i> - if not, or value of null is provided as a reference
	 */
	private boolean isTheReferencePartOfWebXmlEJBReferences(
			String referenceName, IProject project) {
		return (findReferenceInWebXmlEJBReferences(referenceName, project) != null);
	}
	

	/**
	 * Searches for an ejb reference within &lt;ejb-local-ref&gt; tag<br/>
	 * in web.xml for a given web project
	 * @param referenceName reference to be searched for
	 * @param web web project
	 * @return Reference itself if found, null if not
	 */
	private Object findReferenceInWebXmlEJBReferences(String referenceName,
			IProject webProject) {
		
		if (referenceName == null) return null;
		
		WebApp web = getWebAppModelFromProject(webProject);
		
		//iterating over local ejb references
		for (EjbLocalRef localRef : web.getEjbLocalRefs()) {
			if (referenceName.equals(localRef.getEjbRefName())) {
				return localRef;
			}
		}
		
		//no references found
		return null;
	}
	
	/**
	 * Searches for a reference within &lt;resource-ref&gt; tag<br/>
	 * in web.xml for a given web project
	 * @param referenceName reference to be searched for
	 * @param project web project
	 * @return <i>true</i> if a reference has been found , <i>false</i> - if not, or value of null is provided as a reference
	 */
	private boolean isTheReferencePartOfWebXmlResourceReferences(
			String referenceName, IProject project) {
		return (findReferenceInWebXmlResourceReferences(referenceName, project) != null);
	}
	/**
	 * Searches for a reference within &lt;resource-ref&gt; tag<br/>
	 * in web.xml for a given web project
	 * @param referenceName reference to be searched for
	 * @param web web project
	 * @return Reference itself if found, null if not
	 */
	private Object findReferenceInWebXmlResourceReferences(String referenceName,
			IProject webProject) {
		
		if (referenceName == null) return null;
		
		WebApp web = getWebAppModelFromProject(webProject);
		
		//iterating over <resource-ref> references
		for (ResourceRef resourceRef : web.getResourceRefs()) {
			if (referenceName.equals(resourceRef.getResRefName())) {
				return resourceRef;
			}
		}
		
		//no references found
		return null;
	}

	/**
	 * Gets WebApp model from a project
	 * @param project
	 * @return instance of  {@link org.eclipse.jst.javaee.web.WebApp} model
	 * @throws IllegalArgumentException
	 */
	private WebApp getWebAppModelFromProject(IProject webProject) {
		if (!JavaEEProjectUtilities.isDynamicWebProject(webProject)) {
			throw new IllegalArgumentException("Provided project is not a web project"); //$NON-NLS-1$
		}
		return (WebApp) ModelProviderManager.getModelProvider(webProject).getModelObject(new Path(J2EEConstants.WEBAPP_DD_URI));
	}

	private void openResourceRefNode(IResource resource, EJBJar ejbJar) {
		if (ejbJar.getEnterpriseBeans() != null) {
			List<SessionBean> beans = ejbJar.getEnterpriseBeans().getSessionBeans();
			for (SessionBean bean : beans) {
				for (ResourceRef localref : bean.getResourceRefs()) {
					if (localref.getResRefName().equals(((ResourceRef) srcObject).getResRefName())) {
						openAppropriateEditor(resource);
						return;
					}
				}
			}
		}
		if (((ResourceRefImpl) srcObject).eContainer() instanceof SessionBean) {
			openAppropriateEditor(((SessionBean) (((ResourceRefImpl) srcObject).eContainer())).getEjbClass());
			return;
		}
	}

	private void openEjbLocalRefNode(IResource resource, EJBJar ejbJar) {
		if (ejbJar.getEnterpriseBeans() != null) {
			List<SessionBean> beans = ejbJar.getEnterpriseBeans().getSessionBeans();
			for (SessionBean bean : beans) {
				for (EjbLocalRef localref : bean.getEjbLocalRefs()) {
					if (localref.getEjbRefName().equals(((EjbLocalRef) srcObject).getEjbRefName())) {
						openAppropriateEditor(resource);
						return;
					}
				}
			}
		}
		if (((EjbLocalRefImpl) srcObject).eContainer() instanceof SessionBean) {
			openAppropriateEditor(((SessionBean) (((EjbLocalRefImpl) srcObject).eContainer())).getEjbClass());
		    return;
		}
	}

	private void openEObject(EObject _srcObject) {
		EObject ro = _srcObject;
		IResource resource = WorkbenchResourceHelper
		.getFile(_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
	 */
	@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();
		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 GroupEJBProvider) {
			IFile file = WorkbenchResourceHelper.getFile((EObject)((GroupEJBProvider)obj).getEjbJar());
			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{
				currentDescriptor = null;
				return false;
			}
		} else if (obj instanceof RaGroupContentProvider) {
			IFile file = WorkbenchResourceHelper.getFile((EObject) ((AbstractGroupProvider)obj).getJavaEEObject());
			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 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;
	}
}
