/***********************************************************************
 * 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.web;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.javaee.core.JavaEEObject;
import org.eclipse.jst.javaee.web.WebApp;
import org.eclipse.jst.jee.ui.internal.Messages;
import org.eclipse.jst.jee.ui.internal.navigator.AbstractGroupProvider;
import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
import org.eclipse.jst.jee.ui.plugin.JEEUIPluginIcons;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;

/**
 * Content and Label Provider helper class for WebApp element.
 * 
 * @author Dimitar Giormov
 *
 */
public class WebAppProvider extends AbstractGroupProvider implements IAdaptable {
  
  
	private static final String PROJECT_RELATIVE_PATH = "WEB-INF/web.xml"; //$NON-NLS-1$
	
	
	private GroupErrorPagesItemProvider errors;
	private GroupServletItemProvider servlets;
	private GroupFiltersItemProvider filters;
	private GroupListenerItemProvider listeners;
	private GroupServletMappingItemProvider servletMapping;
	private GroupFilterMappingItemProvider filterMapping;
	private GroupReferenceItemProvider references;
	private GroupWelcomePagesItemProvider welcome;
	private GroupContextParamsItemProvider contextParams;
	
	private List<Object> children = new ArrayList<Object>();
	
	private String text;
	private Image WEB_APP_IMAGE;
	
	private IProject prjct = null;
	private IFile ddFile = null;


  

	
	public WebAppProvider(WebApp webApp, IProject project) {
		super(webApp);
		text = NLS.bind(Messages.DEPLOYMENT_DESCRIPTOR, project.getName());
		contextParams = new GroupContextParamsItemProvider(webApp);
		errors = new GroupErrorPagesItemProvider(webApp);
		servlets = new GroupServletItemProvider(webApp);
		servletMapping = new GroupServletMappingItemProvider(webApp);
		filters = new GroupFiltersItemProvider(webApp);
		filterMapping = new GroupFilterMappingItemProvider(webApp);
		listeners = new GroupListenerItemProvider(webApp);
		references = new GroupReferenceItemProvider(webApp);
		welcome = new GroupWelcomePagesItemProvider(webApp);
		children.add(contextParams);
		children.add(errors);
		children.add(servlets);
		children.add(filters);
		children.add(listeners);
		children.add(servletMapping);
		children.add(filterMapping);
		children.add(references);
		children.add(welcome);
		prjct = project;
	}
	public List getChildren(){
		return children;
	}

	public String getText(){
		return text;
	}
	public Image getImage() {
		if (WEB_APP_IMAGE == null) {
			ImageDescriptor imageWebDescriptor = JEEUIPlugin.getDefault()
			.getImageDescriptor(JEEUIPluginIcons.IMG_WEBEEMODEL);
			WEB_APP_IMAGE = imageWebDescriptor.createImage();
		}
		return WEB_APP_IMAGE;
	}

	public IProject getProject(){
		return prjct;
	}
	public IFile getDDFile() {
		if (ddFile != null){
			return ddFile;
		}

		IVirtualFolder virtualFolder = ComponentCore.createComponent(getProject()).getRootFolder();
		return virtualFolder.getFile(PROJECT_RELATIVE_PATH).getUnderlyingFile();
	}
	
	@Override
	public void reinit(JavaEEObject modelObject) {
		super.reinit(modelObject);
		for (Object child : children) {
			((AbstractGroupProvider)child).reinit(modelObject);
		}
	}
	

	public Object getAdapter(Class adapter) {
		if (IProject.class == adapter){
			return getProject();
		}
		return null;
	}
}
