package org.eclipse.jst.j2ee.internal.project;

/*
 * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2002 - All Rights Reserved. US
 * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
 * Schedule Contract with IBM Corp.
 */

/*
 * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001 - All Rights Reserved. US
 * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
 * Schedule Contract with IBM Corp.
 */
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;


/**
 * The Web Nature constants are the constants for the web nature interface to the plugins
 * @deprecated
 * Use
 * <p>
 * All nature constants interfaces are also deprecated along with nature runtime classes
 * IModuleConstants need to be used.
 * </p>
 */

public interface IWebNatureConstants {

	public static final String WEB_XML_TEMPLATE_SERVLET_2_2 = "web22.xml"; //$NON-NLS-1$
	public static final String WEB_XML_TEMPLATE_SERVLET_2_3 = "web23.xml"; //$NON-NLS-1$
	public static final String JAVA_SOURCE = "JavaSource"; //$NON-NLS-1$

	String J2EE_NATURE_ID = "org.eclipse.jst.j2ee.web.WebNature"; //$NON-NLS-1$
	String PORTLET_NATURE_ID = "com.ibm.etools.portal.tools.PortletProjectNature"; //$NON-NLS-1$
	String STRUTS_NATURE_ID = "com.ibm.etools.struts.StrutsNature";//$NON-NLS-1$
	String JSF_NATURE_ID = "com.ibm.etools.jsf.JSFNature";//$NON-NLS-1$
	public static final String EDIT_MODEL_ID = "org.eclipse.jst.web.editModel"; //$NON-NLS-1$
	String WEB_SERVICE_EDIT_MODEL_ID = "org.eclipse.jst.webservice.web.editModel"; //$NON-NLS-1$
	String DEFAULT_AUTO_INVOKER_PATH = "servlet"; //$NON-NLS-1$
	String DEFAULT_FILE_PATH = ""; //$NON-NLS-1$

	String EXCEPTION_CLASS_NAME = "java.lang.Exception"; //$NON-NLS-1$

	String FILE_ENABLER_NAME = "File"; //$NON-NLS-1$
	String FILE_ENABLER_DISPLAY_NAME = ProjectSupportResourceHandler.getString("File_Serving_Enabler_7"); //$NON-NLS-1$
	String FILE_ENABLER_CLASS_NAME = "com.ibm.servlet.engine.webapp.SimpleFileServlet"; //$NON-NLS-1$
	String FILE_ENABLER_DESCRIPTION = ProjectSupportResourceHandler.getString("Auto_Generated_-_File_Enabler_9"); //$NON-NLS-1$
	String FILE_ENABLER_MAPPING = "/"; //$NON-NLS-1$

	String DEPLOYMENT_DESCRIPTOR_FILE_NAME = "web.xml"; //$NON-NLS-1$
	String BINDINGS_FILE_NAME = "ibm-web-bnd.xmi"; //$NON-NLS-1$
	String EXTENSIONS_FILE_NAME = "ibm-web-ext.xmi"; //$NON-NLS-1$
	//String WEBSETTINGS_FILE_NAME = ".websettings"; //$NON-NLS-1$
	String WEBSETTINGS_FILE_NAME = ".j2ee"; //$NON-NLS-1$
	String WEBSETTINGS_MIGRATION_FILE_NAME = ".websettings"; //$NON-NLS-1$
	String INFO_DIRECTORY = "WEB-INF"; //$NON-NLS-1$
	String META_INFO_DIRECTORY = "META-INF"; //$NON-NLS-1$
	String CLASSES_DIRECTORY = "classes"; //$NON-NLS-1$
	String LIBRARY_DIRECTORY = "lib"; //$NON-NLS-1$
	String IMPORTED_CLASSES_SUFFIX = "_classes.jar"; //$NON-NLS-1$
	String DATABASES_DIRECTORY = "databases"; //$NON-NLS-1$

	String CSS_DIRECTORY = "theme"; //$NON-NLS-1$
	public static final String DEFAULT_CSS_FILE_NAME = "Master.css"; //$NON-NLS-1$

	// These values must be accessed through IBaseWebNature or IJ2EEWebNature
	String WEB_MODULE_DIRECTORY_V4 = "webApplication";//$NON-NLS-1$
	String WEB_MODULE_DIRECTORY_ = "Web Content";//$NON-NLS-1$
	IPath WEB_MODULE_PATH_V4 = new Path(WEB_MODULE_DIRECTORY_V4);
	IPath WEB_MODULE_PATH_ = new Path(WEB_MODULE_DIRECTORY_);
	IPath WEBINF_PATH_V4 = WEB_MODULE_PATH_V4.append(INFO_DIRECTORY);
	IPath WEBINF_PATH_ = WEB_MODULE_PATH_.append(INFO_DIRECTORY);

	String DEFAULT_DOCUMENT_ROOT = ""; //$NON-NLS-1$

	String GENERATED_WEB_APP_DESCRIPTION = ProjectSupportResourceHandler.getString("Generated_by_Web_Tooling_23"); //$NON-NLS-1$

	// keys for the persistent store
	String SOURCE_FOLDER_KEY = "java-source-folder"; //$NON-NLS-1$
	String CLASS_FOLDER_KEY = "class-folder"; //$NON-NLS-1$
	String META_PATH_KEY = "meta-path"; //$NON-NLS-1$

	String SERVLET_JAR = "servlet.jar"; //$NON-NLS-1$
	String WEBAS_JAR = "ibmwebas.jar"; //$NON-NLS-1$

	//Messages used by the web nature classes
	String NO_NATURE_MESSAGE = ProjectSupportResourceHandler.getString("Not_a_web_project_29"); //$NON-NLS-1$
	String NOT_OPEN_MESSAGE = ProjectSupportResourceHandler.getString("A_web_project_must_be_open_and_must_exist_for_properties_to_be_edited_30"); //$NON-NLS-1$

	String WEBTOOLS_PLUGINDIR_VARIABLE = "WEBTOOLS_PLUGINDIR"; //$NON-NLS-1$

	int J2EE_WEB_PROJECT = 1;
	int PORTLET_WEB_PROJECT = 2;

	java.lang.String STATIC_CONTEXT_ROOT = "/"; //$NON-NLS-1$
	String STATIC_NATURE_ID = "org.eclipse.jst.j2ee.web" + ".StaticWebNature"; //$NON-NLS-1$ //$NON-NLS-2$
	int STATIC_WEB_PROJECT = 0;

}