Produced by Araxis Merge on Mon Mar 6 16:03:37 2006 UTC. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a reasonably standards compliant browser such as the latest version of Firefox or Internet Explorer. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | C:\Merge Test Files\4.0.6\catalina\src\share\org\apache\catalina\connector\http | HttpProcessor.java | Tue Oct 8 15:15:34 2002 UTC |
| 2 | C:\Merge Test Files\4.1.18\catalina\src\share\org\apache\catalina\connector\http | HttpProcessor.java | Thu Dec 19 13:49:42 2002 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 18 | 1232 |
| Changed | 9 | 27 |
| Inserted | 7 | 40 |
| Removed | 2 | 2 |
| Whitespace | All differences in whitespace within lines are ignored |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | /* * $Header: /home/cvs/ jakarta-to mcat-4.0/c atalina/sr c/share/or g/apache/c atalina/co nnector/ht tp/HttpPro cessor.jav a,v 1. 3 6 .2.5 2002/04/04 17: 46: 0 8 remm Exp $ | 1 |
/*
*
$Header:
/home/cvs/
jakarta-to
mcat-4.0/c
atalina/sr
c/share/or
g/apache/c
atalina/co
nnector/ht
tp/HttpPro
cessor.jav
a,v
1.
4
6
|
|||
| 2 | * $Revision: 1. 3 6 .2.5 $ | 2 |
*
$Revision:
1.
4
6
|
|||
| 3 | * $Date: 2002/04/04 17: 46: 0 8 $ | 3 | * $Date: 2002/04/04 17: 5 0 :34 $ | |||
| 4 | * | 4 | * | |||
| 5 | * ======= ========== ========== ========== ========== ========== ========== = | 5 | * ======= ========== ========== ========== ========== ========== ========== = | |||
| 6 | * | 6 | * | |||
| 7 | * The Apa che Softwa re License , Version 1.1 | 7 | * The Apa che Softwa re License , Version 1.1 | |||
| 8 | * | 8 | * | |||
| 9 | * Copyrig ht (c) 199 9 The Apac he Softwar e Foundati on. All r ights | 9 | * Copyrig ht (c) 199 9 The Apac he Softwar e Foundati on. All r ights | |||
| 10 | * reserve d. | 10 | * reserve d. | |||
| 11 | * | 11 | * | |||
| 12 | * Redistr ibution an d use in s ource and binary for ms, with o r without | 12 | * Redistr ibution an d use in s ource and binary for ms, with o r without | |||
| 13 | * modific ation, are permitted provided that the f ollowing c onditions | 13 | * modific ation, are permitted provided that the f ollowing c onditions | |||
| 14 | * are met : | 14 | * are met : | |||
| 15 | * | 15 | * | |||
| 16 | * 1. Redi stribution s of sourc e code mus t retain t he above c opyright | 16 | * 1. Redi stribution s of sourc e code mus t retain t he above c opyright | |||
| 17 | * noti ce, this l ist of con ditions an d the foll owing disc laimer. | 17 | * noti ce, this l ist of con ditions an d the foll owing disc laimer. | |||
| 18 | * | 18 | * | |||
| 19 | * 2. Redi stribution s in binar y form mus t reproduc e the abov e copyrigh t | 19 | * 2. Redi stribution s in binar y form mus t reproduc e the abov e copyrigh t | |||
| 20 | * noti ce, this l ist of con ditions an d the foll owing disc laimer in | 20 | * noti ce, this l ist of con ditions an d the foll owing disc laimer in | |||
| 21 | * the documentat ion and/or other mat erials pro vided with the | 21 | * the documentat ion and/or other mat erials pro vided with the | |||
| 22 | * dist ribution. | 22 | * dist ribution. | |||
| 23 | * | 23 | * | |||
| 24 | * 3. The end-user d ocumentati on include d with the redistrib ution, if | 24 | * 3. The end-user d ocumentati on include d with the redistrib ution, if | |||
| 25 | * any, must incl ude the fo llowing ac knowlegeme nt: | 25 | * any, must incl ude the fo llowing ac knowlegeme nt: | |||
| 26 | * " This produ ct include s software developed by the | 26 | * " This produ ct include s software developed by the | |||
| 27 | * Apache Sof tware Foun dation (ht tp://www.a pache.org/ )." | 27 | * Apache Sof tware Foun dation (ht tp://www.a pache.org/ )." | |||
| 28 | * Alte rnately, t his acknow legement m ay appear in the sof tware itse lf, | 28 | * Alte rnately, t his acknow legement m ay appear in the sof tware itse lf, | |||
| 29 | * if a nd whereve r such thi rd-party a cknowlegem ents norma lly appear . | 29 | * if a nd whereve r such thi rd-party a cknowlegem ents norma lly appear . | |||
| 30 | * | 30 | * | |||
| 31 | * 4. The names "The Jakarta P roject", " Tomcat", a nd "Apache Software | 31 | * 4. The names "The Jakarta P roject", " Tomcat", a nd "Apache Software | |||
| 32 | * Foun dation" mu st not be used to en dorse or p romote pro ducts deri ved | 32 | * Foun dation" mu st not be used to en dorse or p romote pro ducts deri ved | |||
| 33 | * from this soft ware witho ut prior w ritten per mission. F or written | 33 | * from this soft ware witho ut prior w ritten per mission. F or written | |||
| 34 | * perm ission, pl ease conta ct apache@ apache.org . | 34 | * perm ission, pl ease conta ct apache@ apache.org . | |||
| 35 | * | 35 | * | |||
| 36 | * 5. Prod ucts deriv ed from th is softwar e may not be called "Apache" | 36 | * 5. Prod ucts deriv ed from th is softwar e may not be called "Apache" | |||
| 37 | * nor may "Apach e" appear in their n ames witho ut prior w ritten | 37 | * nor may "Apach e" appear in their n ames witho ut prior w ritten | |||
| 38 | * perm ission of the Apache Group. | 38 | * perm ission of the Apache Group. | |||
| 39 | * | 39 | * | |||
| 40 | * THIS SO FTWARE IS PROVIDED ` `AS IS'' A ND ANY EXP RESSED OR IMPLIED | 40 | * THIS SO FTWARE IS PROVIDED ` `AS IS'' A ND ANY EXP RESSED OR IMPLIED | |||
| 41 | * WARRANT IES, INCLU DING, BUT NOT LIMITE D TO, THE IMPLIED WA RRANTIES | 41 | * WARRANT IES, INCLU DING, BUT NOT LIMITE D TO, THE IMPLIED WA RRANTIES | |||
| 42 | * OF MERC HANTABILIT Y AND FITN ESS FOR A PARTICULAR PURPOSE A RE | 42 | * OF MERC HANTABILIT Y AND FITN ESS FOR A PARTICULAR PURPOSE A RE | |||
| 43 | * DISCLAI MED. IN N O EVENT SH ALL THE AP ACHE SOFTW ARE FOUNDA TION OR | 43 | * DISCLAI MED. IN N O EVENT SH ALL THE AP ACHE SOFTW ARE FOUNDA TION OR | |||
| 44 | * ITS CON TRIBUTORS BE LIABLE FOR ANY DI RECT, INDI RECT, INCI DENTAL, | 44 | * ITS CON TRIBUTORS BE LIABLE FOR ANY DI RECT, INDI RECT, INCI DENTAL, | |||
| 45 | * SPECIAL , EXEMPLAR Y, OR CONS EQUENTIAL DAMAGES (I NCLUDING, BUT NOT | 45 | * SPECIAL , EXEMPLAR Y, OR CONS EQUENTIAL DAMAGES (I NCLUDING, BUT NOT | |||
| 46 | * LIMITED TO, PROCU REMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | 46 | * LIMITED TO, PROCU REMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| 47 | * USE, DA TA, OR PRO FITS; OR B USINESS IN TERRUPTION ) HOWEVER CAUSED AND | 47 | * USE, DA TA, OR PRO FITS; OR B USINESS IN TERRUPTION ) HOWEVER CAUSED AND | |||
| 48 | * ON ANY THEORY OF LIABILITY, WHETHER I N CONTRACT , STRICT L IABILITY, | 48 | * ON ANY THEORY OF LIABILITY, WHETHER I N CONTRACT , STRICT L IABILITY, | |||
| 49 | * OR TORT (INCLUDIN G NEGLIGEN CE OR OTHE RWISE) ARI SING IN AN Y WAY OUT | 49 | * OR TORT (INCLUDIN G NEGLIGEN CE OR OTHE RWISE) ARI SING IN AN Y WAY OUT | |||
| 50 | * OF THE USE OF THI S SOFTWARE , EVEN IF ADVISED OF THE POSSI BILITY OF | 50 | * OF THE USE OF THI S SOFTWARE , EVEN IF ADVISED OF THE POSSI BILITY OF | |||
| 51 | * SUCH DA MAGE. | 51 | * SUCH DA MAGE. | |||
| 52 | * ======= ========== ========== ========== ========== ========== ========== = | 52 | * ======= ========== ========== ========== ========== ========== ========== = | |||
| 53 | * | 53 | * | |||
| 54 | * This so ftware con sists of v oluntary c ontributio ns made by many | 54 | * This so ftware con sists of v oluntary c ontributio ns made by many | |||
| 55 | * individ uals on be half of th e Apache S oftware Fo undation. For more | 55 | * individ uals on be half of th e Apache S oftware Fo undation. For more | |||
| 56 | * informa tion on th e Apache S oftware Fo undation, please see | 56 | * informa tion on th e Apache S oftware Fo undation, please see | |||
| 57 | * <http:/ /www.apach e.org/>. | 57 | * <http:/ /www.apach e.org/>. | |||
| 58 | * | 58 | * | |||
| 59 | * [Additi onal notic es, if req uired by p rior licen sing condi tions] | 59 | * [Additi onal notic es, if req uired by p rior licen sing condi tions] | |||
| 60 | * | 60 | * | |||
| 61 | */ | 61 | */ | |||
| 62 | 62 | |||||
| 63 | 63 | |||||
| 64 | package or g.apache.c atalina.co nnector.ht tp; | 64 | package or g.apache.c atalina.co nnector.ht tp; | |||
| 65 | 65 | |||||
| 66 | 66 | |||||
| 67 | import jav a.io.Buffe redInputSt ream; | 67 | import jav a.io.Buffe redInputSt ream; | |||
| 68 | import jav a.io.EOFEx ception; | 68 | import jav a.io.EOFEx ception; | |||
| 69 | import jav a.io.Inter ruptedIOEx ception; | 69 | import jav a.io.Inter ruptedIOEx ception; | |||
| 70 | import jav a.io.Input Stream; | 70 | import jav a.io.Input Stream; | |||
| 71 | import jav a.io.IOExc eption; | 71 | import jav a.io.IOExc eption; | |||
| 72 | import jav a.io.Outpu tStream; | 72 | import jav a.io.Outpu tStream; | |||
| 73 | import jav a.net.Inet Address; | 73 | import jav a.net.Inet Address; | |||
| 74 | import jav a.net.Sock et; | 74 | import jav a.net.Sock et; | |||
| 75 | import jav a.util.Arr ayList; | 75 | import jav a.util.Arr ayList; | |||
| 76 | import jav a.util.Ite rator; | 76 | import jav a.util.Ite rator; | |||
| 77 | import jav a.util.Loc ale; | 77 | import jav a.util.Loc ale; | |||
| 78 | import jav a.util.Str ingTokeniz er; | 78 | import jav a.util.Str ingTokeniz er; | |||
| 79 | import jav a.util.Tre eMap; | 79 | import jav a.util.Tre eMap; | |||
| 80 | import jav ax.servlet .ServletEx ception; | 80 | import jav ax.servlet .ServletEx ception; | |||
| 81 | import jav ax.servlet .http.Cook ie; | 81 | import jav ax.servlet .http.Cook ie; | |||
| 82 | import jav ax.servlet .http.Http ServletReq uest; | 82 | import jav ax.servlet .http.Http ServletReq uest; | |||
| 83 | import jav ax.servlet .http.Http ServletRes ponse; | 83 | import jav ax.servlet .http.Http ServletRes ponse; | |||
| 84 | import org .apache.ca talina.Con nector; | 84 | import org .apache.ca talina.Con nector; | |||
| 85 | import org .apache.ca talina.Con tainer; | 85 | import org .apache.ca talina.Con tainer; | |||
| 86 | import org .apache.ca talina.Glo bals; | 86 | import org .apache.ca talina.Glo bals; | |||
| 87 | import org .apache.ca talina.Htt pRequest; | 87 | import org .apache.ca talina.Htt pRequest; | |||
| 88 | import org .apache.ca talina.Htt pResponse; | 88 | import org .apache.ca talina.Htt pResponse; | |||
| 89 | import org .apache.ca talina.Lif ecycle; | 89 | import org .apache.ca talina.Lif ecycle; | |||
| 90 | import org .apache.ca talina.Lif ecycleEven t; | 90 | import org .apache.ca talina.Lif ecycleEven t; | |||
| 91 | import org .apache.ca talina.Lif ecycleExce ption; | 91 | import org .apache.ca talina.Lif ecycleExce ption; | |||
| 92 | import org .apache.ca talina.Lif ecycleList ener; | 92 | import org .apache.ca talina.Lif ecycleList ener; | |||
| 93 | import org .apache.ca talina.Log ger; | 93 | import org .apache.ca talina.Log ger; | |||
| 94 | import org.apache .catalina. util. Reque st U t il ; | 94 |
import
org.apache
.catalina.
util.
Fa
st
HttpDateFo
rma
t
|
|||
| 95 | import org .apache.ca talina.uti l.Lifecycl eSupport; | 95 | import org .apache.ca talina.uti l.Lifecycl eSupport; | |||
| 96 | import org .apache.ca talina.uti l.RequestU til; | |||||
| 97 | import org .apache.ca talina.uti l.ServerIn fo; | |||||
| 96 | import org .apache.ca talina.uti l.StringMa nager; | 98 | import org .apache.ca talina.uti l.StringMa nager; | |||
| 97 | import org .apache.ca talina.uti l.StringPa rser; | 99 | import org .apache.ca talina.uti l.StringPa rser; | |||
| 98 | 100 | |||||
| 99 | 101 | |||||
| 100 | /** | 102 | /** | |||
| 101 | * Impleme ntation of a request processor (and its associated thread) t hat may | 103 | * Impleme ntation of a request processor (and its associated thread) t hat may | |||
| 102 | * be used by an Htt pConnector to proces s individu al request s. The co nnector | 104 | * be used by an Htt pConnector to proces s individu al request s. The co nnector | |||
| 103 | * will al locate a p rocessor f rom its po ol, assign a particu lar socket to it, | 105 | * will al locate a p rocessor f rom its po ol, assign a particu lar socket to it, | |||
| 104 | * and the processor will then execute t he process ing requir ed to comp lete | 106 | * and the processor will then execute t he process ing requir ed to comp lete | |||
| 105 | * the req uest. Whe n the proc essor is c ompleted, it will re cycle itse lf. | 107 | * the req uest. Whe n the proc essor is c ompleted, it will re cycle itse lf. | |||
| 106 | * | 108 | * | |||
| 107 | * @author Craig R. McClanahan | 109 | * @author Craig R. McClanahan | |||
| 108 | * @author Remy Mauc herat | 110 | * @author Remy Mauc herat | |||
| 109 | * @version $Revision: 1. 3 6 .2.5 $ $Date: 2002/04/04 17: 46: 0 8 $ | 111 |
*
@version
$Revision:
1.
4
6
|
|||
| 112 | * @deprec ated | |||||
| 110 | */ | 113 | */ | |||
| 111 | 114 | |||||
| 112 | final clas s HttpProc essor | 115 | final clas s HttpProc essor | |||
| 113 | implem ents Lifec ycle, Runn able { | 116 | implem ents Lifec ycle, Runn able { | |||
| 114 | 117 | |||||
| 115 | 118 | |||||
| 119 | // --- ---------- ---------- ---------- ---------- ---------- Manifest Constants | |||||
| 120 | ||||||
| 121 | ||||||
| 122 | /** | |||||
| 123 | * Ser ver inform ation stri ng for thi s server. | |||||
| 124 | */ | |||||
| 125 | privat e static f inal Strin g SERVER_I NFO = | |||||
| 126 | Se rverInfo.g etServerIn fo() + " ( HTTP/1.1 C onnector)" ; | |||||
| 127 | ||||||
| 128 | ||||||
| 116 | // --- ---------- ---------- ---------- ---------- ---------- ------ Con structors | 129 | // --- ---------- ---------- ---------- ---------- ---------- ------ Con structors | |||
| 117 | 130 | |||||
| 118 | 131 | |||||
| 119 | /** | 132 | /** | |||
| 120 | * Con struct a n ew HttpPro cessor ass ociated wi th the spe cified con nector. | 133 | * Con struct a n ew HttpPro cessor ass ociated wi th the spe cified con nector. | |||
| 121 | * | 134 | * | |||
| 122 | * @pa ram connec tor HttpCo nnector th at owns th is process or | 135 | * @pa ram connec tor HttpCo nnector th at owns th is process or | |||
| 123 | * @pa ram id Ide ntifier of this Http Processor (unique pe r connecto r) | 136 | * @pa ram id Ide ntifier of this Http Processor (unique pe r connecto r) | |||
| 124 | */ | 137 | */ | |||
| 125 | public HttpProce ssor(HttpC onnector c onnector, int id) { | 138 | public HttpProce ssor(HttpC onnector c onnector, int id) { | |||
| 126 | 139 | |||||
| 127 | su per(); | 140 | su per(); | |||
| 128 | th is.connect or = conne ctor; | 141 | th is.connect or = conne ctor; | |||
| 129 | th is.debug = connector .getDebug( ); | 142 | th is.debug = connector .getDebug( ); | |||
| 130 | th is.id = id ; | 143 | th is.id = id ; | |||
| 131 | th is.proxyNa me = conne ctor.getPr oxyName(); | 144 | th is.proxyNa me = conne ctor.getPr oxyName(); | |||
| 132 | th is.proxyPo rt = conne ctor.getPr oxyPort(); | 145 | th is.proxyPo rt = conne ctor.getPr oxyPort(); | |||
| 133 | th is.request = (HttpRe questImpl) connector .createReq uest(); | 146 | th is.request = (HttpRe questImpl) connector .createReq uest(); | |||
| 134 | th is.respons e = (HttpR esponseImp l) connect or.createR esponse(); | 147 | th is.respons e = (HttpR esponseImp l) connect or.createR esponse(); | |||
| 135 | th is.serverP ort = conn ector.getP ort(); | 148 | th is.serverP ort = conn ector.getP ort(); | |||
| 136 | th is.threadN ame = | 149 | th is.threadN ame = | |||
| 137 | "HttpProce ssor[" + c onnector.g etPort() + "][" + id + "]"; | 150 | "HttpProce ssor[" + c onnector.g etPort() + "][" + id + "]"; | |||
| 138 | 151 | |||||
| 139 | } | 152 | } | |||
| 140 | 153 | |||||
| 141 | 154 | |||||
| 142 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | 155 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | |||
| 143 | 156 | |||||
| 144 | 157 | |||||
| 145 | /** | 158 | /** | |||
| 146 | * Is there a ne w socket a vailable? | 159 | * Is there a ne w socket a vailable? | |||
| 147 | */ | 160 | */ | |||
| 148 | privat e boolean available = false; | 161 | privat e boolean available = false; | |||
| 149 | 162 | |||||
| 150 | 163 | |||||
| 151 | /** | 164 | /** | |||
| 152 | * The HttpConne ctor with which this processor is associ ated. | 165 | * The HttpConne ctor with which this processor is associ ated. | |||
| 153 | */ | 166 | */ | |||
| 154 | privat e HttpConn ector conn ector = nu ll; | 167 | privat e HttpConn ector conn ector = nu ll; | |||
| 155 | 168 | |||||
| 156 | 169 | |||||
| 157 | /** | 170 | /** | |||
| 158 | * The debugging detail le vel for th is compone nt. | 171 | * The debugging detail le vel for th is compone nt. | |||
| 159 | */ | 172 | */ | |||
| 160 | privat e int debu g = 0; | 173 | privat e int debu g = 0; | |||
| 161 | 174 | |||||
| 162 | 175 | |||||
| 163 | /** | 176 | /** | |||
| (752 unchanged lines omitted) | ||||||
| 916 | * Sen d a confir mation tha t a reques t has been processed when pipe lining. | 929 | * Sen d a confir mation tha t a reques t has been processed when pipe lining. | |||
| 917 | * HTT P/1.1 100 Continue i s sent bac k to the c lient. | 930 | * HTT P/1.1 100 Continue i s sent bac k to the c lient. | |||
| 918 | * | 931 | * | |||
| 919 | * @pa ram output Socket ou tput strea m | 932 | * @pa ram output Socket ou tput strea m | |||
| 920 | */ | 933 | */ | |||
| 921 | privat e void ack Request(Ou tputStream output) | 934 | privat e void ack Request(Ou tputStream output) | |||
| 922 | th rows IOExc eption { | 935 | th rows IOExc eption { | |||
| 923 | if (sendAck) | 936 | if (sendAck) | |||
| 924 | output.w rite(ack); | 937 | output.w rite(ack); | |||
| 925 | } | 938 | } | |||
| 926 | 939 | |||||
| 927 | 940 | |||||
| 928 | /** | 941 | /** | |||
| 929 | * Pro cess an in coming HTT P request on the Soc ket that h as been as signed | 942 | * Pro cess an in coming HTT P request on the Soc ket that h as been as signed | |||
| 930 | * to this Proce ssor. Any exception s that occ ur during processing must be | 943 | * to this Proce ssor. Any exception s that occ ur during processing must be | |||
| 931 | * swa llowed and dealt wit h. | 944 | * swa llowed and dealt wit h. | |||
| 932 | * | 945 | * | |||
| 933 | * @pa ram socket The socke t on which we are co nnected to the clien t | 946 | * @pa ram socket The socke t on which we are co nnected to the clien t | |||
| 934 | */ | 947 | */ | |||
| 935 | privat e void pro cess(Socke t socket) { | 948 | privat e void pro cess(Socke t socket) { | |||
| 936 | 949 | |||||
| 937 | bo olean ok = true; | 950 | bo olean ok = true; | |||
| 938 | bo olean fini shResponse = true; | 951 | bo olean fini shResponse = true; | |||
| 939 | So cketInputS tream inpu t = null; | 952 | So cketInputS tream inpu t = null; | |||
| 940 | Ou tputStream output = null; | 953 | Ou tputStream output = null; | |||
| 941 | 954 | |||||
| 942 | // Construct and initi alize the objects we will need | 955 | // Construct and initi alize the objects we will need | |||
| 943 | tr y { | 956 | tr y { | |||
| 944 | input = new Socket InputStrea m(socket.g etInputStr eam(), | 957 | input = new Socket InputStrea m(socket.g etInputStr eam(), | |||
| 945 | connecto r.getBuffe rSize()); | 958 | connecto r.getBuffe rSize()); | |||
| 946 | } catch (Exc eption e) { | 959 | } catch (Exc eption e) { | |||
| 947 | log("pro cess.creat e", e); | 960 | log("pro cess.creat e", e); | |||
| 948 | ok = fal se; | 961 | ok = fal se; | |||
| 949 | } | 962 | } | |||
| 950 | 963 | |||||
| 951 | ke epAlive = true; | 964 | ke epAlive = true; | |||
| 952 | 965 | |||||
| 953 | wh ile (!stop ped && ok && keepAli ve) { | 966 | wh ile (!stop ped && ok && keepAli ve) { | |||
| 954 | 967 | |||||
| 955 | finishRe sponse = t rue; | 968 | finishRe sponse = t rue; | |||
| 956 | 969 | |||||
| 957 | try { | 970 | try { | |||
| 958 | requ est.setStr eam(input) ; | 971 | requ est.setStr eam(input) ; | |||
| 959 | requ est.setRes ponse(resp onse); | 972 | requ est.setRes ponse(resp onse); | |||
| 960 | outp ut = socke t.getOutpu tStream(); | 973 | outp ut = socke t.getOutpu tStream(); | |||
| 961 | resp onse.setSt ream(outpu t); | 974 | resp onse.setSt ream(outpu t); | |||
| 962 | resp onse.setRe quest(requ est); | 975 | resp onse.setRe quest(requ est); | |||
| 963 | ((Ht tpServletR esponse) r esponse.ge tResponse( )).setHead er | 976 | ((Ht tpServletR esponse) r esponse.ge tResponse( )).setHead er | |||
| 964 | ("Server", Constants. S erver I nfo ); | 977 |
("Server",
|
|||
| 965 | } catch (Exception e) { | 978 | } catch (Exception e) { | |||
| 966 | log( "process.c reate", e) ; | 979 | log( "process.c reate", e) ; | |||
| 967 | ok = false; | 980 | ok = false; | |||
| 968 | } | 981 | } | |||
| 969 | 982 | |||||
| 970 | // Parse the incom ing reques t | 983 | // Parse the incom ing reques t | |||
| 971 | try { | 984 | try { | |||
| 972 | if ( ok) { | 985 | if ( ok) { | |||
| 973 | parseConne ction(sock et); | 986 | parseConne ction(sock et); | |||
| 974 | parseReque st(input, output); | 987 | parseReque st(input, output); | |||
| 975 | if (!reque st.getRequ est().getP rotocol() | 988 | if (!reque st.getRequ est().getP rotocol() | |||
| 976 | .start sWith("HTT P/0")) | 989 | .start sWith("HTT P/0")) | |||
| 977 | parseH eaders(inp ut); | 990 | parseH eaders(inp ut); | |||
| 978 | if (http11 ) { | 991 | if (http11 ) { | |||
| 979 | // Sen ding a req uest ackno wledge bac k to the c lient if | 992 | // Sen ding a req uest ackno wledge bac k to the c lient if | |||
| 980 | // req uested. | 993 | // req uested. | |||
| 981 | ackReq uest(outpu t); | 994 | ackReq uest(outpu t); | |||
| 982 | // If the protoc ol is HTTP /1.1, chun king is al lowed. | 995 | // If the protoc ol is HTTP /1.1, chun king is al lowed. | |||
| 983 | if (co nnector.is ChunkingAl lowed()) | 996 | if (co nnector.is ChunkingAl lowed()) | |||
| 984 | re sponse.set AllowChunk ing(true); | 997 | re sponse.set AllowChunk ing(true); | |||
| 985 | } | 998 | } | |||
| 986 | } | 999 | } | |||
| 987 | } catch (EOFExcept ion e) { | 1000 | } catch (EOFExcept ion e) { | |||
| 988 | // I t's very l ikely to b e a socket disconnec t on eithe r the | 1001 | // I t's very l ikely to b e a socket disconnec t on eithe r the | |||
| 989 | // c lient or t he server | 1002 | // c lient or t he server | |||
| 990 | ok = false; | 1003 | ok = false; | |||
| 991 | fini shResponse = false; | 1004 | fini shResponse = false; | |||
| 992 | } catch (ServletEx ception e) { | 1005 | } catch (ServletEx ception e) { | |||
| 993 | ok = false; | 1006 | ok = false; | |||
| 994 | try { | 1007 | try { | |||
| 995 | ((HttpServ letRespons e) respons e.getRespo nse()) | 1008 | ((HttpServ letRespons e) respons e.getRespo nse()) | |||
| 996 | .sendE rror(HttpS ervletResp onse.SC_BA D_REQUEST) ; | 1009 | .sendE rror(HttpS ervletResp onse.SC_BA D_REQUEST) ; | |||
| 997 | } ca tch (Excep tion f) { | 1010 | } ca tch (Excep tion f) { | |||
| 998 | ; | 1011 | ; | |||
| 999 | } | 1012 | } | |||
| 1000 | } catch (Interrupt edIOExcept ion e) { | 1013 | } catch (Interrupt edIOExcept ion e) { | |||
| 1001 | if ( debug > 1) { | 1014 | if ( debug > 1) { | |||
| 1002 | try { | 1015 | try { | |||
| 1003 | log("p rocess.par se", e); | 1016 | log("p rocess.par se", e); | |||
| 1004 | ((Http ServletRes ponse) res ponse.getR esponse()) | 1017 | ((Http ServletRes ponse) res ponse.getR esponse()) | |||
| 1005 | .s endError(H ttpServlet Response.S C_BAD_REQU EST); | 1018 | .s endError(H ttpServlet Response.S C_BAD_REQU EST); | |||
| 1006 | } catch (E xception f ) { | 1019 | } catch (E xception f ) { | |||
| 1007 | ; | 1020 | ; | |||
| 1008 | } | 1021 | } | |||
| 1009 | } | 1022 | } | |||
| 1010 | ok = false; | 1023 | ok = false; | |||
| 1011 | } catch (Exception e) { | 1024 | } catch (Exception e) { | |||
| 1012 | try { | 1025 | try { | |||
| 1013 | log("proce ss.parse", e); | 1026 | log("proce ss.parse", e); | |||
| 1014 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | 1027 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | |||
| 1015 | (HttpS ervletResp onse.SC_BA D_REQUEST) ; | 1028 | (HttpS ervletResp onse.SC_BA D_REQUEST) ; | |||
| 1016 | } ca tch (Excep tion f) { | 1029 | } ca tch (Excep tion f) { | |||
| 1017 | ; | 1030 | ; | |||
| 1018 | } | 1031 | } | |||
| 1019 | ok = false; | 1032 | ok = false; | |||
| 1020 | } | 1033 | } | |||
| 1021 | 1034 | |||||
| 1022 | // Ask o ur Contain er to proc ess this r equest | 1035 | // Ask o ur Contain er to proc ess this r equest | |||
| 1023 | try { | 1036 | try { | |||
| 1024 |
((HttpServ
letRespons
e)
response).
addDat
e
|
1037 | ((HttpServ letRespons e) response). s e t Header | |||
| 1025 |
("Date",
Sy
st
|
1038 |
("Date",
Fa
st
HttpDat
e
For
m
at
.
getC
urrent
Dat
e
|
|||
| 1026 | if ( ok) { | 1039 | if ( ok) { | |||
| 1027 | connector. getContain er().invok e(request, response) ; | 1040 | connector. getContain er().invok e(request, response) ; | |||
| 1028 | } | 1041 | } | |||
| 1029 | } catch (ServletEx ception e) { | 1042 | } catch (ServletEx ception e) { | |||
| 1030 | log( "process.i nvoke", e) ; | 1043 | log( "process.i nvoke", e) ; | |||
| 1031 | try { | 1044 | try { | |||
| 1032 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | 1045 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | |||
| 1033 | (HttpS ervletResp onse.SC_IN TERNAL_SER VER_ERROR) ; | 1046 | (HttpS ervletResp onse.SC_IN TERNAL_SER VER_ERROR) ; | |||
| 1034 | } ca tch (Excep tion f) { | 1047 | } ca tch (Excep tion f) { | |||
| 1035 | ; | 1048 | ; | |||
| 1036 | } | 1049 | } | |||
| 1037 | ok = false; | 1050 | ok = false; | |||
| 1038 | } catch (Interrupt edIOExcept ion e) { | 1051 | } catch (Interrupt edIOExcept ion e) { | |||
| 1039 | ok = false; | 1052 | ok = false; | |||
| 1040 | } catch (Throwable e) { | 1053 | } catch (Throwable e) { | |||
| 1041 | log( "process.i nvoke", e) ; | 1054 | log( "process.i nvoke", e) ; | |||
| 1042 | try { | 1055 | try { | |||
| 1043 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | 1056 | ((HttpServ letRespons e) respons e.getRespo nse()).sen dError | |||
| 1044 | (HttpS ervletResp onse.SC_IN TERNAL_SER VER_ERROR) ; | 1057 | (HttpS ervletResp onse.SC_IN TERNAL_SER VER_ERROR) ; | |||
| 1045 | } ca tch (Excep tion f) { | 1058 | } ca tch (Excep tion f) { | |||
| 1046 | ; | 1059 | ; | |||
| 1047 | } | 1060 | } | |||
| 1048 | ok = false; | 1061 | ok = false; | |||
| 1049 | } | 1062 | } | |||
| 1050 | 1063 | |||||
| 1051 | // Finis h up the h andling of the reque st | 1064 | // Finis h up the h andling of the reque st | |||
| 1052 | try { | |||||
| 1053 | if ( finishResp onse) { | 1065 | if (fini shResponse ) { | |||
| 1066 | try { | |||||
| 1054 | response.f inishRespo nse(); | 1067 | response.f inishRespo nse(); | |||
| 1068 | } ca tch (IOExc eption e) { | |||||
| 1069 | ok = false ; | |||||
| 1070 | } ca tch (Throw able e) { | |||||
| 1071 | log("proce ss.invoke" , e); | |||||
| 1072 | ok = false ; | |||||
| 1073 | } | |||||
| 1074 | try { | |||||
| 1055 | request.fi nishReques t(); | 1075 | request.fi nishReques t(); | |||
| 1076 | } ca tch (IOExc eption e) { | |||||
| 1077 | ok = false ; | |||||
| 1078 | } ca tch (Throw able e) { | |||||
| 1079 | log("proce ss.invoke" , e); | |||||
| 1080 | ok = false ; | |||||
| 1081 | } | |||||
| 1082 | try { | |||||
| 1056 | if (output != null) | 1083 | if (output != null) | |||
| 1057 | output .flush(); | 1084 | output .flush(); | |||
| 1058 | } | |||||
| 1059 | } catch (IOExcepti on e) { | 1085 | } ca tch (IOExc eption e) { | |||
| 1060 | ok = false; | 1086 | ok = false ; | |||
| 1061 | } catch (Exc eption e) { | 1087 |
}
|
|||
| 1062 | log( "process.f inish", e) ; | |||||
| 1063 | } | 1088 | } | |||
| 1064 | 1089 | |||||
| 1065 | // We ha ve to chec k if the c onnection closure ha s been req uested | 1090 | // We ha ve to chec k if the c onnection closure ha s been req uested | |||
| 1066 | // by th e applicat ion or the response stream (in case of H TTP/1.0 | 1091 | // by th e applicat ion or the response stream (in case of H TTP/1.0 | |||
| 1067 | // and k eep-alive) . | 1092 | // and k eep-alive) . | |||
| 1068 | if ( "cl ose".equal s(response .getHeader ("Connecti on")) ) { | 1093 | if ( "cl ose".equal s(response .getHeader ("Connecti on")) ) { | |||
| 1069 | keep Alive = fa lse; | 1094 | keep Alive = fa lse; | |||
| 1070 | } | 1095 | } | |||
| 1071 | 1096 | |||||
| 1072 | // End o f request processing | 1097 | // End o f request processing | |||
| 1073 | status = Constants .PROCESSOR _IDLE; | 1098 | status = Constants .PROCESSOR _IDLE; | |||
| 1074 | 1099 | |||||
| 1075 | // Recyc ling the r equest and the respo nse object s | 1100 | // Recyc ling the r equest and the respo nse object s | |||
| 1076 | request. recycle(); | 1101 | request. recycle(); | |||
| 1077 | response .recycle() ; | 1102 | response .recycle() ; | |||
| 1078 | 1103 | |||||
| 1079 | } | 1104 | } | |||
| 1080 | 1105 | |||||
| 1081 | tr y { | 1106 | tr y { | |||
| 1082 | shutdown Input(inpu t); | 1107 | shutdown Input(inpu t); | |||
| 1083 | socket.c lose(); | 1108 | socket.c lose(); | |||
| 1084 | } catch (IOE xception e ) { | 1109 | } catch (IOE xception e ) { | |||
| 1085 | ; | 1110 | ; | |||
| 1111 | } catch (Thr owable e) { | |||||
| 1112 | log("pro cess.invok e", e); | |||||
| 1086 | } | 1113 | } | |||
| 1087 | so cket = nul l; | 1114 | so cket = nul l; | |||
| 1088 | 1115 | |||||
| 1089 | } | 1116 | } | |||
| 1090 | 1117 | |||||
| 1091 | 1118 | |||||
| 1092 |
protected
void
shutdownIn
put(InputS
tream
input)
|
1119 | protected void shutdownIn put(InputS tream input) { | |||
| 1093 | th rows IOExc eption { | |||||
| 1094 | tr y { | 1120 | tr y { | |||
| 1095 | int avai lable = in put.availa ble(); | 1121 | int avai lable = in put.availa ble(); | |||
| 1096 | // skip any unread (bogus) b ytes | 1122 | // skip any unread (bogus) b ytes | |||
| 1097 | if (avai lable > 0) { | 1123 | if (avai lable > 0) { | |||
| 1098 | inpu t.skip(ava ilable); | 1124 | inpu t.skip(ava ilable); | |||
| 1099 | } | 1125 | } | |||
| 1100 | } catch ( Excepti o n e) { | 1126 | } catch ( Thr o wable e) { | |||
| 1101 | ; | 1127 | ; | |||
| 1102 | } | 1128 | } | |||
| 1103 | } | 1129 | } | |||
| 1104 | 1130 | |||||
| 1105 | 1131 | |||||
| 1106 | // --- ---------- ---------- ---------- ---------- --- Backgr ound Threa d Methods | 1132 | // --- ---------- ---------- ---------- ---------- --- Backgr ound Threa d Methods | |||
| 1107 | 1133 | |||||
| 1108 | 1134 | |||||
| 1109 | /** | 1135 | /** | |||
| 1110 | * The backgroun d thread t hat listen s for inco ming TCP/I P connecti ons and | 1136 | * The backgroun d thread t hat listen s for inco ming TCP/I P connecti ons and | |||
| 1111 | * han ds them of f to an ap propriate processor. | 1137 | * han ds them of f to an ap propriate processor. | |||
| 1112 | */ | 1138 | */ | |||
| 1113 | public void run( ) { | 1139 | public void run( ) { | |||
| 1114 | 1140 | |||||
| 1115 | // Process r equests un til we rec eive a shu tdown sign al | 1141 | // Process r equests un til we rec eive a shu tdown sign al | |||
| 1116 | wh ile (!stop ped) { | 1142 | wh ile (!stop ped) { | |||
| 1117 | 1143 | |||||
| 1118 | // Wait for the ne xt socket to be assi gned | 1144 | // Wait for the ne xt socket to be assi gned | |||
| 1119 | Socket s ocket = aw ait(); | 1145 | Socket s ocket = aw ait(); | |||
| 1120 | if (sock et == null ) | 1146 | if (sock et == null ) | |||
| 1121 | cont inue; | 1147 | cont inue; | |||
| 1122 | 1148 | |||||
| 1123 | // Proce ss the req uest from this socke t | 1149 | // Proce ss the req uest from this socke t | |||
| 1124 | try { | 1150 | try { | |||
| 1125 | proc ess(socket ); | 1151 | proc ess(socket ); | |||
| 1126 | } catch (Throwable t) { | 1152 | } catch (Throwable t) { | |||
| 1127 |
log("proce
ss
|
1153 | log("proce ss .invoke ", t); | |||
| 1128 | } | 1154 | } | |||
| 1129 | 1155 | |||||
| 1130 | // Finis h up this request | 1156 | // Finis h up this request | |||
| 1131 | connecto r.recycle( this); | 1157 | connecto r.recycle( this); | |||
| 1132 | 1158 | |||||
| 1133 | } | 1159 | } | |||
| 1134 | 1160 | |||||
| 1135 | // Tell thre adStop() w e have shu t ourselve s down suc cessfully | 1161 | // Tell thre adStop() w e have shu t ourselve s down suc cessfully | |||
| 1136 | sy nchronized (threadSy nc) { | 1162 | sy nchronized (threadSy nc) { | |||
| 1137 | threadSy nc.notifyA ll(); | 1163 | threadSy nc.notifyA ll(); | |||
| 1138 | } | 1164 | } | |||
| 1139 | 1165 | |||||
| 1140 | } | 1166 | } | |||
| 1141 | 1167 | |||||
| 1142 | 1168 | |||||
| 1143 | /** | 1169 | /** | |||
| 1144 | * Sta rt the bac kground pr ocessing t hread. | 1170 | * Sta rt the bac kground pr ocessing t hread. | |||
| 1145 | */ | 1171 | */ | |||
| 1146 | privat e void thr eadStart() { | 1172 | privat e void thr eadStart() { | |||
| 1147 | 1173 | |||||
| 1148 | lo g(sm.getSt ring("http Processor. starting") ); | 1174 | lo g(sm.getSt ring("http Processor. starting") ); | |||
| 1149 | 1175 | |||||
| 1150 | th read = new Thread(th is, thread Name); | 1176 | th read = new Thread(th is, thread Name); | |||
| 1151 | th read.setDa emon(true) ; | 1177 | th read.setDa emon(true) ; | |||
| 1152 | th read.start (); | 1178 | th read.start (); | |||
| 1153 | 1179 | |||||
| 1154 | if (debug >= 1) | 1180 | if (debug >= 1) | |||
| 1155 | log(" Ba ckground t hread has been start ed"); | 1181 | log(" Ba ckground t hread has been start ed"); | |||
| 1156 | 1182 | |||||
| 1157 | } | 1183 | } | |||
| 1158 | 1184 | |||||
| 1159 | 1185 | |||||
| 1160 | /** | 1186 | /** | |||
| 1161 | * Sto p the back ground pro cessing th read. | 1187 | * Sto p the back ground pro cessing th read. | |||
| 1162 | */ | 1188 | */ | |||
| 1163 | privat e void thr eadStop() { | 1189 | privat e void thr eadStop() { | |||
| 1164 | 1190 | |||||
| 1165 | lo g(sm.getSt ring("http Processor. stopping") ); | 1191 | lo g(sm.getSt ring("http Processor. stopping") ); | |||
| 1166 | 1192 | |||||
| 1167 | st opped = tr ue; | 1193 | st opped = tr ue; | |||
| 1168 | as sign(null) ; | 1194 | as sign(null) ; | |||
| 1169 | 1195 | |||||
| 1170 | if (status ! = Constant s.PROCESSO R_IDLE) { | 1196 | if (status ! = Constant s.PROCESSO R_IDLE) { | |||
| 1171 | // Only wait if th e processo r is actua lly proces sing a com mand | 1197 | // Only wait if th e processo r is actua lly proces sing a com mand | |||
| 1172 | synchron ized (thre adSync) { | 1198 | synchron ized (thre adSync) { | |||
| 1173 | try { | 1199 | try { | |||
| 1174 | threadSync .wait(5000 ); | 1200 | threadSync .wait(5000 ); | |||
| 1175 | } ca tch (Inter ruptedExce ption e) { | 1201 | } ca tch (Inter ruptedExce ption e) { | |||
| 1176 | ; | 1202 | ; | |||
| 1177 | } | 1203 | } | |||
| 1178 | } | 1204 | } | |||
| 1179 | } | 1205 | } | |||
| 1180 | th read = nul l; | 1206 | th read = nul l; | |||
| 1181 | 1207 | |||||
| 1182 | } | 1208 | } | |||
| 1183 | 1209 | |||||
| 1184 | 1210 | |||||
| 1185 | // --- ---------- ---------- ---------- ---------- ---------- - Lifecycl e Methods | 1211 | // --- ---------- ---------- ---------- ---------- ---------- - Lifecycl e Methods | |||
| 1186 | 1212 | |||||
| 1187 | 1213 | |||||
| 1188 | /** | 1214 | /** | |||
| 1189 | * Add a lifecyc le event l istener to this comp onent. | 1215 | * Add a lifecyc le event l istener to this comp onent. | |||
| 1190 | * | 1216 | * | |||
| 1191 | * @pa ram listen er The lis tener to a dd | 1217 | * @pa ram listen er The lis tener to a dd | |||
| 1192 | */ | 1218 | */ | |||
| 1193 | public void addL ifecycleLi stener(Lif ecycleList ener liste ner) { | 1219 | public void addL ifecycleLi stener(Lif ecycleList ener liste ner) { | |||
| 1194 | 1220 | |||||
| 1195 | li fecycle.ad dLifecycle Listener(l istener); | 1221 | li fecycle.ad dLifecycle Listener(l istener); | |||
| 1196 | 1222 | |||||
| 1197 | } | 1223 | } | |||
| 1198 | 1224 | |||||
| 1199 | 1225 | |||||
| 1200 | /** | 1226 | /** | |||
| 1227 | * Get the lifec ycle liste ners assoc iated with this life cycle. If this | |||||
| 1228 | * Lif ecycle has no listen ers regist ered, a ze ro-length array is r eturned. | |||||
| 1229 | */ | |||||
| 1230 | public Lifecycle Listener[] findLifec ycleListen ers() { | |||||
| 1231 | ||||||
| 1232 | re turn lifec ycle.findL ifecycleLi steners(); | |||||
| 1233 | ||||||
| 1234 | } | |||||
| 1235 | ||||||
| 1236 | ||||||
| 1237 | /** | |||||
| 1201 | * Rem ove a life cycle even t listener from this component . | 1238 | * Rem ove a life cycle even t listener from this component . | |||
| 1202 | * | 1239 | * | |||
| 1203 | * @pa ram listen er The lis tener to a dd | 1240 | * @pa ram listen er The lis tener to a dd | |||
| 1204 | */ | 1241 | */ | |||
| 1205 | public void remo veLifecycl eListener( LifecycleL istener li stener) { | 1242 | public void remo veLifecycl eListener( LifecycleL istener li stener) { | |||
| 1206 | 1243 | |||||
| 1207 | li fecycle.re moveLifecy cleListene r(listener ); | 1244 | li fecycle.re moveLifecy cleListene r(listener ); | |||
| 1208 | 1245 | |||||
| 1209 | } | 1246 | } | |||
| 1210 | 1247 | |||||
| 1211 | 1248 | |||||
| 1212 | /** | 1249 | /** | |||
| 1213 | * Sta rt the bac kground th read we wi ll use for request p rocessing. | 1250 | * Sta rt the bac kground th read we wi ll use for request p rocessing. | |||
| 1214 | * | 1251 | * | |||
| 1215 | * @ex ception Li fecycleExc eption if a fatal st artup erro r occurs | 1252 | * @ex ception Li fecycleExc eption if a fatal st artup erro r occurs | |||
| 1216 | */ | 1253 | */ | |||
| 1217 | public void star t() throws Lifecycle Exception { | 1254 | public void star t() throws Lifecycle Exception { | |||
| 1218 | 1255 | |||||
| 1219 | if (started) | 1256 | if (started) | |||
| 1220 | throw ne w Lifecycl eException | 1257 | throw ne w Lifecycl eException | |||
| 1221 | (sm. getString( "httpProce ssor.alrea dyStarted" )); | 1258 | (sm. getString( "httpProce ssor.alrea dyStarted" )); | |||
| 1222 | li fecycle.fi reLifecycl eEvent(STA RT_EVENT, null); | 1259 | li fecycle.fi reLifecycl eEvent(STA RT_EVENT, null); | |||
| 1223 | st arted = tr ue; | 1260 | st arted = tr ue; | |||
| 1224 | 1261 | |||||
| 1225 | th readStart( ); | 1262 | th readStart( ); | |||
| 1226 | 1263 | |||||
| 1227 | } | 1264 | } | |||
| 1228 | 1265 | |||||
| 1229 | 1266 | |||||
| 1230 | /** | 1267 | /** | |||
| 1231 | * Sto p the back ground thr ead we wil l use for request pr ocessing. | 1268 | * Sto p the back ground thr ead we wil l use for request pr ocessing. | |||
| 1232 | * | 1269 | * | |||
| 1233 | * @ex ception Li fecycleExc eption if a fatal sh utdown err or occurs | 1270 | * @ex ception Li fecycleExc eption if a fatal sh utdown err or occurs | |||
| 1234 | */ | 1271 | */ | |||
| 1235 | public void stop () throws LifecycleE xception { | 1272 | public void stop () throws LifecycleE xception { | |||
| 1236 | 1273 | |||||
| 1237 | if (!started ) | 1274 | if (!started ) | |||
| 1238 | throw ne w Lifecycl eException | 1275 | throw ne w Lifecycl eException | |||
| 1239 | (sm. getString( "httpProce ssor.notSt arted")); | 1276 | (sm. getString( "httpProce ssor.notSt arted")); | |||
| 1240 | li fecycle.fi reLifecycl eEvent(STO P_EVENT, n ull); | 1277 | li fecycle.fi reLifecycl eEvent(STO P_EVENT, n ull); | |||
| 1241 | st arted = fa lse; | 1278 | st arted = fa lse; | |||
| 1242 | 1279 | |||||
| 1243 | th readStop() ; | 1280 | th readStop() ; | |||
| 1244 | 1281 | |||||
| 1245 | } | 1282 | } | |||
| 1246 | 1283 | |||||
| 1247 | 1284 | |||||
| 1248 | } | 1285 | } | |||
Araxis Merge (but not this generated report) is Copyright © 1993-2005 Araxis Ltd (www.araxis.com). All rights reserved.