/*******************************************************************************
 * Copyright (c) 2007 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
 *******************************************************************************/
package org.eclipse.jst.javaee.ejb;

import java.util.List;

import org.eclipse.jst.javaee.core.Description;
import org.eclipse.jst.javaee.core.JavaEEObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Method Type</b></em>'.
 * <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * 
 *         [
 *         The methodType is used to denote a method of an enterprise
 *         bean.  The method may be any of the following or a set of
 *         any of the following methods may be designated:
 *         business interface method
 *         home interface method
 *         component interface method
 *         web service endpoint interface method
 *         no-interface view method
 *         singleton session bean lifecycle callback method
 *         stateful session bean lifecycle callback method (see 
 *         limitations)
 *         timeout callback method
 *         message-driven bean message listener method
 *         
 *         The ejb-name element must be the name of one of the enterprise 
 *         beans declared in the deployment descriptor.
 *         The optional method-intf element allows distinguishing between a
 *         method with the same signature that is multiply defined
 *         across any of the above.
 *         The method-name element specifies the method name.
 *         The optional method-params elements identify a single method 
 *         among multiple methods with an overloaded method name.
 *         
 *         There are three possible styles of using methodType element
 *         within a method element:
 *         
 *         1.
 *         <method>
 *         <ejb-name>EJBNAME</ejb-name>
 *         <method-name>*</method-name>
 *         </method>
 *         
 *         This style is used to refer to all of the following methods 
 *         of the specified enterprise bean:
 *         business interface methods
 *         home interface methods
 *         component interface methods
 *         web service endpoint interface methods
 *         no-interface view methods
 *         singleton session bean lifecycle callback methods
 *         timeout callback methods
 *         message-driven bean message listener method
 *         
 *         This style may also be used in combination with the 
 *         method-intf element that contains LifecycleCallback as 
 *         the value to specify transaction attributes of a stateful 
 *         session bean PostConstruct, PreDestroy, PrePassivate, 
 *         and PostActivate lifecycle callback methods or to override 
 *         transaction attributes of a singleton session bean 
 *         PostConstruct and PreDestroy lifecycle callback methods.
 *         
 *         2.
 *         <method>
 *         <ejb-name>EJBNAME</ejb-name>
 *         <method-name>METHOD</method-name>
 *         </method>
 *         
 *         This style is used to refer to the specified method of
 *         the specified enterprise bean. If there are multiple
 *         methods with the same overloaded name, the element of
 *         this style refers to all the methods with the overloaded
 *         name.
 *         
 *         This style may be used to refer to stateful session bean
 *         PostConstruct, PreDestroy, PrePassivate, and PostActivate 
 *         lifecycle callback methods to specify their transaction
 *         attributes if any of the following is true:
 *         there is only one method with this name in the specified 
 *         enterprise bean
 *         all overloaded methods with this name in the specified 
 *         enterprise bean are lifecycle callback methods
 *         method-intf element is specified and it contains 
 *         LifecycleCallback as the value 
 *         
 *         3.
 *         <method>
 *         <ejb-name>EJBNAME</ejb-name>
 *         <method-name>METHOD</method-name>
 *         <method-params>
 *         	  <method-param>PARAM-1</method-param>
 *         	  <method-param>PARAM-2</method-param>
 *         	  ...
 *         	  <method-param>PARAM-n</method-param>
 *         </method-params>
 *         </method>
 *         
 *         This style is used to refer to a single method within a
 *         set of methods with an overloaded name. PARAM-1 through
 *         PARAM-n are the fully-qualified Java types of the
 *         method's input parameters (if the method has no input
 *         arguments, the method-params element contains no
 *         method-param elements). Arrays are specified by the
 *         array element's type, followed by one or more pair of
 *         square brackets (e.g. int[][]). 
 *         If a method with the same name and signature is defined 
 *         on more than one interface of an enterprise bean, this 
 *         style refers to all those methods. 
 *         
 *         Examples:
 *         
 *         Style 1: The following method element refers to all of the
 *         following methods of the EmployeeService bean:
 *         no interface view methods
 *         business interface methods   
 *         home interface methods   
 *         component business interface methods   
 *         singleton session bean lifecycle callback methods, if any
 *         timeout callback methods
 *         web service endpoint interface methods
 *         message-driven bean message listener methods (if the bean
 *         a message-driven bean)
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-name>*</method-name>
 *         </method>
 *         
 *         Style 2: The following method element refers to all the
 *         create methods of the EmployeeService bean's home
 *         interface(s).
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-name>create</method-name>
 *         </method>
 *         
 *         Style 3: The following method element refers to the
 *         create(String firstName, String LastName) method of the
 *         EmployeeService bean's home interface(s).
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-name>create</method-name>
 *         <method-params>
 *         	  <method-param>java.lang.String</method-param>
 *         	  <method-param>java.lang.String</method-param>
 *         </method-params>
 *         </method>
 *         
 *         The following example illustrates a Style 3 element with
 *         more complex parameter types. The method 
 *         foobar(char s, int i, int[] iar, mypackage.MyClass mycl, 
 *         mypackage.MyClass[][] myclaar) would be specified as:
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-name>foobar</method-name>
 *         <method-params>
 *         	  <method-param>char</method-param>
 *         	  <method-param>int</method-param>
 *         	  <method-param>int[]</method-param>
 *         	  <method-param>mypackage.MyClass</method-param>
 *         	  <method-param>mypackage.MyClass[][]</method-param>
 *         </method-params>
 *         </method>
 *         
 *         The optional method-intf element can be used when it becomes
 *         necessary to differentiate between a method that is defined
 *         multiple times with the same name and signature across any
 *         of the following methods of an enterprise bean:
 *         business interface methods
 *         home interface methods
 *         component interface methods
 *         web service endpoint methods
 *         no-interface view methods
 *         singleton or stateful session bean lifecycle callback methods
 *         timeout callback methods
 *         message-driven bean message listener methods
 *         
 *         However, if the same method is a method of both the local 
 *         business interface, and the local component interface, 
 *         the same attribute applies to the method for both interfaces.
 *         Likewise, if the same method is a method of both the remote 
 *         business interface and the remote component interface, the same
 *         attribute applies to the method for both interfaces.
 *         
 *         For example, the method element
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-intf>Remote</method-intf>
 *         <method-name>create</method-name>
 *         <method-params>
 *         	  <method-param>java.lang.String</method-param>
 *         	  <method-param>java.lang.String</method-param>
 *         </method-params>
 *         </method>
 *         
 *         can be used to differentiate the create(String, String)
 *         method defined in the remote interface from the
 *         create(String, String) method defined in the remote home
 *         interface, which would be defined as
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-intf>Home</method-intf>
 *         <method-name>create</method-name>
 *         <method-params>
 *         	  <method-param>java.lang.String</method-param>
 *         	  <method-param>java.lang.String</method-param>
 *         </method-params>
 *         </method>
 *         
 *         and the create method that is defined in the local home
 *         interface which would be defined as
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-intf>LocalHome</method-intf>
 *         <method-name>create</method-name>
 *         <method-params>
 *         	  <method-param>java.lang.String</method-param>
 *         	  <method-param>java.lang.String</method-param>
 *         </method-params>
 *         </method>
 *         
 *         The method-intf element can be used with all three Styles
 *         of the method element usage. For example, the following
 *         method element example could be used to refer to all the
 *         methods of the EmployeeService bean's remote home interface
 *         and the remote business interface.
 *         
 *         <method>
 *         <ejb-name>EmployeeService</ejb-name>
 *         <method-intf>Home</method-intf>
 *         <method-name>*</method-name>
 *         </method>
 *         
 * 
 *         @since Java EE 5, EJB 3.0
 *       
 * <!-- end-model-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getDescriptions <em>Descriptions</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getEjbName <em>Ejb Name</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodIntf <em>Method Intf</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodName <em>Method Name</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodParams <em>Method Params</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.MethodType#getId <em>Id</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType()
 * @extends JavaEEObject
 * @generated
 */
