<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../../../webtools/wtp.xsl"?>
<html>
	<head>
		<meta
			name="root"
			content="../../../../.." />
		<title>j2ee models</title>
	</head>

	<body>
		<h1>jst j2ee component</h1>
		<h2>Intoduction</h2>
		<p>
			The J2EE Component provides the core models and API for J2EE 1.2, 1.3 and
			1.4 specification levels artifacts. The core models are for creating and
			loading the J2EE artifacts (Enterprise Applications, Application Clients,
			Web Applications, Web Services, Enterprise Java Bean and Connectors). All
			the J2EE core models exist in the
			<b>org.eclipse.jst.j2ee.core</b>
			plugin of the j2ee sub component of the jst sub project. The details of
			each of core j2ee models usage and api are discussed in the following
			sections.
		</p>

		<h2>J2EE Components</h2>
		<p>
			In WTP, J2EE projects include a entry for ModuleCoreNature, that indicates metadata
			is present for the modulecore model.  This model represents the different j2ee component types,
			and how they are structured. 
			<br />
			The snippet of code below shows how a VirtualComponent is accessed from a project that contains the ModuleCoreNature.
			
			<pre>
				FlexibleProject flexProj = ComponentCore.createFlexibleProject(anIProject);
				IVirtualComponent comp = flexProj.createComponent(compName);
			</pre>

		</p>

		<h2>ArtifactEdit</h2>
		<p>
			ArtifactEdit classes are a mechanism to create and load emf resources from the emf
			resource set in read or write mode. When opened in either mode they have
			to be released after the work with the resource is done. The need for
			releasing these edit models is needed because accessing the edit models
			increments the resource count by 1 on the actual resource in the resource
			set. This mechanism of incrementing the resource count is used for
			resource synchronization. There are artifact edit classes defined for each j2ee
			module type to handle creation,load and editiing scenarios of the their deployment
			descriptor resources.
			<br />
			The snippet of code below shows how an EJBArtifactEdit is created from a component
			and used get the list on all the enterprise bean in the EJB Jar	module:
			<pre>
				public List getEnterpriseBeans(IVirtualComponent comp) { 
				EJBArtifactEdit ejbArtifactEdit = null; 
				try{ 
					ejbArtifactEdit = 
					EJBArtifactEdit.getEJBArtifactEditForRead(comp); 
					List enterpriseBeans =
					ejbArtifactEdit.getEJBJar().getEnterpriseBeans();
					return enterpriseBeans;
					 } 
				finally { 
					if(ejbArtifactEdit != null) {
						ejbArtifactEdit.dispose(); 
					} 
				  } 
				}
			</pre>
		</p>
		<p>
			Quick EMF model overview:
			A resource set (@ResourceSet) manages a collection of resources (@link #getResource)  A
			resource contains api to view the (@link #getAllContents) collection of EMF Objects.
			A resource can be created (@link #createResource) or demand loaded (@link
			#getResource(URI, boolean)) into the resource set collection. A proxy can
			be {@link #getEObject} can be resolved by the resource set, and may cause
			the demand load of a resource.

		</p>
		<h2>Common J2EE Model</h2>
		<p>
			The common J2EE model represents the common schema elements that are
			created and used across all the j2ee modules. The
			<b>org.eclipse.jst.j2ee.common</b>
			java package contains the api for creating and accessing the common
			elements
			<b>
				(description, displayName, small-icon,large-icon,ejb-ref,
				resource-ref,resource-env-ref,message-desintations-refs,service-refs,message-destinations,security-roles
				etc.)
			</b>
			. The following diagram depicts all the elements of the common model that
			is being shared across all j2ee module models.
			<br />
			<img
				border="0"
				src="../images/CommonRefs.jpg" />
			<br />
		</p>
		<h2>Enterprise Application Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.application</b>
			package contains all the api for creating an Application module and the
			nested modules (Application Client, Web, EJB and Connector) in the
			Application.
		</p>
		<p>
			The snippet of code below shows how to create an Application:
			ApplicationFactory.eINSTANCE.createApplication();
			<br />
			The ApplicationFactory interface has addtional api to create j2ee modules
			as listed below
			<br />
			<pre>
				WebModule createWebModule(); 
				JavaClientModule createJavaClientModule(); 
				EjbModule createEjbModule();
				ConnectorModule createConnectorModule(); 
				ApplicationPackage getApplicationPackage();
			</pre>
			<br />
			The Application needs to have a minimum of one module as per J2EE
			specification. The modules can be created as standalone modules or along
			with an EAR with the module added to the EAR. The standalone module
			creation api are mentioned in the corresponding module sections below.
			The following diagram depicts all the elements in the Application that
			constitutes the Enteprise Application resource (EARFile). The Application
			needs to have a minimum of one module as per J2EE specification. The
			modules can created as part of EAR creation or individually as standalone
			modules. The UML model below depicts the elements of an Application and
			that contitute the application.xml file.
			<br />
			<img
				border="0"
				src="../images/Application.jpg" />
			<br />
			The
			<b>Application</b>
			Interface class provides all the necessary api to elements on the
			Application model. Here are the api avialable on the Application
			Interface class
			<pre>
				/*Returns the first module matching the specified uri*/ 
				public Module getFirstModule(String uri); 
				/**Returns the first module where the alt dd matches the specified uri*/ 
				public Module getModuleHavingAltDD(String uri); 
				/*Returns the Securtiy Role in the Application matching the name*/ 
				public SecurityRole getSecurityRoleNamed(String name);
			</pre>
		</p>
		<h2>Application Client Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.client</b>
			java package contains all the interfaces and api for creating and
			accessing the elements
			<b>(env-entry,callback-handler etc.)</b>
			an Application Client module. The ApplicationClient interface class has
			the all the api to get to the elemmts that constitutes the deployment
			decriptor
			<b>(application-client.xml)</b>
			. The ClientFactory interface is used to create an instances of an
			Applciation Client. The following diagram depitcs all the elements of an
			Application Client module that constitutes the Application Client jar
			(JavaClientFile).
			<br />
			<img
				border="0"
				src="../images/ApplicationClient.jpg" />
			<br />
			The snippet of code below shows how an AppClientArtifactEdit is accessed
			from a passed component and used to get the list of EJB
			references in the Application Client resource.
			<pre>
				public List getEJBReferences(IVirtualComponent appClientComponent) {
				AppClientArtifactEdit appClientArtifactEdit = null; 
				try {
					appClientArtifactEdit =
					AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientComponent);
					return appClientArtifactEdit.getApplicationClient().getEjbReferences(); 
				}
				finally { 
					if(appClientArtifactEdit != null)
						appClientArtifactEdit.dispose(); 
					} 
				}
			</pre>
		</p>

		<h2>Web Application Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.webapplication</b>
			java package contains all the model api for creating and accessing the
			elements
			<b>
				(context-param, servlet, servlet-mapping, session-config,
				mime-mapping, welcome-file-list, error-page, taglib, resource-ref,
				security-constraint, login-config, security-role, env-entry etc.)
			</b>
			of a Web App. The WebApp and WebResourceCollection are the interfaces
			through which all the elements of WebApplication module can be accessed.
			The
			<b>org.eclipse.jst.j2ee.webapplication.impl</b>
			package contains the concrete implemenation of the interface provided in
			the
			<b>org.eclipse.jst.j2ee.webapplication</b>
			package. The following diagram depicts all the elements of a Web Module
			module deployment descriptor that constitutes the Web Archive (WARFile)
			<br />
			<img
				border="0"
				src="../images/WebApp.jpg" />
			<br />
			The snippet of code below shows how a WebArtifactEdit is accessed from a Web component
			to get the list of all the servlets in the web module.
			<pre>
				public List getServlets(IVirtualComponent webComponent) { 
				WebArtifactEdit webArtifactEdit = null; 
				try { 
					webArtifactEdit = WebArtifactEdit.getWebArtifactEditForRead(webComponent); 
					return webArtifactEdit.getWebApp().getServlets(); 
				} 
				finally { 
					if(webArtifactEdit!= null) 
						webArtifactEdit.dispose(); 
						} 
				}
			</pre>
		</p>

		<h2>Enterprise Java Bean Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.ejb</b>
			java package contains all the interfaces and api for creating and
			accessing the elements
			<b>
				(enterprise-beans, relationships, assembly-descriptor,
				ejb-client-jar)
			</b>
			of an Enterprise Java Bean module. The
			<b>EJBJar</b>
			interface contains all the api for accessing the elements of an
			Enterprise Bean module. The
			<b>EnterpriseBean</b>
			interface provides the api for accessing the elements of an Enterprise
			Java Bean. the The following diagram depicts all the elements of a EJB
			resource that constitutes EJBJar (EJBJarFile).
			<br />
			<img
				border="0"
				src="../images/EJBJar.jpg" />
			<br />
			The snippet of code below shows how the EJBArtifactEdit is accessed for
			write from an EJB component and a CMPAttribute is added to the
			ContainerManagedEntity bean.
			<pre>
				public void addNewCMPAttributeToCMP(IVirtualComponent ejbComp, String cmpBeanName) { 
				EJBArtifactEdit ejbArtifactEdit = null; 
				try {
						ejbArtifactEdit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbComp);
						EJBJar ejbJar = ejbArtifactEdit.getEJBJar();
						EnterpriseBean bean = ejbJar.getEnterpriseBeanNamed(cmpBeanName); 
						if(bean instanceof ContainerManagedEntity) { 
							ContainerManagedEntity cmpBean = (ContainerManagedEntity)bean;
							CMPAttribute attr = EjbFactory.eINSTANCE.createCMPAttribute(); attr.setName("foo");
							cmpBean.getCMPAttribute().add(attr); 
						}
						ejbArtifactEdit.saveIfNecessary(); 
					} 
				finally { 
					if(ejbArtifactEdit != null) 
						ejbArtifactEdit.dispose(); 
					} 
				}
			</pre>
		</p>

		<h2>Connector Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.jca</b>
			java package contains all the interfaces and api for creating and
			accessing the elemtns
			<b>
				(vendor-name, spec-version, eis-type, version, license,
				resourceadapter,activation-spec)
			</b>
			of an Connector module. The
			<b>Connector</b>
			interface contains all the api for accessing the elements of an Connector
			module. The
			<b>ResourceAdapter</b>
			interface provides all the api for accessing the elements of the
			internals of an Connector modules. The following diagram depicts all the
			elements of a Connector resource that constitutes Resource Archive
			(RARFile).
			<br />
			<img
				border="0"
				src="../images/Connector.jpg" />
			<br />
			The snippet of code below shows how the ConnectorArtifactEdit is accessed
			from a Connector component and to get the Config Properties in the
			ResourceAdapter of the Connecter resource.
			<pre>
				public List getConnectorConfigProperties(IVirtualComponent comp) {
				ConnectorArtifactEdit connectorArtifactEdit = null; 
				try {
					connectorArtifactEdit = connectorRuntime.getConnectorArtifactEditForRead(comp); 
					return connectorArtifactEdit.getConnector().getResourceAdapter().getConfigProperties();
				} 
				finally { 
					if(connectorArtifactEdit != null)
						connectorArtifactEdit.dispose(); 
					} 
				}
			</pre>
		</p>

		<h2>Web Services Model</h2>
		<p>
			The
			<b>org.eclipse.jst.j2ee.webservice.wsclient</b>
			java package contains all the interfaces and api for creating and
			accessing the elements
			<b>(ports,handlers,serviceRefs, componentsScopedRefs etc.)</b>
			of a Web Serices Client resource. The
			<b>Webservice_clientFactory</b>
			interface contains all the api for creating the elements of a Web Service
			Client. The
			<b>ComponentScopedRefs,Handler,PortComponentRef,ServiceRef</b>
			interfaces contain the api for accessing the internal elements of a Web
			Services client resource.The
			<b>org.eclipse.jst.j2ee.webservice.wsdd</b>
			package contains the api to access the elements of Web Services
			Deployment Descriptor(WSDD). The
			<b>WsddFactory</b>
			interface contains the api for creating the elements of a WSDD resource.
			The following diagram depicts all the elements of a WSDD and the
			WebServicesClient resource.
			<br />
			<img
				border="0"
				src="../images/wsdd.jpg" />
			<br />
			<img
				border="0"
				src="../images/webserviceclient.jpg" />
			<br />
		</p>

	</body>
</html>
