/*******************************************************************************
 * Copyright (c) 2003, 2012 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
 * Kaloyan Raev, kaloyan.raev@sap.com
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.web.operations;

import static org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties.INIT_PARAM;
import static org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties.IS_SERVLET_TYPE;
import static org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties.URL_MAPPINGS;
import static org.eclipse.jst.j2ee.internal.web.operations.INewWebClassDataModelProperties.DESCRIPTION;
import static org.eclipse.jst.j2ee.internal.web.operations.INewWebClassDataModelProperties.DISPLAY_NAME;

import java.util.List;

import org.eclipse.jst.j2ee.common.CommonFactory;
import org.eclipse.jst.j2ee.common.Description;
import org.eclipse.jst.j2ee.common.ParamValue;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.common.operations.NewJavaEEArtifactClassOperation;
import org.eclipse.jst.j2ee.webapplication.InitParam;
import org.eclipse.jst.j2ee.webapplication.JSPType;
import org.eclipse.jst.j2ee.webapplication.Servlet;
import org.eclipse.jst.j2ee.webapplication.ServletMapping;
import org.eclipse.jst.j2ee.webapplication.ServletType;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
import org.eclipse.jst.javaee.core.DisplayName;
import org.eclipse.jst.javaee.core.JavaeeFactory;
import org.eclipse.jst.javaee.core.UrlPatternType;
import org.eclipse.jst.javaee.web.IWebCommon;
import org.eclipse.jst.javaee.web.WebFactory;
import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;

/**
 * This class, AddServlet Operation is a IDataModelOperation following the IDataModel wizard and
 * operation framework.
 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
 * 
 * This operation subclasses the ArtifactEditProviderOperation so the changes made to the deployment descriptor
 * models are saved to the artifact edit model.
 * @see org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation
 * 
 * It is the operation which should be used when adding a new servlet to
 * a web app, whether that be an annotated servlet or a non annotated servlet.  This uses the
 * NewServletClassDataModelProvider to retrieve properties set by the user in order to create the custom
 * servet.
 * @see org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider
 * 
 * In the non annotated case, this operation will add the metadata necessary into the web deployment
 * descriptor.  In the annotated case, it will not, it will leave this up to the parsing of the
 * annotations to build the deployment descriptor artifacts.  To actually create the java class for
 * the servlet, the operation uses the NewServletClassOperation. The NewServletClassOperation 
 * shares the same data model provider.
 * @see org.eclipse.jst.j2ee.internal.web.operations.NewServletClassOperation
 * 
 * Clients may subclass this operation to provide their own behaviour on servlet creation.  The execute
 * method can be extended to do so. Also, generateServletMetaData and creteServletClass are exposed.
 * 
 */
public class AddServletOperation extends AddWebClassOperation {
	
	/**
	 * This is the constructor which should be used when creating the operation.
	 * It will not accept null parameter.  It will not return null.
	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
	 * 
	 * @param dataModel 
	 * @return AddServletOperation
	 */
	
	
	public AddServletOperation(IDataModel dataModel) {
		super(dataModel);
	}

	@Override
	protected NewJavaEEArtifactClassOperation getNewClassOperation() {
		return new NewServletClassOperation(getDataModel());
	}
	
	@Override
	protected void generateMetaData(IDataModel model, String qualifiedClassName) {
		boolean isServletType = model.getBooleanProperty(IS_SERVLET_TYPE);
		generateMetaData(model, qualifiedClassName, isServletType);
	}
	
	/**
	 * Subclasses may extend this method to add their own generation steps for the creation of the
	 * metadata for the web deployment descriptor.  This implementation uses the J2EE models to create
	 * the Servlet model instance, any init params specified, and any servlet mappings.  It then adds 
	 * these to the web application model.  This will then be written out to the deployment descriptor
	 * file.  This method does not accept null parameters.
	 * @see Servlet
	 * @see AddServletOperation#createServlet(String, boolean)
	 * @see AddServletOperation#setUpInitParams(List, Servlet)
	 * @see AddServletOperation#setUpURLMappings(List, Servlet)
	 * 
	 * @param aModel
	 * @param qualifiedClassName
	 * @param isServletType
	 */
	protected void generateMetaData(IDataModel aModel, String qualifiedClassName, boolean isServletType) {
		// Set up the servlet modelled object
		Object servlet = createServlet(qualifiedClassName, isServletType);

		// Set up the InitParams if any
		List initParamList = (List) aModel.getProperty(INIT_PARAM);
		if (initParamList != null)
			setUpInitParams(initParamList, servlet);
		
		// Set up the servlet URL mappings if any
		List urlMappingList = (List) aModel.getProperty(URL_MAPPINGS);
		if (urlMappingList != null)
			setUpURLMappings(urlMappingList, servlet);
	}
	
