| /*********************************************************************** |
| * 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.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceChangeEvent; |
| import org.eclipse.core.resources.IResourceChangeListener; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.ISchedulingRule; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.viewers.AbstractTreeViewer; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.StructuredViewer; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jst.j2ee.model.IModelProvider; |
| import org.eclipse.jst.j2ee.model.IModelProviderEvent; |
| import org.eclipse.jst.j2ee.model.IModelProviderListener; |
| import org.eclipse.jst.j2ee.model.ModelProviderManager; |
| import org.eclipse.jst.j2ee.navigator.internal.EMFRootObjectProvider.IRefreshHandlerListener; |
| import org.eclipse.jst.javaee.core.JavaEEObject; |
| 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.jee.ui.plugin.JEEUIPlugin; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Item; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.TreeItem; |
| import org.eclipse.swt.widgets.Widget; |
| import org.eclipse.ui.progress.UIJob; |
| |
| public abstract class JEE5ContentProvider implements ITreeContentProvider, IRefreshHandlerListener, IModelProviderListener, IResourceChangeListener { |
| |
| protected Viewer viewer; |
| protected static final Class IPROJECT_CLASS = IProject.class; |
| |
| protected static Map<IProject, IModelProvider> groupProvidersMap = new HashMap<IProject, IModelProvider>(); |
| |
| protected static Map<IProject, AbstractGroupProvider> groupContentProviders = new HashMap<IProject, AbstractGroupProvider>(); |
| |
| |
| public JEE5ContentProvider() { |
| ResourcesPlugin.getWorkspace().addResourceChangeListener(this); |
| } |
| |
| public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) { |
| viewer = aViewer; |
| } |
| |
| |
| protected IModelProvider getCachedModelProvider(IProject project) { |
| IModelProvider provider = groupProvidersMap.get(project); |
| if (provider == null){ |
| provider = ModelProviderManager.getModelProvider(project); |
| provider.addListener(this); |
| groupProvidersMap.put(project,provider); |
| } |
| return provider; |
| } |
| |
| protected AbstractGroupProvider getCachedContentProvider(IProject project) { |
| AbstractGroupProvider provider = groupContentProviders.get(project); |
| if (provider == null){ |
| provider = getNewContentProviderInstance(project); |
| groupContentProviders.put(project, provider); |
| } else { |
| Object modelObject = ModelProviderManager.getModelProvider(project).getModelObject(); |
| if (provider.getJavaEEObject() != modelObject){ |
| if (modelObject == null){ |
| provider.setValid(false); |
| return provider; |
| } |
| |
| provider.reinit((JavaEEObject)modelObject); |
| } |
| } |
| return provider; |
| } |
| |
| protected abstract AbstractGroupProvider getNewContentProviderInstance(IProject project); |
| |
| |
| public void projectChanged(final IProject project) { |
| try { |
| Runnable refreshThread = new Runnable() { |
| public void run() { |
| if (viewer != null) { |
| try{ |
| if( viewer.getControl() != null && !viewer.getControl().isDisposed() ){ |
| viewer.getControl().setRedraw(false); |
| ISelection sel = ((TreeViewer) viewer).getSelection(); |
| ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer) |
| .getContentProvider()); |
| contentProvider.getChildren(project); |
| |
| Object[] expandedElements = ((TreeViewer) viewer).getExpandedElements(); |
| |
| ((StructuredViewer) viewer).refresh(project); |
| ((TreeViewer) viewer).setSelection(sel); |
| |
| ArrayList<Object> newExpandedElements = new ArrayList<Object>(); |
| |
| ArrayList<Object> allElements = new ArrayList<Object>(); |
| getViewerElements(allElements, ((TreeViewer) viewer).getControl()); |
| |
| Object[] expandedElementsAfterRefresh = ((TreeViewer) viewer).getExpandedElements(); |
| newExpandedElements.addAll(Arrays.asList(expandedElementsAfterRefresh)); |
| for(int i=0;i < expandedElements.length;i++){ |
| boolean expanded = false; |
| for(int j=0;j < expandedElementsAfterRefresh.length; j++){ |
| if(expandedElements[i].equals(expandedElementsAfterRefresh[j])){ |
| expanded = true; |
| } |
| } |
| if(!expanded){ |
| for(Object ob : allElements){ |
| if(ob instanceof SessionBean |
| && expandedElements[i] instanceof SessionBean){ |
| SessionBean bean = (SessionBean) ob; |
| SessionBean bean2 = (SessionBean) expandedElements[i]; |
| if(bean.getEjbName().equals(bean2.getEjbName())){ |
| newExpandedElements.add(ob); |
| } |
| } |
| if(ob instanceof MessageDrivenBean |
| && expandedElements[i] instanceof MessageDrivenBean){ |
| MessageDrivenBean bean = (MessageDrivenBean) ob; |
| MessageDrivenBean bean2 = (MessageDrivenBean) expandedElements[i]; |
| if(bean.getEjbName().equals(bean2.getEjbName())){ |
| newExpandedElements.add(ob); |
| } |
| } |
| if(ob instanceof EntityBean |
| && expandedElements[i] instanceof EntityBean){ |
| EntityBean bean = (EntityBean) ob; |
| EntityBean bean2 = (EntityBean) expandedElements[i]; |
| if(bean.getEjbName().equals(bean2.getEjbName())){ |
| newExpandedElements.add(ob); |
| } |
| } |
| } |
| } |
| } |
| ((TreeViewer) viewer).setExpandedElements(newExpandedElements.toArray()); |
| } |
| |
| }finally{ |
| if( viewer.getControl() != null && !viewer.getControl().isDisposed() ){ |
| viewer.getControl().setRedraw(true); |
| } |
| } |
| } |
| } |
| }; |
| Display.getDefault().asyncExec(refreshThread); |
| } catch (Exception e) |
| { |
| JEEUIPlugin.logError("Error during refresh", e); //$NON-NLS-1$ |
| } |
| } |
| |
| private void getViewerElements(List result, Widget widget) { |
| Item[] items = getChildren(widget); |
| for (int i = 0; i < items.length; i++) { |
| Item item = items[i]; |
| result.add(item.getData()); |
| getViewerElements(result, item); |
| } |
| } |
| |
| protected Item[] getChildren(Widget o) { |
| if (o instanceof TreeItem) { |
| return ((TreeItem) o).getItems(); |
| } |
| if (o instanceof Tree) { |
| return ((Tree) o).getItems(); |
| } |
| return null; |
| } |
| |
| public void modelsChanged(IModelProviderEvent event) { |
| projectChanged(event.getProject()); |
| |
| } |
| |
| public void onRefresh(final Object element) { |
| if (viewer instanceof AbstractTreeViewer) { |
| if (Display.getCurrent() != null) { |
| ((AbstractTreeViewer) viewer).refresh(element, true); |
| } else { |
| /* Create and schedule a UI Job to update the Navigator Content Viewer */ |
| Job job = new UIJob("Update the Navigator Content Viewer Job") { //$NON-NLS-1$ |
| public IStatus runInUIThread(IProgressMonitor monitor) { |
| ((AbstractTreeViewer) viewer).refresh(element, true); |
| return Status.OK_STATUS; |
| } |
| }; |
| ISchedulingRule rule = new ISchedulingRule() { |
| public boolean contains(ISchedulingRule rule) { |
| return rule == this; |
| } |
| public boolean isConflicting(ISchedulingRule rule) { |
| return rule == this; |
| } |
| }; |
| if (rule != null) { |
| job.setRule(rule); |
| } |
| job.schedule(); |
| } |
| } |
| } |
| |
| public void dispose() { |
| groupProvidersMap.clear(); |
| groupContentProviders.clear(); |
| } |
| |
| public void resourceChanged(IResourceChangeEvent event) { |
| if (event.getType() == IResourceChangeEvent.PRE_DELETE && event.getResource() != null && event.getResource().getType() == IResource.PROJECT){ |
| groupContentProviders.remove(event.getResource()); |
| groupProvidersMap.remove(event.getResource()); |
| } |
| |
| } |
| |
| } |