Chapter 6 Migrating from Other Application Servers to Sun Java System Application Server 9
This chapter describes the considerations and strategies that
are needed when moving Java EE applications from Application Server 6.x,,
7.x, or from servers such as Weblogic, Websphere servers to the Application Server Platform Edition 9 product
line.
The sections that follow describe issues that arise while migrating
the main components of a typical Java EE application from other application
servers to Application Server Platform Edition 9.
This chapter contains the following sections:
Several migration issues described in this chapter are based on an actual
migration that was performed for a Java EE application called iBank, a simulated online banking service, from Application Server
6.x to Sun Java System Application Server 9. This application reflects all aspects of a traditional
Java EE application.
The following areas of the Java EE specification are covered by the
iBank application:
-
Servlets, especially with redirection to JSP pages (model-view-controller
architecture)
-
JSP pages, especially with static and dynamic inclusion of
pages
-
JSP custom tag libraries
-
Creation and management of HTTP sessions
-
Database access through the JDBC API
-
Enterprise JavaBeans: Stateful and Stateless session beans,
CMP and BMP entity beans.
-
Assembly and deployment in line with the standard packaging
methods of the J2EE application
Migrating Deployment Descriptors
There are two types of deployment descriptors, namely, Standard
Deployment Descriptors and Runtime Deployment Descriptors. Standard deployment
descriptors are portable across Java EE platform versions and vendors and
does not require any modifications. Currently, there are exceptions due to
standards interpretation. The following table lists such deployment descriptors.
|
Source Deployment Descriptor in Sun Application 6.x /7.x
|
Source Deployment Descriptor in Websphere 4.0 /5.x
|
Source Deployment Descriptor in WebLogic 4.0 /5.x
|
Target Deployment Descriptor in 9
|
|
ias-ejb-jar.xml
|
ibm-ejb-jar-bnd.xmi, ibm-ejb-jar-ext.xmi
|
weblogic-ejb-jar.xml
|
sun-ejb-jar.xml
|
|
<bean-name>-ias-cmp.xml
|
ibm-ejb-jar-ext.xmi
|
weblogic-cmp-rdbms-jar.xml
|
sun-cmp-mappings.xml
|
|
ias-web.xml
|
ibm-web-bnd.xmi, ibm-web-ext.xmi
|
weblogic.xml
|
sun-web.xml
|
The Java EE standard deployment descriptors ejb-jar.xml, web.xml and application.xml are not modified
and therefore need not be changed.
Runtime deployment descriptors are vendor and product specific and are
not portable across application servers due to difference in their format.
Hence, deployment descriptors require migration. You can use the Migration
Tool for Application Server 9 to migrate these deplyment descriptors.
A majority of the information required for creating sun-ejb-jar.xml and sun-web.xml comes from ias-ejb-jar.xml and ias-web.xml respectively. However, there
is some information that is required and extracted from the home interface
(java file) of the CMP entity bean, in case the sun-ejb-jar.xml being
migrated declares one. This is required to build the <query-filter> construct
inside the sun-ejb-jar.xml, which requires information
from inside the home interface of that CMP entity bean. If the source file
is not present during the migration time, the <query-filter> construct
is created, but with missing information (which manifests itself in the form
of REPLACE ME phrases in the migrated sun-ejb-jar.xml).
Additionally, if the ias-ejb-jar.xml contains a <message-driven> element, then information from inside this element
is picked up and used to fill up information inside both ejb-jar.xml and sun-ejb-jar.xml. Also, inside the <message-driven> element
of ias-ejb-jar.xml, there is an element <destination-name>, which holds the JNDI name of the topic or queue to which the MDB
listens. In Application Server 6.5, the naming convention for this jndi name
is cn=<SOME_NAME>. Since a JMS Topic or Queue with this
name is not deployable on Application Server, the application server changes this
to <SOME_NAME>, and inserts this information in the sun-ejb-jar.xml. This change must be reflected for all valid input
files, namely, all .java, .jsp and .xml files. Hence, this JNDI name change is propagated across the
application, and if some source files that contain reference to this jndi-name
are unavailable, the administrator must make the changes manually so that
the application becomes deployable.
Migrating Web Applications
Application Server 6.x support servlets (Servlet API 2.2), and
JSPs (JSP 1.1). Sun Java System Application Server 9 supports Servlet API 2.4 and JSP 2.0.
Within these environments it is essential to group the different components
of an application (servlets, JSP and HTML pages and other resources) together
within an archive file (Java EE-standard Web application module) deploying
it on the application server.
According to the Java EE specification, a Web application is an archive
file (WAR file) with the following structure:
-
A root directory containing the HTML pages, JSP, images and
other static resources of the application.
-
A META-INF/ directory containing the archive
manifest file MANIFEST.MF containing the version information
for the SDK used and, optionally, a list of the files contained in the archive.
-
A WEB-INF/ directory containing the application
deployment descriptor (web.xml file) and all the Java classes
and libraries used by the application, organized as follows:
Migrating Java Server Pages and JSP Custom Tag Libraries
Application Server 6.x complies with the JSP 1.1 specification
and Application Server 8.1 complies with the JSP 2.0 specification.
JSP 2.0 specification contains many new features, as well as updates
to the JSP 1.1 specification.
These changes are enhancements and are not required to migrate to JSP
pages from JSP 1.1 to 2.0.
The implementation of JSP custom tag libraries in Application Server
6.x complies with the J2EE specification. Consequently, migrating JSP custom
tag libraries to the Application Server Platform Edition 9does not pose any particular
problem, nor require any modifications.
Migrating Servlets
Application Server 6.x supports the Servlet 2.2 API. Sun Java System Application Server 9 supports
the Servlet 2.4 API.
Servlet API 2.4 leaves the core of servlets relatively untouched. Most
changes are concerned with adding new features outside the core.
The most significant features are:
-
Servlets now require JDK 1.2 or later
-
Filter mechanisms have been created
-
Application lifecycle events have been added
-
Internationalization support has been added
-
Error and security attributes have been expanded
-
HttpUtils class has been deprecated
-
Several DTD behaviors have been expanded and clarified
These changes are enhancements and are not required to be made when
migrating servlets from Servlet API 2.2 to 2.4.
However, if the servlets in the application use JNDI to access resources
in the Java EE application (such as data sources or EJBs), some modifications
might be needed in the source files or in the deployment descriptor.
These modifications are explained in detail in the following sections:
One last scenario might require modifications to the servlet code. Naming
conflicts can occur with Application Server 6.x if a JSP page has the same
name as an existing Java class. In this case, the conflict must be resolved
by modifying the name of the JSP page in question. This in turn can mean editing
the code of the servlets that call this JSP page. This issue is resolved in Application Server as
it uses a new class loader hierarchy. In the new version of the application
server, for a given application, one class loader loads all EJB modules and
another class loader loads web module. As these two loaders do not talk with
each other, there is no naming conflict.
Obtaining a Data Source from the JNDI Context
To obtain a reference to a data source bound to the JNDI context, look
up the data source’s JNDI name from the initial context object. The
object retrieved in this way is then be cast as
a DataSource type object:
ds = (DataSource)ctx.lookup(JndiDataSourceName);
For detailed information, refer to section “Migrating JDBC Code.”
Declaring EJBs in the JNDI Context
Please refer to section Clients written to the new EJB 3.0 API in Chapter 5, Migrating EJB.”
Potential Servlets and JSP Migration Problems
The actual migration of the components of a Servlet / JSP application
from Application Server 6.x to Application Server 9does not require any
modifications to the component code.
If the Web application is using a server resource, a DataSource for
example, the Application Server requires that this resource to be declared inside
the web.xml file and, correspondingly, inside the sun-web.xml file. To declare a DataSource called jdbc/iBank,
the <resource-ref> tag in the web.xml file
is as follows:
<resource-ref>
<res-ref-name>jdbc/iBank</res-ref-name>
<res-type>javax.sql.XADataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
The corresponding declaration inside the sun-web.xml file
looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE FIX ME: need confirmation on the DTD to be used for this file
<sun-web-app>
<resource-ref>
<res-ref-name>jdbc/iBank</res-ref-name>
<jndi-name>jdbc/iBank</jndi-name>
</resource-ref>
</sun-web-app>
Migrating Web Application Modules
Migrating applications from Application Server 6.x to Sun Java System Application Server 9 does
not require any changes to the Java code or Java Server Pages. However, you
must change the following files:
The Application Server adheres to J2EE 1.4 standards, according to which,
the web.xml file inside a WAR file must comply with the
revised DTD at http://java.sun.com/dtd/web-app_2_3.dtd. This DTD is a superset of the previous versions’ DTD, hence
only the <! DOCTYPE definition needs to be changed inside
the web.xml file, which is to be migrated. The modified <! DOCTYPE declaration looks like:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD
Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
In Application Server Platform Edition 9, the name of this file is changed
to sun-web.xml.
This XML file must declare the Application Server-specific properties and
resources that are required by the Web application.
See Potential Servlets and JSP Migration Problems for
information about important inclusions to this file.
If the ias-web.xml of the Application Server 6.5
application is present and does declare Application Server 6.5 specific properties,
then this file needs to be migrated to Application Server standards. The DTD file
name has to be changed to sun-web.xml. For more details,
see URL http://wwws.sun.com/software/dtd/appserver/sun-web-app_2_4-1.dtd
Once you have made these changes to the web.xml and ias-web.xml files, the Web application (WAR file) can be deployed
from the Application Server’s deploytool GUI interface or from the command
line utility asadmin. The deployment command must specific
the type of application as web.
Invoke the asadmin command line utility by running asadmin.bat file or the asadmin.sh script in
the Application Server’s bin directory.
The command at the asadmin prompt is:
asadmin deploy -u username -w password
-H hostname
-p adminport
--type web
[--contextroot contextroot]
[--force=true]
[--name component-name]
[--upload=true] filepath
Migrating Enterprise EJB Modules
Application Server 6.x supports EJB 1.1, and the Application Server 8.x
supports EJB 2.0. Application Server 9 supports EJB 3.0. Therefore, both can support:
-
Stateful or stateless session beans
-
Entity beans with bean-managed persistence (BMP), or container-managed
persistence (CMP)
EJB 2.0, however, introduces a new type of enterprise bean, called a
message-driven bean (MDB).
J2EE 1.4 specification dictates that the different components of an
EJB must be grouped together in a JAR file with the following structure:
-
META-INF/ directory with an XML deployment
descriptor named ejb-jar.xml
-
The .class files corresponding to the home
interface, remote interface, the implementation class, and the auxiliary classes
of the bean with their package
Application Server 6.x uses this archive structure. However, the EJB
1.1 specification leaves each EJB container vendor to implement certain aspects
as they see fit:
-
Database persistence of CMP EJBs (particularly the configuration
of mapping between the bean’s CMP fields and columns in a database table).
-
Implementation of the custom finder method logic for CMP beans.
-
Application Server 6.x/7.x and Application Server 9do not
handle migrations in the same way, which means that some XML files must be
modified:
-
The <!DOCTYPE definition must be modified
to point to the latest DTD URL (in the case of J2EE standard DDs, like ejb-jar.xml).
-
Replace the ias-ejb-jar.xml file with the
modified version of this file (for example, file sun-ejb-jar.xml,
which is created manually according to the DTDs). For more information, see http://wwws.sun.com/software/dtd/appserver/sun-ejb-jar_2_1-1.dtd
-
Replace all the <ejb-name>-ias-cmp.xml files with one sun-cmp-mappings.xml file,
which is created manually. For more information, see http://wwws.sun.com/software/dtd/appserver/sun-cmp-mapping_1_2.dtd
-
Optionally, for CMP entity beans, use the capture-schema utility
in the Application Server’s bin directory to generate
the dbschema. Then place it above the META-INF directory
for the entity beans.
EJB Migration
As mentioned in Chapter 4, Understanding Migration, while Application Server 6.x supports the EJB 1.1 specification
and Application Server 8 supports EJB 2.0, Application Server 9 supports the EJB 3.0
specification.
Although the EJB 1.1 and 2.0 specification continues to be supported
in the Application Server, the use of the EJB 3.0 architecture is recommended to
leverage its enhanced capabilities.
For detailed information on migrating from EJB 1.1 to 2.0 to EJB 3.0,
please refer to Chapter 5, Migrating EJB
Migrating Enterprise Applications
According to the Java EE specifications, an enterprise application
is an EAR file, which must have the following structure:
-
A META-INF/ directory containing the XML
deployment descriptor of the J2EE application called application.xml
-
The JAR and WAR archive files for the EJB modules and Web
module of the enterprise application, respectively
In the application deployment descriptor, the modules that make up the
enterprise application and the Web application’s context root are defined.
Application server 6.x and the Application Server 9support the J2EE
model wherein applications are packaged in the form of an enterprise archive
(EAR) file (extension .ear). The application is further
subdivided into a collection of J2EE modules, packaged into Java archives
(JAR files, which have a .jar file extension) and EJBs
and Web archives (WAR files, which have a .war file extension)
for servlets and JSPs.
It is essential to follow the steps listed here before deploying an
enterprise application:
To Build an EAR File
-
Package EJBs in one or more EJB modules.
-
Package the components of the Web application in a Web module.
-
Assemble the EJB modules and Web modules in an enterprise application
module.
-
Define the name of the enterprise application’s root context,
which will determine the URL for accessing the application.
The Application Server uses
a newer class loader hierarchy than Application Server 6.x does. In the new
scheme, for a given application, one class loader loads all EJB modules and
another class loader loads Web modules. These two are related in a parent
child hierarchy where the JAR module class loader is the parent module of
the WAR module class loader. All classes loaded by the JAR class loader are
available/accessible to the WAR module but the reverse is not true. If a certain
class is required by the JAR file as well as the WAR file, then the class
file must be packaged inside the JAR module only. If this guideline is not
followed it can lead to class conflicts.
Application Root Context and Access URL
There is a major ”difference between Application Server 6.x and
the Application Server, concerning the applications access URL (root context of
the application’s Web module. If AppName is the name
of the root context of an application deployed on a server called hostname, the access URL for this application will differ depending on the
application server used:
-
With Application Server 6.x, which is always used jointly
with a Web front-end, the access URL for the application takes the following
form (assuming the Web server is configured on the standard HTTP port, 80):
http://<hostname>/NASApp/AppName/
-
With the Application Server, the URL takes the form:
http://<hostname>:<portnumber>/AppName/
The TCP port used as default by Application Server is port 8080.
Although the difference in access URLs between Application Server 6.x
and the Application Server might appear minor, it can be problematic when migrating
applications that make use of absolute URL references. In such cases, it is
necessary to edit the code to update any absolute URL references so that they
are no longer prefixed with the specific marker used by the Web Server plug-in
for Application Server 6.x.
Applications With Form-based Authentication
Applications developed on Application Server 6.5 that use form-based
authentication can pass the request parameters to the Authentication Form
or the Login page. The Login page could be customized to display the authentication
parameters based on the input parameters.
For example:
http://gatekeeper.uk.sun.com:8690/NASApp/test/secured/page.jsp?arg1=test&arg2=m
Application Server 9 does not support the passing of request
parameters while displaying the Login page. The applications that uses form-based
authentication, which passes the request parameters can not be migrated to
Application Server 9. Porting such applications to Application Server 9 requires
significant changes in the code. Instead, you can store the request parameter
information in the session, which can be retrieved while displaying the Login
page.
The following code example demonstrates the workaround:
Before changing the code in 6.5:
---------index-65.jsp -----------
<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>
go to the <a href="secured/page.htm">secured a rea</a>
</body>
</html>
----------login-65.jsp--------------
<%@page contentType="text/html"%>
<html>
<head> </head>
<body>
<!-- Print login form -->
<h3>Parameters</h3><br>
out.println("arg1 is " + request.getParameter("arg1"));
out.println("arg2 is " + request.getParameter("arg2"));
</body>
</html>
After changing the code in Application Server 9:
---------index-81.jsp -----------
<%@page contentType="text/html"%>
<html>
<head><title>JSP Page</title></head>
<body>
<%session.setAttribute("arg1","test"); %>
<%session.setAttribute("arg2","me"); %>
go to the <a href="secured/page.htm">secured area</a>
</body>
</html>
The index-81.jsp shows how you can store the request
parameters in a session.
----------login-81.jsp--------------
<%@page contentType="text/html"%>
<html>
<head> </head>
<body>
<!-- Print login form -->
<h3>Parameters</h3><br>
<!--retrieving the parameters from the session -->
out.println("arg1 is"+(String)session.getAttribute("arg1"));
out.println("arg2 is” + (String)session.getAttribute("arg2"));
</body>
</html>
Migrating Proprietary Extensions
A number of classes proprietary to the Application Server 6.x
environment might have been used in applications. Some of the proprietary
packages used by Application Server 6.x are listed below:
-
com.iplanet.server.servlet.extension
-
com.kivasoft.dlm
-
com.iplanetiplanet.server.jdbc
-
com.kivasoft.util
-
com.netscape.server.servlet.extension
-
com.kivasoft
-
com.netscape.server
These APIs are not supported in the Application Server. Applications using
any classes belonging to the above package must be rewritten to use standard
J2EE APIs. Applications using custom JSP tags and UIF framework also need
to be rewritten to use standard J2EE APIs.
For a sample migration walkthrough using the iBank application, see Chapter 7, Migrating a Sample Application - an Overview.
Migrating UIF
The Application Server does not support the use of Unified Integration
Framework (UIF) API for applications. Instead, it supports the use of J2EE
Connector Architecture (JCA) for integrating the applications. However, the
applications developed in Application Server 6.5 use the UIF. In order to
deploy such applications to the Application Server, migrate the UIF to the J2EE
Connector Architecture. This section discusses the prerequisites and steps
to migrate the applications using UIF to Application Server.
Before migrating the applications, ensure that the UIF is installed
on Application Server 6.5. To check for the installation, follow either of
the following approaches:
Checking in the Registry Files
UIF is installed as a set of application server extensions. They are
registered in the application server registry during the installation. Search
for the following strings in the registry to check whether UIF is installed.
Extension Name Set:
-
Extension DataObjectExt-cDataObject
-
Extension RepositoryExt-cLDAPRepository
-
Extension MetadataService-cMetadataService
-
Extension RepoValidator-cRepoValidator
-
Extension BSPRuntime-cBSPRuntime
-
Extension BSPErrorLogExt-cErrorLogMgr
-
Extension BSPUserMap-cBSPUserMap
The registry file on Solaris Operating Environment can be found at the
following location:
AS_HOME/AS/registry/reg.dat
Checking for UIF Binaries in Installation Directories
UIF installers copy specific binary files in to the application server
installation. Successfully finding the files listed below, indicates that
UIF is installed.
The location of the following files on Solaris and Windows is:
AS_HOME/AS/APPS/bin
List of files to be searched on Solaris:
List of files to be searched on Windows:
-
cBSPRlop.dll
-
cBSPRuntime.dll
-
cBSPUserMap.dll
-
cDataObject.dll
-
ErrorLogMgr.dll
-
cLDAPRepository.dll
-
cMetadataService.dll
-
cRepoValidator.dll
-
jx2cBSPRuntime.dll
-
jx2cDataObject.dll
-
jx2cLDAPRepository.dll
-
jx2cMetadataService.dll
Before migrating the UIF to Application Server, ensure that the UIF API is
being used in the applications. To verify its usage:
-
Check for the usage of netscape.bsp package
name in the Java sources
-
Check for the usage of access_cBSPRuntime.getcBSPRuntime method in the sources. You must call this method to acquire the
UIF runtime.
Contact appserver-migration@sun.com for information about UIF migration
to the Application Server.
Migrating Rich Clients
This section describes the steps for migrating RMI/IIOP and ACC
clients developed in Planet Application Server 6.x to the Application Server.
Authenticating a Client in Application Server 6.x
Application Server 6.x provides a client-side callback mechanism that
enables applications to collect authentication data from the user, such as
the username and the password.The authentication data collected by the iPlanet
CORBA infrastructure is propagated to the application server via IIOP.
If ORBIX 2000 is the ORB used for RMI/IIOP, portable interceptors implement
security by providing hooks, or interception points, which define stages within
the request and reply sequence.
Authenticating a Client in Sun Java System Application Server 9
The authentication is done based on JAAS (Java Authorization and Authentication
System API). If a client does not provide a CallbackHandler,
then the default CallbackHandler, called the LoginModule, is used by the ACC to obtain the authentication data.
For detailed instructions on using JAAS for authentication, see Chapter 8, Configuring Security, in Sun Java System Application Server Platform Edition 9 Administration Guide.
Using ACC in Application Server 6.x and Sun Java System Application Server 9
In Application Server 6.x, no separate appclient script is provided.
You are required to place the iasacc.jar file in the classpath
instead of the iascleint.jar file. The only benefit of
using the ACC for packaging application clients in 6.x is that the JNDI names
specified in the client application are indirectly mapped to the absolute
JNDI names of the EJBs.
In case of Application Server 6.x applications, a stand-alone client
uses the absolute name of the EJB in the JNDI lookup. That is, outside an
ACC, the following approach is used to lookup the JNDI:
initial.lookup(“ejb/ejb-name”);
initial.lookup(“ejb/module-name/ejb-name”);
If your application was developed using Application Server 6.5 SP3,
you would have used the prefix “java:comp/env/ejb/”
when performing lookups via absolute references.
initial.lookup("java:comp/env/ejb/ejb-name");
In Sun Java System Application Server 9, the JNDI lookup is done on the jndi-name of
the EJB. The absolute name of the ejb must not be used. Also, the prefix, java:comp/env/ejb is not supported in Sun Java System Application Server 9. Replace
the iasclient.jar, iasacc.jar, or javax.jar JAR files in the classpath with appserv-ext.jar.
If your application provides load balancing capabilities, in Sun Java System Application Server 9,
load balancing capabilities are supported only in the form of S1ASCTXFactory
as the context factory on the client side and then specifying the alternate
hosts and ports in the cluster by setting the com.sun.appserv.iiop.loadbalancingpolicy system property as follows:
com.sun.appserv.iiop.loadbalancingpolicy=
roundrobin,host1:port1,host2:port2,...,
This property provides the administrator with a list of host:port combinations
to round robin the ORBs. These host names can also map to multiple IP addresses.
If this property is used along with org.omg.CORBA.ORBInitialHost and org.omg.CORBA.ORBInitialPort as system properties, the round robin
algorithm will round robin across all the values provided. If, however, a
host name and port number are provided in your code, in the environment object,
that value overrides any other system property settings.
The Provider URL to which the client is connected in Application Server
6.5 is the IIOP host and port of the CORBA Executive Engine (CXS Engine).
In case of Sun Java System Application Server 9, the client needs to specify the IIOP listener
Host and Port number of the instance. No separate CXS engine exists in Sun Java System Application Server 9.
The default IIOP port is 3700 in Sun Java System Application Server 9; the actual value
of the IIOP Port can be found in the domain.xml configuration
file.