/*******************************************************************************
 * Copyright (c) 2003, 2006 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
 *******************************************************************************/
/*
 * Created on Aug 11, 2004
 */
package org.eclipse.jst.j2ee.internal.war.ui.util;

import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
import org.eclipse.jst.j2ee.common.Listener;
import org.eclipse.jst.j2ee.internal.provider.J2EEItemProvider;
import org.eclipse.jst.j2ee.webapplication.Filter;
import org.eclipse.jst.j2ee.webapplication.Servlet;
import org.eclipse.jst.j2ee.webapplication.WebApp;

/**
 * @author jlanuti
 */
public abstract class WebGroupItemProvider extends J2EEItemProvider {

	class WebGroupComparator implements Comparator {
        public int compare(Object o1, Object o2) {
            if (o1 instanceof Servlet) {
                Servlet s1 = (Servlet)o1;
                Servlet s2 = (Servlet)o2;
                if (s1.getServletName() != null && s2.getServletName() != null)
                	return s1.getServletName().compareTo(s2.getServletName());
                return -1;
            }
            else if (o1 instanceof Filter) {
                Filter f1 = (Filter) o1;
                Filter f2 = (Filter) o2;
                if (f1.getName() != null && f2.getName() != null)
                	return f1.getName().compareTo(f2.getName());
                return -1;
            }
            else if (o1 instanceof Listener) {
                Listener l1 = (Listener) o1;
                Listener l2 = (Listener) o2;
                if (l1.getListenerClassName() != null && l2.getListenerClassName() !=null)
                	return l1.getListenerClassName().compareTo(l2.getListenerClassName());
                return -1;
            }
            else return -1;
        }
	}
    
    protected WeakReference weakWebApp;
    
    public WebGroupItemProvider(AdapterFactory adapterFactory, WeakReference weakWebApp) {
		super(adapterFactory);
		this.weakWebApp = weakWebApp;
	}
    
    public Collection getSortedChildren(List theChildren) {
		Collections.sort(theChildren, new WebGroupComparator());
		return theChildren;
    }

	@Override
	public void dispose() {
		super.dispose();
		weakWebApp = null;
	}
	

	@Override
	public IFile getAssociatedFile() {

		try { 
			WebApp webapp = (WebApp) weakWebApp.get();
			if(webapp != null && webapp.eResource() != null) {
				return WorkbenchResourceHelperBase.getIFile(webapp.eResource().getURI());
			}
		} catch (Throwable t) {
			
		}
		return null;		
	}
}
