You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2008/12/05 16:57:46 UTC
svn commit: r723775 [4/5] - in /tomcat/trunk: java/org/apache/juli/
modules/bayeux/ modules/bayeux/java/org/apache/cometd/bayeux/
modules/bayeux/java/org/apache/tomcat/bayeux/
modules/bayeux/java/org/apache/tomcat/bayeux/request/
modules/bayeux/test/or...
Modified: tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java (original)
+++ tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java Fri Dec 5 07:57:43 2008
@@ -1,215 +1,215 @@
-package org.apache.cometd.bayeux.samples;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletContextAttributeEvent;
-import org.apache.cometd.bayeux.Bayeux;
-
-import java.text.DecimalFormat;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.cometd.bayeux.Client;
-import org.apache.cometd.bayeux.Listener;
-import org.apache.cometd.bayeux.Message;
-import org.apache.cometd.bayeux.Channel;
-
-public class BayeuxStockTicker implements ServletContextListener,
- ServletContextAttributeListener, Listener {
-
- static AtomicInteger counter = new AtomicInteger(0);
- protected int id;
- protected Bayeux b;
- protected Client c;
- protected boolean alive = true;
- protected boolean initialized = false;
- protected TickerThread tt = new TickerThread();
-
- public BayeuxStockTicker() {
- id = counter.incrementAndGet();
- System.out.println("new listener created with id:" + id);
- }
-
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- alive = false;
- tt.run = false;
- tt.interrupt();
- }
-
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- }
-
- public void attributeAdded(ServletContextAttributeEvent scae) {
- if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
- if (initialized) return;
- initialized = true;
- System.out.println("Starting stock ticker server client!");
- b = (Bayeux) scae.getValue();
- c = b.newClient("stock-ticker-", this);
- tt.start();
- }
- }
-
- public void attributeRemoved(ServletContextAttributeEvent scae) {
- if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
- initialized = false;
- b = (Bayeux) scae.getValue();
- List<Channel> chs = b.getChannels();
- for (Channel ch : chs) {
- ch.unsubscribe(c);
- }
- }
- }
-
- public void attributeReplaced(
- ServletContextAttributeEvent servletContextAttributeEvent) {
- }
-
- public void removed(boolean timeout) {
- System.out.println("Client removed.");
- }
-
- public void deliver(Message[] msgs) {
- for (int i = 0; msgs != null && i < msgs.length; i++) {
- Message msg = msgs[i];
- System.out.println("[stock ticker server client ]received message:" + msg);
- }
- }
-
- public class TickerThread extends Thread {
- public boolean run = true;
-
- public TickerThread() {
- setName("Ticker Thread");
- }
-
- public void run() {
- try {
-
- Stock[] stocks = new Stock[] {
- new Stock("GOOG", 435.43),
- new Stock("YHOO", 27.88),
- new Stock("SPRG", 1015.55), };
- for (Stock s : stocks) {
- Channel ch = b.getChannel("/stock/"+s.getSymbol(), true);
- ch.subscribe(c);
-
- }
- Random r = new Random(System.currentTimeMillis());
- while (run) {
- for (int j = 0; j < 1; j++) {
- int i = r.nextInt() % 3;
- if (i < 0)
- i = i * (-1);
- Stock stock = stocks[i];
- double change = r.nextDouble();
- boolean plus = r.nextBoolean();
- if (plus) {
- stock.setValue(stock.getValue() + change);
- } else {
- stock.setValue(stock.getValue() - change);
- }
- Channel ch = b.getChannel("/stock/"+stock.getSymbol(), true);
- Message m = b.newMessage(c);
- m.put("stock", stock.toString());
- m.put("symbol", stock.getSymbol());
- m.put("price", stock.getValueAsString());
- m.put("change", stock.getLastChangeAsString());
- ch.publish(m);
- System.out.println("Stock: "+stock.getSymbol()+" Price: "+stock.getValueAsString()+" Change: "+stock.getLastChangeAsString());
- }
- Thread.sleep(850);
- }
- } catch (InterruptedException ix) {
-
- } catch (Exception x) {
- x.printStackTrace();
- }
- }
- }
-
- public static class Stock {
- protected static DecimalFormat df = new DecimalFormat("0.00");
- protected String symbol = "";
- protected double value = 0.0d;
- protected double lastchange = 0.0d;
- protected int cnt = 0;
-
- public Stock(String symbol, double initvalue) {
- this.symbol = symbol;
- this.value = initvalue;
- }
-
- public void setCnt(int c) {
- this.cnt = c;
- }
-
- public int getCnt() {
- return cnt;
- }
-
- public String getSymbol() {
- return symbol;
- }
-
- public double getValue() {
- return value;
- }
-
- public void setValue(double value) {
- double old = this.value;
- this.value = value;
- this.lastchange = value - old;
- }
-
- public String getValueAsString() {
- return df.format(value);
- }
-
- public double getLastChange() {
- return this.lastchange;
- }
-
- public void setLastChange(double lastchange) {
- this.lastchange = lastchange;
- }
-
- public String getLastChangeAsString() {
- return df.format(lastchange);
- }
-
- public int hashCode() {
- return symbol.hashCode();
- }
-
- public boolean equals(Object other) {
- if (other instanceof Stock) {
- return this.symbol.equals(((Stock) other).symbol);
- } else {
- return false;
- }
- }
-
- public String toString(){
- StringBuffer buf = new StringBuffer("STOCK#");
- buf.append(getSymbol());
- buf.append("#");
- buf.append(getValueAsString());
- buf.append("#");
- buf.append(getLastChangeAsString());
- buf.append("#");
- buf.append(String.valueOf(getCnt()));
- return buf.toString();
-
- }
-
- public Object clone() {
- Stock s = new Stock(this.getSymbol(), this.getValue());
- s.setLastChange(this.getLastChange());
- s.setCnt(this.cnt);
- return s;
- }
- }
-
+package org.apache.cometd.bayeux.samples;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextAttributeEvent;
+import org.apache.cometd.bayeux.Bayeux;
+
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Listener;
+import org.apache.cometd.bayeux.Message;
+import org.apache.cometd.bayeux.Channel;
+
+public class BayeuxStockTicker implements ServletContextListener,
+ ServletContextAttributeListener, Listener {
+
+ static AtomicInteger counter = new AtomicInteger(0);
+ protected int id;
+ protected Bayeux b;
+ protected Client c;
+ protected boolean alive = true;
+ protected boolean initialized = false;
+ protected TickerThread tt = new TickerThread();
+
+ public BayeuxStockTicker() {
+ id = counter.incrementAndGet();
+ System.out.println("new listener created with id:" + id);
+ }
+
+ public void contextDestroyed(ServletContextEvent servletContextEvent) {
+ alive = false;
+ tt.run = false;
+ tt.interrupt();
+ }
+
+ public void contextInitialized(ServletContextEvent servletContextEvent) {
+ }
+
+ public void attributeAdded(ServletContextAttributeEvent scae) {
+ if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ if (initialized) return;
+ initialized = true;
+ System.out.println("Starting stock ticker server client!");
+ b = (Bayeux) scae.getValue();
+ c = b.newClient("stock-ticker-", this);
+ tt.start();
+ }
+ }
+
+ public void attributeRemoved(ServletContextAttributeEvent scae) {
+ if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ initialized = false;
+ b = (Bayeux) scae.getValue();
+ List<Channel> chs = b.getChannels();
+ for (Channel ch : chs) {
+ ch.unsubscribe(c);
+ }
+ }
+ }
+
+ public void attributeReplaced(
+ ServletContextAttributeEvent servletContextAttributeEvent) {
+ }
+
+ public void removed(boolean timeout) {
+ System.out.println("Client removed.");
+ }
+
+ public void deliver(Message[] msgs) {
+ for (int i = 0; msgs != null && i < msgs.length; i++) {
+ Message msg = msgs[i];
+ System.out.println("[stock ticker server client ]received message:" + msg);
+ }
+ }
+
+ public class TickerThread extends Thread {
+ public boolean run = true;
+
+ public TickerThread() {
+ setName("Ticker Thread");
+ }
+
+ public void run() {
+ try {
+
+ Stock[] stocks = new Stock[] {
+ new Stock("GOOG", 435.43),
+ new Stock("YHOO", 27.88),
+ new Stock("SPRG", 1015.55), };
+ for (Stock s : stocks) {
+ Channel ch = b.getChannel("/stock/"+s.getSymbol(), true);
+ ch.subscribe(c);
+
+ }
+ Random r = new Random(System.currentTimeMillis());
+ while (run) {
+ for (int j = 0; j < 1; j++) {
+ int i = r.nextInt() % 3;
+ if (i < 0)
+ i = i * (-1);
+ Stock stock = stocks[i];
+ double change = r.nextDouble();
+ boolean plus = r.nextBoolean();
+ if (plus) {
+ stock.setValue(stock.getValue() + change);
+ } else {
+ stock.setValue(stock.getValue() - change);
+ }
+ Channel ch = b.getChannel("/stock/"+stock.getSymbol(), true);
+ Message m = b.newMessage(c);
+ m.put("stock", stock.toString());
+ m.put("symbol", stock.getSymbol());
+ m.put("price", stock.getValueAsString());
+ m.put("change", stock.getLastChangeAsString());
+ ch.publish(m);
+ System.out.println("Stock: "+stock.getSymbol()+" Price: "+stock.getValueAsString()+" Change: "+stock.getLastChangeAsString());
+ }
+ Thread.sleep(850);
+ }
+ } catch (InterruptedException ix) {
+
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+ }
+
+ public static class Stock {
+ protected static DecimalFormat df = new DecimalFormat("0.00");
+ protected String symbol = "";
+ protected double value = 0.0d;
+ protected double lastchange = 0.0d;
+ protected int cnt = 0;
+
+ public Stock(String symbol, double initvalue) {
+ this.symbol = symbol;
+ this.value = initvalue;
+ }
+
+ public void setCnt(int c) {
+ this.cnt = c;
+ }
+
+ public int getCnt() {
+ return cnt;
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public void setValue(double value) {
+ double old = this.value;
+ this.value = value;
+ this.lastchange = value - old;
+ }
+
+ public String getValueAsString() {
+ return df.format(value);
+ }
+
+ public double getLastChange() {
+ return this.lastchange;
+ }
+
+ public void setLastChange(double lastchange) {
+ this.lastchange = lastchange;
+ }
+
+ public String getLastChangeAsString() {
+ return df.format(lastchange);
+ }
+
+ public int hashCode() {
+ return symbol.hashCode();
+ }
+
+ public boolean equals(Object other) {
+ if (other instanceof Stock) {
+ return this.symbol.equals(((Stock) other).symbol);
+ } else {
+ return false;
+ }
+ }
+
+ public String toString(){
+ StringBuffer buf = new StringBuffer("STOCK#");
+ buf.append(getSymbol());
+ buf.append("#");
+ buf.append(getValueAsString());
+ buf.append("#");
+ buf.append(getLastChangeAsString());
+ buf.append("#");
+ buf.append(String.valueOf(getCnt()));
+ return buf.toString();
+
+ }
+
+ public Object clone() {
+ Stock s = new Stock(this.getSymbol(), this.getValue());
+ s.setLastChange(this.getLastChange());
+ s.setCnt(this.cnt);
+ return s;
+ }
+ }
+
}
\ No newline at end of file
Propchange: tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/EchoChatClient.java?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/EchoChatClient.java (original)
+++ tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/EchoChatClient.java Fri Dec 5 07:57:43 2008
@@ -1,101 +1,101 @@
-package org.apache.cometd.bayeux.samples;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletContextAttributeEvent;
-import org.apache.cometd.bayeux.Bayeux;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.cometd.bayeux.Client;
-import org.apache.cometd.bayeux.Listener;
-import org.apache.cometd.bayeux.Message;
-import org.apache.cometd.bayeux.Channel;
-
-public class EchoChatClient implements ServletContextListener, ServletContextAttributeListener, Listener {
-
- static AtomicInteger counter = new AtomicInteger(0);
- protected int id;
- protected Bayeux b;
- protected Client c;
- protected boolean alive = true;
- protected TimestampThread tt = new TimestampThread();
-
- public EchoChatClient() {
- id = counter.incrementAndGet();
- System.out.println("new listener created with id:"+id);
- }
-
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- alive = false;
- tt.interrupt();
- }
-
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- }
-
- public void attributeAdded(ServletContextAttributeEvent scae) {
- if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
- System.out.println("Starting echo chat client!");
- b = (Bayeux)scae.getValue();
- c = b.newClient("echochat-",this);
- Channel ch = b.getChannel("/chat/demo",true);
- ch.subscribe(c);
- tt.start();
- }
- }
-
- public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
- }
-
- public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
- }
-
- public void removed(boolean timeout) {
- System.out.println("Client removed.");
- }
-
- public void deliver(Message[] msgs) {
- for (int i=0; msgs!=null && i<msgs.length; i++) {
- Message msg = msgs[i];
- System.out.println("[echochatclient ]received message:" + msg);
- Message m = b.newMessage(c);
- m.putAll(msg);
- //echo the same message
- m.put("user", "echochatserver");
- if (m.containsKey("msg")) {
- //simple chat demo
- String chat = (String) m.get("msg");
- m.put("msg", "echochatserver|I received your message-" + chat.substring(chat.indexOf("|") + 1));
- }
- System.out.println("[echochatclient ]sending message:" + m);
- msg.getChannel().publish(m);
- }
- }
-
- public class TimestampThread extends Thread {
- public TimestampThread() {
- setDaemon(true);
- }
-
- public void run() {
- while (alive) {
- try {
- sleep(5000);
- Channel ch = b.getChannel("/chat/demo",false);
- if (ch.getSubscribers().size()<=1) {
- continue;
- }
- Message m = b.newMessage(c);
- m.put("user","echochatserver");
- m.put("chat","Time is:"+new java.sql.Date(System.currentTimeMillis()).toLocaleString());
- m.put("join",false);
- ch.publish(m);
- }catch (InterruptedException ignore) {
- Thread.currentThread().interrupted();
- }catch (Exception x) {
- x.printStackTrace();
- }
- }
- }
- }
-}
+package org.apache.cometd.bayeux.samples;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextAttributeEvent;
+import org.apache.cometd.bayeux.Bayeux;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Listener;
+import org.apache.cometd.bayeux.Message;
+import org.apache.cometd.bayeux.Channel;
+
+public class EchoChatClient implements ServletContextListener, ServletContextAttributeListener, Listener {
+
+ static AtomicInteger counter = new AtomicInteger(0);
+ protected int id;
+ protected Bayeux b;
+ protected Client c;
+ protected boolean alive = true;
+ protected TimestampThread tt = new TimestampThread();
+
+ public EchoChatClient() {
+ id = counter.incrementAndGet();
+ System.out.println("new listener created with id:"+id);
+ }
+
+ public void contextDestroyed(ServletContextEvent servletContextEvent) {
+ alive = false;
+ tt.interrupt();
+ }
+
+ public void contextInitialized(ServletContextEvent servletContextEvent) {
+ }
+
+ public void attributeAdded(ServletContextAttributeEvent scae) {
+ if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ System.out.println("Starting echo chat client!");
+ b = (Bayeux)scae.getValue();
+ c = b.newClient("echochat-",this);
+ Channel ch = b.getChannel("/chat/demo",true);
+ ch.subscribe(c);
+ tt.start();
+ }
+ }
+
+ public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
+ }
+
+ public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
+ }
+
+ public void removed(boolean timeout) {
+ System.out.println("Client removed.");
+ }
+
+ public void deliver(Message[] msgs) {
+ for (int i=0; msgs!=null && i<msgs.length; i++) {
+ Message msg = msgs[i];
+ System.out.println("[echochatclient ]received message:" + msg);
+ Message m = b.newMessage(c);
+ m.putAll(msg);
+ //echo the same message
+ m.put("user", "echochatserver");
+ if (m.containsKey("msg")) {
+ //simple chat demo
+ String chat = (String) m.get("msg");
+ m.put("msg", "echochatserver|I received your message-" + chat.substring(chat.indexOf("|") + 1));
+ }
+ System.out.println("[echochatclient ]sending message:" + m);
+ msg.getChannel().publish(m);
+ }
+ }
+
+ public class TimestampThread extends Thread {
+ public TimestampThread() {
+ setDaemon(true);
+ }
+
+ public void run() {
+ while (alive) {
+ try {
+ sleep(5000);
+ Channel ch = b.getChannel("/chat/demo",false);
+ if (ch.getSubscribers().size()<=1) {
+ continue;
+ }
+ Message m = b.newMessage(c);
+ m.put("user","echochatserver");
+ m.put("chat","Time is:"+new java.sql.Date(System.currentTimeMillis()).toLocaleString());
+ m.put("join",false);
+ ch.publish(m);
+ }catch (InterruptedException ignore) {
+ Thread.currentThread().interrupted();
+ }catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+ }
+ }
+}
Propchange: tomcat/trunk/modules/bayeux/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/bayeux/webapps/cometd/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/bayeux/webapps/cometd/WEB-INF/web.xml?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/bayeux/webapps/cometd/WEB-INF/web.xml (original)
+++ tomcat/trunk/modules/bayeux/webapps/cometd/WEB-INF/web.xml Fri Dec 5 07:57:43 2008
@@ -1,37 +1,37 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<web-app
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
- <display-name>Cometd Test WebApp</display-name>
-
- <servlet>
- <servlet-name>cometd</servlet-name>
- <servlet-class>org.apache.tomcat.bayeux.BayeuxServlet</servlet-class>
- <init-param>
- <param-name>timeout</param-name>
- <param-value>120000000</param-value>
- </init-param>
- <init-param>
- <param-name>reconnectInterval</param-name>
- <param-value>250</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>cometd</servlet-name>
- <url-pattern>/cometd/*</url-pattern>
- </servlet-mapping>
-
- <listener>
- <listener-class>org.apache.cometd.bayeux.samples.EchoChatClient</listener-class>
- </listener>
- <listener>
- <listener-class>org.apache.cometd.bayeux.samples.BayeuxStockTicker</listener-class>
- </listener>
-
-</web-app>
-
-
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ version="2.5">
+ <display-name>Cometd Test WebApp</display-name>
+
+ <servlet>
+ <servlet-name>cometd</servlet-name>
+ <servlet-class>org.apache.tomcat.bayeux.BayeuxServlet</servlet-class>
+ <init-param>
+ <param-name>timeout</param-name>
+ <param-value>120000000</param-value>
+ </init-param>
+ <init-param>
+ <param-name>reconnectInterval</param-name>
+ <param-value>250</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>cometd</servlet-name>
+ <url-pattern>/cometd/*</url-pattern>
+ </servlet-mapping>
+
+ <listener>
+ <listener-class>org.apache.cometd.bayeux.samples.EchoChatClient</listener-class>
+ </listener>
+ <listener>
+ <listener-class>org.apache.cometd.bayeux.samples.BayeuxStockTicker</listener-class>
+ </listener>
+
+</web-app>
+
+
Propchange: tomcat/trunk/modules/bayeux/webapps/cometd/WEB-INF/web.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/bayeux/webapps/cometd/examples/simplechat/ticker.html
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/bayeux/webapps/cometd/examples/simplechat/ticker.html?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/bayeux/webapps/cometd/examples/simplechat/ticker.html (original)
+++ tomcat/trunk/modules/bayeux/webapps/cometd/examples/simplechat/ticker.html Fri Dec 5 07:57:43 2008
@@ -1,128 +1,128 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" >
-<title>Bayeux Stock Ticker</title>
-<script type="text/javascript" src="../../dojo/dojo.js.uncompressed.js"></script>
-<script type="text/javascript" src="../../dojox/cometd.js"></script>
-<script type="text/javascript" src="../../dojox/cometd/_base.js"></script>
-<script type="text/javascript">
-
-dojo.require("dojox.cometd");
-
-dojo.addOnUnload(function() {
- dojox.cometd.init("/cometd/cometd");
- dojox.cometd.startBatch();
- dojox.cometd.unsubscribe("/stock/GOOG", this,"");
- dojox.cometd.unsubscribe("/stock/YHOO", this,"");
- dojox.cometd.unsubscribe("/stock/SPRG", this,"");
- dojox.cometd.endBatch();
- });
-
-
-dojo.addOnLoad(function() {
- dojox.cometd.init("/cometd/cometd");
- dojox.cometd.startBatch();
- dojox.cometd.subscribe("/stock/GOOG", onMsgEvent);
- dojox.cometd.subscribe("/stock/YHOO", onMsgEvent);
- dojox.cometd.subscribe("/stock/SPRG", onMsgEvent);
- dojox.cometd.endBatch();
-});
-
-
-function subscribe(box, symbol) {
- if (box.checked) {
- dojox.cometd.subscribe("/stock/"+symbol, onMsgEvent);
- var rowCurrent = dojo.byId("row."+symbol);
- rowCurrent.bgColor="white";
- } else {
- dojox.cometd.unsubscribe("/stock/"+symbol, onMsgEvent);
- var rowCurrent = dojo.byId("row."+symbol);
- rowCurrent.bgColor="gray";
- }
-}
-
-function removeChildrenFromNode(node)
-{
- if(node == undefined || node == null)
- {
- return;
- }
-
- var len = node.childNodes.length;
-
- while (node.hasChildNodes())
- {
- node.removeChild(node.firstChild);
- }
-}
-
-function onMsgEvent(event) {
- // Break apart the text string into screen name and message parts.
- var symbol = event.data.symbol;
- var price = event.data.price;
- var pricechange = event.data.change;
- //alert("symbol: "+symbol+" price: "+price+" change: "+pricechange);
-
- var pricenode = dojo.byId("price."+symbol);
- var changenode = dojo.byId("change."+symbol);
- removeChildrenFromNode(pricenode);
- removeChildrenFromNode(changenode);
- var pricelabel = document.createTextNode(price);
- pricelabel.value = price;
- var changelabel = document.createTextNode(pricechange);
- changelabel.value = pricechange;
- pricenode.appendChild(pricelabel);
- changenode.appendChild(changelabel);
-
- var table = dojo.byId("stocktable");
- var rows = table.getElementsByTagName("tr");
- for(i = 0; i < rows.length; i++){
- if (rows[i].bgColor != "gray") {
- rows[i].bgColor = "white";
- }
- }
- //manipulate rows
- var rowCurrent = dojo.byId("row."+symbol);
- if (pricechange<=0) {
- rowCurrent.bgColor = "red";
- } else {
- rowCurrent.bgColor = "cyan";
- }
-}
-
-
-</script>
-</head>
-<body bgcolor="#ffffff">
-<h1 align="center">Bayeux Stock Ticker</h1>
-<h2 align="left"> </h2>
-<p>
-<table id="stocktable" cellspacing="0" cellpadding="3" width="100%" align="center" border="0">
- <tr id="row.HEADER">
- <td>SYMBOL</td>
- <td>PRICE</td>
- <td>LAST CHANGE</td>
- <td>SUBSCRIBE</td></tr>
- <tr id="row.SPRG">
- <td>SPRG</td>
- <td id="price.SPRG"></td>
- <td id="change.SPRG"></td>
- <td id="check.SPRG"><input type="checkbox" id="check.SPRG" checked onClick="subscribe(this,'SPRG')"></td>
- </tr>
- <tr id="row.GOOG">
- <td>GOOG</td>
- <td id="price.GOOG"></td>
- <td id="change.GOOG"></td>
- <td id="check.GOOG"><input type="checkbox" id="check.GOOG" checked onClick="subscribe(this,'GOOG')"></td>
- </tr>
- <tr id="row.YHOO">
- <td>YHOO</td>
- <td id="price.YHOO"></td>
- <td id="change.YHOO"></td>
- <td id="check.YHOO"><input type="checkbox" id="check.GOOG" checked onClick="subscribe(this,'YHOO')"></td>
- </tr>
-</table>
-</p>
-</body>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" >
+<title>Bayeux Stock Ticker</title>
+<script type="text/javascript" src="../../dojo/dojo.js.uncompressed.js"></script>
+<script type="text/javascript" src="../../dojox/cometd.js"></script>
+<script type="text/javascript" src="../../dojox/cometd/_base.js"></script>
+<script type="text/javascript">
+
+dojo.require("dojox.cometd");
+
+dojo.addOnUnload(function() {
+ dojox.cometd.init("/cometd/cometd");
+ dojox.cometd.startBatch();
+ dojox.cometd.unsubscribe("/stock/GOOG", this,"");
+ dojox.cometd.unsubscribe("/stock/YHOO", this,"");
+ dojox.cometd.unsubscribe("/stock/SPRG", this,"");
+ dojox.cometd.endBatch();
+ });
+
+
+dojo.addOnLoad(function() {
+ dojox.cometd.init("/cometd/cometd");
+ dojox.cometd.startBatch();
+ dojox.cometd.subscribe("/stock/GOOG", onMsgEvent);
+ dojox.cometd.subscribe("/stock/YHOO", onMsgEvent);
+ dojox.cometd.subscribe("/stock/SPRG", onMsgEvent);
+ dojox.cometd.endBatch();
+});
+
+
+function subscribe(box, symbol) {
+ if (box.checked) {
+ dojox.cometd.subscribe("/stock/"+symbol, onMsgEvent);
+ var rowCurrent = dojo.byId("row."+symbol);
+ rowCurrent.bgColor="white";
+ } else {
+ dojox.cometd.unsubscribe("/stock/"+symbol, onMsgEvent);
+ var rowCurrent = dojo.byId("row."+symbol);
+ rowCurrent.bgColor="gray";
+ }
+}
+
+function removeChildrenFromNode(node)
+{
+ if(node == undefined || node == null)
+ {
+ return;
+ }
+
+ var len = node.childNodes.length;
+
+ while (node.hasChildNodes())
+ {
+ node.removeChild(node.firstChild);
+ }
+}
+
+function onMsgEvent(event) {
+ // Break apart the text string into screen name and message parts.
+ var symbol = event.data.symbol;
+ var price = event.data.price;
+ var pricechange = event.data.change;
+ //alert("symbol: "+symbol+" price: "+price+" change: "+pricechange);
+
+ var pricenode = dojo.byId("price."+symbol);
+ var changenode = dojo.byId("change."+symbol);
+ removeChildrenFromNode(pricenode);
+ removeChildrenFromNode(changenode);
+ var pricelabel = document.createTextNode(price);
+ pricelabel.value = price;
+ var changelabel = document.createTextNode(pricechange);
+ changelabel.value = pricechange;
+ pricenode.appendChild(pricelabel);
+ changenode.appendChild(changelabel);
+
+ var table = dojo.byId("stocktable");
+ var rows = table.getElementsByTagName("tr");
+ for(i = 0; i < rows.length; i++){
+ if (rows[i].bgColor != "gray") {
+ rows[i].bgColor = "white";
+ }
+ }
+ //manipulate rows
+ var rowCurrent = dojo.byId("row."+symbol);
+ if (pricechange<=0) {
+ rowCurrent.bgColor = "red";
+ } else {
+ rowCurrent.bgColor = "cyan";
+ }
+}
+
+
+</script>
+</head>
+<body bgcolor="#ffffff">
+<h1 align="center">Bayeux Stock Ticker</h1>
+<h2 align="left"> </h2>
+<p>
+<table id="stocktable" cellspacing="0" cellpadding="3" width="100%" align="center" border="0">
+ <tr id="row.HEADER">
+ <td>SYMBOL</td>
+ <td>PRICE</td>
+ <td>LAST CHANGE</td>
+ <td>SUBSCRIBE</td></tr>
+ <tr id="row.SPRG">
+ <td>SPRG</td>
+ <td id="price.SPRG"></td>
+ <td id="change.SPRG"></td>
+ <td id="check.SPRG"><input type="checkbox" id="check.SPRG" checked onClick="subscribe(this,'SPRG')"></td>
+ </tr>
+ <tr id="row.GOOG">
+ <td>GOOG</td>
+ <td id="price.GOOG"></td>
+ <td id="change.GOOG"></td>
+ <td id="check.GOOG"><input type="checkbox" id="check.GOOG" checked onClick="subscribe(this,'GOOG')"></td>
+ </tr>
+ <tr id="row.YHOO">
+ <td>YHOO</td>
+ <td id="price.YHOO"></td>
+ <td id="change.YHOO"></td>
+ <td id="check.YHOO"><input type="checkbox" id="check.GOOG" checked onClick="subscribe(this,'YHOO')"></td>
+ </tr>
+</table>
+</p>
+</body>
</html>
\ No newline at end of file
Propchange: tomcat/trunk/modules/bayeux/webapps/cometd/examples/simplechat/ticker.html
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/bayeux/webapps/cometd/index.html
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/bayeux/webapps/cometd/index.html?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/bayeux/webapps/cometd/index.html (original)
+++ tomcat/trunk/modules/bayeux/webapps/cometd/index.html Fri Dec 5 07:57:43 2008
@@ -1,7 +1,7 @@
-
-<h1>Cometd demo</h1>
-
-<p>
-Try the <a href="examples/simplechat/cometdchat.htm">Simple Chat Demo</a>.</br>
-Try the <a href="examples/simplechat/ticker.html">Stock Ticker Demo</a>.</br>
-</p>
+
+<h1>Cometd demo</h1>
+
+<p>
+Try the <a href="examples/simplechat/cometdchat.htm">Simple Chat Demo</a>.</br>
+Try the <a href="examples/simplechat/ticker.html">Stock Ticker Demo</a>.</br>
+</p>
Propchange: tomcat/trunk/modules/bayeux/webapps/cometd/index.html
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/doc/changelog.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java Fri Dec 5 07:57:43 2008
@@ -1,135 +1,135 @@
-/*
- * 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.
- */
-package org.apache.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Method;
-import java.sql.SQLException;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.DataSourceFactory;
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-import org.apache.tomcat.jdbc.pool.PoolProperties;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Interceptor that keep track of connection state to avoid roundtrips to the database
- * @author fhanik
- *
- */
-
-public class ConnectionState extends JdbcInterceptor {
- protected static Log log = LogFactory.getLog(ConnectionState.class);
-
- protected final String[] readState = {"getAutoCommit","getTransactionIsolation","isReadOnly","getCatalog"};
- protected final String[] writeState = {"setAutoCommit","setTransactionIsolation","setReadOnly","setCatalog"};
-
- protected Boolean autoCommit = null;
- protected Integer transactionIsolation = null;
- protected Boolean readOnly = null;
- protected String catalog = null;
-
-
- public void reset(ConnectionPool parent, PooledConnection con) {
- PoolProperties poolProperties = parent.getPoolProperties();
- if (poolProperties.getDefaultReadOnly()!=null) {
- try {
- if (readOnly==null || readOnly.booleanValue()!=poolProperties.getDefaultReadOnly().booleanValue()) {
- con.getConnection().setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
- readOnly = poolProperties.getDefaultReadOnly();
- }
- }catch (SQLException x) {
- readOnly = null;
- log.error("Unable to reset readonly state to connection.",x);
- }
- }
- if (poolProperties.getDefaultAutoCommit()!=null) {
- try {
- if (autoCommit==null || autoCommit.booleanValue()!=poolProperties.getDefaultAutoCommit().booleanValue()) {
- con.getConnection().setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
- autoCommit = poolProperties.getDefaultAutoCommit();
- }
- }catch (SQLException x) {
- autoCommit = null;
- log.error("Unable to reset autocommit state to connection.",x);
- }
- }
- if (poolProperties.getDefaultCatalog()!=null) {
- try {
- if (catalog==null || (!catalog.equals(poolProperties.getDefaultCatalog()))) {
- con.getConnection().setCatalog(poolProperties.getDefaultCatalog());
- catalog = poolProperties.getDefaultCatalog();
- }
- }catch (SQLException x) {
- catalog = null;
- log.error("Unable to reset default catalog state to connection.",x);
- }
- }
- if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION) {
- try {
- if (transactionIsolation==null || transactionIsolation.intValue()!=poolProperties.getDefaultTransactionIsolation()) {
- con.getConnection().setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
- transactionIsolation = poolProperties.getDefaultTransactionIsolation();
- }
- }catch (SQLException x) {
- transactionIsolation = null;
- log.error("Unable to reset transaction isolation state to connection.",x);
- }
- }
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String name = method.getName();
- boolean read = false;
- int index = -1;
- for (int i=0; (!read) && i<readState.length; i++) {
- read = compare(name,readState[i]);
- if (read) index = i;
- }
- boolean write = false;
- for (int i=0; (!write) && (!read) && i<writeState.length; i++) {
- write = compare(name,writeState[i]);
- if (write) index = i;
- }
- Object result = null;
- if (read) {
- switch (index) {
- case 0:{result = autoCommit; break;}
- case 1:{result = transactionIsolation; break;}
- case 2:{result = readOnly; break;}
- case 3:{result = catalog; break;}
- default: result = null;
- }
- //return cached result, if we have it
- if (result!=null) return result;
- }
-
- result = super.invoke(proxy, method, args);
- if (read || write) {
- switch (index) {
- case 0:{autoCommit = (Boolean) (read?result:args[0]); break;}
- case 1:{transactionIsolation = (Integer)(read?result:args[0]); break;}
- case 2:{readOnly = (Boolean)(read?result:args[0]); break;}
- case 3:{catalog = (String)(read?result:args[0]); break;}
- }
- }
- return result;
- }
-
-}
+/*
+ * 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.
+ */
+package org.apache.tomcat.jdbc.pool.interceptor;
+
+import java.lang.reflect.Method;
+import java.sql.SQLException;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
+import org.apache.tomcat.jdbc.pool.DataSourceFactory;
+import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
+import org.apache.tomcat.jdbc.pool.PoolProperties;
+import org.apache.tomcat.jdbc.pool.PooledConnection;
+
+/**
+ * Interceptor that keep track of connection state to avoid roundtrips to the database
+ * @author fhanik
+ *
+ */
+
+public class ConnectionState extends JdbcInterceptor {
+ protected static Log log = LogFactory.getLog(ConnectionState.class);
+
+ protected final String[] readState = {"getAutoCommit","getTransactionIsolation","isReadOnly","getCatalog"};
+ protected final String[] writeState = {"setAutoCommit","setTransactionIsolation","setReadOnly","setCatalog"};
+
+ protected Boolean autoCommit = null;
+ protected Integer transactionIsolation = null;
+ protected Boolean readOnly = null;
+ protected String catalog = null;
+
+
+ public void reset(ConnectionPool parent, PooledConnection con) {
+ PoolProperties poolProperties = parent.getPoolProperties();
+ if (poolProperties.getDefaultReadOnly()!=null) {
+ try {
+ if (readOnly==null || readOnly.booleanValue()!=poolProperties.getDefaultReadOnly().booleanValue()) {
+ con.getConnection().setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
+ readOnly = poolProperties.getDefaultReadOnly();
+ }
+ }catch (SQLException x) {
+ readOnly = null;
+ log.error("Unable to reset readonly state to connection.",x);
+ }
+ }
+ if (poolProperties.getDefaultAutoCommit()!=null) {
+ try {
+ if (autoCommit==null || autoCommit.booleanValue()!=poolProperties.getDefaultAutoCommit().booleanValue()) {
+ con.getConnection().setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
+ autoCommit = poolProperties.getDefaultAutoCommit();
+ }
+ }catch (SQLException x) {
+ autoCommit = null;
+ log.error("Unable to reset autocommit state to connection.",x);
+ }
+ }
+ if (poolProperties.getDefaultCatalog()!=null) {
+ try {
+ if (catalog==null || (!catalog.equals(poolProperties.getDefaultCatalog()))) {
+ con.getConnection().setCatalog(poolProperties.getDefaultCatalog());
+ catalog = poolProperties.getDefaultCatalog();
+ }
+ }catch (SQLException x) {
+ catalog = null;
+ log.error("Unable to reset default catalog state to connection.",x);
+ }
+ }
+ if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION) {
+ try {
+ if (transactionIsolation==null || transactionIsolation.intValue()!=poolProperties.getDefaultTransactionIsolation()) {
+ con.getConnection().setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
+ transactionIsolation = poolProperties.getDefaultTransactionIsolation();
+ }
+ }catch (SQLException x) {
+ transactionIsolation = null;
+ log.error("Unable to reset transaction isolation state to connection.",x);
+ }
+ }
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ String name = method.getName();
+ boolean read = false;
+ int index = -1;
+ for (int i=0; (!read) && i<readState.length; i++) {
+ read = compare(name,readState[i]);
+ if (read) index = i;
+ }
+ boolean write = false;
+ for (int i=0; (!write) && (!read) && i<writeState.length; i++) {
+ write = compare(name,writeState[i]);
+ if (write) index = i;
+ }
+ Object result = null;
+ if (read) {
+ switch (index) {
+ case 0:{result = autoCommit; break;}
+ case 1:{result = transactionIsolation; break;}
+ case 2:{result = readOnly; break;}
+ case 3:{result = catalog; break;}
+ default: result = null;
+ }
+ //return cached result, if we have it
+ if (result!=null) return result;
+ }
+
+ result = super.invoke(proxy, method, args);
+ if (read || write) {
+ switch (index) {
+ case 0:{autoCommit = (Boolean) (read?result:args[0]); break;}
+ case 1:{transactionIsolation = (Integer)(read?result:args[0]); break;}
+ case 2:{readOnly = (Boolean)(read?result:args[0]); break;}
+ case 3:{catalog = (String)(read?result:args[0]); break;}
+ }
+ }
+ return result;
+ }
+
+}
Propchange: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java?rev=723775&r1=723774&r2=723775&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java Fri Dec 5 07:57:43 2008
@@ -1,206 +1,206 @@
-/*
- * 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.
- */
-package org.apache.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.CallableStatement;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.Map.Entry;
-
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * @author Filip Hanik
- * @version 1.0
- */
-public class SlowQueryReport extends AbstractCreateStatementInterceptor {
- protected final String[] statements = {"createStatement","prepareStatement","prepareCall"};
- protected final String[] executes = {"execute","executeQuery","executeUpdate","executeBatch"};
-
- protected static IdentityHashMap<ConnectionPool,HashMap<String,QueryStats>> perPoolStats =
- new IdentityHashMap<ConnectionPool,HashMap<String,QueryStats>>();
-
- protected HashMap<String,QueryStats> queries = null;
-
- protected long threshold = 100; //don't report queries less than this
- protected int maxQueries= 1000; //don't store more than this amount of queries
-
-
-
- public SlowQueryReport() {
- super();
- }
-
- public long getThreshold() {
- return threshold;
- }
-
- public void setThreshold(long threshold) {
- this.threshold = threshold;
- }
-
- @Override
- public void closeInvoked() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public Object createStatement(Object proxy, Method method, Object[] args, Object statement) {
- // TODO Auto-generated method stub
- String sql = null;
- if (method.getName().startsWith("prepare")) {
- sql = (args.length>0 && (args[0] instanceof String))?(String)args[0]:null;
- }
- return new StatementProxy(statement,sql);
- }
-
- protected boolean process(final String[] names, Method method, boolean process) {
- for (int i=0; (!process) && i<names.length; i++) {
- process = compare(method.getName(),names[i]);
- }
- return process;
- }
-
- protected class QueryStats {
- private final String query;
- private int nrOfInvocations;
- private long maxInvocationTime;
- private long maxInvocationDate;
- private long minInvocationTime;
- private long minInvocationDate;
- private long totalInvocationTime;
-
- public QueryStats(String query) {
- this.query = query;
- }
-
- public void add(long invocationTime) {
- long now = -1;
- //not thread safe, but don't sacrifice performance for this kind of stuff
- maxInvocationTime = Math.max(invocationTime, maxInvocationTime);
- if (maxInvocationTime == invocationTime) {
- now = System.currentTimeMillis();
- maxInvocationDate = now;
- }
- minInvocationTime = Math.min(invocationTime, minInvocationTime);
- if (minInvocationTime==invocationTime) {
- now = (now==-1)?System.currentTimeMillis():now;
- minInvocationDate = now;
- }
- nrOfInvocations++;
- totalInvocationTime+=invocationTime;
- }
-
- public String getQuery() {
- return query;
- }
-
- public int getNrOfInvocations() {
- return nrOfInvocations;
- }
-
- public long getMaxInvocationTime() {
- return maxInvocationTime;
- }
-
- public long getMaxInvocationDate() {
- return maxInvocationDate;
- }
-
- public long getMinInvocationTime() {
- return minInvocationTime;
- }
-
- public long getMinInvocationDate() {
- return minInvocationDate;
- }
-
- public long getTotalInvocationTime() {
- return totalInvocationTime;
- }
-
- public int hashCode() {
- return query.hashCode();
- }
-
- public boolean equals(Object other) {
- if (other instanceof QueryStats) {
- QueryStats qs = (QueryStats)other;
- return SlowQueryReport.this.compare(qs.query,this.query);
- }
- return false;
- }
- }
-
- protected class StatementProxy implements InvocationHandler {
- protected boolean closed = false;
- protected Object delegate;
- protected final String query;
- public StatementProxy(Object parent, String query) {
- this.delegate = parent;
- this.query = query;
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- final String name = method.getName();
- boolean close = compare(JdbcInterceptor.CLOSE_VAL,name);
- if (close && closed) return null; //allow close to be called multiple times
- if (closed) throw new SQLException("Statement closed.");
- boolean process = false;
- process = process(executes, method, process);
- long start = (process)?System.currentTimeMillis():0;
- //execute the query
- Object result = method.invoke(delegate,args);
- long delta = (process)?(System.currentTimeMillis()-start):0;
- if (delta>threshold) {
- String sql = null;//TODO
- QueryStats qs = SlowQueryReport.this.queries.get(sql);
- if (qs == null) {
- qs = new QueryStats(sql);
- SlowQueryReport.this.queries.put((String)sql,qs);
- }
- qs.add(delta);
- return qs;
- }
- if (close) {
- closed=true;
- delegate = null;
- }
- return result;
- }
- }
-
- public void reset(ConnectionPool parent, PooledConnection con) {
- if (queries==null && SlowQueryReport.perPoolStats.get(parent)==null) {
- queries = new LinkedHashMap<String,QueryStats>() {
- @Override
- protected boolean removeEldestEntry(Entry<String, QueryStats> eldest) {
- return size()>maxQueries;
- }
-
- };
- }
- }
-}
+/*
+ * 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.
+ */
+package org.apache.tomcat.jdbc.pool.interceptor;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.CallableStatement;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
+import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
+import org.apache.tomcat.jdbc.pool.PooledConnection;
+
+/**
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class SlowQueryReport extends AbstractCreateStatementInterceptor {
+ protected final String[] statements = {"createStatement","prepareStatement","prepareCall"};
+ protected final String[] executes = {"execute","executeQuery","executeUpdate","executeBatch"};
+
+ protected static IdentityHashMap<ConnectionPool,HashMap<String,QueryStats>> perPoolStats =
+ new IdentityHashMap<ConnectionPool,HashMap<String,QueryStats>>();
+
+ protected HashMap<String,QueryStats> queries = null;
+
+ protected long threshold = 100; //don't report queries less than this
+ protected int maxQueries= 1000; //don't store more than this amount of queries
+
+
+
+ public SlowQueryReport() {
+ super();
+ }
+
+ public long getThreshold() {
+ return threshold;
+ }
+
+ public void setThreshold(long threshold) {
+ this.threshold = threshold;
+ }
+
+ @Override
+ public void closeInvoked() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Object createStatement(Object proxy, Method method, Object[] args, Object statement) {
+ // TODO Auto-generated method stub
+ String sql = null;
+ if (method.getName().startsWith("prepare")) {
+ sql = (args.length>0 && (args[0] instanceof String))?(String)args[0]:null;
+ }
+ return new StatementProxy(statement,sql);
+ }
+
+ protected boolean process(final String[] names, Method method, boolean process) {
+ for (int i=0; (!process) && i<names.length; i++) {
+ process = compare(method.getName(),names[i]);
+ }
+ return process;
+ }
+
+ protected class QueryStats {
+ private final String query;
+ private int nrOfInvocations;
+ private long maxInvocationTime;
+ private long maxInvocationDate;
+ private long minInvocationTime;
+ private long minInvocationDate;
+ private long totalInvocationTime;
+
+ public QueryStats(String query) {
+ this.query = query;
+ }
+
+ public void add(long invocationTime) {
+ long now = -1;
+ //not thread safe, but don't sacrifice performance for this kind of stuff
+ maxInvocationTime = Math.max(invocationTime, maxInvocationTime);
+ if (maxInvocationTime == invocationTime) {
+ now = System.currentTimeMillis();
+ maxInvocationDate = now;
+ }
+ minInvocationTime = Math.min(invocationTime, minInvocationTime);
+ if (minInvocationTime==invocationTime) {
+ now = (now==-1)?System.currentTimeMillis():now;
+ minInvocationDate = now;
+ }
+ nrOfInvocations++;
+ totalInvocationTime+=invocationTime;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public int getNrOfInvocations() {
+ return nrOfInvocations;
+ }
+
+ public long getMaxInvocationTime() {
+ return maxInvocationTime;
+ }
+
+ public long getMaxInvocationDate() {
+ return maxInvocationDate;
+ }
+
+ public long getMinInvocationTime() {
+ return minInvocationTime;
+ }
+
+ public long getMinInvocationDate() {
+ return minInvocationDate;
+ }
+
+ public long getTotalInvocationTime() {
+ return totalInvocationTime;
+ }
+
+ public int hashCode() {
+ return query.hashCode();
+ }
+
+ public boolean equals(Object other) {
+ if (other instanceof QueryStats) {
+ QueryStats qs = (QueryStats)other;
+ return SlowQueryReport.this.compare(qs.query,this.query);
+ }
+ return false;
+ }
+ }
+
+ protected class StatementProxy implements InvocationHandler {
+ protected boolean closed = false;
+ protected Object delegate;
+ protected final String query;
+ public StatementProxy(Object parent, String query) {
+ this.delegate = parent;
+ this.query = query;
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ final String name = method.getName();
+ boolean close = compare(JdbcInterceptor.CLOSE_VAL,name);
+ if (close && closed) return null; //allow close to be called multiple times
+ if (closed) throw new SQLException("Statement closed.");
+ boolean process = false;
+ process = process(executes, method, process);
+ long start = (process)?System.currentTimeMillis():0;
+ //execute the query
+ Object result = method.invoke(delegate,args);
+ long delta = (process)?(System.currentTimeMillis()-start):0;
+ if (delta>threshold) {
+ String sql = null;//TODO
+ QueryStats qs = SlowQueryReport.this.queries.get(sql);
+ if (qs == null) {
+ qs = new QueryStats(sql);
+ SlowQueryReport.this.queries.put((String)sql,qs);
+ }
+ qs.add(delta);
+ return qs;
+ }
+ if (close) {
+ closed=true;
+ delegate = null;
+ }
+ return result;
+ }
+ }
+
+ public void reset(ConnectionPool parent, PooledConnection con) {
+ if (queries==null && SlowQueryReport.perPoolStats.get(parent)==null) {
+ queries = new LinkedHashMap<String,QueryStats>() {
+ @Override
+ protected boolean removeEldestEntry(Entry<String, QueryStats> eldest) {
+ return size()>maxQueries;
+ }
+
+ };
+ }
+ }
+}
Propchange: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/BorrowWaitTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/SimplePOJOExample.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestConnectionState.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TwoDataSources.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org