Deployment of a COOL Plex Java Application on

  • Slides: 63
Download presentation
Deployment of a COOL: Plex Java Application on a Web Server Robert Atkins Technical

Deployment of a COOL: Plex Java Application on a Web Server Robert Atkins Technical Consultant Computer Associates

Agenda Introduction Requirements for this session References Presentation – Concepts and Definitions – Deployment

Agenda Introduction Requirements for this session References Presentation – Concepts and Definitions – Deployment Process Questions & Answers

Introduction about me This presentation – Originally presented at EDGE 2001, 1 May 2001

Introduction about me This presentation – Originally presented at EDGE 2001, 1 May 2001 by Paulo Dias – Original presentation available on EDGE website About you: – Any previous experience using Plex and/or Java?

Requirements for this session Good knowledge of MS-DOS and Windows (batch files, shortcuts, properties,

Requirements for this session Good knowledge of MS-DOS and Windows (batch files, shortcuts, properties, etc. ) Good knowledge of COOL: Plex Some knowledge of JAVA required

References COOL: Plex Java Configuration Document – http: //esupport. ca. com/index. html? Sterling Java

References COOL: Plex Java Configuration Document – http: //esupport. ca. com/index. html? Sterling Java Database Programming with JDBC – Pratik Patel and Karl Moss, ISBN: 1576100561 Java Network Programming – Elliotte Rusty Harold, ISBN: 1565922271 Java. Soft Web Page at: – http: //www. javasoft. com

What is JAVA ? (1) Conceived by: James Gosling, Patrick Naughton, Chris Warth, Ed

What is JAVA ? (1) Conceived by: James Gosling, Patrick Naughton, Chris Warth, Ed Frank and Mike Sheridan, at Sun Microsystems, 1991. Initially called “Oak” but renamed to JAVA in 1995 Why the need for Java ? – 1 st: Need for a platform-independent language (architectural neutral) – 2 nd: While in developing stage, it was also built for the WWW. Similar and related to C++ but not meant to replace C++

What is JAVA ? (2) Portable (one of the main reasons for its creation)

What is JAVA ? (2) Portable (one of the main reasons for its creation) Lightweight, web-friendly, Object Oriented, Open and reusable Support for network protocols, exception handling, garbage collection, etc. Can be used to create two types of programs: – Applications (meant to run traditionally) – Applets (special applications designed to be transmitted over the internet and executed by a JAVA-compatible browser).

What is JAVA ? (3) Security (safely download Java applets without the risk of

What is JAVA ? (3) Security (safely download Java applets without the risk of virus because of “firewall” between the network and the computer). – – – Applets cannot read or write to the local file system. Applets cannot load programs native to the local platform. Applets can only access the web server from where it was retrieved. Portability (code needs to be portable in order to run in all the various types of platforms connected through the internet). – – “write once, run anywhere” The magic key solution is BYTECODE

What is JAVA ? (4) The output of a java compiler is BYTECODE Bytecode

What is JAVA ? (4) The output of a java compiler is BYTECODE Bytecode is a highly optimised set of instructions designed to be executed by the Java Runtime System, which is called Java Virtual Machine (JVM). JVM is an interpreter for bytecode. JVM is different for each platform. Java is secure because the execution of every Java program is under the control of the JVM.

What is JAVA ? (5) Compiler for Bytecode already available in Java 2 (JIT)

What is JAVA ? (5) Compiler for Bytecode already available in Java 2 (JIT) Just In Time (JIT) is part of JVM of Java 2 and compiles bytecode into executable code in real time, piece by piece, on demand basis. Java bytecode was carefully designed so that it would be easy to translate directly into native code for very high performance, in real time by the JIT compiler available with Java 2. (in this way, Java can be compiled to native code and still be platform independent). Java is not an enhanced HTML !

What is JAVA ? (6) First simple Java program /* This is a simple

What is JAVA ? (6) First simple Java program /* This is a simple Java program Call this file “Example. java” */ class Example { // Your program begins with a call to main() public static void main(String args[]) { System. out. println(“This is a simple Java program”); } } The name of this file should be “Example. java” (compilation unit)

What is JAVA ? (7) To compile the Example program: – C: >javac Example.

What is JAVA ? (7) To compile the Example program: – C: >javac Example. java To run the program: – C: >java Example When the program is run, the following is displayed – This is a simple Java program.

What is JAVA ? (8) After compilation to bytecode, each individual class is put

What is JAVA ? (8) After compilation to bytecode, each individual class is put into its own output file name. class. That’s why it is a good idea to give the java source files the same name as the class they contain. The interpreter executes the bytecode contained in the specified class. Source code is case sensitive. Looks like C++ but no pointers. Code is compiled into. class files can be packaged into directory structures and run with a JVM.

How does JAVA work ? ü The Java compiler translates (and verifies the syntax)

How does JAVA work ? ü The Java compiler translates (and verifies the syntax) the source into a number of. class files. For reasons of easy distribution classes can be zipped in. zip or. jar (Java Archives). The classloader in the Java runtime (could be a browser) loads these zip's or classes and passes them to the bytecode verifier. If the runtime offers Just In Time compilation, the classes will be converted in platform dependent "dynamically loadable objects". When no JIT is present the interpreter will browse the VM-code and execute the statements. The runtime will monitor all activity and if necessary "eject" the program. A Just In time Compiler offers an 8 x - 50 x performance increase

What is JDK, JRE & Java Plug-in? JDK = Development Kit required to compile

What is JDK, JRE & Java Plug-in? JDK = Development Kit required to compile and run Java programs. – Available in three major versions: 1. 1. x, 1. 2. x and 1. 3 JRE (Java Runtime Environment) is the runtime portion of the JDK. JFC (also known as Swing or Swing. Set) is separate from JDK 1. 1. x but it is an integral part of JDK 1. 2. x. The JDK is the minimal suite of products developers need to compile, test and run their Java programs. The JRE (Java Runtime Environment) is the minimal set of tools to execute Java applications. Java Plug-in is required by Plex to execute Java applets correctly. The Plug-in emulates the Java Runtime Environments for the context of the applet execution.

Do you really need the Plug-in? Java Plug-In – Plug in VM - executes

Do you really need the Plug-in? Java Plug-In – Plug in VM - executes instead of browsers VM – Downloaded on request - not mandatory – Guarantees behavior across a range of browsers – Guarantees JDK compatibility - even with older browsers e. g. MS Explorer 3 – Kept in line with JDK releases

What are JAVA BEANS ? Portable, platform independent software component model written in JAVA.

What are JAVA BEANS ? Portable, platform independent software component model written in JAVA. It enables developers to write reusable components once and run them anywhere. Beans are Java classes that can be manipulated and composed together into applications. Any Java class that adheres to certain property and even interface conventions can be a bean. A bean may be designed to work autonomously on a user’s workstation or to work in co-operation with a set of other distributed components.

What are Servlets ? Small programs that execute on the server side of a

What are Servlets ? Small programs that execute on the server side of a web connection. Appeared in opposition to CGI (common gateway interface) built in several languages (C, C++, Perl). CGI (not platform independent) was expensive in terms of memory and processor resources because created a separate process for each client request. Servlets are platform independent and run on the server side.

What are EJBs Component model for secure, scalable, transaction based systems Different specification to

What are EJBs Component model for secure, scalable, transaction based systems Different specification to Java Beans Requires Application Server e. g. Web. Sphere, Web. Logic. Forms part of Sun’s J 2 EE specification.

Java Client Applet Architecture Client HTTP Browser Generated Applet TCP/IP Server 1 Server 2

Java Client Applet Architecture Client HTTP Browser Generated Applet TCP/IP Server 1 Server 2 Web Server Generated Java Server Classes JDK Database NB. An unsigned applet can only open a network conversation with the machine that delivered it.

Not Currently Supported (sorry) No MDI support in Java – MDI windows will be

Not Currently Supported (sorry) No MDI support in Java – MDI windows will be converted to SDI windows No report generation yet. Drag and drop not supported yet. (JDK 1. 2 feature) No help generation yet. No print capabilities Select where SQL statements BLOBs Stored procedures

Deployment Considerations Many parts to a Java client application – JDK executables and runtime

Deployment Considerations Many parts to a Java client application – JDK executables and runtime – JFC runtime – Plex Java runtime – Generated class files Many parts to a Java client applet – JFC runtime – Plex Java runtime – Generated class files

Specifying deployment environment

Specifying deployment environment

Example (1) Platform combination chosen for this demo:

Example (1) Platform combination chosen for this demo:

Example (2) Plex Model Editor with Java Entity: NB: I have given an implementation

Example (2) Plex Model Editor with Java Entity: NB: I have given an implementation name of Employee to the function Edit

Example (3) Build Directories

Example (3) Build Directories

Example (4) Generate and Build Systems NB: For Java Client functions, JAVA, JDBC Build

Example (4) Generate and Build Systems NB: For Java Client functions, JAVA, JDBC Build System is UKIDIASP as well.

Example (5) UKIDIASP (development machine) System Properties - Java Build NB: I chose to

Example (5) UKIDIASP (development machine) System Properties - Java Build NB: I chose to use JDK 1. 2. 2. which already includes JFC

Example (6) Server (MERLIN) System Properties NB: The application’s database name is: BFTRAIN

Example (6) Server (MERLIN) System Properties NB: The application’s database name is: BFTRAIN

Example (7) Java Generation Options:

Example (7) Java Generation Options:

Client side Gen & Build Generate everything scoped to entity Employee but only build

Client side Gen & Build Generate everything scoped to entity Employee but only build the client function to the development machine (UKIDIASP) NB: You might need to change your build system to be the development machine (UKIDIASP)

Server side Configuration for build There are two possible ways for building to the

Server side Configuration for build There are two possible ways for building to the server: – 1) You can use the batch file Ob 450 bld. bat which will run the Plex Java Build Manager – 2) Or: you can use a Java Web Server and run the servlet Plex Java Build Manager that ships with COOL: Plex. (We usually use the Sun Java Web Server for this to run this servlet. ) Either way, you will have to configure the Ob 450 bld. properties file first. This is required for the Plex Java Build Manager.

Server side Configuration for build File Ob 450 bld. properties on the server (MERLIN)

Server side Configuration for build File Ob 450 bld. properties on the server (MERLIN) : What is this Java. Build database for ? ? The build manager is going to build to the directory: c: jws 2classes

Remote Java Job Status DB The Job Status Database – The Plex Java Build

Remote Java Job Status DB The Job Status Database – The Plex Java Build Manager uses a SQL database to maintain build status information for remote builds. – The build manager creates a record in the job status database for each remote Java compile or JDBC build that is submitted. As a compile or build completes, the build manager updates the status in the database.

The Job Status Database Using your preferred database tool, you must create the following

The Job Status Database Using your preferred database tool, you must create the following table in a new or existing database: (I have created a new database and called it Java. Build) » CREATE TABLE Job. List ( Usr char(30), Grp. Mdl char(8), Ver. ID int, Lvl. ID int, Var. ID int, Lang. ID int, Job. ID char(36), Job. Sts int, Job. Dte int, Job. Tme int, Obj. Nme char(100), Impl. Nme char(50) )

Batch file Ob 450 bld. bat · (Option 1) To use a batch file

Batch file Ob 450 bld. bat · (Option 1) To use a batch file to start the Plex Java Build Manager: · Enter the following at the command line: – <Plex install directory>ObjavaOb 450 bld. bat <port> <server-side package location> <JDK install directory> <properties file location> <Plex Java runtime location> – where: – <Plex install directory> is where you installed COOL: Plex – <port> is the port that you want to use to connect to the Build Manager (ex. 2005) – <server-side package location> is where on the server you want the packages to be built (in our example, this will be c: jws 2classes) – <JDK install directory> is where the Java Developers' Kit is installed – <properties file location> is where the Ob 450 bld. properties file is installed; by default, this is <Plex install directory>Objava. – <Plex Java runtime location>is where on the server the Ob. Run. jar file is located; by default this is <Plex install directory>Objavalib

Sun Java Web Server (Option 2) The Plex Java Build Manager and the Plex

Sun Java Web Server (Option 2) The Plex Java Build Manager and the Plex Java Dispatcher servlets have been tested using the Java Web Server from Sun Microsystems (http: //www. sun. com/software/jwebserver/buy/inde x. html) Advantages of using a Java Web Server (option 2): – When the Java Web Server is installed as a NT service, the server can be logged off and still be accessible by Plex and Plex applications. – Administration of Build Manager and Dispatcher can be performed using a browser over the internet !!!

Sun Java Web Server (Option 2) To use a Java Web Server to start

Sun Java Web Server (Option 2) To use a Java Web Server to start the Plex Java Build Manager:

Sun Java Web Server (Option 2) Plex Java Build Manager Servlet Configuration

Sun Java Web Server (Option 2) Plex Java Build Manager Servlet Configuration

Sun Java Web Server (Option 2) Plex Java Build Manager Servlet properties

Sun Java Web Server (Option 2) Plex Java Build Manager Servlet properties

Sun Java Web Server (Option 2) Plex Servlets’ Aliases (Build Manager and Dispatcher) Plex

Sun Java Web Server (Option 2) Plex Servlets’ Aliases (Build Manager and Dispatcher) Plex Dispatcher Plex Build Manager NB: Note the 2 aliases: Ob. Bld. Admin and the Ob. Admin.

Sun Java Web Server Plex Java Build Manager Running (Option 2)

Sun Java Web Server Plex Java Build Manager Running (Option 2)

Submit for remote compilation Once your build manager is running on the server, you

Submit for remote compilation Once your build manager is running on the server, you can submit your files to be compiled remotely to the server (MERLIN). NB: You might need to change your build system to be the server machine (MERLIN)

Remote Java Build Status Java. Build database is used here to check the build

Remote Java Build Status Java. Build database is used here to check the build status.

Server side Configuration for running the Dispatcher After all files have been build successfully,

Server side Configuration for running the Dispatcher After all files have been build successfully, there are two possible ways for running the Plex Java Dispatcher: – 1) You can use the batch file Ob 450 dsp. bat which will run the Plex Java Dispatcher. – 2) Or: you can use a Java Web Server and run the servlet Plex Java Dispatcher that ships with COOL: Plex. (We usually use the Sun Java Web Server for this to run this servlet. ) Either way, you will have to configure the Ob 450 svr. properties file first. This is required for the Plex Java Dispatcher.