	/**
	 * This method is intended for private use only.  This method is used to create the servlet
	 * modelled object, to set any parameters specified in the data model, and then to add the
	 * servlet instance to the web application model.  This method does not accpet null parameters.
	 * It will not return null.
	 * @see AddServletOperation#generateServletMetaData(NewServletClassDataModel, String, boolean)
	 * @see WebapplicationFactory#createServlet()
	 * @see Servlet
	 * 
	 * @param qualifiedClassName
	 * @param isServletType
	 * @return Servlet instance
	 */
	private Object createServlet(String qualifiedClassName, boolean isServletType) {
		// Get values from data model
		String displayName = model.getStringProperty(DISPLAY_NAME);
		String description = model.getStringProperty(DESCRIPTION);
		
		// Create the servlet instance and set up the parameters from data model
		Object modelObject = provider.getModelObject(WEB_APP_XML_PATH);
		if (modelObject instanceof org.eclipse.jst.j2ee.webapplication.WebApp) {
		
			Servlet servlet = WebapplicationFactory.eINSTANCE.createServlet();
			servlet.setDisplayName(displayName);
			servlet.setServletName(displayName);
			servlet.setDescription(description);
			// Handle servlet case
			if (isServletType) {
				ServletType servletType = WebapplicationFactory.eINSTANCE.createServletType();
				servletType.setClassName(qualifiedClassName);
				servlet.setWebType(servletType);
			} 
			// Handle JSP case
			else {
				JSPType jspType = WebapplicationFactory.eINSTANCE.createJSPType();
				jspType.setJspFile(qualifiedClassName);
				servlet.setWebType(jspType);
			}
			// Add the servlet to the web application model
			
			//WebApp webApp = (WebApp) artifactEdit.getContentModelRoot();
			WebApp webApp = (WebApp) modelObject;
			webApp.getServlets().add(servlet);
			return servlet;
		} else if (modelObject instanceof IWebCommon) {
			
			org.eclipse.jst.javaee.web.Servlet servlet = WebFactory.eINSTANCE.createServlet();

			DisplayName displayNameObj = JavaeeFactory.eINSTANCE.createDisplayName();
			displayNameObj.setValue(displayName);
			servlet.getDisplayNames().add(displayNameObj);
			
			servlet.setServletName(displayName);
			
			org.eclipse.jst.javaee.core.Description descriptionObj = JavaeeFactory.eINSTANCE.createDescription();
			descriptionObj.setValue(description);
			servlet.getDescriptions().add(descriptionObj);
			
			// Handle servlet case
			if (isServletType) {
				servlet.setServletClass(qualifiedClassName);
			} 
			// Handle JSP case
			else {
				servlet.setJspFile(qualifiedClassName);
			}
			// Add the servlet to the web application model
			
			//WebApp webApp = (WebApp) artifactEdit.getContentModelRoot();
			IWebCommon webApp = (IWebCommon) modelObject;
			webApp.getServlets().add(servlet);	
			return servlet;
		}
		// Return the servlet instance
		return null;
	}
	
