/***********************************************************************
 * 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.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.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 {
  
  
	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 = 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);
		}
	}
}