Server side Configuration Dispatcher File Ob 450 svr. properties on the server (MERLIN) :

Server side Configuration Dispatcher File Ob 450 svr. properties on the server (MERLIN) :

Running the Dispatcher using batch file Ob 450 dsp. bat (Option 1) File Ob

Running the Dispatcher using batch file Ob 450 dsp. bat (Option 1) File Ob 450 dsp. bat on the server (MERLIN) : – If you are using JDK 1. 2. 2. , Modify the Ob 450 dsp. bat file as follows: – Edit the file in a text editor and do a search for the string “- nojit”. Remove all occurrences of that string from the file. This is because option “–nojit” is not supported by the JDK 1. 2. 2. To use a batch file ob 450 dsp. bat to start the Plex Java Dispatcher: – Enter the following at the command line: – – <Plex install directory>Objavaob 450 dsp. bat <port> <server-side package location> <JDK install directory> <properties files location> <Plex Java Runtime location> Where: – <Plex install directory> is where you installed COOL: Plex – <port> this is the same Default. Admin. Port that you defined earlier in file Ob 450 srv. properties (For example: 2006). – <server-side package location> is where on the server your packages were built (example: c: jws 2classes) – <JDK install directory> is where the Java Developers' Kit is installed – <properties file location> is where the properties files are installed; by default, this is <Plex install directory>Objava. – <Plex Java runtime location>is where on the server the Ob. Run. jar file is located; by default this is <Plex install directory>Objavalib

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher Servlet Configuration

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher Servlet Properties

