<!--

    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
============
OVERVIEW
============
This example creates an applet which requires the user to enter two numbers.
It then uses the Calculator EJB to add the numbers and displays the result.

Before you run the example, there are a few things worth noting. 
One has to keep in mind that applets run in a very restrictive environment. A couple of 
them are
1. Applets can only establish a connection to the host they came from
2. A signed applet gets around most of the restrictions (e.g. calls to System.getProperty() etc)
3. Any resources/classes needed by the applet should be available in the same directory where
the applet originated from, or its sub-directory/ies

Since our applet will establish a connection back to the EJB, so we need to make sure 
we are not trying to establish a connection to some other webapp. We will see in a minute 
what that means.
We shall also sign our applet using jarsigner, however would would first need to create
a certificate. We will get to this part also in a minute.

Since our applet would be running in a remote JVM, it would use the RemoteInitialContextFactory
instead of the LocalInitialContextFactory. The RemoteInitialContextFactory is available
in openejb-client.jar. The applet would also need the java-ee-api.jar in its class-path.

Lets see how we can use maven + ant to get around the above restrictions of applets:-

The pom.xml of this project 
- adds the client and the ee jars as dependencies. 
- uses the ant jar task (in the maven-antrun-plugin) to jar up all classes in WEB-INF/classes and puts them under the root
directory of the web app (this is required, since web app clients cannot access anything under
WEB-INF directory, hence we copied those classes to web-apps root directory)
[Note:- The ant script puts all classes under WEB-INF/classes inside a jar. All classes
are not required by the applet. Instead, the applet only needs the EJB interface and Applet 
classes in the jar]
- uses maven-dependency-plugin to copy javaee-api-embedded and openejb-client jars to src/main/webapp (this is the webapp root directory)
- uses the signjar ant task to sign all the jar files

The APPLET is located inside index.jsp . Notice how the archive attribute of the applet
is used to add the applet , java ee and openejb client jars to the applets classpath

Since the APPLET can only communicate from the host it originates, notice how the web context
root is used in the provider url to obtain the InitialContext. 
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY,
				"org.apache.openejb.client.RemoteInitialContextFactory");
		props.put(Context.PROVIDER_URL,"http://127.0.0.1:8080/applet/ejb");

The example web-app has a context root named applet. If you were making another webapp with a 
different context root, then you would use that in the provider url instead.
If you open the web.xml of this project, you will find a <servlet-mapping> section which 
actually maps the /ejb/* to a servlet named ServerServlet. This is another thing which you need
too keep in mind in your web-app. Yes, the provider url actually points to a servlet named
ServerServlet. This servlet is provided by openejb and is automatically added to you webapps
classpath.
[Note:- All other clients (except applets) will use a provider url of http://127.0.0.1:8080/tomee/ejb,
since an applet cannot connect to another web-app, hence the above little trick to work around this
limitation. If you do not make the change, you will get a HTTP 403 error i.e. server denied 
access to the ServerServlet . A unit test named JNDILookupTest has been added to the example to 
show how a non-applet remote client would obtain the Context]

HOW TO RUN THE EXAMPLE
======================
--USE KEYTOOL --
You would need to do a bit of work (if you have not done that already) in creating a self-signed
certificate (in case you do not have one from one of the certificate authorities).
Here is the steps performed to create the certificate (notice the store password is openejb - 
this password is also used in pom.xml while signing the jar -- if your store passwd is different
please update the pom.xml with the correct password before proceeding forward)
Use the keytool as shown below (answer all questions asked by keytool -- the answers do not
have to match as shown below (except for store password and alias <mykey> -- since it is used by maven))

karan@jee:~$ keytool -genkey
Enter keystore password:  openejb
What is your first and last name?
  [Unknown]:  karan malhi
What is the name of your organizational unit?
  [Unknown]:  Superbiz   
What is the name of your organization?
  [Unknown]:  Superbiz
What is the name of your City or Locality?
  [Unknown]:  Deptford
What is the name of your State or Province?
  [Unknown]:  NJ
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=karan malhi, OU=Superbiz, O=Superbiz, L=Deptford, ST=NJ, C=US correct?
  [no]:  yes

Enter key password for <mykey>
        (RETURN if same as keystore password):  
karan@jee:~$ 

-- INSTALL AND CONFIGURE TOMCAT --

1. Install latest Tomcat
2. Deploy OpenEJB WAR in tomcat
3. Open <<tomcat-install>>/conf/tomcat-users.xml and add the following user
   <user username="admin" password="" roles="manager"/>
   
-- DEPLOY AND TEST THE EXAMPLE --
1. Run the following command while in the applet directory
   mvn clean install war:exploded tomcat:deploy -Dmaven.test.skip=true
   [It is required to skip the test since the application is not yet deployed on tomcat. If you run
the test now, it will fail]
2. The above will deploy this web application to tomcat.
3. To test the application, open a web browser and navigate to 
   http://localhost:8080/applet
4. You will be prompted to accept digital signature. Accept it to run the applet
5. Enter two numbers and click the add button, the result should be displayed next
to the button

[Note:- If you make changes and want to redeploy the app use the following command:
 mvn clean install war:exploded tomcat:redeploy]



