/**
*
* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
*
* Licensed 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.
*/
package org.apache.geronimo.samples.daytrader.web.prims;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import org.apache.geronimo.samples.daytrader.ejb.*;
import org.apache.geronimo.samples.daytrader.util.*;
import org.apache.geronimo.samples.daytrader.*;
/**
*
* Primitive designed to run within the TradeApplication and makes use of {@link trade_client.TradeConfig}
* for config parameters and random stock symbols.
* Servlet will generate a random stock symbol and get the price of that symbol using a {@link trade.Quote} Entity EJB
* This tests the common path of a Servlet calling an Entity EJB to get data
* In this servlet the call is made the through the Quote EJBs Remote Interface
*
*/
public class PingServlet2EntityRemote extends HttpServlet
{
private static String initTime;
private static int hitCount;
private static QuoteHome quoteHome;
/**
* forwards post requests to the doGet method
* Creation date: (11/6/2000 10:52:39 AM)
* @param res javax.servlet.http.HttpServletRequest
* @param res2 javax.servlet.http.HttpServletResponse
*/
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
doGet(req, res);
}
/**
* this is the main method of the servlet that will service all get requests.
* @param request HttpServletRequest
* @param responce HttpServletResponce
**/
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/html");
java.io.PrintWriter out = res.getWriter();
Quote quote = null;
String symbol = null;
StringBuffer output = new StringBuffer(100);
output.append(
"<html><head><title>Servlet2EntityRemote</title></head>"
+ "<body><HR><FONT size=\"+2\" color=\"#000066\">PingServlet2EntityRemote<BR></FONT>"
+ "<FONT size=\"-1\" color=\"#000066\"><BR>PingServlet2EntityRemote performs a JNDI lookup"
+ " on the QuoteBean Remote Home and then gets the price of a random symbol (generated by TradeConfig)"
+ " through the Remote Interface");
try
{
//this is just a large general catch block.
//it is important only to look up the home once.
if (quoteHome == null)
{
//make sure that only one thread looks up the home
synchronized (lock)
{
if (quoteHome == null)
{
output.append(
"<HR>Performing JNDI lookup and creating reference to QuoteHome</B>");
try
{
//do not pass an environment so that it uses the system env.
InitialContext ic = new InitialContext();
//lookup and narrow (cast) the reference to the ejbHome.
quoteHome = (QuoteHome) PortableRemoteObject.narrow(
ic.lookup("java:comp/env/ejb/Quote"),
QuoteHome.class);
}
catch (Exception ne)
{
//wrap and throw the exception for handling
Log.error(ne,"web_primtv.PingServlet2Entity.doGet(...): error looking up QuoteHome");
throw ne;
}
}
}
}
//generate random symbol
try {
int iter = TradeConfig.getPrimIterations();
for (int ii = 0; ii < iter; ii++) {
//get a random symbol to look up and get the key to that symbol.
symbol = TradeConfig.rndSymbol();
//find the EntityInstance.
quote = quoteHome.findByPrimaryKey(symbol);
}
}
catch (Exception e)
{
Log.error("web_primtv.PingServlet2Entity.doGet(...): error performing findByPrimaryKey");
throw e;
}
//get the price and print the output.
QuoteDataBean quoteData = quote.getDataBean();
output.append("<HR>initTime: " + initTime + "<BR>Hit Count: ").append(
hitCount++);
output
.append("<HR>Quote Information<BR><BR> " + quoteData.toHTML());
output.append("</font><HR></body></html>");
out.println(output.toString());
}
catch (Exception e)
{
Log.error(e,"PingServlet2Entity.doGet(...): error");
//this will send an Error to teh web applications defined error page.
res.sendError(
500,
"PingServlet2Entity.doGet(...): error"
+ e.toString());
}
}
/**
* returns a string of information about the servlet
* @return info String: contains info about the servlet
**/
public String getServletInfo()
{
return "web primitive, tests Servlet to Entity EJB path";
}
/**
* called when the class is loaded to initialize the servlet
* @param config ServletConfig:
**/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
hitCount = 0;
initTime = new java.util.Date().toString();
//set this to null, this will be initialized in the doGet method.
quoteHome = null;
//this lock is used to synchronize initialization of the EJBHome
lock = new Integer(99);
}
private java.lang.Integer lock;
}