Sun Java Web Server Config. You will have to unzip the following. jar files

Sun Java Web Server Config. You will have to unzip the following. jar files as follows: – Open C: Plex 450ObjavaRemoteOb. Remote. jar using winzip and unzip all files to C: jws 2Servlets. Make sure the “Use folder names” option is checked. – Open C: Plex 450ObjavaLibOb. Run. jar using winzip and unzip all files to C: jws 2Classes. Make sure the “Use folder names” option is checked. – Open C: Plex 450ObjavaRemoteOb. Images. jar using winzip and unzip all files to C: jws 2Public. HTMLOb. Images. Make sure the “Use folder names” option is checked. Make sure that your server packages are visible from C: jws 2Classes. – In this example, they will probably be inside of C: jws 2ClassesBFT (this was your server- side package location). You will have to move them manually to C: jws 2Classes.

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher

Running the Dispatcher using the Sun Java Web Server (Option 2) Plex Java Dispatcher Running

Deployment using the IIS from the NT 4 Option Pack In our example, we

Deployment using the IIS from the NT 4 Option Pack In our example, we are going to use the Microsoft IIS Web Server from the Windows NT 4 Option Pack. In order for the applet to be successfully downloaded from the web server and launched from within a browser, you will have to have all these things put on to the web server: – Panel Class Files (put in the EMPLOYEE. jar file) – in/out of server functions (put in the EMPLOYEE. jar file) – Obrun. jar – Ob 450 client. properties – panel resource files (BFTRAIN. panelresource file + *. gif files) – html page (EMPLOYEE. html)