	/**
	 * This method is intended for internal use only.  This is used to create any init params
	 * for the new servlet metadata.  It will not accept null parameters.  The init params are
	 * set on the servlet modelled object.
	 * @see AddServletOperation#generateServletMetaData(NewServletClassDataModel, String, boolean)
	 * @see WebapplicationFactory#createInitParam()
	 * 
	 * @param initParamList
	 * @param servlet
	 */
	private void setUpInitParams(List initParamList, Object servletObj) {
		// Get the web app instance from the data model
		Object modelObject = provider.getModelObject();
		if (modelObject instanceof org.eclipse.jst.j2ee.webapplication.WebApp) {
			WebApp webApp = (WebApp) modelObject;
			Servlet servlet = (Servlet) servletObj;
			
			// If J2EE 1.4, add the param value and description info instances to the servlet init params
			if (webApp.getJ2EEVersionID() >= J2EEVersionConstants.J2EE_1_4_ID) {
				for (int iP = 0; iP < initParamList.size(); iP++) {
					String[] stringArray = (String[]) initParamList.get(iP);
					// Create 1.4 common param value
					ParamValue param = CommonFactory.eINSTANCE.createParamValue();
					param.setName(stringArray[0]);
					param.setValue(stringArray[1]);
					// Create 1.4 common descripton value
					Description descriptionObj = CommonFactory.eINSTANCE.createDescription();
					descriptionObj.setValue(stringArray[2]);
					// Set the description on the param
					param.getDescriptions().add(descriptionObj);
					param.setDescription(stringArray[2]);
					// Add the param to the servlet model list of init params
					servlet.getInitParams().add(param);
				}
			}
			// If J2EE 1.2 or 1.3, use the servlet specific init param instances
			else {
				for (int iP = 0; iP < initParamList.size(); iP++) {
					String[] stringArray = (String[]) initParamList.get(iP);
					// Create the web init param
					InitParam ip = WebapplicationFactory.eINSTANCE.createInitParam();
					// Set the param name
					ip.setParamName(stringArray[0]);
					// Set the param value
					ip.setParamValue(stringArray[1]);
					// Set the param description
					ip.setDescription(stringArray[2]);
					// Add the init param to the servlet model list of params
					servlet.getParams().add(ip);
				}
			}
		} else if (modelObject instanceof org.eclipse.jst.javaee.web.WebApp) {
			org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servletObj;

			for (int iP = 0; iP < initParamList.size(); iP++) {
				String[] stringArray = (String[]) initParamList.get(iP);
				// Create 1.4 common param value
				org.eclipse.jst.javaee.core.ParamValue param= JavaeeFactory.eINSTANCE.createParamValue();
				param.setParamName(stringArray[0]);
				param.setParamValue(stringArray[1]);

				org.eclipse.jst.javaee.core.Description descriptionObj = JavaeeFactory.eINSTANCE.createDescription();
				descriptionObj.setValue(stringArray[2]);
				// Set the description on the param
				param.getDescriptions().add(descriptionObj);
				// Add the param to the servlet model list of init params
				servlet.getInitParams().add(param);
			}
		}
	}
	
	/**
	 * This method is intended for internal use only.  This method is used to create the servlet
	 * mapping modelled objects so the metadata for the servlet mappings is store in the web
	 * deployment descriptor.  This method will not accept null parameters.  The servlet mappings
	 * are added to the web application modelled object.
	 * @see AddServletOperation#generateServletMetaData(NewServletClassDataModel, String, boolean)
	 * @see WebapplicationFactory#createServletMapping()
	 * 
	 * @param urlMappingList
	 * @param servlet
	 */
	private void setUpURLMappings(List urlMappingList, Object servletObj) {
		// Get the web app modelled object from the data model
		//WebApp webApp = (WebApp) artifactEdit.getContentModelRoot();
		Object modelObject = provider.getModelObject(WEB_APP_XML_PATH);
		// Create the servlet mappings if any
		if (modelObject instanceof org.eclipse.jst.j2ee.webapplication.WebApp) {	
			WebApp webApp = (WebApp) modelObject;
			Servlet servlet = (Servlet) servletObj;
			for (int iM = 0; iM < urlMappingList.size(); iM++) {
				String[] stringArray = (String[]) urlMappingList.get(iM);
				// Create the servlet mapping instance from the web factory
				ServletMapping mapping = WebapplicationFactory.eINSTANCE.createServletMapping();
				// Set the servlet and servlet name
				mapping.setServlet(servlet);
				mapping.setName(servlet.getServletName());
				// Set the URL pattern to map the servlet to
				mapping.setUrlPattern(stringArray[0]);
				// Add the servlet mapping to the web application modelled list
				webApp.getServletMappings().add(mapping);
			}
		} else if (modelObject instanceof IWebCommon) {
			IWebCommon webApp = (IWebCommon) modelObject;
			org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servletObj;
			
			// Create the servlet mappings if any
			if (urlMappingList.size() > 0) {
				// Create the servlet mapping instance from the web factory
				org.eclipse.jst.javaee.web.ServletMapping mapping = WebFactory.eINSTANCE.createServletMapping();

				mapping.setServletName(servlet.getServletName());
				for (int i = 0; i < urlMappingList.size(); i++) {
					String[] stringArray = (String[]) urlMappingList.get(i);
					// Set the URL pattern to map the servlet to
					UrlPatternType url = JavaeeFactory.eINSTANCE.createUrlPatternType();
					url.setValue(stringArray[0]);
					mapping.getUrlPatterns().add(url);
				}
				// Add the servlet mapping to the web application model list
				webApp.getServletMappings().add(mapping);
			}			
		}
	}

}
