| /******************************************************************************* |
| * Copyright (c) 2003, 2005 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.provider; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFile; |
| 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.IResourceDelta; |
| import org.eclipse.core.resources.IResourceDeltaVisitor; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.edit.provider.ItemProvider; |
| import org.eclipse.emf.edit.provider.ItemProviderAdapter; |
| import org.eclipse.jem.util.emf.workbench.ProjectUtilities; |
| import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; |
| import org.eclipse.jst.j2ee.application.Application; |
| import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit; |
| import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; |
| import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; |
| import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; |
| import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent; |
| import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities; |
| import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualReference; |
| |
| /** |
| * @author jsholl |
| * |
| * To change this generated comment edit the template variable "typecomment": |
| * Window>Preferences>Java>Templates. To enable and disable the creation of type comments go to |
| * Window>Preferences>Java>Code Generation. |
| */ |
| public class J2EEUtilityJarItemProvider extends J2EEItemProvider { |
| |
| public final static String UTILITY_JARS = J2EEUIMessages.getResourceString("Utility_JARs_UI_"); //$NON-NLS-1$ |
| |
| private boolean childrenLoaded = false; |
| private Application application = null; |
| |
| /** |
| * Constructor for J2EEUtilityJarItemProvider. |
| */ |
| public J2EEUtilityJarItemProvider(Application app, AdapterFactory adapterFactory, Object parent) { |
| super(adapterFactory); |
| setParent(parent); |
| application = app; |
| UtilityJarResourceChangeListener.INSTANCE.addUtilityJarItemProvider(ProjectUtilities.getProject(application), this); |
| } |
| |
| public boolean hasChildren(Object object) { |
| getChildren(object); |
| return !children.isEmpty(); |
| } |
| |
| public Collection getChildren(final Object object) { |
| if (!childrenLoaded) { |
| try { |
| disableNotification(); |
| org.eclipse.swt.custom.BusyIndicator.showWhile(null, new Runnable() { |
| public void run() { |
| computeChildren(); |
| } |
| }); |
| } finally { |
| enableNotification(); |
| } |
| } |
| return children; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.emf.edit.provider.ItemProvider#dispose() |
| */ |
| public void dispose() { |
| super.dispose(); |
| UtilityJarResourceChangeListener.INSTANCE.removeUtilityJarItemProvider(ProjectUtilities.getProject(application), this); |
| |
| } |
| |
| /** |
| * @see ItemProvider#getChildren(Object) |
| */ |
| private void computeChildren() { |
| childrenLoaded = true; |
| IVirtualComponent ear = ComponentUtilities.findComponent(application); |
| if (ear != null) { |
| EARArtifactEdit earEdit = null; |
| try { |
| earEdit = EARArtifactEdit.getEARArtifactEditForRead(ear); |
| IVirtualReference[] modules = earEdit.getUtilityModuleReferences(); |
| for (int i = 0; i < modules.length; i++) { |
| IVirtualComponent module = modules[i].getReferencedComponent(); |
| if (module.isBinary()) { |
| VirtualArchiveComponent virtualArchiveComponent = (VirtualArchiveComponent) module; |
| java.io.File diskFile = virtualArchiveComponent.getUnderlyingDiskFile(); |
| if (diskFile.exists()) |
| children.add(diskFile); |
| else { |
| // we will assume the component name is in synch with the module uri |
| IFile utilityJar = virtualArchiveComponent.getUnderlyingWorkbenchFile(); |
| if (utilityJar != null) |
| children.add(utilityJar); |
| } |
| } else { |
| |
| } |
| if (module.getProject() == null || !module.getProject().isAccessible()) |
| continue; |
| // return only jars for utility components |
| if (J2EEProjectUtilities.isUtilityProject(module.getProject())) { |
| IProject project = ProjectUtilities.getProject(application); |
| if (project == null) |
| continue; |
| // we will assume the component name is in synch with the module uri |
| IFile utilityJar = project.getFile(module.getName() + ".jar"); //$NON-NLS-1$ |
| if (utilityJar != null) |
| children.add(utilityJar); |
| } |
| } |
| } finally { |
| if (earEdit != null) { |
| earEdit.dispose(); |
| } |
| } |
| } |
| } |
| |
| // private Collection getJars(List list, IResource[] members) { |
| // for (int i = 0; i < members.length; i++) { |
| // if (isJarFile(members[i])) { |
| // list.add(members[i]); |
| // } else if (members[i].getType() == IResource.FOLDER) { |
| // try { |
| // getJars(list, ((IFolder) members[i]).members()); |
| // } catch (CoreException e) { |
| // Logger.getLogger().logError(e); |
| // } |
| // } |
| // } |
| // return list; |
| // } |
| |
| public static boolean isJarFile(IResource member) { |
| return member.getType() == IResource.FILE && member.getName().toLowerCase().endsWith(".jar"); //$NON-NLS-1$ |
| } |
| |
| public static boolean isComponentFile(IResource member) { |
| return member.getType() == IResource.FILE && member.getName().toLowerCase().endsWith(IModuleConstants.COMPONENT_FILE_NAME); |
| } |
| |
| |
| /** |
| * @see ItemProviderAdapter#getImage(Object) |
| */ |
| public Object getImage(Object object) { |
| return J2EEPlugin.getPlugin().getImage("folder"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see ItemProviderAdapter#getText(Object) |
| */ |
| public String getText(Object object) { |
| return UTILITY_JARS; |
| } |
| |
| // assume this resource is a jar resource |
| public void utilityJarChanged(IResource resource, IResourceDelta delta) { |
| if (childrenLoaded) { |
| if (delta.getKind() == IResourceDelta.ADDED && !children.contains(resource)) { |
| children.add(resource); |
| } else if (delta.getKind() == IResourceDelta.REMOVED && children.contains(resource)) { |
| children.remove(resource); |
| } |
| } |
| } |
| |
| protected static class UtilityJarResourceChangeListener implements IResourceChangeListener, IResourceDeltaVisitor { |
| |
| protected static final UtilityJarResourceChangeListener INSTANCE = new UtilityJarResourceChangeListener(); |
| |
| private boolean listening = false; |
| private Map earProjectsToUtilityJarProviderMap; |
| |
| public void addUtilityJarItemProvider(IProject project, J2EEUtilityJarItemProvider utilityJarItemProvider) { |
| List providers = getProviders(project); |
| if (providers != null) |
| providers.add(utilityJarItemProvider); |
| if (!listening) { |
| ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); |
| listening = true; |
| } |
| } |
| |
| /** |
| * @param project |
| * @return |
| */ |
| private List getProviders(IProject project) { |
| List result = (List) getEarProjectsToUtilityJarProviderMap().get(project); |
| if (result == null && project != null) |
| getEarProjectsToUtilityJarProviderMap().put(project, (result = new ArrayList())); |
| return result; |
| } |
| |
| /** |
| * @return |
| */ |
| private Map getEarProjectsToUtilityJarProviderMap() { |
| if (earProjectsToUtilityJarProviderMap == null) |
| earProjectsToUtilityJarProviderMap = new HashMap(); |
| return earProjectsToUtilityJarProviderMap; |
| } |
| |
| public void removeUtilityJarItemProvider(IProject project, J2EEUtilityJarItemProvider utilityJarItemProvider) { |
| List providers = getProviders(project); |
| providers.remove(utilityJarItemProvider); |
| if (providers.isEmpty()) |
| getEarProjectsToUtilityJarProviderMap().remove(project); |
| |
| if (getEarProjectsToUtilityJarProviderMap().isEmpty()) { |
| ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); |
| listening = false; |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) |
| */ |
| public void resourceChanged(IResourceChangeEvent event) { |
| try { |
| event.getDelta().accept(this); |
| } catch (CoreException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) |
| */ |
| public boolean visit(IResourceDelta delta) { |
| switch (delta.getResource().getType()) { |
| case IResource.ROOT : |
| case IResource.FOLDER : |
| return true; |
| |
| case IResource.PROJECT : |
| return getEarProjectsToUtilityJarProviderMap().containsKey(delta.getResource()); |
| case IResource.FILE : { |
| IResource resource = delta.getResource(); |
| if (isComponentFile(resource)) { |
| List utilityJarItemProviders = getProviders(resource.getProject()); |
| for (int i = 0; i < utilityJarItemProviders.size(); i++) { |
| ((J2EEUtilityJarItemProvider) utilityJarItemProviders.get(i)).getChildren().clear(); |
| ((J2EEUtilityJarItemProvider) utilityJarItemProviders.get(i)).computeChildren(); |
| } |
| } |
| return false; |
| } |
| |
| } |
| return false; |
| } |
| } |
| |
| public IFile getAssociatedFile() { |
| |
| try { |
| if (application != null && application.eResource() != null) { |
| return WorkbenchResourceHelperBase.getIFile(application.eResource().getURI()); |
| } |
| } catch (Throwable t) { |
| |
| } |
| return null; |
| } |
| |
| } |