public interface MethodType extends JavaEEObject {
	/**
	 * Returns the value of the '<em><b>Descriptions</b></em>' containment reference list.
	 * The list contents are of type {@link org.eclipse.jst.javaee.core.Description}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Descriptions</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Descriptions</em>' containment reference list.
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_Descriptions()
	 * @generated
	 */
	List<Description> getDescriptions();

	/**
	 * Returns the value of the '<em><b>Ejb Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Ejb Name</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Ejb Name</em>' attribute.
	 * @see #setEjbName(String)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_EjbName()
	 * @generated
	 */
	String getEjbName();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getEjbName <em>Ejb Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Ejb Name</em>' attribute.
	 * @see #getEjbName()
	 * @generated
	 */
	void setEjbName(String value);

	/**
	 * Returns the value of the '<em><b>Method Intf</b></em>' attribute.
	 * The literals are from the enumeration {@link org.eclipse.jst.javaee.ejb.MethodInterfaceType}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Method Intf</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Method Intf</em>' attribute.
	 * @see org.eclipse.jst.javaee.ejb.MethodInterfaceType
	 * @see #isSetMethodIntf()
	 * @see #unsetMethodIntf()
	 * @see #setMethodIntf(MethodInterfaceType)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_MethodIntf()
	 * @generated
	 */
	MethodInterfaceType getMethodIntf();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodIntf <em>Method Intf</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Method Intf</em>' attribute.
	 * @see org.eclipse.jst.javaee.ejb.MethodInterfaceType
	 * @see #isSetMethodIntf()
	 * @see #unsetMethodIntf()
	 * @see #getMethodIntf()
	 * @generated
	 */
	void setMethodIntf(MethodInterfaceType value);

	/**
	 * Unsets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodIntf <em>Method Intf</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isSetMethodIntf()
	 * @see #getMethodIntf()
	 * @see #setMethodIntf(MethodInterfaceType)
	 * @generated
	 */
	void unsetMethodIntf();

	/**
	 * Returns whether the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodIntf <em>Method Intf</em>}' attribute is set.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return whether the value of the '<em>Method Intf</em>' attribute is set.
	 * @see #unsetMethodIntf()
	 * @see #getMethodIntf()
	 * @see #setMethodIntf(MethodInterfaceType)
	 * @generated
	 */
	boolean isSetMethodIntf();

	/**
	 * Returns the value of the '<em><b>Method Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Method Name</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Method Name</em>' attribute.
	 * @see #setMethodName(String)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_MethodName()
	 * @generated
	 */
	String getMethodName();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodName <em>Method Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Method Name</em>' attribute.
	 * @see #getMethodName()
	 * @generated
	 */
	void setMethodName(String value);

	/**
	 * Returns the value of the '<em><b>Method Params</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Method Params</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Method Params</em>' containment reference.
	 * @see #setMethodParams(MethodParams)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_MethodParams()
	 * @generated
	 */
	MethodParams getMethodParams();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getMethodParams <em>Method Params</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Method Params</em>' containment reference.
	 * @see #getMethodParams()
	 * @generated
	 */
	void setMethodParams(MethodParams value);

	/**
	 * Returns the value of the '<em><b>Id</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Id</em>' attribute.
	 * @see #setId(String)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getMethodType_Id()
	 * @generated
	 */
	String getId();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.MethodType#getId <em>Id</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Id</em>' attribute.
	 * @see #getId()
	 * @generated
	 */
	void setId(String value);

} // MethodType