commit 99386c3dff4764b1c5841ba9cf34d43f110b028b
Author: unknown
Date: Mon May 21 23:31:43 2012 +0800
sdfsd
diff --git a/.project b/.project
new file mode 100644
index 0000000..175ad28
--- /dev/null
+++ b/.project
@@ -0,0 +1,11 @@
+
+
+ comet4j
+
+
+
+
+
+
+
+
diff --git a/.svn/entries b/.svn/entries
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/.svn/entries
@@ -0,0 +1 @@
+12
diff --git a/.svn/format b/.svn/format
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/.svn/format
@@ -0,0 +1 @@
+12
diff --git a/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base b/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base
new file mode 100644
index 0000000..e94d4df
--- /dev/null
+++ b/.svn/pristine/00/005ada82457aba800fe1950d21dec417960046bf.svn-base
@@ -0,0 +1,105 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.event.demo.mic;
+
+import org.comet4j.event.Event;
+import org.comet4j.event.Listener;
+import org.comet4j.event.Observable;
+
+public class Test {
+
+ // 用法展示:微观事件模式
+ public class SpeakEvent extends Event {
+
+ public String words = "";
+
+ public SpeakEvent(Person target, String aWords) {
+ super(target);
+ words = aWords;
+ }
+ }
+
+ public abstract class SpeakListener extends Listener {
+
+ }
+
+ public class GoEvent extends Event {
+
+ public String where = "";
+
+ public GoEvent(Person target, String where) {
+ super(target);
+ this.where = where;
+ }
+ }
+
+ public abstract class GoListener extends Listener {
+
+ }
+
+ @SuppressWarnings({
+ "unchecked", "rawtypes"
+ })
+ public class Person extends Observable {
+
+ public Person() {
+ this.addEvent(SpeakEvent.class);
+ this.addEvent(GoEvent.class);
+ }
+
+ public void say(String aWords) {
+ SpeakEvent e = new SpeakEvent(this, aWords);
+ if (!this.fireEvent(e)) {
+ return;
+ }
+ System.out.println("say:" + aWords);
+ }
+
+ public void go(String anPlace) {
+ GoEvent e = new GoEvent(this, anPlace);
+ if (!this.fireEvent(e)) {
+ return;
+ }
+ System.out.println("go:" + anPlace);
+ }
+ }
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ new Test().run();
+
+ }
+
+ @SuppressWarnings("unchecked")
+ public void run() {
+ Person person = new Person();
+ person.addListener(SpeakEvent.class, new SpeakListener() {
+
+ @Override
+ public boolean handleEvent(SpeakEvent anEvent) {
+ // anEvent.stopEvent();
+ System.out.println("One person want to say:" + anEvent.words);
+ return true;
+ }
+
+ });
+ person.addListener(GoEvent.class, new GoListener() {
+
+ @Override
+ public boolean handleEvent(GoEvent anEvent) {
+ // anEvent.stopEvent();
+ System.out.println("One person want to go:" + anEvent.where);
+ return true;
+ }
+
+ });
+ person.say("Hello world!");
+ person.go("Home!");
+ }
+
+}
diff --git a/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base b/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base
new file mode 100644
index 0000000..7203f73
--- /dev/null
+++ b/.svn/pristine/01/0105fc0ee547eb0cf19082dae88cd6443defc26b.svn-base
@@ -0,0 +1,113 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.util;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+/**
+ * 过滤器
+ */
+public class CharacterEncodingFilter implements Filter {
+
+ /**
+ * 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest
+ * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的 request
+ * 对象即可.
+ */
+ protected String encoding = null;
+ protected FilterConfig filterConfig = null;
+
+ // protected boolean ignore = true;
+
+ public void destroy() {
+ this.encoding = null;
+ this.filterConfig = null;
+ }
+
+ class Request extends HttpServletRequestWrapper {
+
+ public Request(HttpServletRequest request) {
+ super(request);
+ }
+
+ /**
+ * 转换由表单读取的数据的内码. 从 ISO 字符转到 utf-8(或gbk).
+ */
+ public String toChi(String input) {
+ try {
+
+ byte[] bytes = input.getBytes("ISO-8859-1");
+ return new String(bytes, encoding);
+ } catch (Exception ex) {
+ }
+ return null;
+ }
+
+ /**
+ * Return the HttpServletRequest holded by this object.
+ */
+ private HttpServletRequest getHttpServletRequest() {
+ return (HttpServletRequest) super.getRequest();
+ }
+
+ /**
+ * 读取参数 -- 修正了中文问题.
+ */
+ @Override
+ public String getParameter(String name) {
+ return toChi(getHttpServletRequest().getParameter(name));
+ }
+
+ /**
+ * 读取参数列表 - 修正了中文问题.
+ */
+ @Override
+ public String[] getParameterValues(String name) {
+ String values[] = getHttpServletRequest().getParameterValues(name);
+ if (values != null) {
+ for (int i = 0; i < values.length; i++) {
+ values[i] = toChi(values[i]);
+ }
+ }
+ return values;
+ }
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+ ServletException {
+
+ HttpServletRequest httpreq = (HttpServletRequest) request;
+ if (httpreq.getMethod().equals("POST")) {
+ request.setCharacterEncoding(encoding);
+ } else {
+ request = new Request(httpreq);
+ }
+
+ chain.doFilter(request, response);
+
+ }
+
+ /**
+ * Place this filter into service.
+ * @param filterConfig The filter configuration object
+ */
+ public void init(FilterConfig filterConfig) throws ServletException {
+
+ this.filterConfig = filterConfig;
+ this.encoding = filterConfig.getInitParameter("encoding");
+
+ }
+
+}
diff --git a/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base b/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base
new file mode 100644
index 0000000..669f3cf
Binary files /dev/null and b/.svn/pristine/01/012efd8f96ee4c40499dd2bfca8304df7467216a.svn-base differ
diff --git a/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base b/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base
new file mode 100644
index 0000000..eb1e6b3
--- /dev/null
+++ b/.svn/pristine/01/014107a58ed069f8c2bca73fefb706cd0d230564.svn-base
@@ -0,0 +1 @@
+服务端事件监视器,监视服务器组件的事件是否正确触发。
\ No newline at end of file
diff --git a/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base b/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base
new file mode 100644
index 0000000..0160f97
Binary files /dev/null and b/.svn/pristine/03/03fe8f5a132948941eaadf3791001c39e03df9e8.svn-base differ
diff --git a/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base b/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base
new file mode 100644
index 0000000..9497c9e
--- /dev/null
+++ b/.svn/pristine/07/07283854c136d50597de8e01db42fc4637f7305b.svn-base
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base b/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base
new file mode 100644
index 0000000..09405c7
Binary files /dev/null and b/.svn/pristine/07/074eda992155b4411d4d7d1dbde08d678d028248.svn-base differ
diff --git a/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base b/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base
new file mode 100644
index 0000000..2d3a823
Binary files /dev/null and b/.svn/pristine/07/0771341a4722e8644e91120da127fe3781d1294b.svn-base differ
diff --git a/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base b/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base
new file mode 100644
index 0000000..d82c337
Binary files /dev/null and b/.svn/pristine/07/07bb05808cfa5b9c6a8b8577a7d8782ffe8970f1.svn-base differ
diff --git a/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base b/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base
new file mode 100644
index 0000000..d84f41a
Binary files /dev/null and b/.svn/pristine/08/0806bc00d5eb3948773c20f9809c66f78bb8352b.svn-base differ
diff --git a/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base b/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base
new file mode 100644
index 0000000..f8ff7b8
Binary files /dev/null and b/.svn/pristine/08/086031e238836160d5e4d11920e33e453c6b9cbc.svn-base differ
diff --git a/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base b/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base
new file mode 100644
index 0000000..099b90d
Binary files /dev/null and b/.svn/pristine/09/0903b1bd045ffdbe0182fd684558658413e887d6.svn-base differ
diff --git a/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base b/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base
new file mode 100644
index 0000000..9810aca
Binary files /dev/null and b/.svn/pristine/09/09302386573c7025657ac25b79ae418a800c657c.svn-base differ
diff --git a/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base b/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base
new file mode 100644
index 0000000..aa0d0ed
Binary files /dev/null and b/.svn/pristine/09/09e1679a9db14cab9fe6ed3e184accc05d2a7a2c.svn-base differ
diff --git a/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base b/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base
new file mode 100644
index 0000000..85f66b1
Binary files /dev/null and b/.svn/pristine/0a/0a2b0bc935bf653f6b7010eced1e2ca8dbecc799.svn-base differ
diff --git a/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base b/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base
new file mode 100644
index 0000000..6ea4c38
Binary files /dev/null and b/.svn/pristine/0b/0b2ccb38837849fe75ce7cee23843d92522b0956.svn-base differ
diff --git a/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base b/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base
new file mode 100644
index 0000000..8134e49
Binary files /dev/null and b/.svn/pristine/0b/0b79d2c11d9ef82afd725c337190bf2fc0ecdbed.svn-base differ
diff --git a/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base b/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base
new file mode 100644
index 0000000..07be08c
--- /dev/null
+++ b/.svn/pristine/0b/0b85e5061c456f84b61d425f26e7a7b7e7d62a9f.svn-base
@@ -0,0 +1,104 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 事件源 一个事件源代一个事件种类,并管理这种事件的侦听。 职责:对于侦听的管理和执行
+ * @author xiaojinghai@kedacom.com
+ */
+@SuppressWarnings("rawtypes")
+public class EventSource> {
+
+ protected List listeners = new ArrayList();
+
+ public EventSource() {
+
+ }
+
+ /**
+ * 触发所有侦听函数
+ * @param anEvent
+ * @return
+ */
+ public boolean fire(E anEvent) {
+ synchronized (listeners) {
+ for (int i = listeners.size() - 1; i >= 0; i--) {
+ L listener = listeners.get(i);
+ if (anEvent.hasStoped()) {
+ return false;
+ }
+ if (anEvent.hasPreventDefault()) {
+ break;
+ }
+ if (!listener.handleEvent(anEvent)) { // 等同于hasStoped
+ return false;
+ }
+ }
+ }
+ return anEvent.hasStoped() ? false : true;
+ }
+
+ /**
+ * 添加侦听函数
+ * @param aListener
+ */
+ public void addListener(L aListener) {
+ synchronized (listeners) {
+ listeners.add(aListener);
+ }
+
+ }
+
+ /**
+ * 删除指定的侦听函数
+ * @param aListener
+ */
+ public void removeListener(L aListener) {
+ synchronized (listeners) {
+ listeners.remove(aListener);
+ }
+
+ }
+
+ /**
+ * 删除所有侦听
+ */
+ public void removeAllListeners() {
+ synchronized (listeners) {
+ listeners.clear();
+ }
+ }
+
+ /**
+ * 得到某个侦听函数
+ * @param aListener
+ * @return
+ */
+ public L getListener(L aListener) {
+ for (L l : listeners) {
+ if (l == aListener) {
+ return l;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取所有侦听函数
+ * @return
+ */
+ public List getListeners() {
+ return listeners;
+ }
+
+ public void destroy() {
+ removeAllListeners();
+ listeners = null;
+ }
+}
diff --git a/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base b/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base
new file mode 100644
index 0000000..6fdfd5e
--- /dev/null
+++ b/.svn/pristine/0b/0be8133c7574d78dbf64adf12349d0189075ca7b.svn-base
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ChatDemo
+
+
+
+
+
+
+
+连接状态:;
+连接数量:;
+已用内存:;
+可用内存:;
+内存容量:;
+最大容量:;
+系统已运行:
+
+
+
+
+
+
+请输入:
+
+
+
+
+
+ 请输入昵称:
+
+
+
+
+
diff --git a/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base b/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base
new file mode 100644
index 0000000..859ab1b
--- /dev/null
+++ b/.svn/pristine/0c/0c6c2b2a2894086dab10144b9cfb5cf95af19580.svn-base
@@ -0,0 +1,73 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.catalina.CometEvent;
+import org.apache.catalina.CometProcessor;
+
+/**
+ * 连接前端Servlet,负责处理连接请求,并转交给引擎处理。
+ */
+public class CometServletTomcat6 extends HttpServlet implements CometProcessor {
+
+ private static final long serialVersionUID = 1L;
+
+ public CometServletTomcat6() {
+ super();
+ }
+
+ /*
+ * @see
+ * org.apache.catalina.CometProcessor#event(org.apache.catalina.CometEvent)
+ */
+ public void event(CometEvent event) throws IOException, ServletException {
+ HttpServletRequest request = event.getHttpServletRequest();
+ HttpServletResponse response = event.getHttpServletResponse();
+ // request.setAttribute("org.apache.tomcat.comet.timeout",
+ // CometContext.getInstance().getTimeout());
+
+ if (event.getEventType() == CometEvent.EventType.BEGIN) {
+ event.setTimeout(CometContext.getInstance().getTimeout());
+ String action = request.getParameter(CometProtocol.FLAG_ACTION);
+ if (CometProtocol.CMD_CONNECT.equals(action)) {
+ CometContext.getInstance().getEngine().connect(request, response);
+ event.close();
+ } else if (CometProtocol.CMD_REVIVAL.equals(action)) {
+ CometContext.getInstance().getEngine().revival(request, response);
+ } else if (CometProtocol.CMD_DROP.equals(action)) {
+ CometContext.getInstance().getEngine().drop(request, response);
+ event.close();
+ }
+ } else if (event.getEventType() == CometEvent.EventType.ERROR) {
+ if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) {
+ CometContext.getInstance().getEngine().dying(request, response);
+ event.close();
+ } else {
+ CometContext.getInstance().getEngine().drop(request, response);
+ event.close();
+ }
+ } else if (event.getEventType() == CometEvent.EventType.END) {
+ CometContext.getInstance().getEngine().dying(request, response);
+ event.close();
+ } else if (event.getEventType() == CometEvent.EventType.READ) {
+ event.close();
+ }
+
+ }
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ }
+
+}
diff --git a/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base b/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base
new file mode 100644
index 0000000..8fb3c64
--- /dev/null
+++ b/.svn/pristine/0c/0c725861fceff1a784cd8a900dd7669c84114710.svn-base
@@ -0,0 +1,83 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core;
+
+/**
+ * 用于封装向客户端发送信息的数据格式
+ */
+
+public class CometMessage {
+
+ /** 应用模块标识 */
+ private String channel;
+ private long time;// 发送时间
+ private Object data;// 包含数据
+
+ public CometMessage(Object anData, String aChannel) {
+ data = anData;
+ channel = aChannel;
+ time = System.currentTimeMillis();
+ }
+
+ /**
+ * 获取发送时间
+ * @return
+ */
+
+ public long getTime() {
+ return time;
+ }
+
+ /**
+ * 设置发送时间
+ * @param time
+ */
+
+ public void setTime(long time) {
+ this.time = time;
+ }
+
+ /**
+ * 获取被发送数据
+ * @return
+ */
+
+ public Object getData() {
+ return data;
+ }
+
+ /**
+ * 设置被发送数据
+ * @param data
+ */
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ /**
+ * 获取通道标识
+ * @return
+ */
+
+ public String getChannel() {
+ return channel;
+ }
+
+ /**
+ * 设置通道标识
+ * @param channel
+ */
+
+ public void setChannel(String channel) {
+ this.channel = channel;
+ }
+
+ public void destroy() {
+ data = null;
+ }
+
+}
diff --git a/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base b/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base
new file mode 100644
index 0000000..36bb91d
Binary files /dev/null and b/.svn/pristine/0c/0c9a20b7eb1ac789f4f4f2a5bd82b6421d106b8f.svn-base differ
diff --git a/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base b/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base
new file mode 100644
index 0000000..eae8e54
Binary files /dev/null and b/.svn/pristine/0d/0d19e9faa860eeb5a61bee4f8aa80ae858e52629.svn-base differ
diff --git a/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base b/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base
new file mode 100644
index 0000000..f946f21
--- /dev/null
+++ b/.svn/pristine/0d/0ddc84af0d5138e033409571d970a5478f0db09a.svn-base
@@ -0,0 +1,24 @@
+package org.comet4j.demo.eventmonitor;
+
+import org.comet4j.core.event.BeforeConnectEvent;
+import org.comet4j.core.listener.BeforeConnectListener;
+
+/**
+ * (用一句话描述类的主要功能)
+ * @author xiaojinghai
+ * @date 2011-3-9
+ */
+
+public class BeforeConnectEventListener extends BeforeConnectListener {
+
+ /*
+ * (non-Jsdoc)
+ * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event)
+ */
+ @Override
+ public boolean handleEvent(BeforeConnectEvent anEvent) {
+ System.out.println("[BeforeConnectEvent]:");
+ return true;
+ }
+
+}
diff --git a/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base b/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base
new file mode 100644
index 0000000..82da71b
--- /dev/null
+++ b/.svn/pristine/0f/0f19e23611f3d72c469b75568f1a37eafdda5a49.svn-base
@@ -0,0 +1,38 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.event;
+
+import org.comet4j.core.CometConnection;
+import org.comet4j.core.CometEngine;
+import org.comet4j.event.Event;
+
+/**
+ * 连接复活事件对象
+ */
+
+public class RevivalEvent extends Event {
+
+ private CometConnection conn;
+
+ public RevivalEvent(CometEngine target, CometConnection anConn) {
+ super(target);
+ conn = anConn;
+ }
+
+ public CometConnection getConn() {
+ return conn;
+ }
+
+ public void setConn(CometConnection conn) {
+ this.conn = conn;
+ }
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ conn = null;
+ }
+}
diff --git a/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base b/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base
new file mode 100644
index 0000000..08abd82
Binary files /dev/null and b/.svn/pristine/0f/0f887d15b1dd3638f179df3a3b4ae88ad314ee45.svn-base differ
diff --git a/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base b/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base
new file mode 100644
index 0000000..b22cd14
Binary files /dev/null and b/.svn/pristine/0f/0fa08cc1fe9e2c7932ab6b41ce8dd16815852af3.svn-base differ
diff --git a/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base b/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base
new file mode 100644
index 0000000..72a4026
Binary files /dev/null and b/.svn/pristine/10/10005711143ad804bd594b923e9f3d527af10610.svn-base differ
diff --git a/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base b/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base
new file mode 100644
index 0000000..5ee373f
--- /dev/null
+++ b/.svn/pristine/10/104a974a26584b9082ba02629e1d4faffd3e1d31.svn-base
@@ -0,0 +1,355 @@
+JS.ns("JS.HTTPStatus","JS.XMLHttpRequest");
+/**
+ * FC 2616 HTTP1.1规范的HTTP Status状态常量,详见
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10
+ * @author jinghai.xiao@gmail.com
+ */
+JS.HTTPStatus = {
+ //Informational 1xx
+ '100' : 'Continue',
+ '101' : 'Switching Protocols',
+ //Successful 2xx
+ '200' : 'OK',
+ '201' : 'Created',
+ '202' : 'Accepted',
+ '203' : 'Non-Authoritative Information',
+ '204' : 'No Content',
+ '205' : 'Reset Content',
+ '206' : 'Partial Content',
+ //Redirection 3xx
+ '300' : 'Multiple Choices',
+ '301' : 'Moved Permanently',
+ '302' : 'Found',
+ '303' : 'See Other',
+ '304' : 'Not Modified',
+ '305' : 'Use Proxy',
+ '306' : 'Unused',
+ '307' : 'Temporary Redirect',
+ //Client Error 4xx
+ '400' : 'Bad Request',
+ '401' : 'Unauthorized',
+ '402' : 'Payment Required',
+ '403' : 'Forbidden',
+ '404' : 'Not Found',
+ '405' : 'Method Not Allowed',
+ '406' : 'Not Acceptable',
+ '407' : 'Proxy Authentication Required',
+ '408' : 'Request Timeout',
+ '409' : 'Conflict',
+ '410' : 'Gone',
+ '411' : 'Length Required',
+ '412' : 'Precondition Failed',
+ '413' : 'Request Entity Too Large',
+ '414' : 'Request-URI Too Long',
+ '415' : 'Unsupported Media Type',
+ '416' : 'Requested Range Not Satisfiable',
+ '417' : 'Expectation Failed',
+ //Server Error 5xx
+ '500' : 'Internal Server Error',
+ '501' : 'Not Implemented',
+ '502' : 'Bad Gateway',
+ '503' : 'Service Unavailable',
+ '504' : 'Gateway Timeout',
+ '505' : 'HTTP Version Not Supported'
+};
+JS.HTTPStatus.OK = 200;
+JS.HTTPStatus.BADREQUEST = 400;
+JS.HTTPStatus.FORBIDDEN = 403;
+JS.HTTPStatus.NOTFOUND = 404;
+JS.HTTPStatus.TIMEOUT = 408;
+JS.HTTPStatus.SERVERERROR = 500;
+
+/**
+ * @class JS.XMLHttpRequest
+ * @extends JS.Observable
+ * 跨浏览器、事件驱动的XMLHTTPRequest对象,此对象完全兼容传统XMLHTTPRequest对象,在遵循
+ * http://www.w3.org/TR/XMLHttpRequest/标准的前提下有所扩展。
+ * @author jinghai.xiao@gmail.com
+ */
+JS.XMLHttpRequest = JS.extend(JS.Observable,{
+ /**
+ * @cfg {Boolean} enableCache
+ * 是否启用缓存,默认为false
+ */
+ enableCache : false,
+ /**
+ * @cfg {Number} timeout
+ * 请求超时毫秒数,默认为30000(30秒),设置为0则永不超时
+ */
+ timeout : 30000,//default never time out
+ /**
+ * 是否调用了abort方法
+ * @property
+ * @type Boolean
+ */
+ isAbort : false,
+ /**
+ * @cfg {String} specialXHR
+ * 指定一个特定的ActiveX对象名称用于取代XMLHTTPRequest对象,默认为空。
+ */
+ specialXHR : '',//指定使用特殊的xhr对象
+ //propoty
+ _xhr : null,
+ //--------request propoty--------
+ /**
+ * @property
+ * @type Number
+ */
+ readyState : 0,
+ //--------response propoty--------
+ /**
+ * @property
+ * @type Number
+ */
+ status : 0,
+ /**
+ * @property
+ * @type String
+ */
+ statusText : '',
+ /**
+ * @property
+ * @type String
+ */
+ responseText : '',
+ /**
+ * @property
+ * @type DOM
+ */
+ responseXML : null,
+ //private method
+ constructor : function(){
+ var self = this;
+ this.addEvents([
+ /**
+ * @event readyStateChange 当readyState发生变化
+ * @param {Number} readyState
+ * @param {Number} status
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'readyStateChange',
+ /**
+ * @event timeout 请求超时
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'timeout',
+ /**
+ * @event abort 主动取消
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'abort',
+ /**
+ * @event error 请求出错
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'error',
+ /**
+ * @event load 接收完毕
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'load',
+ /**
+ * @event progress 正在接收
+ * @param {JS.XMLHttpRequest} xhr
+ * @param {XMLHTTPRequest} realXhr 实际使用的XMLHTTPRequest对象
+ */
+ 'progress'
+ ]);
+ JS.XMLHttpRequest.superclass.constructor.apply(this,arguments);
+ this._xhr = this.createXmlHttpRequestObject();
+ this._xhr.onreadystatechange = function(){
+ self.doReadyStateChange();
+ };
+ },
+ //private
+ //超时任务
+ timeoutTask : null,
+ //延迟执行超时任务(timeoutTask)
+ delayTimeout : function(){
+ if(this.timeout){
+ if(!this.timeoutTask){
+ this.timeoutTask = new JS.DelayedTask(function(){
+ //readyState=4已经停止,由doReadyStateChange来判断为何停止
+ if(this._xhr.readyState != 4){
+ this.fireEvent('timeout', this, this._xhr);
+ }else{
+ this.cancelTimeout();
+ }
+ },this);
+ }
+ this.timeoutTask.delay(this.timeout);
+ }
+ },
+ //取消超时任务
+ cancelTimeout : function(){
+ if(this.timeoutTask){
+ this.timeoutTask.cancel();
+ }
+ },
+ createXmlHttpRequestObject : function(){
+ var activeX = [
+ 'Msxml2.XMLHTTP.6.0',
+ 'Msxml2.XMLHTTP.5.0',
+ 'Msxml2.XMLHTTP.4.0',
+ 'Msxml2.XMLHTTP.3.0',
+ 'Msxml2.XMLHTTP',
+ 'Microsoft.XMLHTTP'],
+ xhr,
+ specialXHR = this.specialXHR;
+ if(specialXHR){//如果指定了xhr对象
+ if(JS.isString(specialXHR)){
+ return new ActiveXObject(specialXHR);
+ }else{
+ return specialXHR;
+ }
+ }
+ try {
+ xhr = new XMLHttpRequest();
+ } catch(e) {
+ for (var i = 0; i < activeX.length; ++i) {
+ try {
+ xhr = new ActiveXObject(activeX[i]);
+ break;
+ } catch(e) {}
+ }
+ } finally {
+ return xhr;
+ }
+ },
+ //private
+ doReadyStateChange : function(){
+ this.delayTimeout();
+ var xhr = this._xhr;
+ try{
+ this.readyState = xhr.readyState;
+ }catch(e){
+ this.readyState = 0;
+ }
+ try{
+ this.status = xhr.status;
+ }catch(e){
+ this.status = 0;
+ }
+ try{
+ this.statusText = xhr.statusText;
+ }catch(e){
+ this.statusText = "";
+ }
+ try {
+ this.responseText = xhr.responseText;
+ }catch(e){
+ this.responseText = "";
+ }
+ try {
+ this.responseXML = xhr.responseXML;
+ }catch(e){
+ this.responseXML = null;
+ }
+
+ this.fireEvent('readyStateChange',this.readyState, this.status, this, xhr );
+
+ if(this.readyState == 3 && (this.status >= 200 && this.status < 300)){
+ this.fireEvent('progress', this, xhr);
+ }
+
+ if(this.readyState == 4){
+ this.cancelTimeout();
+ var status = this.status ;
+ if(status == 0 || status == ""){
+ this.fireEvent('error', this, xhr);
+ }else if(status >= 200 && status < 300){
+ this.fireEvent('load', this, xhr);
+ }else if(status >= 400 && status != 408){
+ this.fireEvent('error', this, xhr);
+ }else if(status == 408){
+ this.fireEvent('timeout', this, xhr);
+ }
+
+ }
+ this.onreadystatechange();
+ },
+ /**
+ * 兼容标准的onreadystatechange
+ * @method
+ */
+ onreadystatechange : function(){
+ },
+ //--------request--------
+ /**
+ * 兼容标准的open方法
+ * @method
+ */
+ open : function(method, url, async, username, password){
+ if(!url){
+ return;
+ }
+ if(!this.enableCache){
+ if(url.indexOf('?') != -1){
+ url += '&ram='+Math.random();
+ }else{
+ url += '?ram='+Math.random();
+ }
+ }
+ this._xhr.open(method, url, async, username, password);
+ },
+ /**
+ * 兼容标准的send方法
+ * @method
+ */
+ send : function(content){
+ this.delayTimeout();
+ this.isAbort = false;
+ this._xhr.send(content);
+ },
+ /**
+ * 兼容标准的abort方法
+ * @method
+ */
+ abort : function(){
+ this.isAbort = true;
+ this.cancelTimeout();
+ this._xhr.abort();
+ if(JS.isIE){//IE在abort后会清空侦听
+ var self = this;
+ self._xhr.onreadystatechange = function(){
+ self.doReadyStateChange();
+ };
+ }
+ this.fireEvent('abort',this,this._xhr);
+ },
+ /**
+ * 兼容标准的setRequestHeader方法
+ * @method
+ */
+ setRequestHeader : function(header, value){
+ this._xhr.setRequestHeader(header,value);
+ },
+ //--------request--------
+ /**
+ * 兼容标准的getResponseHeader方法
+ * @method
+ */
+ getResponseHeader : function(header){
+ return this._xhr.getResponseHeader(header);
+ },
+ /**
+ * 兼容标准的getAllResponseHeaders方法
+ * @method
+ */
+ getAllResponseHeaders : function(){
+ return this._xhr.getAllResponseHeaders();
+ },
+ /**
+ * 设置客户端超时时间
+ * @method
+ */
+ setTimeout : function(t){
+ this.timeout = t;
+ }
+
+});
\ No newline at end of file
diff --git a/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base b/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base
new file mode 100644
index 0000000..9d99a99
Binary files /dev/null and b/.svn/pristine/11/1107b01255db5fdff2ad5ad89d6da0c2ba72c581.svn-base differ
diff --git a/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base b/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base
new file mode 100644
index 0000000..e633afb
Binary files /dev/null and b/.svn/pristine/11/11c98b99ad538f2f67633afd4d7f4d98ecfbb408.svn-base differ
diff --git a/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base b/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base
new file mode 100644
index 0000000..56ba737
Binary files /dev/null and b/.svn/pristine/13/131dca28bedc85d776f58800cf15f5811e3df5cf.svn-base differ
diff --git a/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base b/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base
new file mode 100644
index 0000000..4179607
Binary files /dev/null and b/.svn/pristine/14/14ce153d393b3c489f8a4e6b9a9383e7d8f4c911.svn-base differ
diff --git a/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base b/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base
new file mode 100644
index 0000000..98209e6
Binary files /dev/null and b/.svn/pristine/14/14fe821fdc0946c28051559dbda82e1fc12fa2e4.svn-base differ
diff --git a/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base b/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base
new file mode 100644
index 0000000..43dfc33
--- /dev/null
+++ b/.svn/pristine/15/157dc93f5c5cad8ea619f2bb7026aec2344b0c66.svn-base
@@ -0,0 +1,73 @@
+package org.comet4j.demo.requestmonitor;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.comet4j.core.CometContext;
+import org.comet4j.core.CometProtocol;
+
+/**
+ * 应用初始化
+ * @author jinghai.xiao@gmail.com
+ * @date 2011-2-25
+ */
+
+public class AppInit implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener,
+ ServletRequestListener {
+
+ // ServletContextListener
+ public void contextInitialized(ServletContextEvent event) {
+ CometContext cc = CometContext.getInstance();
+ cc.registChannel(Constant.AppChannel);
+ }
+
+ public void contextDestroyed(ServletContextEvent event) {
+
+ }
+
+ // HttpSessionListener
+ public void sessionCreated(HttpSessionEvent event) {
+ HttpSession session = event.getSession();
+ // System.out.println("Session:" + session.getId() + "创建了");
+ }
+
+ public void sessionDestroyed(HttpSessionEvent event) {
+ HttpSession session = event.getSession();
+ // System.out.println("Session:" + session.getId() + "销毁了");
+ }
+
+ // HttpSessionAttributeListener
+ public void attributeAdded(HttpSessionBindingEvent event) {
+ // System.out.println("Session中增加了:" + event.getName() + "属性");
+ }
+
+ public void attributeRemoved(HttpSessionBindingEvent event) {
+ // System.out.println("Session中删除了:" + event.getName() + "属性");
+ }
+
+ public void attributeReplaced(HttpSessionBindingEvent event) {
+ // System.out.println("Session中修改了:" + event.getName() + "属性");
+ }
+
+ // ServletRequestListener
+ public void requestInitialized(ServletRequestEvent event) {
+ HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
+ System.out.println("请求:" + request.getRequestURI() + ","+CometProtocol.FLAG_ACTION+":" + request.getParameter(CometProtocol.FLAG_ACTION) + ",cId:"
+ + request.getParameter("cid"));
+
+ }
+
+ public void requestDestroyed(ServletRequestEvent event) {
+ HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
+ // System.out.println("请求完毕:" + request.getRequestURI());
+ }
+
+}
diff --git a/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base b/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base
new file mode 100644
index 0000000..59f7584
--- /dev/null
+++ b/.svn/pristine/15/159b847ba7d6820a35c0f02621326b7e02c230f7.svn-base
@@ -0,0 +1,39 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.event;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.comet4j.core.CometEngine;
+import org.comet4j.event.Event;
+
+/**
+ * 即将断开前的事件对象
+ */
+
+public class BeforeDropEvent extends Event {
+
+ private HttpServletRequest request;
+
+ public BeforeDropEvent(CometEngine target, HttpServletRequest aRequest) {
+ super(target);
+ request = aRequest;
+ }
+
+ public HttpServletRequest getRequest() {
+ return request;
+ }
+
+ public void setRequest(HttpServletRequest request) {
+ this.request = request;
+ }
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ request = null;
+ }
+}
diff --git a/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base b/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base
new file mode 100644
index 0000000..0bd244b
--- /dev/null
+++ b/.svn/pristine/15/15a4366490f2c0d8f32f8ce94376810d4319db1f.svn-base
@@ -0,0 +1,52 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.temp;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public class ReadJARResource {
+
+ public static void main(String[] args) throws IOException {
+ String jarName = "C://VODOSSClient.jar";
+ String fileName = "client.properties";
+ JarFile jarFile = new JarFile(jarName);// 读入jar文件
+
+ JarEntry entry = jarFile.getJarEntry(fileName);
+ InputStream input = jarFile.getInputStream(entry);// 读入需要的文件
+
+ readFile(input);
+
+ jarFile.close();
+
+ }
+
+ private static void readFile(InputStream input)
+
+ throws IOException {
+
+ InputStreamReader isr =
+
+ new InputStreamReader(input);
+
+ BufferedReader reader = new BufferedReader(isr);
+
+ String line;
+
+ while ((line = reader.readLine()) != null) {
+
+ System.out.println(line);
+
+ }
+
+ reader.close();
+
+ }
+}
diff --git a/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base b/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base
new file mode 100644
index 0000000..14b5437
Binary files /dev/null and b/.svn/pristine/15/15cd68ebbe9d4bbccce56b82f47faafaef116a34.svn-base differ
diff --git a/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base b/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base
new file mode 100644
index 0000000..b0e24b5
Binary files /dev/null and b/.svn/pristine/16/160e46c26460402904800c4857848711d643429a.svn-base differ
diff --git a/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base b/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base
new file mode 100644
index 0000000..435889b
Binary files /dev/null and b/.svn/pristine/16/1664b2093acfb8b1a840646bae51399bada33c5d.svn-base differ
diff --git a/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base b/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base
new file mode 100644
index 0000000..2112607
Binary files /dev/null and b/.svn/pristine/17/17738c4f5dcc06c969250d4872e1276dfbdebcd1.svn-base differ
diff --git a/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base b/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base
new file mode 100644
index 0000000..f8f4f7f
--- /dev/null
+++ b/.svn/pristine/17/17914902027f8769b8ec2251d9110c560286398a.svn-base
@@ -0,0 +1,25 @@
+function _pr_isIE6(){var F=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);_pr_isIE6=function(){return F};return F}var aa="break continue do else for if return while ",ba="auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",ca="catch class delete false import new operator private protected public this throw true try ",da="alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ",
+ea="boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",fa="as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",ga="debugger eval export function get null set undefined var with Infinity NaN ",ha="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",
+ia="and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",ja="alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",ka="case done elif esac eval fi function in local set then until ",la="a",ma="z",na="A",oa="Z",pa="!",qa="!=",ra="!==",s="#",sa="%",Ha="%=",v="&",Ia="&&",Ja="&&=",Ka="&=",La=
+"(",Ma="*",Na="*=",Oa="+=",Pa=",",Qa="-=",Ra="->",w="/",Sa="/=",Ta=":",Ua="::",y=";",z="<",Va="<<",Wa="<<=",Xa="<=",Ya="=",Za="==",$a="===",A=">",ab=">=",bb=">>",cb=">>=",db=">>>",eb=">>>=",fb="?",C="@",gb="[",hb="^",ib="^=",jb="^^",kb="^^=",lb="{",mb="|",nb="|=",ob="||",pb="||=",qb="~",rb="break",sb="case",tb="continue",ub="delete",vb="do",wb="else",xb="finally",yb="instanceof",zb="return",Ab="throw",Bb="try",Cb="typeof",Db="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)",Eb=
+"|\\b",Fb="\\$1",Gb="|^)\\s*$",Hb="&",Ib="<",Jb=">",Kb=""",Lb="",Mb="x",Nb="'",G='"',Ob=" ",Pb="XMP",Qb="",Rb='="',H="PRE",Sb='\n',I="",Tb="\t",Ub="\n",Vb="nocode",Wb=' $1="$2$3$4"',J="pln",O="com",Xb="dec",P="src",Q="tag",R="atv",S="pun",Yb="<>/=",X="atn",Zb=" \t\r\n",Y="str",$b="'\"",ac="'\"`",bc="\"'",cc=" \r\n",Z="lit",dc="123456789",ec=".",fc="kwd",gc="typ",$="",hc='',jc="$1 ",kc="
",lc="console",mc=
+"cannot override language handler %s",nc="default-code",oc="default-markup",pc="html",qc="htm",rc="xhtml",sc="xml",tc="xsl",uc="c",vc="cc",wc="cpp",xc="cs",yc="cxx",zc="cyc",Ac="java",Bc="bsh",Cc="csh",Dc="sh",Ec="cv",Fc="py",Gc="perl",Hc="pl",Ic="pm",Jc="rb",Kc="js",Lc="pre",Mc="code",Nc="xmp",Oc="prettyprint",Pc="class",Qc="br",Rc="\r\n";(function(){function F(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var K=aa,Sc=K+ba,T=Sc+ca,ta=T+da,ua=T+ea,Tc=ua+
+fa,va=T+ga,wa=ha,xa=K+ia,ya=K+ja,za=K+ka,Uc=ta+Tc+va+wa+xa+ya+za;function Vc(b){return b>=la&&b<=ma||b>=na&&b<=oa}function D(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Wc=(function(){var b=[pa,qa,ra,s,sa,Ha,v,Ia,Ja,Ka,La,Ma,Na,Oa,Pa,Qa,Ra,w,Sa,Ta,Ua,y,z,Va,Wa,Xa,Ya,Za,$a,A,ab,bb,cb,db,eb,fb,C,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,Bb,Cb],a=Db;for(var c=0;c:&])/g,Fb)}a+=
+Gb;return new RegExp(a)})(),Aa=/&/g,Ba=//g,Xc=/\"/g;function Yc(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb).replace(Xc,Kb)}function U(b){return b.replace(Aa,Hb).replace(Ba,Ib).replace(Ca,Jb)}var Zc=/</g,$c=/>/g,ad=/'/g,bd=/"/g,cd=/&/g,dd=/ /g;function ed(b){var a=b.indexOf(v);if(a<0)return b;for(--a;(a=b.indexOf(Lb,a+1))>=0;){var c=b.indexOf(y,a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)===Mb){d=d.substring(1);g=16}var e=parseInt(d,g);
+if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(Zc,z).replace($c,A).replace(ad,Nb).replace(bd,G).replace(cd,v).replace(dd,Ob)}function Da(b){return Pb===b.tagName}function L(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push(z,c);for(var d=0;d=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break;case Ub:a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join(I)}}var hd=/(?:[^<]+|
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base b/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base
new file mode 100644
index 0000000..cf3fb24
Binary files /dev/null and b/.svn/pristine/22/22e713a01a3e7861943db96ab837c4e3d2856868.svn-base differ
diff --git a/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base b/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base
new file mode 100644
index 0000000..972055e
Binary files /dev/null and b/.svn/pristine/23/23631eb77516b9d80138a4d1beb6776ba7294c07.svn-base differ
diff --git a/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base b/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base
new file mode 100644
index 0000000..3d7f062
Binary files /dev/null and b/.svn/pristine/24/242073cc74da8ae08742d8cd8ddea12efc81073f.svn-base differ
diff --git a/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base b/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base
new file mode 100644
index 0000000..eb70cf8
Binary files /dev/null and b/.svn/pristine/24/24460a1dc0b3cd69e8093994596a75806236c5a4.svn-base differ
diff --git a/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base b/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base
new file mode 100644
index 0000000..d30b3e5
Binary files /dev/null and b/.svn/pristine/24/24522e5bca535a24e9623db71abb5c078834c62f.svn-base differ
diff --git a/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base b/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base
new file mode 100644
index 0000000..3a28de0
--- /dev/null
+++ b/.svn/pristine/25/250bbdae7886c4c506953e7f84b4de6cd1ae56a2.svn-base
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base b/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base
new file mode 100644
index 0000000..9999194
Binary files /dev/null and b/.svn/pristine/25/25229424bac0a80f7bb892ee34cec8b050934c93.svn-base differ
diff --git a/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base b/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base
new file mode 100644
index 0000000..30d1ca7
Binary files /dev/null and b/.svn/pristine/26/26989c5a898467b5f7187e2734eb33050864f441.svn-base differ
diff --git a/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base b/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base
new file mode 100644
index 0000000..28bbe69
Binary files /dev/null and b/.svn/pristine/26/26a2ab1b355a7a1f751ad6ecc61e40d3b033be1c.svn-base differ
diff --git a/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base b/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base
new file mode 100644
index 0000000..f26b7c2
Binary files /dev/null and b/.svn/pristine/28/2851aa4e87a0b95d5d7add1b557ba2f625fa0733.svn-base differ
diff --git a/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base b/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base
new file mode 100644
index 0000000..67a2a4c
Binary files /dev/null and b/.svn/pristine/29/296bb89bfaef25a5189740258b0cd1217daac43b.svn-base differ
diff --git a/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base b/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base
new file mode 100644
index 0000000..928779e
Binary files /dev/null and b/.svn/pristine/29/29c03b23895d652aefe684971367024068e3c942.svn-base differ
diff --git a/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base b/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base
new file mode 100644
index 0000000..6e49d69
Binary files /dev/null and b/.svn/pristine/29/29cf4ac5755c1dff0dafbe4bcba08002828a4959.svn-base differ
diff --git a/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base b/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base
new file mode 100644
index 0000000..4f791e1
Binary files /dev/null and b/.svn/pristine/29/29d847f5636a9d2113b67721c9de12a9ce411c1d.svn-base differ
diff --git a/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base b/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base
new file mode 100644
index 0000000..dd54ac4
--- /dev/null
+++ b/.svn/pristine/2a/2a55e3ea60758777e05703a1fe90964a57ec4956.svn-base
@@ -0,0 +1,16 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.listener;
+
+import org.comet4j.core.event.RemovedEvent;
+import org.comet4j.event.Listener;
+
+/**
+ * 移除连接事件侦听抽象类
+ */
+public abstract class RemovedListener extends Listener {
+
+}
diff --git a/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base b/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base
new file mode 100644
index 0000000..8c2c83d
Binary files /dev/null and b/.svn/pristine/2b/2b402ce9faaaec89a4f21f24f564bbb3a70daee3.svn-base differ
diff --git a/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base b/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base
new file mode 100644
index 0000000..562fecc
Binary files /dev/null and b/.svn/pristine/2b/2bb7d59c94e3ec6d3cac83f57206fdfbe9fee7a5.svn-base differ
diff --git a/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base b/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base
new file mode 100644
index 0000000..24b1ab2
Binary files /dev/null and b/.svn/pristine/2d/2d8c5ac25bc5619b4bdc098c800a228cc85a9222.svn-base differ
diff --git a/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base b/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base
new file mode 100644
index 0000000..7862cb6
--- /dev/null
+++ b/.svn/pristine/2e/2e99f1e8d5a518c794caa2bec71e6b97c8f68959.svn-base
@@ -0,0 +1,16 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.listener;
+
+import org.comet4j.core.event.RevivalEvent;
+import org.comet4j.event.Listener;
+
+/**
+ * 连接复活事件侦听抽象类
+ */
+public abstract class RevivalListener extends Listener {
+
+}
diff --git a/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base b/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base
new file mode 100644
index 0000000..fb2e2c0
--- /dev/null
+++ b/.svn/pristine/2e/2e9b49f5af72b71ace35ba8a4ad213731f3ae324.svn-base
@@ -0,0 +1,16 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.listener;
+
+import org.comet4j.core.event.BeforeDropEvent;
+import org.comet4j.event.Listener;
+
+/**
+ * 连接即将断开事件侦听抽象类
+ */
+public abstract class BeforeDropListener extends Listener {
+
+}
diff --git a/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base b/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base
new file mode 100644
index 0000000..915db65
--- /dev/null
+++ b/.svn/pristine/2e/2ed8acd774183d5eb14691f43593374bef2aa052.svn-base
@@ -0,0 +1,29 @@
+/**
+ * @(#)BeforeDropEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc.
+ * All rights reserved.
+ */
+
+package org.comet4j.demo.eventmonitor;
+
+import org.comet4j.core.event.BeforeDropEvent;
+import org.comet4j.core.listener.BeforeDropListener;
+
+/**
+ * (用一句话描述类的主要功能)
+ * @author xiaojinghai
+ * @date 2011-3-9
+ */
+
+public class BeforeDropEventListener extends BeforeDropListener {
+
+ /*
+ * (non-Jsdoc)
+ * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event)
+ */
+ @Override
+ public boolean handleEvent(BeforeDropEvent anEvent) {
+ System.out.println("[BeforeDropEvent]:cId=" + anEvent.getRequest().getParameter("cid"));
+ return true;
+ }
+
+}
diff --git a/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base b/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base
new file mode 100644
index 0000000..23095d7
--- /dev/null
+++ b/.svn/pristine/31/31eaebbc77e064473958bdc51a43db1917ee2156.svn-base
@@ -0,0 +1,55 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.demo.talker;
+
+import org.comet4j.core.CometContext;
+import org.comet4j.core.CometEngine;
+import org.comet4j.demo.talker.dto.HealthDTO;
+
+/**
+ * 系统健康信息发送器
+ * @author xiaojinghai
+ * @date 2011-4-7
+ */
+
+public class HealthSender implements Runnable {
+
+ private static final CometEngine engine = CometContext.getInstance().getEngine();
+ private static final HealthDTO healthDto = new HealthDTO();
+ private static final long startup = System.currentTimeMillis();
+
+ @Override
+ public void run() {
+
+ while (true) {
+ try {
+ Thread.sleep(5000);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ long totalMemory = Runtime.getRuntime().totalMemory();
+ long freeMemory = Runtime.getRuntime().freeMemory();
+ long maxMemory = Runtime.getRuntime().maxMemory();
+ long usedMemory = totalMemory - freeMemory;
+ Integer connectorCount = engine.getConnections().size();
+ healthDto.setConnectorCount(connectorCount.toString());
+ healthDto.setFreeMemory(freeMemory);
+ healthDto.setMaxMemory(maxMemory);
+ healthDto.setTotalMemory(totalMemory);
+ healthDto.setUsedMemory(usedMemory);
+ long dif = System.currentTimeMillis() - startup;
+ long day_mill = 86400000;// 一天的毫秒数 60*60*1000*24
+ long hour_mill = 3600000;// 一小时的毫秒数 60*60*1000
+ Long day = dif / day_mill;
+ Long hour = (dif % day_mill) / hour_mill;
+ String str = day.toString() + "天 " + hour.toString() + "小时";
+ healthDto.setStartup(str);
+ engine.sendToAll(Constant.APP_CHANNEL, healthDto);
+
+ }
+
+ }
+}
diff --git a/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base b/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base
new file mode 100644
index 0000000..dde7968
Binary files /dev/null and b/.svn/pristine/31/31f435f65f63a5ef78c0458fd01649c473f3e181.svn-base differ
diff --git a/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base b/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base
new file mode 100644
index 0000000..34180c5
--- /dev/null
+++ b/.svn/pristine/32/325e794dc8620be2e31fd88cee44923cab8e5e63.svn-base
@@ -0,0 +1,65 @@
+/**
+ * @(#)WalleAPPListenner.java 2011-2-25 Copyright 2011 it.kedacom.com, Inc. All
+ * rights reserved.
+ */
+
+package org.comet4j.demo.sender;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.comet4j.core.CometContext;
+import org.comet4j.core.CometEngine;
+
+/**
+ * (用一句话描述类的主要功能)
+ * @author xiaojinghai
+ * @date 2011-2-25
+ */
+
+public class AppInit implements ServletContextListener {
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
+ */
+
+ // ServletContextListener
+ public void contextInitialized(ServletContextEvent arg0) {
+ CometContext cc = CometContext.getInstance();
+ cc.registChannel(Constant.AppChannel);
+ Thread helloAppModule = new Thread(new HelloAppModule(), "Sender App Module");
+ helloAppModule.setDaemon(true);
+ helloAppModule.start();
+
+ }
+
+ class HelloAppModule implements Runnable {
+
+ private int inc = 0;
+
+ public void run() {
+ while (true) {
+ try {
+ Thread.sleep(5000);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ CometEngine engine = CometContext.getInstance().getEngine();
+ engine.sendTo(Constant.AppChannel, engine.getConnections(), "This is the SenderAppModule Test,来自Sender"
+ + inc);
+ inc++;
+ }
+ }
+ }
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
+ */
+
+ // ServletContextListener
+ public void contextDestroyed(ServletContextEvent arg0) {
+ // TODO 该方法尚未实现
+
+ }
+
+}
diff --git a/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base b/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base
new file mode 100644
index 0000000..6f4d874
Binary files /dev/null and b/.svn/pristine/32/3276c34c5c4af74e275064d204f300a190103c30.svn-base differ
diff --git a/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base b/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base
new file mode 100644
index 0000000..51fb5c1
--- /dev/null
+++ b/.svn/pristine/32/32dd1aca7a3bbb98539a3b9111a76e98268cdcd3.svn-base
@@ -0,0 +1,31 @@
+/**
+ * @(#)MessageEventListener.java 2011-3-9 Copyright 2011 it.kedacom.com, Inc.
+ * All rights reserved.
+ */
+
+package org.comet4j.demo.eventmonitor;
+
+import org.comet4j.core.event.MessageEvent;
+import org.comet4j.core.listener.MessageListener;
+import org.comet4j.core.util.JSONUtil;
+
+/**
+ * (用一句话描述类的主要功能)
+ * @author xiaojinghai
+ * @date 2011-3-9
+ */
+
+public class MessageEventListener extends MessageListener {
+
+ /*
+ * (non-Jsdoc)
+ * @see org.comet4j.event.Listener#handleEvent(org.comet4j.event.Event)
+ */
+ @Override
+ public boolean handleEvent(MessageEvent anEvent) {
+ System.out.println("[MessageEvent]:cId=" + anEvent.getConn().getId() + "\ndata="
+ + JSONUtil.object2json(anEvent.getData()));
+ return false;
+ }
+
+}
diff --git a/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base b/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base
new file mode 100644
index 0000000..18e215d
Binary files /dev/null and b/.svn/pristine/32/32e532b36e0d7a3830904153624c2d967bf5fa54.svn-base differ
diff --git a/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base b/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base
new file mode 100644
index 0000000..f3fd297
--- /dev/null
+++ b/.svn/pristine/33/3327ad69de48ba3bcb284d4cbc30534187d7df01.svn-base
@@ -0,0 +1,10 @@
+
+
+ The source code
+
+
+
+
+ ###SOURCE###
+
+
\ No newline at end of file
diff --git a/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base b/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base
new file mode 100644
index 0000000..a915dfb
Binary files /dev/null and b/.svn/pristine/33/333e9405b194376d599346420cd4d4c930aebfb6.svn-base differ
diff --git a/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base b/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base
new file mode 100644
index 0000000..3ed5f24
--- /dev/null
+++ b/.svn/pristine/33/335ef794302cb86f97ae3a083227da5f9e1ee266.svn-base
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base b/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base
new file mode 100644
index 0000000..f24ddee
Binary files /dev/null and b/.svn/pristine/33/335f08289b716d76e423f4f3eeee2503f37ec9cb.svn-base differ
diff --git a/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base b/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base
new file mode 100644
index 0000000..891d1b7
Binary files /dev/null and b/.svn/pristine/33/339b1a4718911af61fcc0ff60cb9bd8aec8d4d2d.svn-base differ
diff --git a/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base b/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base
new file mode 100644
index 0000000..6219312
--- /dev/null
+++ b/.svn/pristine/34/34446074781ec7c390d18de19ebedca256ec4afc.svn-base
@@ -0,0 +1,484 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.comet4j.core.dto.ConnectionDTO;
+import org.comet4j.core.event.BeforeConnectEvent;
+import org.comet4j.core.event.BeforeDropEvent;
+import org.comet4j.core.event.BeforeRemoveEvent;
+import org.comet4j.core.event.ConnectEvent;
+import org.comet4j.core.event.DropEvent;
+import org.comet4j.core.event.DyingEvent;
+import org.comet4j.core.event.ErrorEvent;
+import org.comet4j.core.event.MessageEvent;
+import org.comet4j.core.event.RemovedEvent;
+import org.comet4j.core.event.RevivalEvent;
+import org.comet4j.core.listener.BeforeConnectListener;
+import org.comet4j.core.listener.BeforeDropListener;
+import org.comet4j.core.listener.BeforeRemoveListener;
+import org.comet4j.core.listener.ConnectListener;
+import org.comet4j.core.listener.DropListener;
+import org.comet4j.core.listener.DyingListener;
+import org.comet4j.core.listener.MessageListener;
+import org.comet4j.core.listener.RemovedListener;
+import org.comet4j.core.listener.RevivalListener;
+import org.comet4j.event.Observable;
+
+/**
+ * 引擎,负责管理和维持连接,并能够必要的发送服务
+ */
+
+@SuppressWarnings({
+ "unchecked", "rawtypes"
+})
+public class CometEngine extends Observable {
+
+ private CometConnector ct;
+ private CometSender sender;
+
+ public CometEngine() {
+ this.addEvent(BeforeConnectEvent.class);
+ this.addEvent(ConnectEvent.class);
+ this.addEvent(BeforeDropEvent.class);
+ this.addEvent(DropEvent.class);
+ this.addEvent(DyingEvent.class);
+ this.addEvent(RevivalEvent.class);
+ this.addEvent(MessageEvent.class);
+ this.addEvent(ErrorEvent.class);// TODO:
+ CometContext cc = CometContext.getInstance();
+ sender = new CometSender(cc.getCacheExpires(), cc.getCacheFrequency());
+ ct = new CometConnector(cc.getConnExpires(), cc.getConnFrequency());
+ }
+
+ /**
+ * 建立用户连接
+ * @param request
+ * @param response
+ * @throws IOException
+ */
+ void connect(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ String uId = request.getParameter("uid");
+ CometContext.getInstance().log("【CometDebug】-->【connect】-->uid:" + uId);
+
+ CometConnection conn = new CometConnection(request, response);
+ BeforeConnectEvent be = new BeforeConnectEvent(this, request, response);
+ if (!this.fireEvent(be)) {
+ conn.getResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ conn.getResponse().getWriter().close();
+ return;
+ }
+ ct.addConnection(conn);
+ CometContext cc = CometContext.getInstance();
+ ConnectionDTO cdto = new ConnectionDTO(conn.getId(), conn.getWorkStyle(), cc.getAppModules(), cc.getTimeout());
+ sendTo(CometProtocol.SYS_CHANNEL, conn, cdto);
+ try {// 强制关闭长连接工作模式下的输出
+ conn.getResponse().getWriter().close();
+ conn.setState(CometProtocol.STATE_DYING);
+ conn.setResponse(null);
+ conn.setDyingTime(System.currentTimeMillis());
+ } catch (Exception ex) {
+ } finally {
+ ConnectEvent e = new ConnectEvent(this, conn);
+ this.fireEvent(e);
+ }
+
+ }
+
+ void dying(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ // response.setStatus(CometProtocol.HTTPSTATUS_TIMEOUT);
+ String uId = request.getParameter("uid");
+ String cId = request.getParameter("cid");
+ CometContext.getInstance().log("【CometDebug】-->【dying】-->cid:" + cId + "," + "uid:" + uId);
+
+ CometConnection conn = ct.getConnection(request);
+ if (conn != null) {
+ CometContext.getInstance().getEngine().sendTo(CometProtocol.SYS_CHANNEL, conn, CometProtocol.STATE_DYING);
+ }
+ try {
+ conn.getResponse().getWriter().close();
+ } catch (Exception exc) {
+ try {
+ response.getWriter().close();
+ } catch (Exception excp) {
+ excp.printStackTrace();
+ }
+
+ }
+ if (conn != null) {
+ conn.setState(CometProtocol.STATE_DYING);
+ conn.setResponse(null);
+ conn.setDyingTime(System.currentTimeMillis());
+ DyingEvent e = new DyingEvent(this, conn);
+ this.fireEvent(e);
+ }
+ }
+
+ void revival(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ String cId = getConnectionId(request);
+
+ String uId = request.getParameter("uid");
+ CometContext.getInstance().log("【CometDebug】-->【revival】-->cid:" + cId + "," + "uid:" + uId);
+
+ if (cId == null) {
+ drop(request, response);
+ // throw new CometException("无法复活,断开连接。");
+ }
+ CometConnection conn = ct.getConnection(cId);
+ if (conn != null /* && CometProtocol.STATE_DYING.equals(conn.getState()) */) {
+ conn.setRequest(request);
+ conn.setResponse(response);
+ conn.setDyingTime(System.currentTimeMillis());
+ conn.setState(CometProtocol.STATE_ALIVE);
+ RevivalEvent e = new RevivalEvent(this, conn);
+ this.fireEvent(e);
+ sender.sendCacheMessage(conn);
+ } else {
+ drop(request, response);
+ // throw new CometException("非正常复活,断开连接。conn=" + conn);
+ }
+ }
+
+ /**
+ * 断开一个连接
+ * @param request
+ * @param response
+ * @throws IOException
+ */
+
+ public void drop(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+ BeforeDropEvent be = new BeforeDropEvent(this, request);
+ if (!this.fireEvent(be)) {
+ return;
+ }
+ String cId = getConnectionId(request);
+
+ String uId = request.getParameter("uid");
+ CometContext.getInstance().log("【CometDebug】-->【drop】-->cid:" + cId + "," + "uid:" + uId);
+
+ CometConnection conn = null;
+ if (cId != null) {
+ conn = ct.getConnection(cId);
+ } else {
+ conn = ct.getConnection(request);
+ }
+ if (conn != null) {
+ remove(conn);
+ }
+ // response.setStatus(CometProtocol.HTTPSTATUS_ERROR);
+ response.getWriter().close();
+ }
+
+ void remove(CometConnection aConn) {
+
+ BeforeRemoveEvent be = new BeforeRemoveEvent(this, aConn);
+ if (!this.fireEvent(be)) {
+ return;
+ }
+ sender.getCacheMessage(aConn);
+ ct.removeConnection(aConn);
+ // Fixed nio endpoint exception
+ /*
+ * try { aConn.getResponse().getWriter().close(); } catch (Exception
+ * exc) { // 连接有可能是dying,此时getResponse为空是正常的,这里仅保证对有效的Response做出回应 }
+ */
+ RemovedEvent re = new RemovedEvent(this, aConn);
+ this.fireEvent(re);
+ DropEvent de = new DropEvent(this, aConn);
+ this.fireEvent(de);
+
+ }
+
+ /**
+ * 按ID获取已有
+ * @param id
+ * @return
+ */
+
+ public CometConnection getConnection(String id) {
+ return ct.getConnection(id);
+ }
+
+ /**
+ * 按Request对象获得连接对象
+ * @param request
+ * @return
+ */
+
+ public CometConnection getConnection(HttpServletRequest request) {
+ String cId = getConnectionId(request);
+ CometConnection conn = null;
+ if (cId != null) {
+ conn = ct.getConnection(cId);
+ } else {
+ conn = ct.getConnection(request);
+ }
+ return conn;
+ }
+
+ /**
+ * 获得所有连接对象
+ * @return
+ */
+
+ public List getConnections() {
+ return ct.getConnections();
+ }
+
+ /**
+ * 向连接发送消息
+ * @param channel 应用通道标识
+ * @param c 连接对象
+ * @param data 数据
+ */
+
+ public void sendTo(String channel, CometConnection c, Object data) {
+ CometMessage msg = new CometMessage(data, channel);
+ sender.sendTo(c, msg);
+ MessageEvent e = new MessageEvent(this, c, msg);
+ this.fireEvent(e);
+ }
+
+ /**
+ * 向连接发送批量数据
+ * @param channel 应用通道标识
+ * @param c 连接对象
+ * @param data 数据列表
+ */
+
+ public void sendTo(String channel, CometConnection c, List
+ * The value is deemed to be empty if it is
+ * - null
+ * - undefined
+ * - an empty array
+ * - a zero length string (Unless the allowBlank parameter is true)
+ *
+ * @param {Mixed} value The value to test
+ * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false)
+ * @return {Boolean}
+ */
+ isEmpty : function(v, allowBlank){
+ return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript array, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isArray : function(v){
+ return Object.prototype.toString.apply(v) === '[object Array]';
+ },
+
+ /**
+ * Returns true if the passed object is a JavaScript date object, otherwise false.
+ * @param {Object} object The object to test
+ * @return {Boolean}
+ */
+ isDate : function(v){
+ return Object.prototype.toString.apply(v) === '[object Date]';
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript Object, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isObject : function(v){
+ return !!v && Object.prototype.toString.call(v) === '[object Object]';
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isPrimitive : function(v){
+ return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v);
+ },
+
+ /**
+ * Returns true if the passed value is a JavaScript Function, otherwise false.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isFunction : function(v){
+ return Object.prototype.toString.apply(v) === '[object Function]';
+ },
+
+ /**
+ * Returns true if the passed value is a number. Returns false for non-finite numbers.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isNumber : function(v){
+ return typeof v === 'number' && isFinite(v);
+ },
+
+ /**
+ * Returns true if the passed value is a string.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isString : function(v){
+ return typeof v === 'string';
+ },
+
+ /**
+ * Returns true if the passed value is a boolean.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isBoolean : function(v){
+ return typeof v === 'boolean';
+ },
+
+ /**
+ * Returns true if the passed value is an HTMLElement
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isElement : function(v) {
+ return !!v && v.tagName;
+ },
+
+ /**
+ * Returns true if the passed value is not undefined.
+ * @param {Mixed} value The value to test
+ * @return {Boolean}
+ */
+ isDefined : function(v){
+ return typeof v !== 'undefined';
+ },
+ /**
+ * 将任何可迭代(带有length属性)的对象转换成Array对象
+ * 不要用它转换字符串.IE doesn't support "abc"[0] which this implementation depends on.
+ * For strings, use this instead: "abc".match(/./g) => [a,b,c];
+ * @param {Iterable} the iterable object to be turned into a true Array.
+ * @return (Array) array
+ */
+ toArray : function(){
+ return JS.isIE ?
+ function(a, i, j, res){
+ res = [];
+ for(var x = 0, len = a.length; x < len; x++) {
+ res.push(a[x]);
+ }
+ return res.slice(i || 0, j || res.length);
+ } :
+ function(a, i, j){
+ return Array.prototype.slice.call(a, i || 0, j || a.length);
+ };
+ }()
+};
+JS.log = JS.Syntax.log;
+JS.ns = JS.Syntax.nameSpace;
+JS.apply = JS.Syntax.apply;
+JS.override = JS.Syntax.override;
+JS.extend = JS.Syntax.extend;
+JS.callBack = JS.Syntax.callBack;
+JS.isEmpty = JS.Syntax.isEmpty;
+JS.isArray = JS.Syntax.isArray;
+JS.isDate = JS.Syntax.isDate;
+JS.isObject = JS.Syntax.isObject;
+JS.isPrimitive = JS.Syntax.isPrimitive;
+JS.isFunction = JS.Syntax.isFunction;
+JS.isNumber = JS.Syntax.isNumber;
+JS.isString = JS.Syntax.isString;
+JS.isBoolean = JS.Syntax.isBoolean;
+JS.isElement = JS.Syntax.isElement;
+JS.isDefined = JS.Syntax.isDefined;
+JS.toArray = JS.Syntax.toArray;
+
+JS.DomEvent = {
+ /**
+ * @method
+ * @param {DOM} el
+ * @param {String} name
+ * @param {Function} fun
+ * @param {Object} scope
+ */
+ on: function(el, name, fun, scope){
+ if (el.addEventListener) {
+ //el.addEventListener(name, fun, false);
+ //TODO:若封闭成带有作用域的功能,如何删除事件,是否自己要记一下on的函数,然后在un下删除它
+
+ el.addEventListener(name, function(){
+ JS.callBack(fun,scope,arguments);
+ }, false);
+
+ } else {
+ //el.attachEvent('on' + name, fun);
+
+ el.attachEvent('on' + name, function(){
+ JS.callBack(fun,scope,arguments);
+ });
+
+ }
+ },
+ /**
+ * @method
+ * @param {DOM} el
+ * @param {String} name
+ * @param {Function} fun
+ * @param {Object} scope
+ */
+ un: function(el, name, fun,scope){
+ if (el.removeEventListener){
+ el.removeEventListener(name, fun, false);
+ } else {
+ el.detachEvent('on' + name, fun);
+ }
+ },
+ /**
+ * @method
+ * @param {DOMEvent} e
+ */
+ stop: function(e){
+ e.returnValue = false;
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+ JS.DomEvent.stopPropagation(e);
+ },
+ /**
+ * @method
+ * @param {DOMEvent} e
+ */
+ stopPropagation: function(e){
+ e.cancelBubble = true;
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+ }
+};
+JS.on = JS.DomEvent.on;
+JS.un = JS.DomEvent.un;
+/**
+ *
+ var task = new Ext.util.DelayedTask(function(){
+ alert(Ext.getDom('myInputField').value.length);
+ });
+ Ext.get('myInputField').on('keypress', function(){
+ task.delay(500);
+ });
+ *
+ */
+JS.DelayedTask = function(fn, scope, args){
+ var me = this,
+ id,
+ call = function(){
+ clearInterval(id);
+ id = null;
+ fn.apply(scope, args || []);
+ };
+
+ /**
+ * Cancels any pending timeout and queues a new one
+ * @param {Number} delay The milliseconds to delay
+ * @param {Function} newFn (optional) Overrides function passed to constructor
+ * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope
+ * is specified, this will refer to the browser window.
+ * @param {Array} newArgs (optional) Overrides args passed to constructor
+ */
+ me.delay = function(delay, newFn, newScope, newArgs){
+ me.cancel();
+ fn = newFn || fn;
+ scope = newScope || scope;
+ args = newArgs || args;
+ id = setInterval(call, delay);
+ };
+
+ /**
+ * Cancel the last queued timeout
+ */
+ me.cancel = function(){
+ if(id){
+ clearInterval(id);
+ id = null;
+ }
+ };
+};
diff --git a/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base b/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base
new file mode 100644
index 0000000..e4362e8
--- /dev/null
+++ b/.svn/pristine/b8/b80159993a0efd33592b79750230a838857a3e6e.svn-base
@@ -0,0 +1,13 @@
+/*
+ * Comet4J Copyright(c) 2011, http://code.google.com/p/comet4j/ This code is
+ * licensed under BSD license. Use it as you wish, but keep this copyright
+ * intact.
+ */
+package org.comet4j.core.listener;
+
+import org.comet4j.core.event.ErrorEvent;
+import org.comet4j.event.Listener;
+
+public abstract class ErrorListener extends Listener {
+
+}
diff --git a/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base b/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base
new file mode 100644
index 0000000..110f684
Binary files /dev/null and b/.svn/pristine/b8/b8b2a73365f842ef9682b1356d1870da8612b14a.svn-base differ
diff --git a/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base b/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base
new file mode 100644
index 0000000..9c1653b
Binary files /dev/null and b/.svn/pristine/b8/b8ce4b8f9cd6ea9291a1c5fed07caa1735c19f15.svn-base differ
diff --git a/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base b/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base
new file mode 100644
index 0000000..9834745
--- /dev/null
+++ b/.svn/pristine/b9/b9339da2c49154aa2b4d197e46e7c2f80bad7703.svn-base
@@ -0,0 +1,162 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@extjs.com
+ *
+ * http://extjs.com/license
+ */
+
+Ext.DomHelper=function(){var L=null;var F=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var B=/^table|tbody|tr|td$/i;var A=function(T){if(typeof T=="string"){return T}var O="";if(Ext.isArray(T)){for(var R=0,P=T.length;R"}else{O+=">";var U=T.children||T.cn;if(U){O+=A(U)}else{if(T.html){O+=T.html}}O+=""+T.tag+">"}return O};var M=function(T,O){var S;if(Ext.isArray(T)){S=document.createDocumentFragment();for(var R=0,P=T.length;R",C=J+"
",K=""+E,H=C+"",D="
"+K;var G=function(N,O,Q,P){if(!L){L=document.createElement("div")}var R;var S=null;if(N=="td"){if(O=="afterbegin"||O=="beforeend"){return }if(O=="beforebegin"){S=Q;Q=Q.parentNode}else{S=Q.nextSibling;Q=Q.parentNode}R=I(4,H,P,D)}else{if(N=="tr"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(4,H,P,D)}}}else{if(N=="tbody"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(3,C,P,K)}}}else{if(O=="beforebegin"||O=="afterend"){return }if(O=="afterbegin"){S=Q.firstChild}R=I(2,J,P,E)}}}Q.insertBefore(R,S);return R};return{useDom:false,markup:function(N){return A(N)},applyStyles:function(P,Q){if(Q){P=Ext.fly(P);if(typeof Q=="string"){var O=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var R;while((R=O.exec(Q))!=null){P.setStyle(R[1],R[2])}}else{if(typeof Q=="object"){for(var N in Q){P.setStyle(N,Q[N])}}else{if(typeof Q=="function"){Ext.DomHelper.applyStyles(P,Q.call())}}}}},insertHtml:function(P,R,Q){P=P.toLowerCase();if(R.insertAdjacentHTML){if(B.test(R.tagName)){var O;if(O=G(R.tagName.toLowerCase(),P,R,Q)){return O}}switch(P){case"beforebegin":R.insertAdjacentHTML("BeforeBegin",Q);return R.previousSibling;case"afterbegin":R.insertAdjacentHTML("AfterBegin",Q);return R.firstChild;case"beforeend":R.insertAdjacentHTML("BeforeEnd",Q);return R.lastChild;case"afterend":R.insertAdjacentHTML("AfterEnd",Q);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""}var N=R.ownerDocument.createRange();var S;switch(P){case"beforebegin":N.setStartBefore(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R);return R.previousSibling;case"afterbegin":if(R.firstChild){N.setStartBefore(R.firstChild);S=N.createContextualFragment(Q);R.insertBefore(S,R.firstChild);return R.firstChild}else{R.innerHTML=Q;return R.firstChild}case"beforeend":if(R.lastChild){N.setStartAfter(R.lastChild);S=N.createContextualFragment(Q);R.appendChild(S);return R.lastChild}else{R.innerHTML=Q;return R.lastChild}case"afterend":N.setStartAfter(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R.nextSibling);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""},insertBefore:function(N,P,O){return this.doInsert(N,P,O,"beforeBegin")},insertAfter:function(N,P,O){return this.doInsert(N,P,O,"afterEnd","nextSibling")},insertFirst:function(N,P,O){return this.doInsert(N,P,O,"afterBegin","firstChild")},doInsert:function(Q,S,R,T,P){Q=Ext.getDom(Q);var O;if(this.useDom){O=M(S,null);(P==="firstChild"?Q:Q.parentNode).insertBefore(O,P?Q[P]:Q)}else{var N=A(S);O=this.insertHtml(T,Q,N)}return R?Ext.get(O,true):O},append:function(P,R,Q){P=Ext.getDom(P);var O;if(this.useDom){O=M(R,null);P.appendChild(O)}else{var N=A(R);O=this.insertHtml("beforeEnd",P,N)}return Q?Ext.get(O,true):O},overwrite:function(N,P,O){N=Ext.getDom(N);N.innerHTML=A(P);return O?Ext.get(N.firstChild,true):N.firstChild},createTemplate:function(O){var N=A(O);return new Ext.Template(N)}}}();
+Ext.Template=function(E){var B=arguments;if(Ext.isArray(E)){E=E.join("")}else{if(B.length>1){var C=[];for(var D=0,A=B.length;D+~]\s?|\s|$)/;var tagTokenRe=/^(#)?([\w-\*]+)/;var nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/;function child(p,index){var i=0;var n=p.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(d){var n=d.firstChild,ni=-1;while(n){var nx=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){d.removeChild(n)}else{n.nodeIndex=++ni}n=nx}return this}function byClassName(c,a,v){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=ci}}return r}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.children||ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&(n.nodeType!=1||(tagName=="*"||n.tagName.toLowerCase()!=tagName))){}if(n){result[++ri]=n}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i1){return nodup(results)}return results},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root);n=n[0]?n[0]:n;var v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el);var result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w-]+)/,select:"n = byClassName(n, null, \" {1} \");"},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:"n = byPseudo(n, \"{1}\", \"{2}\");"},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:"n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"},{re:/^#([\w-]+)/,select:"n = byId(n, null, \"{1}\");"},{re:/^@([\w-]+)/,select:"return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1;var m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a);var f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},"empty":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true)},"any":function(c,selectors){var ss=selectors.split("|");var r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},"odd":function(c){return this["nth-child"](c,"odd")},"even":function(c){return this["nth-child"](c,"even")},"nth":function(c,a){return c[a-1]||[]},"first":function(c){return c[0]||[]},"last":function(c){return c[c.length-1]||[]},"has":function(c,ss){var s=Ext.DomQuery.select;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select;
+Ext.util.Observable=function(){if(this.listeners){this.on(this.listeners);delete this.listeners}};Ext.util.Observable.prototype={fireEvent:function(){if(this.eventsSuspended!==true){var A=this.events[arguments[0].toLowerCase()];if(typeof A=="object"){return A.fire.apply(A,Array.prototype.slice.call(arguments,1))}}return true},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(A,C,B,F){if(typeof A=="object"){F=A;for(var E in F){if(this.filterOptRe.test(E)){continue}if(typeof F[E]=="function"){this.addListener(E,F[E],F.scope,F)}else{this.addListener(E,F[E].fn,F[E].scope,F[E])}}return }F=(!F||typeof F=="boolean")?{}:F;A=A.toLowerCase();var D=this.events[A]||true;if(typeof D=="boolean"){D=new Ext.util.Event(this,A);this.events[A]=D}D.addListener(C,B,F)},removeListener:function(A,C,B){var D=this.events[A.toLowerCase()];if(typeof D=="object"){D.removeListener(C,B)}},purgeListeners:function(){for(var A in this.events){if(typeof this.events[A]=="object"){this.events[A].clearListeners()}}},relayEvents:function(F,D){var E=function(G){return function(){return this.fireEvent.apply(this,Ext.combine(G,Array.prototype.slice.call(arguments,0)))}};for(var C=0,A=D.length;C0},suspendEvents:function(){this.eventsSuspended=true},resumeEvents:function(){this.eventsSuspended=false},getMethodEvent:function(G){if(!this.methodEvents){this.methodEvents={}}var F=this.methodEvents[G];if(!F){F={};this.methodEvents[G]=F;F.originalFn=this[G];F.methodName=G;F.before=[];F.after=[];var C,B,D;var E=this;var A=function(J,I,H){if((B=J.apply(I||E,H))!==undefined){if(typeof B==="object"){if(B.returnValue!==undefined){C=B.returnValue}else{C=B}if(B.cancel===true){D=true}}else{if(B===false){D=true}else{C=B}}}};this[G]=function(){C=B=undefined;D=false;var I=Array.prototype.slice.call(arguments,0);for(var J=0,H=F.before.length;J0){this.firing=true;var G=Array.prototype.slice.call(arguments,0);for(var H=0;H=33&&D<=40)||D==this.RETURN||D==this.TAB||D==this.ESC},isSpecialKey:function(){var D=this.keyCode;return(this.type=="keypress"&&this.ctrlKey)||D==9||D==13||D==40||D==27||(D==16)||(D==17)||(D>=18&&D<=20)||(D>=33&&D<=35)||(D>=36&&D<=39)||(D>=44&&D<=45)},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this)}B.stopPropagation(this.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){var D=this.keyCode||this.charCode;return Ext.isSafari?(A[D]||D):D},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getTime:function(){if(this.browserEvent){return B.getTime(this.browserEvent)}return null},getXY:function(){return this.xy},getTarget:function(E,F,D){return E?Ext.fly(this.target).findParent(E,F,D):(D?Ext.get(this.target):this.target)},getRelatedTarget:function(){if(this.browserEvent){return B.getRelatedTarget(this.browserEvent)}return null},getWheelDelta:function(){var D=this.browserEvent;var E=0;if(D.wheelDelta){E=D.wheelDelta/120}else{if(D.detail){E=-D.detail/3}}return E},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)?true:false},within:function(E,F){var D=this[F?"getRelatedTarget":"getTarget"]();return D&&Ext.fly(E).contains(D)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])}};return new Ext.EventObjectImpl()}();
+(function(){var D=Ext.lib.Dom;var E=Ext.lib.Event;var A=Ext.lib.Anim;var propCache={};var camelRe=/(-[a-z])/gi;var camelFn=function(m,a){return a.charAt(1).toUpperCase()};var view=document.defaultView;Ext.Element=function(element,forceNew){var dom=typeof element=="string"?document.getElementById(element):element;if(!dom){return null}var id=dom.id;if(forceNew!==true&&id&&Ext.Element.cache[id]){return Ext.Element.cache[id]}this.dom=dom;this.id=id||Ext.id(dom)};var El=Ext.Element;El.prototype={originalDisplay:"",visibilityMode:1,defaultUnit:"px",setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this},enableDisplayMode:function(display){this.setVisibilityMode(El.DISPLAY);if(typeof display!="undefined"){this.originalDisplay=display}return this},findParent:function(simpleSelector,maxDepth,returnEl){var p=this.dom,b=document.body,depth=0,dq=Ext.DomQuery,stopEl;maxDepth=maxDepth||50;if(typeof maxDepth!="number"){stopEl=Ext.getDom(maxDepth);maxDepth=10}while(p&&p.nodeType==1&&depthch||tcb){c.scrollTop=b-ch}}c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||lcr){c.scrollLeft=r-c.clientWidth}}c.scrollLeft=c.scrollLeft}return this},scrollChildIntoView:function(child,hscroll){Ext.fly(child,"_scrollChildIntoView").scrollIntoView(this,hscroll)},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=="function"){onComplete()}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=="function"){onComplete()}}.createDelegate(this),easing)}}.createDelegate(this),0);return this},contains:function(el){if(!el){return false}return D.isAncestor(this.dom,el.dom?el.dom:el)},isVisible:function(deep){var vis=!(this.getStyle("visibility")=="hidden"||this.getStyle("display")=="none");if(deep!==true||!vis){return vis}var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!="body"){if(!Ext.fly(p,"_isVisible").isVisible()){return false}p=p.parentNode}return true},select:function(selector,unique){return El.select(selector,unique,this.dom)},query:function(selector){return Ext.DomQuery.select(selector,this.dom)},child:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(" > "+selector,this.dom);return returnDom?n:Ext.get(n)},initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},setVisible:function(visible,animate){if(!animate||!A){if(this.visibilityMode==El.DISPLAY){this.setDisplayed(visible)}else{this.fixDisplay();this.dom.style.visibility=visible?"visible":"hidden"}}else{var dom=this.dom;var visMode=this.visibilityMode;if(visible){this.setOpacity(0.01);this.setVisible(true)}this.anim({opacity:{to:(visible?1:0)}},this.preanim(arguments,1),null,0.35,"easeIn",function(){if(!visible){if(visMode==El.DISPLAY){dom.style.display="none"}else{dom.style.visibility="hidden"}Ext.get(dom).setOpacity(1)}})}return this},isDisplayed:function(){return this.getStyle("display")!="none"},toggle:function(animate){this.setVisible(!this.isVisible(),this.preanim(arguments,0));return this},setDisplayed:function(value){if(typeof value=="boolean"){value=value?this.originalDisplay:"none"}this.setStyle("display",value);return this},focus:function(){try{this.dom.focus()}catch(e){}return this},blur:function(){try{this.dom.blur()}catch(e){}return this},addClass:function(className){if(Ext.isArray(className)){for(var i=0,len=className.length;idw+scrollX){x=swapX?r.left-w:dw+scrollX-w}if(xdh+scrollY){y=swapY?r.top-h:dh+scrollY-h}if(yvr){x=vr-w;moved=true}if((y+h)>vb){y=vb-h;moved=true}if(x";E.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:
+
+
+
+
+
+连接状态:;
+连接数量:;
+已用内存:;
+可用内存:;
+内存容量:;
+最大容量:;
+系统已运行:
+
+
+
+
+
+
+请输入:
+
+
+
+
+
+ 请输入昵称:
+
+
+
+
+