/**
*
* 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.*;
/**
*
* PingServlet2TwoPhase tests key functionality of a TwoPhase commit
* In this primitive a servlet calls a Session EJB which begins a global txn
* The Session EJB then reads a DB row and sends a message to JMS Queue
* The txn is closed w/ a 2-phase commit
*
*/
public class PingServlet2TwoPhase extends HttpServlet
{
private static String initTime;
private static int hitCount;
private static TradeHome tradeHome;
/**
* 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();
String symbol = null;
QuoteDataBean quoteData = null;
Trade trade = null;
StringBuffer output = new StringBuffer(100);
output.append(
"<html><head><title>PingServlet2TwoPhase</title></head>"
+ "<body><HR><FONT size=\"+2\" color=\"#000066\">PingServlet2TwoPhase<BR></FONT>"
+ "<FONT size=\"-1\" color=\"#000066\">"
+ "PingServlet2TwoPhase tests the path of a Servlet calling a Session EJB "
+ "which in turn calls an Entity EJB to read a DB row (quote). The Session EJB "
+ "then posts a message to a JMS Queue. "
+ "<BR> These operations are wrapped in a 2-phase commit<BR>");
try
{
//only want to do this once.
if (tradeHome == null)
{
//only want one thread to create the EjbHome
synchronized (lock)
{
if (tradeHome == null)
{
//out.println("doing JNDI lookup and creating new reference to trade.TradeHome");
output.append("<HR><B>Performing JNDI lookup to create new tradeHome</B>");
try
{
//I am going to use the System env. that is set through TradeConfig
InitialContext ic = new InitialContext();
tradeHome =
(TradeHome) PortableRemoteObject.narrow(
ic.lookup("java:comp/env/ejb/Trade"),
TradeHome.class);
}
catch (Exception ne)
{
Log.error(ne, "PingServlet2TwoPhase.goGet(...): exception caught looking up and narrowing 'TradeHome'");
throw ne;
}
}
}
}
try
{
int iter = TradeConfig.getPrimIterations();
for (int ii = 0; ii < iter; ii++) {
symbol = TradeConfig.rndSymbol();
trade = tradeHome.create();
//getQuote will call findQuote which will instaniate the Quote Entity Bean
//and then will return a QuoteObject
quoteData = trade.pingTwoPhase(symbol);
trade.remove();
}
}
catch (Exception ne)
{
Log.error(ne, "PingServlet2TwoPhase.goGet(...): exception getting QuoteData through Trade");
throw ne;
}
output.append("<HR>initTime: " + initTime).append(
"<BR>Hit Count: " + hitCount++);
output.append("<HR>Two phase ping selected a quote and sent a message to TradeBrokerQueue JMS queue<BR>Quote Information<BR><BR>" + quoteData.toHTML());
out.println(output.toString());
}
catch (Exception e)
{
Log.error(e, "PingServlet2TwoPhase.doGet(...): General Exception caught");
res.sendError(500, "General Exception caught, " + 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 Session to Entity EJB and JMS -- 2-phase commit 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;
tradeHome = null;
initTime = new java.util.Date().toString();
//this is for synchronization
lock = new Integer(99);
}
private java.lang.Integer lock;
}