Configuring the IIS as Web Server Create a virtual web directory with IIS –

Configuring the IIS as Web Server Create a virtual web directory with IIS – Go to the menu start ¦ programs ¦ Windows NT 4. 0 Option Pack ¦ Microsoft Internet Information Server ¦ Internet Service Manager – Create a new virtual directory under the Default Web Site. – Choose the alias to be used to access the virtual directory (ex: Employee) – Enter the physical path of the directory containing the content you want to publish – Give the access permissions for the virtual directory: – Typically: Read access, Scripting access, Execute access and Directory browsing – Close the Internet Service Manager.

Packaging the Java Code To deploy applications over the internet (or intranet), you can

Packaging the Java Code To deploy applications over the internet (or intranet), you can choose to bundle your compiled code. The two formats supported by Java are *. zip and *. jar In this example, we will create a EMPLOYEE. jar file containing the java client portion of the application. The JDK comes with a tool called <jar. exe>, which resides in the JDK bin directory.

Creating the. jar file To create the EMPLOYEE. jar file: – This is to

Creating the. jar file To create the EMPLOYEE. jar file: – This is to be done in the development machine (UKIDIASP) – Open a MSDOS window – Create a working directory to store all your directories and folders which will be included – – – in the. jar file. In our example we will call it c: working Start by using Win. Zip to unzip Ob. Run. jar to this directory c: working. Delete the Ob. Bld. Mgr and the Meta-inf directories (these were extracted from Ob. Run. jar but are not needed to create the EMPLOYEE. jar file) Next, copy your panel package (BFTRAINPNL), the default package (BFTRAINMISC) and the default server package (BFTRAIN) to this c: working directory. You might need to copy any third party packages (example: OBASE, OBDATE, PDATE, etc) In the default server package (BFTRAIN) delete any *. class files with _Ob. Fnc in the name, including any _Ob. Fnc$. You should be left with files _Ob. In or _Ob. Out in the name. Create a compressed jar file using the following commend in a DOS window: – C: working> jar cvf EMPLOYEE. jar *. *

