Author: markt Date: Tue Jan 16 20:01:04 2018 New Revision: 1821297 URL: http://svn.apache.org/viewvc?rev=1821297&view=rev Log: Clean-up prior to fixing BZ 61993
Added: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java - copied, changed from r1821197, tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java Modified: tomcat/tc8.5.x/trunk/ (props changed) tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java Propchange: tomcat/tc8.5.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 16 20:01:04 2018 @@ -1,2 +1,2 @@ /tomcat/tc8.0.x/trunk:1809644 -/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409 ,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747 404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1 756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205 3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176 8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138- 1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885 50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17 95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297 ,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811 329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1 820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1821157,1821167 +/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409 ,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747 404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1 756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205 3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176 8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138- 1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885 50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17 95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297 ,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811 329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1 820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1820981,1820994,1821157,1821167,1821197-1821203,1821225,1821234-1821235,1821251-1821252 Copied: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java (from r1821197, tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java) URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&p1=tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&r1=1821197&r2=1821297&rev=1821297&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java Tue Jan 16 20:01:04 2018 @@ -25,4 +25,121 @@ public abstract class AbstractChunk impl private static final long serialVersionUID = 1L; + + private int hashCode = 0; + protected boolean hasHashCode = false; + + protected boolean isSet; + + protected int start; + protected int end; + + + /** + * @return the start position of the data in the buffer + */ + public int getStart() { + return start; + } + + + public int getEnd() { + return end; + } + + + public void setEnd(int i) { + end = i; + } + + + // TODO: Deprecate offset and use start + + public int getOffset() { + return start; + } + + + public void setOffset(int off) { + if (end < off) { + end = off; + } + start = off; + } + + + /** + * @return the length of the data in the buffer + */ + public int getLength() { + return end - start; + } + + + public boolean isNull() { + if (end > 0) { + return false; + } + return !isSet; + } + + + public int indexOf(String src, int srcOff, int srcLen, int myOff) { + char first = src.charAt(srcOff); + + // Look for first char + int srcEnd = srcOff + srcLen; + + mainLoop: for (int i = myOff + start; i <= (end - srcLen); i++) { + if (getBufferElement(i) != first) { + continue; + } + // found first char, now look for a match + int myPos = i + 1; + for (int srcPos = srcOff + 1; srcPos < srcEnd;) { + if (getBufferElement(myPos++) != src.charAt(srcPos++)) { + continue mainLoop; + } + } + return i - start; // found it + } + return -1; + } + + + /** + * Resets the chunk to an uninitialized state. + */ + public void recycle() { + hasHashCode = false; + isSet = false; + start = 0; + end = 0; + } + + + @Override + public int hashCode() { + if (hasHashCode) { + return hashCode; + } + int code = 0; + + code = hash(); + hashCode = code; + hasHashCode = true; + return code; + } + + + public int hash() { + int code = 0; + for (int i = start; i < end; i++) { + code = code * 37 + getBufferElement(i); + } + return code; + } + + + protected abstract int getBufferElement(int index); } Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Tue Jan 16 20:01:04 2018 @@ -17,7 +17,6 @@ package org.apache.tomcat.util.buf; import java.io.IOException; -import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -41,16 +40,15 @@ import java.nio.charset.StandardCharsets // inside this way it could provide the search/etc on ByteBuffer, as a helper. /** - * This class is used to represent a chunk of bytes, and - * utilities to manipulate byte[]. + * This class is used to represent a chunk of bytes, and utilities to manipulate + * byte[]. * * The buffer can be modified and used for both input and output. * * There are 2 modes: The chunk can be associated with a sink - ByteInputChannel * or ByteOutputChannel, which will be used when the buffer is empty (on input) - * or filled (on output). - * For output, it can also grow. This operating mode is selected by calling - * setLimit() or allocate(initial, limit) with limit != -1. + * or filled (on output). For output, it can also grow. This operating mode is + * selected by calling setLimit() or allocate(initial, limit) with limit != -1. * * Various search and append method are defined - similar with String and * StringBuffer, but operating on bytes. @@ -65,43 +63,50 @@ import java.nio.charset.StandardCharsets * @author Costin Manolache * @author Remy Maucherat */ -public final class ByteChunk implements Cloneable, Serializable { +public final class ByteChunk extends AbstractChunk { private static final long serialVersionUID = 1L; - /** Input interface, used when the buffer is empty + /** + * Input interface, used when the buffer is empty. * - * Same as java.nio.channel.ReadableByteChannel + * Same as java.nio.channels.ReadableByteChannel */ public static interface ByteInputChannel { + /** * Read new bytes. * * @return The number of bytes read * - * @throws IOException If an I/O occurs while reading the bytes + * @throws IOException If an I/O error occurs during reading */ public int realReadBytes() throws IOException; } - /** Same as java.nio.channel.WritableByteChannel. + /** + * When we need more space we'll either grow the buffer ( up to the limit ) + * or send it to a channel. + * + * Same as java.nio.channel.WritableByteChannel. */ public static interface ByteOutputChannel { + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * - * @param cbuf bytes that will be written + * @param buf bytes that will be written * @param off offset in the bytes array * @param len length that will be written * @throws IOException If an I/O occurs while writing the bytes */ - public void realWriteBytes(byte cbuf[], int off, int len) - throws IOException; + public void realWriteBytes(byte buf[], int off, int len) throws IOException; + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * * @param from bytes that will be written * @throws IOException If an I/O occurs while writing the bytes @@ -111,41 +116,35 @@ public final class ByteChunk implements // -------------------- - /** Default encoding used to convert to strings. It should be UTF8, - as most standards seem to converge, but the servlet API requires - 8859_1, and this object is used mostly for servlets. - */ + /** + * Default encoding used to convert to strings. It should be UTF8, as most + * standards seem to converge, but the servlet API requires 8859_1, and this + * object is used mostly for servlets. + */ public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1; - private int hashCode=0; - // did we compute the hashcode ? - private boolean hasHashCode = false; + private transient Charset charset; // byte[] private byte[] buff; - private int start=0; - private int end; - - private Charset charset; - - private boolean isSet=false; // XXX - - // How much can it grow, when data is added - private int limit=-1; + // -1: grow indefinitely + // maximum amount to be cached + private int limit = -1; private ByteInputChannel in = null; private ByteOutputChannel out = null; + /** * Creates a new, uninitialized ByteChunk object. */ public ByteChunk() { - // NO-OP } - public ByteChunk( int initial ) { - allocate( initial, -1 ); + + public ByteChunk(int initial) { + allocate(initial, -1); } @Override @@ -153,36 +152,30 @@ public final class ByteChunk implements return super.clone(); } - public boolean isNull() { - return ! isSet; // buff==null; - } - /** - * Resets the message buff to an uninitialized state. - */ + @Override public void recycle() { - charset=null; - start=0; - end=0; - isSet=false; - hasHashCode = false; + super.recycle(); + charset = null; } + // -------------------- Setup -------------------- - public void allocate( int initial, int limit ) { - if( buff==null || buff.length < initial ) { - buff=new byte[initial]; - } - this.limit=limit; - start=0; - end=0; - isSet=true; + public void allocate(int initial, int limit) { + if (buff == null || buff.length < initial) { + buff = new byte[initial]; + } + this.limit = limit; + start = 0; + end = 0; + isSet = true; hasHashCode = false; } + /** - * Sets the message bytes to the specified subarray of bytes. + * Sets the buffer to the specified subarray of bytes. * * @param b the ascii bytes * @param off the start offset of the bytes @@ -191,15 +184,17 @@ public final class ByteChunk implements public void setBytes(byte[] b, int off, int len) { buff = b; start = off; - end = start+ len; - isSet=true; + end = start + len; + isSet = true; hasHashCode = false; } + public void setCharset(Charset charset) { this.charset = charset; } + public Charset getCharset() { if (charset == null) { charset = DEFAULT_CHARSET; @@ -207,109 +202,84 @@ public final class ByteChunk implements return charset; } + /** - * @return the message bytes. + * @return the buffer. */ public byte[] getBytes() { return getBuffer(); } + /** - * @return the message bytes. + * @return the buffer. */ public byte[] getBuffer() { return buff; } - /** - * @return the start offset of the bytes. - * For output this is the end of the buffer. - */ - public int getStart() { - return start; - } - - public int getOffset() { - return start; - } - - public void setOffset(int off) { - if (end < off ) { - end=off; - } - start=off; - } - - /** - * @return the length of the bytes. - */ - public int getLength() { - return end-start; - } /** - * Maximum amount of data in this buffer. - * If -1 or not set, the buffer will grow indefinitely. - * Can be smaller than the current buffer size ( which will not shrink ). - * When the limit is reached, the buffer will be flushed ( if out is set ) - * or throw exception. + * Maximum amount of data in this buffer. If -1 or not set, the buffer will + * grow indefinitely. Can be smaller than the current buffer size ( which + * will not shrink ). When the limit is reached, the buffer will be flushed + * ( if out is set ) or throw exception. + * * @param limit The new limit */ public void setLimit(int limit) { - this.limit=limit; + this.limit = limit; } + public int getLimit() { return limit; } + /** * When the buffer is empty, read the data from the input channel. + * * @param in The input channel */ public void setByteInputChannel(ByteInputChannel in) { this.in = in; } + /** - * When the buffer is full, write the data to the output channel. - * Also used when large amount of data is appended. - * If not set, the buffer will grow to the limit. + * When the buffer is full, write the data to the output channel. Also used + * when large amount of data is appended. If not set, the buffer will grow + * to the limit. + * * @param out The output channel */ public void setByteOutputChannel(ByteOutputChannel out) { - this.out=out; + this.out = out; } - public int getEnd() { - return end; - } - - public void setEnd( int i ) { - end=i; - } // -------------------- Adding data to the buffer -------------------- - public void append( byte b ) - throws IOException - { - makeSpace( 1 ); + + public void append(byte b) throws IOException { + makeSpace(1); // couldn't make space - if( limit >0 && end >= limit ) { + if (limit > 0 && end >= limit) { flushBuffer(); } - buff[end++]=b; + buff[end++] = b; } - public void append( ByteChunk src ) - throws IOException - { - append( src.getBytes(), src.getStart(), src.getLength()); + + public void append(ByteChunk src) throws IOException { + append(src.getBytes(), src.getStart(), src.getLength()); } + /** * Add data to the buffer. + * * @param src Bytes array * @param off Offset * @param len Length @@ -317,13 +287,13 @@ public final class ByteChunk implements */ public void append(byte src[], int off, int len) throws IOException { // will grow, up to limit - makeSpace( len ); + makeSpace(len); // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { + if (limit < 0) { // assert: makeSpace made enough space - System.arraycopy( src, off, buff, end, len ); - end+=len; + System.arraycopy(src, off, buff, end, len); + end += len; return; } @@ -331,16 +301,18 @@ public final class ByteChunk implements // If the buffer is empty and the source is going to fill up all the // space in buffer, may as well write it directly to the output, // and avoid an extra copy - if ( len == limit && end == start && out != null ) { - out.realWriteBytes( src, off, len ); + if (len == limit && end == start && out != null) { + out.realWriteBytes(src, off, len); return; } + // if we have limit and we're below - if( len <= limit - end ) { + if (len <= limit - end) { // makeSpace will grow the buffer to the limit, // so we have space - System.arraycopy( src, off, buff, end, len ); - end+=len; + System.arraycopy(src, off, buff, end, len); + + end += len; return; } @@ -352,7 +324,7 @@ public final class ByteChunk implements // We chunk the data into slices fitting in the buffer limit, although // if the data is written directly if it doesn't fit - int avail=limit-end; + int avail = limit - end; System.arraycopy(src, off, buff, end, avail); end += avail; @@ -361,7 +333,7 @@ public final class ByteChunk implements int remain = len - avail; while (remain > (limit - end)) { - out.realWriteBytes( src, (off + len) - remain, limit - end ); + out.realWriteBytes(src, (off + len) - remain, limit - end); remain = remain - (limit - end); } @@ -457,7 +429,7 @@ public final class ByteChunk implements } - public int substract(byte dest[], int off, int len ) throws IOException { + public int substract(byte dest[], int off, int len) throws IOException { if (checkEof()) { return -1; } @@ -474,8 +446,8 @@ public final class ByteChunk implements /** * Transfers bytes from the buffer to the specified ByteBuffer. After the * operation the position of the ByteBuffer will be returned to the one - * before the operation, the limit will be the position incremented by - * the number of the transfered bytes. + * before the operation, the limit will be the position incremented by the + * number of the transfered bytes. * * @param to the ByteBuffer into which bytes are to be written. * @return an integer specifying the actual number of bytes read, or -1 if @@ -515,53 +487,50 @@ public final class ByteChunk implements * * @throws IOException Writing overflow data to the output channel failed */ - public void flushBuffer() - throws IOException - { - //assert out!=null - if( out==null ) { - throw new IOException( "Buffer overflow, no sink " + limit + " " + - buff.length ); + public void flushBuffer() throws IOException { + // assert out!=null + if (out == null) { + throw new IOException("Buffer overflow, no sink " + limit + " " + buff.length); } - out.realWriteBytes( buff, start, end-start ); - end=start; + out.realWriteBytes(buff, start, end - start); + end = start; } + /** * Make space for len bytes. If len is small, allocate a reserve space too. * Never grow bigger than limit. + * * @param count The size */ public void makeSpace(int count) { byte[] tmp = null; int newSize; - int desiredSize=end + count; + int desiredSize = end + count; // Can't grow above the limit - if( limit > 0 && - desiredSize > limit) { - desiredSize=limit; + if (limit > 0 && desiredSize > limit) { + desiredSize = limit; } - if( buff==null ) { - if( desiredSize < 256 ) - { - desiredSize=256; // take a minimum + if (buff == null) { + if (desiredSize < 256) { + desiredSize = 256; // take a minimum } - buff=new byte[desiredSize]; + buff = new byte[desiredSize]; } // limit < buf.length ( the buffer is already big ) // or we already have space XXX - if( desiredSize <= buff.length ) { + if (desiredSize <= buff.length) { return; } // grow in larger chunks - if( desiredSize < 2 * buff.length ) { - newSize= buff.length * 2; + if (desiredSize < 2 * buff.length) { + newSize = buff.length * 2; } else { - newSize= buff.length * 2 + count ; + newSize = buff.length * 2 + count; } if (limit > 0 && newSize > limit) { @@ -569,25 +538,28 @@ public final class ByteChunk implements } tmp = new byte[newSize]; - System.arraycopy(buff, start, tmp, 0, end-start); + // Compacts buffer + System.arraycopy(buff, start, tmp, 0, end - start); buff = tmp; tmp = null; - end=end-start; - start=0; + end = end - start; + start = 0; } + // -------------------- Conversion and getters -------------------- @Override public String toString() { if (null == buff) { return null; - } else if (end-start == 0) { + } else if (end - start == 0) { return ""; } return StringCache.toString(this); } + public String toStringInternal() { if (charset == null) { charset = DEFAULT_CHARSET; @@ -595,12 +567,13 @@ public final class ByteChunk implements // new String(byte[], int, int, Charset) takes a defensive copy of the // entire byte array. This is expensive if only a small subset of the // bytes will be used. The code below is from Apache Harmony. - CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end-start)); + CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end - start)); return new String(cb.array(), cb.arrayOffset(), cb.length()); } + public long getLong() { - return Ascii.parseLong(buff, start,end-start); + return Ascii.parseLong(buff, start, end - start); } @@ -614,67 +587,75 @@ public final class ByteChunk implements return false; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return <code>true</code> if the comparison succeeded, <code>false</code> + * otherwise */ public boolean equals(String s) { // XXX ENCODING - this only works if encoding is UTF8-compat // ( ok for tomcat, where we compare ascii - header names, etc )!!! byte[] b = buff; - int blen = end-start; - if (b == null || blen != s.length()) { + int len = end - start; + if (b == null || len != s.length()) { return false; } - int boff = start; - for (int i = 0; i < blen; i++) { - if (b[boff++] != s.charAt(i)) { + int off = start; + for (int i = 0; i < len; i++) { + if (b[off++] != s.charAt(i)) { return false; } } return true; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return <code>true</code> if the comparison succeeded, <code>false</code> + * otherwise */ public boolean equalsIgnoreCase(String s) { byte[] b = buff; - int blen = end-start; - if (b == null || blen != s.length()) { + int len = end - start; + if (b == null || len != s.length()) { return false; } - int boff = start; - for (int i = 0; i < blen; i++) { - if (Ascii.toLower(b[boff++]) != Ascii.toLower(s.charAt(i))) { + int off = start; + for (int i = 0; i < len; i++) { + if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } - public boolean equals( ByteChunk bb ) { - return equals( bb.getBytes(), bb.getStart(), bb.getLength()); + + public boolean equals(ByteChunk bb) { + return equals(bb.getBytes(), bb.getStart(), bb.getLength()); } - public boolean equals( byte b2[], int off2, int len2) { - byte b1[]=buff; - if( b1==null && b2==null ) { + + public boolean equals(byte b2[], int off2, int len2) { + byte b1[] = buff; + if (b1 == null && b2 == null) { return true; } - int len=end-start; - if ( len2 != len || b1==null || b2==null ) { + int len = end - start; + if (len != len2 || b1 == null || b2 == null) { return false; } int off1 = start; - while ( len-- > 0) { + while (len-- > 0) { if (b1[off1++] != b2[off2++]) { return false; } @@ -682,116 +663,74 @@ public final class ByteChunk implements return true; } - public boolean equals( CharChunk cc ) { - return equals( cc.getChars(), cc.getStart(), cc.getLength()); + + public boolean equals(CharChunk cc) { + return equals(cc.getChars(), cc.getStart(), cc.getLength()); } - public boolean equals( char c2[], int off2, int len2) { + + public boolean equals(char c2[], int off2, int len2) { // XXX works only for enc compatible with ASCII/UTF !!! - byte b1[]=buff; - if( c2==null && b1==null ) { + byte b1[] = buff; + if (c2 == null && b1 == null) { return true; } - if (b1== null || c2==null || end-start != len2 ) { + if (b1 == null || c2 == null || end - start != len2) { return false; } int off1 = start; - int len=end-start; + int len = end - start; - while ( len-- > 0) { - if ( (char)b1[off1++] != c2[off2++]) { + while (len-- > 0) { + if ((char) b1[off1++] != c2[off2++]) { return false; } } return true; } + /** - * Returns true if the message bytes starts with the specified string. + * Returns true if the buffer starts with the specified string. + * * @param s the string * @param pos The position + * * @return <code>true</code> if the start matches */ public boolean startsWithIgnoreCase(String s, int pos) { byte[] b = buff; int len = s.length(); - if (b == null || len+pos > end-start) { + if (b == null || len + pos > end - start) { return false; } - int off = start+pos; + int off = start + pos; for (int i = 0; i < len; i++) { - if (Ascii.toLower( b[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } - public int indexOf( String src, int srcOff, int srcLen, int myOff ) { - char first=src.charAt( srcOff ); - - // Look for first char - int srcEnd = srcOff + srcLen; - - mainLoop: - for( int i=myOff+start; i <= (end - srcLen); i++ ) { - if( buff[i] != first ) { - continue; - } - // found first char, now look for a match - int myPos=i+1; - for( int srcPos=srcOff + 1; srcPos< srcEnd;) { - if( buff[myPos++] != src.charAt( srcPos++ )) { - continue mainLoop; - } - } - return i-start; // found it - } - return -1; - } - - // -------------------- Hash code -------------------- @Override - public int hashCode() { - if (hasHashCode) { - return hashCode; - } - int code = 0; - - code = hash(); - hashCode = code; - hasHashCode = true; - return code; - } - - // normal hash. - public int hash() { - return hashBytes( buff, start, end-start); + protected int getBufferElement(int index) { + return buff[index]; } - private static int hashBytes( byte buff[], int start, int bytesLen ) { - int max=start+bytesLen; - byte bb[]=buff; - int code=0; - for (int i = start; i < max ; i++) { - code = code * 37 + bb[i]; - } - return code; - } /** * Returns the first instance of the given character in this ByteChunk * starting at the specified byte. If the character is not found, -1 is - * returned. - * <br> + * returned. <br> * NOTE: This only works for characters in the range 0-127. * - * @param c The character - * @param starting The start position - * @return The position of the first instance of the character or - * -1 if the character is not found. + * @param c The character + * @param starting The start position + * @return The position of the first instance of the character or -1 if the + * character is not found. */ public int indexOf(char c, int starting) { int ret = indexOf(buff, start + starting, end, c); @@ -800,23 +739,22 @@ public final class ByteChunk implements /** * Returns the first instance of the given character in the given byte array - * between the specified start and end. - * <br> + * between the specified start and end. <br> * NOTE: This only works for characters in the range 0-127. * - * @param bytes The byte array to search - * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param c The character to search for - * @return The position of the first instance of the character or -1 - * if the character is not found. + * @param bytes The array to search + * @param start The point to start searching from in the array + * @param end The point to stop searching in the array + * @param s The character to search for + * @return The position of the first instance of the character or -1 if the + * character is not found. */ - public static int indexOf(byte bytes[], int start, int end, char c) { + public static int indexOf(byte bytes[], int start, int end, char s) { int offset = start; while (offset < end) { - byte b=bytes[offset]; - if (b == c) { + byte b = bytes[offset]; + if (b == s) { return offset; } offset++; @@ -824,16 +762,17 @@ public final class ByteChunk implements return -1; } + /** * Returns the first instance of the given byte in the byte array between * the specified start and end. * * @param bytes The byte array to search * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param b The byte to search for - * @return The position of the first instance of the byte or -1 if the - * byte is not found. + * @param end The point to stop searching in the byte array + * @param b The byte to search for + * @return The position of the first instance of the byte or -1 if the byte + * is not found. */ public static int findByte(byte bytes[], int start, int end, byte b) { int offset = start; @@ -846,22 +785,23 @@ public final class ByteChunk implements return -1; } + /** * Returns the first instance of any of the given bytes in the byte array * between the specified start and end. * * @param bytes The byte array to search * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param b The array of bytes to search for - * @return The position of the first instance of the byte or -1 if the - * byte is not found. + * @param end The point to stop searching in the byte array + * @param b The array of bytes to search for + * @return The position of the first instance of the byte or -1 if the byte + * is not found. */ public static int findBytes(byte bytes[], int start, int end, byte b[]) { int blen = b.length; int offset = start; while (offset < end) { - for (int i = 0; i < blen; i++) { + for (int i = 0; i < blen; i++) { if (bytes[offset] == b[i]) { return offset; } @@ -871,6 +811,7 @@ public final class ByteChunk implements return -1; } + /** * Convert specified String to a byte array. This ONLY WORKS for ascii, UTF * chars will be truncated. Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java Tue Jan 16 20:01:04 2018 @@ -17,74 +17,66 @@ package org.apache.tomcat.util.buf; import java.io.IOException; -import java.io.Serializable; /** - * Utilities to manipulate char chunks. While String is - * the easiest way to manipulate chars ( search, substrings, etc), - * it is known to not be the most efficient solution - Strings are - * designed as immutable and secure objects. + * Utilities to manipulate char chunks. While String is the easiest way to + * manipulate chars ( search, substrings, etc), it is known to not be the most + * efficient solution - Strings are designed as immutable and secure objects. * * @author d...@sun.com * @author James Todd [go...@sun.com] * @author Costin Manolache * @author Remy Maucherat */ -public final class CharChunk implements Cloneable, Serializable, CharSequence { +public final class CharChunk extends AbstractChunk implements CharSequence { private static final long serialVersionUID = 1L; - // Input interface, used when the buffer is emptied. + /** + * Input interface, used when the buffer is empty. + */ public static interface CharInputChannel { + /** * Read new characters. * * @return The number of characters read * - * @throws IOException If an I/O error occurs reading the characters + * @throws IOException If an I/O error occurs during reading */ public int realReadChars() throws IOException; } + /** - * When we need more space we'll either - * grow the buffer ( up to the limit ) or send it to a channel. + * When we need more space we'll either grow the buffer ( up to the limit ) + * or send it to a channel. */ public static interface CharOutputChannel { + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * - * @param cbuf characters that will be written + * @param buf characters that will be written * @param off offset in the characters array * @param len length that will be written * @throws IOException If an I/O occurs while writing the characters */ - public void realWriteChars(char cbuf[], int off, int len) - throws IOException; + public void realWriteChars(char buf[], int off, int len) throws IOException; } // -------------------- - private int hashCode = 0; - // did we compute the hashcode ? - private boolean hasHashCode = false; - // char[] - private char buff[]; - - private int start; - private int end; - - private boolean isSet=false; // XXX + private char[] buff; // -1: grow indefinitely // maximum amount to be cached - private int limit=-1; + private int limit = -1; private CharInputChannel in = null; private CharOutputChannel out = null; - private boolean optimizedWrite=true; /** * Creates a new, uninitialized CharChunk object. @@ -92,10 +84,12 @@ public final class CharChunk implements public CharChunk() { } - public CharChunk(int size) { - allocate( size, -1 ); + + public CharChunk(int initial) { + allocate(initial, -1); } + // -------------------- @Override @@ -103,186 +97,147 @@ public final class CharChunk implements return super.clone(); } - public boolean isNull() { - if( end > 0 ) { - return false; - } - return !isSet; //XXX - } - /** - * Resets the message bytes to an uninitialized state. - */ - public void recycle() { - // buff=null; - isSet=false; // XXX + // -------------------- Setup -------------------- + + public void allocate(int initial, int limit) { + if (buff == null || buff.length < initial) { + buff = new char[initial]; + } + this.limit = limit; + start = 0; + end = 0; + isSet = true; hasHashCode = false; - start=0; - end=0; } - // -------------------- Setup -------------------- - public void allocate( int initial, int limit ) { - if( buff==null || buff.length < initial ) { - buff=new char[initial]; - } - this.limit=limit; - start=0; - end=0; - isSet=true; + /** + * Sets the buffer to the specified subarray of characters. + * + * @param c the characters + * @param off the start offset of the characters + * @param len the length of the characters + */ + public void setChars(char[] c, int off, int len) { + buff = c; + start = off; + end = start + len; + isSet = true; hasHashCode = false; } - public void setOptimizedWrite(boolean optimizedWrite) { - this.optimizedWrite = optimizedWrite; + /** + * @return the buffer. + */ + public char[] getChars() { + return getBuffer(); } - public void setChars( char[] c, int off, int len ) { - buff=c; - start=off; - end=start + len; - isSet=true; - hasHashCode = false; + + /** + * @return the buffer. + */ + public char[] getBuffer() { + return buff; } + /** - * Maximum amount of data in this buffer. - * If -1 or not set, the buffer will grow indefinitely. - * Can be smaller than the current buffer size ( which will not shrink ). - * When the limit is reached, the buffer will be flushed ( if out is set ) - * or throw exception. + * Maximum amount of data in this buffer. If -1 or not set, the buffer will + * grow indefinitely. Can be smaller than the current buffer size ( which + * will not shrink ). When the limit is reached, the buffer will be flushed + * ( if out is set ) or throw exception. + * * @param limit The new limit */ public void setLimit(int limit) { - this.limit=limit; + this.limit = limit; } + public int getLimit() { return limit; } + /** * When the buffer is empty, read the data from the input channel. + * * @param in The input channel */ public void setCharInputChannel(CharInputChannel in) { this.in = in; } + /** - * When the buffer is full, write the data to the output channel. - * Also used when large amount of data is appended. - * If not set, the buffer will grow to the limit. + * When the buffer is full, write the data to the output channel. Also used + * when large amount of data is appended. If not set, the buffer will grow + * to the limit. + * * @param out The output channel */ public void setCharOutputChannel(CharOutputChannel out) { - this.out=out; - } - - // compat - public char[] getChars() - { - return getBuffer(); - } - - public char[] getBuffer() - { - return buff; - } - - /** - * @return the start offset of the chars. - * For output this is the end of the buffer. - */ - public int getStart() { - return start; - } - - public int getOffset() { - return start; - } - - /** - * @param off The offset - */ - public void setOffset(int off) { - start=off; - } - - /** - * @return the length of the bytes. - */ - public int getLength() { - return end-start; + this.out = out; } - public int getEnd() { - return end; - } + // -------------------- Adding data to the buffer -------------------- - public void setEnd( int i ) { - end=i; - } - - // -------------------- Adding data -------------------- - - public void append( char b ) - throws IOException - { - makeSpace( 1 ); + public void append(char b) throws IOException { + makeSpace(1); // couldn't make space - if( limit >0 && end >= limit ) { + if (limit > 0 && end >= limit) { flushBuffer(); } - buff[end++]=b; + buff[end++] = b; } - public void append( CharChunk src ) - throws IOException - { - append( src.getBuffer(), src.getOffset(), src.getLength()); + + public void append(CharChunk src) throws IOException { + append(src.getBuffer(), src.getOffset(), src.getLength()); } + /** * Add data to the buffer. + * * @param src Char array * @param off Offset * @param len Length * @throws IOException Writing overflow data to the output channel failed */ - public void append( char src[], int off, int len ) - throws IOException - { + public void append(char src[], int off, int len) throws IOException { // will grow, up to limit - makeSpace( len ); + makeSpace(len); // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { + if (limit < 0) { // assert: makeSpace made enough space - System.arraycopy( src, off, buff, end, len ); - end+=len; + System.arraycopy(src, off, buff, end, len); + end += len; return; } // Optimize on a common case. - // If the source is going to fill up all the space in buffer, may - // as well write it directly to the output, and avoid an extra copy - if ( optimizedWrite && len == limit && end == start && out != null ) { - out.realWriteChars( src, off, len ); + // If the buffer is empty and the source is going to fill up all the + // space in buffer, may as well write it directly to the output, + // and avoid an extra copy + if (len == limit && end == start && out != null) { + out.realWriteChars(src, off, len); return; } // if we have limit and we're below - if( len <= limit - end ) { + if (len <= limit - end) { // makeSpace will grow the buffer to the limit, // so we have space - System.arraycopy( src, off, buff, end, len ); + System.arraycopy(src, off, buff, end, len); - end+=len; + end += len; return; } @@ -298,32 +253,34 @@ public final class CharChunk implements // and still have some space for more. We'll still have 2 writes, but // we write more on the first. - if( len + end < 2 * limit ) { - /* If the request length exceeds the size of the output buffer, - flush the output buffer and then write the data directly. - We can't avoid 2 writes, but we can write more on the second - */ - int avail=limit-end; + if (len + end < 2 * limit) { + /* + * If the request length exceeds the size of the output buffer, + * flush the output buffer and then write the data directly. We + * can't avoid 2 writes, but we can write more on the second + */ + int avail = limit - end; System.arraycopy(src, off, buff, end, avail); end += avail; flushBuffer(); - System.arraycopy(src, off+avail, buff, end, len - avail); - end+= len - avail; + System.arraycopy(src, off + avail, buff, end, len - avail); + end += len - avail; - } else { // len > buf.length + avail + } else { // len > buf.length + avail // long write - flush the buffer and write the rest // directly from source flushBuffer(); - out.realWriteChars( src, off, len ); + out.realWriteChars(src, off, len); } } /** * Append a string to the buffer. + * * @param s The string * @throws IOException Writing overflow data to the output channel failed */ @@ -331,26 +288,28 @@ public final class CharChunk implements append(s, 0, s.length()); } + /** * Append a string to the buffer. + * * @param s The string * @param off Offset * @param len Length * @throws IOException Writing overflow data to the output channel failed */ public void append(String s, int off, int len) throws IOException { - if (s==null) { + if (s == null) { return; } // will grow, up to limit - makeSpace( len ); + makeSpace(len); // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { + if (limit < 0) { // assert: makeSpace made enough space - s.getChars(off, off+len, buff, end ); - end+=len; + s.getChars(off, off + len, buff, end); + end += len; return; } @@ -358,7 +317,7 @@ public final class CharChunk implements int sEnd = off + len; while (sOff < sEnd) { int d = min(limit - end, sEnd - sOff); - s.getChars( sOff, sOff+d, buff, end); + s.getChars(sOff, sOff + d, buff, end); sOff += d; end += d; if (end >= limit) { @@ -367,32 +326,21 @@ public final class CharChunk implements } } + // -------------------- Removing data from the buffer -------------------- public int substract() throws IOException { - if ((end - start) == 0) { - if (in == null) { - return -1; - } - int n = in.realReadChars(); - if (n < 0) { - return -1; - } + if (checkEof()) { + return -1; } - return (buff[start++]); + return buff[start++]; } + public int substract(char dest[], int off, int len) throws IOException { - if ((end - start) == 0) { - if (in == null) { - return -1; - } - int n = in.realReadChars(); - if (n < 0) { - return -1; - } + if (checkEof()) { + return -1; } - int n = len; if (len > getLength()) { n = getLength(); @@ -403,52 +351,70 @@ public final class CharChunk implements } + private boolean checkEof() throws IOException { + if ((end - start) == 0) { + if (in == null) { + return true; + } + int n = in.realReadChars(); + if (n < 0) { + return true; + } + } + return false; + } + + + /** + * Send the buffer to the sink. Called by append() when the limit is + * reached. You can also call it explicitly to force the data to be written. + * + * @throws IOException Writing overflow data to the output channel failed + */ public void flushBuffer() throws IOException { - //assert out!=null - if( out==null ) { - throw new IOException( "Buffer overflow, no sink " + limit + " " + - buff.length ); + // assert out!=null + if (out == null) { + throw new IOException("Buffer overflow, no sink " + limit + " " + buff.length); } - out.realWriteChars( buff, start, end - start ); - end=start; + out.realWriteChars(buff, start, end - start); + end = start; } + /** - * Make space for len chars. If len is small, allocate - * a reserve space too. Never grow bigger than limit. + * Make space for len chars. If len is small, allocate a reserve space too. + * Never grow bigger than limit. + * * @param count The size */ - public void makeSpace(int count) - { + public void makeSpace(int count) { char[] tmp = null; int newSize; - int desiredSize=end + count; + int desiredSize = end + count; // Can't grow above the limit - if( limit > 0 && - desiredSize > limit) { - desiredSize=limit; + if (limit > 0 && desiredSize > limit) { + desiredSize = limit; } - if( buff==null ) { - if( desiredSize < 256 ) - { - desiredSize=256; // take a minimum + if (buff == null) { + if (desiredSize < 256) { + desiredSize = 256; // take a minimum } - buff=new char[desiredSize]; + buff = new char[desiredSize]; } // limit < buf.length ( the buffer is already big ) // or we already have space XXX - if( desiredSize <= buff.length) { + if (desiredSize <= buff.length) { return; } // grow in larger chunks - if( desiredSize < 2 * buff.length ) { - newSize= buff.length * 2; + if (desiredSize < 2 * buff.length) { + newSize = buff.length * 2; } else { - newSize= buff.length * 2 + count ; + newSize = buff.length * 2 + count; } if (limit > 0 && newSize > limit) { @@ -456,27 +422,31 @@ public final class CharChunk implements } tmp = new char[newSize]; + // Some calling code assumes buffer will not be compacted System.arraycopy(buff, 0, tmp, 0, end); buff = tmp; tmp = null; } + // -------------------- Conversion and getters -------------------- @Override public String toString() { if (null == buff) { return null; - } else if (end-start == 0) { + } else if (end - start == 0) { return ""; } return StringCache.toString(this); } + public String toStringInternal() { - return new String(buff, start, end-start); + return new String(buff, start, end - start); } + // -------------------- equals -------------------- @Override @@ -487,14 +457,17 @@ public final class CharChunk implements return false; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return <code>true</code> if the comparison succeeded, <code>false</code> otherwise + * @return <code>true</code> if the comparison succeeded, <code>false</code> + * otherwise */ public boolean equals(String s) { char[] c = buff; - int len = end-start; + int len = end - start; if (c == null || len != s.length()) { return false; } @@ -507,42 +480,49 @@ public final class CharChunk implements return true; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return <code>true</code> if the comparison succeeded, <code>false</code> otherwise + * @return <code>true</code> if the comparison succeeded, <code>false</code> + * otherwise */ public boolean equalsIgnoreCase(String s) { char[] c = buff; - int len = end-start; + int len = end - start; if (c == null || len != s.length()) { return false; } int off = start; for (int i = 0; i < len; i++) { - if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } + public boolean equals(CharChunk cc) { - return equals( cc.getChars(), cc.getOffset(), cc.getLength()); + return equals(cc.getChars(), cc.getOffset(), cc.getLength()); } + public boolean equals(char b2[], int off2, int len2) { - char b1[]=buff; - if( b1==null && b2==null ) { + char b1[] = buff; + if (b1 == null && b2 == null) { return true; } - if (b1== null || b2==null || end-start != len2) { + int len = end - start; + if (len != len2 || b1 == null || b2 == null) { return false; } + int off1 = start; - int len=end-start; - while ( len-- > 0) { + + while (len-- > 0) { if (b1[off1++] != b2[off2++]) { return false; } @@ -550,14 +530,16 @@ public final class CharChunk implements return true; } + /** - * @return <code>true</code> if the message bytes starts with the specified string. + * @return <code>true</code> if the message bytes starts with the specified + * string. * @param s The string */ public boolean startsWith(String s) { char[] c = buff; int len = s.length(); - if (c == null || len > end-start) { + if (c == null || len > end - start) { return false; } int off = start; @@ -569,20 +551,24 @@ public final class CharChunk implements return true; } + /** - * @return <code>true</code> if the message bytes starts with the specified string. - * @param s The string - * @param pos The position at which the comparison will be made + * Returns true if the buffer starts with the specified string. + * + * @param s the string + * @param pos The position + * + * @return <code>true</code> if the start matches */ public boolean startsWithIgnoreCase(String s, int pos) { char[] c = buff; int len = s.length(); - if (c == null || len+pos > end-start) { + if (c == null || len + pos > end - start) { return false; } - int off = start+pos; + int off = start + pos; for (int i = 0; i < len; i++) { - if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } @@ -591,13 +577,14 @@ public final class CharChunk implements /** - * @return <code>true</code> if the message bytes end with the specified string. + * @return <code>true</code> if the message bytes end with the specified + * string. * @param s The string */ public boolean endsWith(String s) { char[] c = buff; int len = s.length(); - if (c == null || len > end-start) { + if (c == null || len > end - start) { return false; } int off = end - len; @@ -609,82 +596,59 @@ public final class CharChunk implements return true; } - // -------------------- Hash code -------------------- @Override - public int hashCode() { - if (hasHashCode) { - return hashCode; - } - int code = 0; - - code = hash(); - hashCode = code; - hasHashCode = true; - return code; + protected int getBufferElement(int index) { + return buff[index]; } - // normal hash. - public int hash() { - int code=0; - for (int i = start; i < start + end-start; i++) { - code = code * 37 + buff[i]; - } - return code; - } public int indexOf(char c) { - return indexOf( c, start); + return indexOf(c, start); } + /** - * @return <code>true</code> if the message bytes starts with the specified string. - * @param c the character - * @param starting Start position + * Returns the first instance of the given character in this CharChunk + * starting at the specified char. If the character is not found, -1 is + * returned. <br> + * + * @param c The character + * @param starting The start position + * @return The position of the first instance of the character or -1 if the + * character is not found. */ public int indexOf(char c, int starting) { - int ret = indexOf( buff, start+starting, end, c ); + int ret = indexOf(buff, start + starting, end, c); return (ret >= start) ? ret - start : -1; } - public static int indexOf( char chars[], int off, int cend, char qq ) - { - while( off < cend ) { - char b=chars[off]; - if( b==qq ) { - return off; - } - off++; - } - return -1; - } - - public int indexOf( String src, int srcOff, int srcLen, int myOff ) { - char first=src.charAt( srcOff ); - - // Look for first char - int srcEnd = srcOff + srcLen; - - for( int i=myOff+start; i <= (end - srcLen); i++ ) { - if( buff[i] != first ) { - continue; - } - // found first char, now look for a match - int myPos=i+1; - for( int srcPos=srcOff + 1; srcPos< srcEnd;) { - if( buff[myPos++] != src.charAt( srcPos++ )) { - break; - } - if( srcPos==srcEnd ) - { - return i-start; // found it - } + /** + * Returns the first instance of the given character in the given char array + * between the specified start and end. <br> + * + * @param chars The array to search + * @param start The point to start searching from in the array + * @param end The point to stop searching in the array + * @param s The character to search for + * @return The position of the first instance of the character or -1 if the + * character is not found. + */ + public static int indexOf(char chars[], int start, int end, char s) { + int offset = start; + + while (offset < end) { + char c = chars[offset]; + if (c == s) { + return offset; } + offset++; } return -1; } + // -------------------- utils private int min(int a, int b) { if (a < b) { @@ -693,6 +657,7 @@ public final class CharChunk implements return b; } + // Char sequence impl @Override @@ -700,6 +665,7 @@ public final class CharChunk implements return buff[index + start]; } + @Override public CharSequence subSequence(int start, int end) { try { @@ -713,9 +679,21 @@ public final class CharChunk implements } } + @Override public int length() { return end - start; } + /** + * NO-OP. + * + * @param optimizedWrite Ignored + * + * @deprecated Unused code. This is now a NO-OP and will be removed without + * replacement in Tomcat 10. + */ + @Deprecated + public void setOptimizedWrite(boolean optimizedWrite) { + } } Modified: tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java Tue Jan 16 20:01:04 2018 @@ -36,4 +36,30 @@ public class TestCharChunk { Assert.assertFalse(cc.endsWith("x")); Assert.assertFalse(cc.endsWith("xxtest")); } + + @Test + public void testIndexOf_String() { + char[] chars = "Hello\u00a0world".toCharArray(); + final int len = chars.length; + + CharChunk cc = new CharChunk(); + cc.setChars(chars, 0, len); + + Assert.assertEquals(0, cc.indexOf("Hello", 0, "Hello".length(), 0)); + Assert.assertEquals(2, cc.indexOf("ll", 0, 2, 0)); + Assert.assertEquals(2, cc.indexOf("Hello", 2, 2, 0)); + + Assert.assertEquals(7, cc.indexOf("o", 0, 1, 5)); + + // Does work outside of 0-127 (unlike ByteChunk) + Assert.assertEquals(5, cc.indexOf("\u00a0", 0, 1, 0)); + + cc.setChars(chars, 6, 5); + Assert.assertEquals(1, cc.indexOf("o", 0, 1, 0)); + + cc.setChars(chars, 6, 2); + Assert.assertEquals(0, cc.indexOf("wo", 0, 1, 0)); + Assert.assertEquals(-1, cc.indexOf("d", 0, 1, 0)); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org