/*******************************************************************************
 * 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;
	}

}