Applets: Downloading classes on demand (COOL: Plex 4. 5 feature) If you deploy a

Applets: Downloading classes on demand (COOL: Plex 4. 5 feature) If you deploy a Java client applet as a single JAR file, the entire client has to be downloaded before the applet can be executed. This may present a performance problem. You have the option of packaging the class files for the client applet into multiple JAR files or directories. You can then set up the run-time environment so that the JAR files are downloaded only when and if they are required. The JAR file (or files) containing the initial function to be called and the COOL: Plex Java run-time classes need to be referenced in the HTML page used to start the applet Other files can be packaged into separate JAR files or directories as required. When one function calls another in a Java applet, if the target function is not found on the client, the run-time searches for it in the server locations specified by the Remote. Load. Location setting (described below). Once found, the function class is downloaded to the client and then called. It then remains cached on the client for the duration of the applet's execution. Note that this is not a client-server call - the target function is not called on the server, it is retrieved from the web server and then called.

Applets: Downloading classes on demand (COOL: Plex 4. 5 feature) Client properties file entries

Applets: Downloading classes on demand (COOL: Plex 4. 5 feature) Client properties file entries The following entries (highlighted) in the client properties file are used to configure download on demand: #-------------------------# Download on demand settings #-------------------------# Show information messages to the end user as classes are being remotely loaded: Environment. Default. Remote. Load. Messages=No # # Attempt any remote loading if classes cannot be found automatically: Environment. Default. Attempt. Remote. Load=Yes # # Locations to try to load from: Environment. Default. Remote. Load. Locations=http: //localhost: 8080/Test. Java #-------------------------#All of the following are valid Remote. Load. Locations: #Environment. Default. Remote. Load. Locations=http: //localhost: 8080/a. jar #Environment. Default. Remote. Load. Locations=http: //localhost: 8080/

Copy the files to the server Copy the EMPLOYEE. jar file – Copy the

Copy the files to the server Copy the EMPLOYEE. jar file – Copy the EMPLOYEE. jar file to the physical location of the virtual directory chosen in IIS (in the server MERLIN) – Copy the panel resource file (EMPLOYEE. panelresource), the html file (EMPLOYEE. html), the Ob 450 client. properties and any *. gif files used by your applet to the physical location of the virtual directory chosen in IIS (in the server MERLIN)

Modifications to EMPLOYEE. html Edit the EMPLOYEE. html file with notepad or any other

Modifications to EMPLOYEE. html Edit the EMPLOYEE. html file with notepad or any other simple text editor. – 1. First you will need to change the location of the client properties file to point to a URL to the directory containing the file on the server. The entry value “file: c: plex 450Objava” appears 3 times in the html file. This should be changed to something like: “http: //merlin/Employee/”. , or wherever your virtual directory is on the IIS web server. (Do not forget the last forward slash - it is important). – 2. Immediately following the line <PARAM NAME=CODEBASE VALUE=“. /”>, add a new line like this: <PARAM NAME=ARCHIVE VALUE=“EMPLOYEE. jar”>

Modifications to EMPLOYEE. html – 3. Next you will need to state that the

Modifications to EMPLOYEE. html – 3. Next you will need to state that the applet is in an archive as follows: – Before – – <EMBED type="application/x-java-applet; version=1. 2. 2" java_CODE = "Ob. Run. Ob. Panel. Ob. Launch. class" java_CODEBASE = ". /" NAME="Ob. Launch" WIDTH="484" HEIGHT="231" ALIGN="baseline" Function = ”EMPLOYEE" After – <EMBED type="application/x-java-applet; version=1. 2. 2" java_CODE = "Ob. Run. Ob. Panel. Ob. Launch. class" java_ARCHIVE = “EMPLOYEE. jar” NAME="Ob. Launch" WIDTH="484" HEIGHT="231" ALIGN="baseline" Function = ”EMPLOYEE” java_CODEBASE = ". /" – 4. Finally you will need to change another line to state that the applet is in an archive as follows: – – Before – <APPLET CODE = "Ob. Run. Ob. Panel. Ob. Launch. class" CODEBASE = ". /" WIDTH="484" HEIGHT="231" NAME="Ob. Launch" ALIGN="baseline" > – <PARAM NAME = "Function" VALUE =”EMPLOYEE"> After – <APPLET CODE = "Ob. Run. Ob. Panel. Ob. Launch. class" CODEBASE = ". /" ARCHIVE = “EMPLOYEE. jar” WIDTH="484" HEIGHT="231" NAME="Ob. Launch" ALIGN="baseline" > – <PARAM NAME = "Function" VALUE =”EMPLOYEE">

Modifications to Ob 450 client. properties Edit the ob 450 client. properties file to

Modifications to Ob 450 client. properties Edit the ob 450 client. properties file to change any references to any hard-coded c: \ paths to point to the IIS web server virtual directory where the files are located. We’ll be changing both the image path and the resource path to point to where the pnl resource and *. gif’s are located. This way these files will remain on the server. Edit ob 450 client. properties file to contain the following updates: – – – – – # COOL: Plex Environment Options: Environment. Default. Driver=sun. jdbc. odbc. Jdbc. Odbc. Driver Environment. Default. Data. Source= Environment. Default. User= Environment. Default. Password= Environment. Default. Resources=http: //merlin/Employee/ Environment. Default. Image. Path=http: //merlin/Employee/ Environment. Default. Look. And. Feel=System Environment. Default. Auto. Commit=Yes That’s it !! Done !

The applet running. . .

The applet running. . .

Questions & Answers ? ? ? ? ?

Questions & Answers ? ? ? ? ?