Return-Path: Delivered-To: apmail-jakarta-lucene-dev-archive@apache.org Received: (qmail 91558 invoked from network); 9 Apr 2002 12:40:16 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 9 Apr 2002 12:40:16 -0000 Received: (qmail 22188 invoked by uid 97); 9 Apr 2002 12:40:14 -0000 Delivered-To: qmlist-jakarta-archive-lucene-dev@jakarta.apache.org Received: (qmail 22138 invoked by uid 97); 9 Apr 2002 12:40:13 -0000 Mailing-List: contact lucene-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Lucene Developers List" Reply-To: "Lucene Developers List" Delivered-To: mailing list lucene-dev@jakarta.apache.org Received: (qmail 22127 invoked from network); 9 Apr 2002 12:40:12 -0000 X-MIMEOLE: Produced By Microsoft Exchange V6.0.5762.3 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C1DFC2.BE9CD5F7" Subject: RE: Searcher/Reader/Writer Management Date: Tue, 9 Apr 2002 14:33:25 +0200 Message-ID: <50EA669584662B498F13A5F24630A0C0DB1730@peach.mnet.private> X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: Searcher/Reader/Writer Management Thread-Index: AcHbI0yTFv4IUHuaTgONUPgBMMeeaQEnIS5A From: =?iso-8859-1?Q?Hal=E1csy_P=E9ter?= To: "Lucene Developers List" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hello Scott, I've attached a new version of IndexAccessControl and a TEST file. First = of all I think I've found a failure in you code: 1. get a searcher 2. use it 3. release it 4. get an other searcher 5. use it In step 3. -- since there is only one reference to the searhcer -- the = real searcher is closed: else // last reference to searcher { info.searcher.close(); } The info isn't deleted. In step 4. in method getSearcher the info is found and the closed = Searcher object is returned. Other: a. I changed the IndexAccessControl it's not static any more. You can = make a new instance for every index. b. I created a ManagedSearcher class that is returned by getSearcher. If = you call close method of this class it notifies the IndexAccessControl = to release the searcher. So the usage: IndexAccessControl iac =3D = IndexAccessControl.getInstance("/pathToIndex"); Searcher searcher =3D iac.getSearcher(); // use the searcher searcher.close(); If you like this architecture we could improve the code: 1. decoupling factory method and access control logic 2. decoupling searcher managment and reader/writer managment 3. solve the problem of last used searcher: if the last used searcher is = released the searcher is closed. Getting searcher again takes a lot of = time. We should have a pool of searcher where the size of pool is 1.=20 Unfortunatla to use compile and use ManagedSearcher class you have to = modify lucene source: the Searcher has not public abstract methods --> = you can't maka subclass of Searcher in other package that = org.apache.lucene.search. To use the class modify all abstract method of = org.apache.lucene.search.Searcher to public or protected. peter > -----Original Message----- > From: Scott Ganyo [mailto:scott.ganyo@eTapestry.com] > Sent: Wednesday, April 03, 2002 5:24 PM > To: 'Lucene Developers List' > Subject: RE: Searcher/Reader/Writer Management >=20 >=20 > > > > 1. Why don't we have as many control/manager object as index=20 > > > > we want to use? > > > > 2. Why is it a static class with only static methods?=20 > > >=20 > > > That would destroy what this class is attempting to=20 > > > accomplish: Guarding > > > the index resources so that you don't have to think about=20 > > > concurrency. If > > > you could have multiple controllers, they would then have=20 > to somehow > > > coordinate between themselves... making the class even=20 > more complex. > > >=20 > > I mean we could have as many instance as many index (path or=20 > > directory) we want to manage. For example > > IndexAccessControl iac =3D new IndexAccessControl(myPath); > > Searcher searcher =3D iac.getSearcher(); >=20 > Yes, but then you rely on the user to make sure that they=20 > don't create two > on the same path, right? If you really don't like the static=20 > style for some > reason (why?), I suppose we could have a static accessor like: > "IndexAccessControl getController(path)" and maintain an=20 > internal map of > controllers to avoid conflicts... >=20 > > > > 3. Couldn't we wrap the release logic into a=20 > > > > ControledSearcher (Yesterday I've writter CachedSearcher)? > > >=20 > > > Nope. For example, in my application I need to hold onto a=20 > > > single Searcher > > > during the course of a transaction... if I was forced to use=20 > > > a new Searcher > > > for each query, I couldn't be guaranteed consistent results=20 > > > throughout the > > > transaction. > >=20 > > You are not forced. You can hold reference to=20 > > ControledSearcher as long you want. I only suggest that=20 > > developer should call > > searcher.close() > > instead of > > IndexAccessControl.releaseSearcher(searcher) >=20 > Ah. Yes, good point. You're right, we should wrap all 3=20 > (IndexReader, > IndexWriter, and Searcher) classes for control purposes. (I=20 > guess I just > hadn't thought about this because I already wrap and=20 > consolidate these 3 > classes into 2 classes: A Searcher and a Writer where the=20 > writer handles > add(), update(), and delete(). Maybe folks would be=20 > interested in that kind > of thing as well...?) >=20 > Scott >=20 ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: application/octet-stream; name="ManagedSearcher.java" Content-Transfer-Encoding: base64 Content-Description: ManagedSearcher.java Content-Disposition: attachment; filename="ManagedSearcher.java" LyoKICogTWFuYWdlZFNlYXJjaGVyLmphdmEKICoKICogQ3JlYXRlZCBvbiAyMDAyLiDhcHJpbGlz IDYuLCAyMzoyMQogKi8KCnBhY2thZ2UgaWFjOwppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2Vh cmNoLio7CmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKaW1wb3J0 IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LlRlcm07CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9u OwovKioKICogVGhlIFNlYXJjaGVyIG9iamVjdCB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUg SW5kZXhBY2Nlc3NDb250cm9sIGNvbXBvbmVudC4KICoKICogQGF1dGhvciAgUGV0ZXIgSGFsYWNz eQogKiBAdmVyc2lvbgogKi8KcHVibGljIGNsYXNzIE1hbmFnZWRTZWFyY2hlciBleHRlbmRzIFNl YXJjaGVyIHsKICAgIHByb3RlY3RlZCBTZWFyY2hlciBtX3NlYXJjaGVyOwogICAgCiAgICBwcm90 ZWN0ZWQgbG9uZyBtX2xhc3RVc2VkOwogICAgCiAgICAvKiogb2JqZWN0IHRoYXQgaXMgaW50ZXJl c3RlZCBpbiB0aGUgZmFjdCB0aGF0IHRoaXMgc2VhcmNoZXIgaXMgY2xvc2VkICovCiAgICBwcm90 ZWN0ZWQgU2VhcmNoZXJMaXN0ZW5lciBtX21hbmFnZXI7CiAgICAKICAgIC8qKiBDcmVhdGVzIG5l dyBNYW5hZ2VkU2VhcmNoZXIgKi8KICAgIHB1YmxpYyBNYW5hZ2VkU2VhcmNoZXIoaWFjLlNlYXJj aGVyTGlzdGVuZXIgbWFuYWdlciwgU2VhcmNoZXIgc2VhcmNoZXIpIHsKICAgICAgICBTeXN0ZW0u b3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiIG5ldyBNYW5h Z2VkU2VhcmNoZXIgY3JlYXRlZCIpOwogICAgICAgIG1fbWFuYWdlciA9IG1hbmFnZXI7CiAgICAg ICAgbV9zZWFyY2hlciA9IHNlYXJjaGVyOwogICAgICAgIHRvdWNoKCk7CiAgICB9CiAgICAKICAg IFNlYXJjaGVyIGdldFJlYWxTZWFyY2hlcigpIHsKICAgICAgICByZXR1cm4gbV9zZWFyY2hlcjsK ICAgIH0KICAgIC8qKiBOb3RpZnkgbGlzdGVuZXIgICovCiAgICBwdWJsaWMgdm9pZCBjbG9zZSgp IHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gZG8gbm90IGNsb3NlIHRoZSBzZWFyY2hl ciBidXQgbm90aWZ5IGxpc3RlbmVyCiAgICAgICAgbV9tYW5hZ2VyLnNlYXJjaGVyQ2xvc2VkKG5l dyBTZWFyY2hlckV2ZW50KHRoaXMpKTsKICAgIH0KICAgIAogICAgLyoqIGhlbHBlciBtZXRob2Qg dG8gc2F2ZSB0aGUgdGltZSB0aGUgZGVsZWdhdGVkIFNlYXJjaGVyIGxhc3Qgd2FzIHVzZWQgKi8K ICAgIHByaXZhdGUgZmluYWwgdm9pZCB0b3VjaCgpIHsKICAgICAgICBtX2xhc3RVc2VkID0gU3lz dGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICB9CiAgICAvKiogcmV0dXJucyBtaWxsaXNlY29u ZHMgZnJvbSB3aGVuIHRoaXMgb2JqZWN0IHdhcyBub3QgdXNlZCAqLwogICAgcHVibGljIGZpbmFs IGxvbmcgZ2V0QWdlKCkgewogICAgICAgIHJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMo KSAtIG1fbGFzdFVzZWQ7CiAgICB9CiAgICAKICAgIAogICAgLy8gaW1wbGVtZW50aW5nIG1ldGhv ZHMgb2YgU2VhcmNoZXIKICAgIAogICAgLyoqIEZvciB1c2UgYnkge0BsaW5rIEhpdENvbGxlY3Rv cn0gaW1wbGVtZW50YXRpb25zLiAgKi8KICAgIHB1YmxpYyBEb2N1bWVudCBkb2MoaW50IGkpIHRo cm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgdG91Y2goKTsKICAgICAgICByZXR1cm4gZG9jKGkp OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNlYXJjaChRdWVyeSBxdWVyeSwgRmlsdGVyIGZpbHRl ciwgSGl0Q29sbGVjdG9yIHJlc3VsdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgdG91 Y2goKTsKICAgICAgICBtX3NlYXJjaGVyLnNlYXJjaChxdWVyeSwgZmlsdGVyLCByZXN1bHRzKTsK ICAgIH0KICAgIHB1YmxpYyBUb3BEb2NzIHNlYXJjaChRdWVyeSBxdWVyeSwgRmlsdGVyIGZpbHRl ciwgaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgdG91Y2goKTsKICAgICAgICBy ZXR1cm4gbV9zZWFyY2hlci5zZWFyY2gocXVlcnksIGZpbHRlciwgbik7CiAgICB9CiAgICAKICAg IHB1YmxpYyBpbnQgZG9jRnJlcShUZXJtIHRlcm0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAg ICAgdG91Y2goKTsKICAgICAgICByZXR1cm4gbV9zZWFyY2hlci5kb2NGcmVxKHRlcm0pOwogICAg fQogICAgCiAgICBwdWJsaWMgaW50IG1heERvYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAg ICAgdG91Y2goKTsKICAgICAgICByZXR1cm4gbV9zZWFyY2hlci5tYXhEb2MoKTsKICAgIH0KICAg IAp9Cg== ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: application/octet-stream; name="IndexAccessControl.java" Content-Transfer-Encoding: base64 Content-Description: IndexAccessControl.java Content-Disposition: attachment; filename="IndexAccessControl.java" cGFja2FnZSBpYWM7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0 IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4Lio7CmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1 bWVudC4qOwppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLio7CmltcG9ydCBvcmcuYXBh Y2hlLmx1Y2VuZS5hbmFseXNpcy4qOwoKLyoqIFJ1bGVzOgogKiAgT25jZSBjcmVhdGVkLCBzZWFy Y2hlcnMgYXJlIHZhbGlkIHVudGlsIGNsb3NlZC4KICogIElmIGRvaW5nIGFuIHVwZGF0ZSwgc2Vh cmNoZXJzIG11c3Qgbm90IGJlIGNyZWF0ZWQgYmV0d2VlbgogKiBjbG9zZSBvZiB0aGUKICogcmVh ZGVyCiAqICAgICAgdGhhdCBkZWxldGVzIGFuZCBjbG9zZSBvZiB0aGUgd3JpdGVyIHRoYXQgYWRk cy4KICogIFdyaXRlcnMgbWF5IGJlIHJldXNlZCB1bnRpbCBSZWFkZXIgb3IgU2VhcmNoZXIgaXMg bmVlZGVkLgogKiAgUmVhZGVycyBtYXkgYmUgcmV1c2VkIHVudGlsIFdyaXRlciBvciBTZWFyY2hl ciBpcyBuZWVkZWQuCiAqICBTZWFyY2hlcnMgbWF5IGJlIHJldXNlZCB1bnRpbCB0aGUgaW5kZXgg aXMgY2hhbmdlZC4KICogIFRoZXJlIG1heSBiZSBvbmx5IG9uZSBvZiBhIFJlYWRlciBhbmQvb3Ig V3JpdGVyIGF0IGEgdGltZS4KICogIElmIHlvdSBnZXQgaXQsIHJlbGVhc2UgaXQuCiAqCiAqCiAq LwovLyAtLSBGcm9tIHRoZSBzdGF0aWMgY2xhc3MgSSBtYWRlIGZhY3RvcnkgY2xhc3MuIEZvciBl dmVyeSBpbmRleCAocGF0aCkgb25lCi8vICAgIGluc3RhbmNlIGlzIG1hcHBlZC4KLy8gLS0gZ2V0 U2VhcmNoZXIgcmV0dXJucyBNYW5hZ2VkU2VhcmNoZXIgb2JqZWN0cyBzbyB5b3UgY2FuIHNpbXBs eSBjYWxsIGNsb3NlCi8vICAgIG1ldGhvZCBpbnRzZWFkIG9mIHJlbGVhc2VTZWFyY2hlcgovLyAt LSByZWxlYXNlU2VhcmNoZXIgaXMgbm90IHB1YmxpYwovLwovLyBtYXliZSB3ZSBzaG91bGQgZGVj b3VwbGUgdGhlIGZhY3RvcnkgYW5kIGFjY2VzcyBjb250cm9sIGxvZ2ljCi8vCi8vIHF1ZXN0aW9u cyBhcmU6Ci8vIGhvdyB0byBjb25maWd1cmUgSW5kZXhXcml0ZXIgKGFuYWx5emVyLCBtZXJnZUZh Y3RvciBldGMuKQovLyBzaG91bGQgd2UgdXNlIERpcmVjdG9yeSBvYmplY3RzIGluc3RlYWQgb2Yg cGF0aCAoaG93IHRvIG1hbmFnZSByZWFkZXJzL3dyaXRlcnMvc2VhcmNoZXJzIG9mIFJBTURpcmVj dG9yKQovLyBjb3VsZCB3ZSBkZWNvdXBsZSBTZWFyY2hlciBtYW5hZ21lbnQgYW5kIFdyaXRlci9S ZWFkZXIgbWFuYWdtZW50PwovLyBkbyB3ZSBuZWVkIHN0YXRpYyBNYXBzPyBuby4gaG93IHRvIG1h a2UgaGFuZGxlIGNoZWNrb3V0IGluZm9zCgpwdWJsaWMgY2xhc3MgSW5kZXhBY2Nlc3NDb250cm9s IGltcGxlbWVudHMgU2VhcmNoZXJMaXN0ZW5lciB7CiAgICBwcml2YXRlIEFuYWx5emVyIGFuYWx5 emVyOwogICAgcHJpdmF0ZSBGaWxlIHBhdGg7CiAgICAKICAgIHByaXZhdGUgc3RhdGljIGZpbmFs IE1hcCBXUklURVJfUEFUSFMgPSBuZXcgSGFzaE1hcCgpOyAvLyBwYXRoIC0+IENoZWNrb3V0SW5m bwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIFNFQVJDSEVSX1BBVEhTID0gbmV3IEhhc2hN YXAoKTsgLy8gcGF0aCAtPiBTZWFyY2hlcgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE9M RF9TRUFSQ0hFUlMgPSBuZXcgSGFzaE1hcCgpOyAvLyBTZWFyY2hlciAtPiBDaGVja291dEluZm8K ICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOyAg ICAgLy8gcGF0aCAtLT4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwogICAgCiAgICBwdWJsaWMgc3Rh dGljIEluZGV4QWNjZXNzQ29udHJvbCBnZXRJbnN0YW5jZShTdHJpbmcgcGF0aCkgewogICAgICAg IHJldHVybiBnZXRJbnN0YW5jZShuZXcgRmlsZShwYXRoKSk7CiAgICB9CiAgICAvKiogQ3JlYXRl cyBhIG5ldyBpbnN0YW5jZTsgZm9yIGV2ZXJ5IHBhdGggb25lIGluc3RhbmNlIGlzIGFsbG93ZWQg Ki8KICAgIHB1YmxpYyBzdGF0aWMgSW5kZXhBY2Nlc3NDb250cm9sIGdldEluc3RhbmNlKEZpbGUg cGF0aCkgewogICAgICAgIAogICAgICAgIHN5bmNocm9uaXplZChpbnN0YW5jZXMpIHsKICAgICAg ICAgICAgU3RyaW5nIGtleSA9IHBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgIElu ZGV4QWNjZXNzQ29udHJvbCBpYWMgPSAoSW5kZXhBY2Nlc3NDb250cm9sKSBpbnN0YW5jZXMuZ2V0 KGtleSk7CiAgICAgICAgICAgIGlmKGlhYyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBj cmVhdGluZyBuZXcKICAgICAgICAgICAgICAgIGlhYyA9IG5ldyBJbmRleEFjY2Vzc0NvbnRyb2wo cGF0aCwgbmV3IFNpbXBsZUFuYWx5emVyKCkpOwogICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1 dChrZXksIGlhYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGlhYzsKICAgICAg ICB9CiAgICB9CiAgICAKICAgIAogICAgLyoqIHNpbmdsZXRvbiAqLwogICAgcHJpdmF0ZSBJbmRl eEFjY2Vzc0NvbnRyb2woRmlsZSBwYXRoLCBBbmFseXplciBhbmFseXplcikgewogICAgICAgIHRo aXMucGF0aCA9IHBhdGg7CiAgICAgICAgdGhpcy5hbmFseXplciA9IGFuYWx5emVyOwogICAgfQog ICAgCiAgICAvKiogZ2V0IGZvciBhZGRpbmcgZG9jdW1lbnRzLgogICAgICogYmxvY2tzOiByZWFk ZXJzIHVudGlsIHJlbGVhc2VkCiAgICAgKi8KICAgIHB1YmxpYyBJbmRleFdyaXRlciBnZXRXcml0 ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIEluZGV4V3JpdGVyIHdyaXRlciA9IG51 bGw7CiAgICAgICAgCiAgICAgICAgLy8gU3RyaW5nIHN5bmMgPSBwYXRoLmdldEFic29sdXRlUGF0 aCgpLmludGVybigpOwogICAgICAgIC8vIHN5bmNocm9uaXplZCAoc3luYykgLy8gc3luYyBvbiBz cGVjaWZpYyBpbmRleAogICAgICAgIC8vIGJlY2F1c2Ugb2YgdGhlIG9uZSB0byBvbmUgbWFwcGlu ZyBiZXR3ZWVuIHBhdGhzIGFuZCBpbnN0YW5jZXMgd2UgbmVlZCBvbmx5CiAgICAgICAgLy8gdG8g b2J0YWluIHRoZSBtb25pdG9yIG9mIHRoaXMgb2JqZWN0CiAgICAgICAgc3luY2hyb25pemVkKHRo aXMpIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgQ2hlY2tvdXRJbmZvIGluZm8g PQogICAgICAgICAgICAgICAgKENoZWNrb3V0SW5mbylXUklURVJfUEFUSFMuZ2V0KHBhdGgpOwog ICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgLy8gbWF5IGFscmVhZHkgaGF2ZSBhIHdy aXRlciwgdXNlIGl0CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlu Zm8ud3JpdGVyICE9IG51bGwpIC8vIHl1cCwgaGF2ZSBhIHdyaXRlcgogICAgICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jaGVja291dENvdW50Kys7CiAgICAg ICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IGluZm8ud3JpdGVyOwogICAgICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIG5vdCBhIHdyaXRlciwgaXQgbXVzdCBi ZSBhIHJlYWRlciwgd2FpdCBmb3IgaXQgdG8gZmluaXNoIHRvIHRyeSBhZ2FpbgogICAgICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGluZm8ud2FpdCgpOyAvLyB3YWl0IGZvciBpbmZvIHRvIGJlIHJlbGVhc2Vk CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gg KEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v IFRPRE86IFdpbGwgdGhpcyBldmVyIGhhcHBlbj8KICAgICAgICAgICAgICAgICAgICAgICAgICAg IGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g bnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgLy8gbm8gd3JpdGVyLCBjcmVhdGUg b25lCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtaXNzaW5n ID0gIXBhdGguZXhpc3RzKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmcpIHBhdGgu bWtkaXIoKTsKICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIocGF0 aCwgYW5hbHl6ZXIsCi8qY3JlYXRlKi9taXNzaW5nKTsKICAgICAgICAgICAgICAgICAgICB3cml0 ZXIubWVyZ2VGYWN0b3IgPSAyOwogICAgICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQ2hlY2tv dXRJbmZvKHdyaXRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAg ICAgd2hpbGUgKHdyaXRlciA9PSBudWxsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdyaXRl cjsKICAgIH0KICAgIAogICAgcHVibGljIHZvaWQgcmVsZWFzZVdyaXRlcihJbmRleFdyaXRlciB3 cml0ZXIpIHRocm93cwogICAgSU9FeGNlcHRpb24gewogICAgICAgIAogICAgICAgIHN5bmNocm9u aXplZCAodGhpcykgewogICAgICAgICAgICBDaGVja291dEluZm8gaW5mbyA9IChDaGVja291dElu Zm8pV1JJVEVSX1BBVEhTLmdldChwYXRoKTsKICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAm JiB3cml0ZXIgPT0gaW5mby53cml0ZXIpIC8vIHdyaXRlciB3YXMgY2hlY2tlZCBvdXQKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgaWYgKGluZm8uY2hlY2tvdXRDb3VudCA+IDEpIC8vIHdy aXRlciBoYXMgb3RoZXIgcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgIGluZm8uY2hlY2tvdXRDb3VudC0tOwogICAgICAgICAgICAgICAgICAgIHdyaXRlciA9 IG51bGw7IC8vIGF2b2lkIGNsb3NlKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg IGVsc2UgLy8gbGFzdCByZWZlcmVuY2UgdG8gd3JpdGVyCiAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgV1JJVEVSX1BBVEhTLnJlbW92ZShwYXRoKTsKICAgICAgICAgICAgICAg ICAgICB3cml0ZXIgPSBpbmZvLndyaXRlcjsKICAgICAgICAgICAgICAgICAgICBpbmZvLm5vdGlm eSgpOyAvLyBub3RpZnkgd2FpdGVycyB0byB0cnkgYWdhaW4KICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBjbG9zZSB0aGUgd3JpdGVyICh1bmxlc3Mg aXQgc3RpbGwgaGFzIGNoZWNrb3V0cykKICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHdyaXRl ci5jbG9zZSgpOwogICAgfQogICAgCiAgICBDaGVja291dEluZm8gc2VhcmNoZXJJbmZvID0gbnVs bDsKICAgIC8vIGluZm8gYWJvdXQgU2VhcmNoZXIgdGhhdCBzaG91bGQgYmUgY2xvc2VkIGJlY2F1 c2UgdGhlIGluZGV4IGhhcyBiZW5uIAogICAgLy8gbW9kaWZpZWQgc2luY2UgdGhpcyBzZWFyY2hl ciB3YXMgY3JlYXRlZAogICAgQ2hlY2tvdXRJbmZvIG9sZFNlYXJjaGVySW5mbyA9IG51bGw7CiAg ICAKICAgIC8qKiBnZXQgZm9yIHNlYXJjaC4gKi8KICAgIHB1YmxpYyBTZWFyY2hlciBnZXRTZWFy Y2hlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgTWFuYWdlZFNlYXJjaGVyIGlzOwog ICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgIGlmIChzZWFyY2hlckluZm8g PT0gbnVsbCB8fCBzZWFyY2hlckluZm8uc2VhcmNoZXIgPT0gbnVsbCB8fCBJbmRleFJlYWRlci5s YXN0TW9kaWZpZWQocGF0aCkgPiBzZWFyY2hlckluZm8uY3JlYXRpb25UaW1lKSAKICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgLy8gbmVlZCBuZXcgc2VhcmNoZXIgYnV0IGZpcnN0IGNoZWNr IHdoZXRoZXIgd2UgaGF2ZSBhbiBvbGQgb25lCiAgICAgICAgICAgICAgICBpZiAoIHNlYXJjaGVy SW5mbyAhPSBudWxsICYmIHNlYXJjaGVySW5mby5zZWFyY2hlciAhPSBudWxsICkgewogICAgICAg ICAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgOiBJbmRleFJlYWRlci5sYXN0TW9kaWZpZWQocGF0 aCkgPiBzZWFyY2hlckluZm8uY3JlYXRpb25UaW1lCiAgICAgICAgICAgICAgICAgICAgLy8gdGhp cyBzZWFyY2hlciB3b24ndCBiZSByZXR1cm5lZCBhbnkgbW9yZSBidXQgb3RoZXJzIG1heSBiZSB1 c2luZyBpdAogICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hlckluZm8uY2hlY2tvdXRDb3Vu dCA+IDEpIC8vIHNlYXJjaGVyIGhhcyBvdGhlciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlckluZm8uY2hlY2tvdXRDb3VudC0t OwogICAgICAgICAgICAgICAgICAgICAgICBvbGRTZWFyY2hlckluZm8gPSBzZWFyY2hlckluZm87 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gbGFzdCBy ZWZlcmVuY2UgdG8gc2VhcmNoZXIKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0 TmFtZSgpICsgIiBnZXRTZWFyY2hlcigpIGxhc3QgcmVmZXJlbmNlOiBjbG9zZSIpOwogICAgICAg ICAgICAgICAgICAgICAgICBzZWFyY2hlckluZm8uc2VhcmNoZXIuZ2V0UmVhbFNlYXJjaGVyKCku Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgIGlzID0gbmV3IE1hbmFnZWRTZWFyY2hlcih0aGlzLCBu ZXcgSW5kZXhTZWFyY2hlcihJbmRleFJlYWRlci5vcGVuKHBhdGgpKSk7CiAgICAgICAgICAgICAg ICBzZWFyY2hlckluZm8gPSBuZXcgQ2hlY2tvdXRJbmZvKGlzKTsKICAgICAgICAgICAgfSAgCiAg ICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHVzZSBleGlz dGluZyBzZWFyY2hlcgogICAgICAgICAgICAgICAgaXMgPSBzZWFyY2hlckluZm8uc2VhcmNoZXI7 CiAgICAgICAgICAgICAgICBzZWFyY2hlckluZm8uY2hlY2tvdXRDb3VudCsrOwogICAgICAgICAg ICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpczsKICAgIH0KICAgIAogICAgcHVibGljIHZv aWQgc2VhcmNoZXJDbG9zZWQoU2VhcmNoZXJFdmVudCBldmVudCkgdGhyb3dzIElPRXhjZXB0aW9u IHsKICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdl dE5hbWUoKSArICIgc2VhcmNoZXJDbG9zZWQgZXZlbnQgcmVjZWl2ZWQiKTsKICAgICAgICByZWxl YXNlU2VhcmNoZXIoKE1hbmFnZWRTZWFyY2hlcikgZXZlbnQuZ2V0U291cmNlKCkpOwogICAgfQog ICAgCiAgICB2b2lkIHJlbGVhc2VTZWFyY2hlcihNYW5hZ2VkU2VhcmNoZXIgc2VhcmNoZXIpIHRo cm93cyBJT0V4Y2VwdGlvbiB7Ci8qICAgICAgICAKICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMp IHsKICAgICAgICAgICAgQ2hlY2tvdXRJbmZvIGluZm8gPSBzZWFyY2hlckluZm87CiAgICAgICAg ICAgIGlmIChpbmZvID09IG51bGwgfHwgc2VhcmNoZXIgIT0gaW5mby5zZWFyY2hlcikgLy8gdGhp cyBpc24ndCB0aGUgaW5mbyB3ZSdyZSBsb29raW5nIGZvcgogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBpbmZvID0gb2xkU2VhcmNoZXJJbmZvOwogICAgICAgICAgICB9CiAgICAgICAgICAg IGlmIChpbmZvICE9IG51bGwpIC8vIGZvdW5kIGEgc2VhcmNoZXIKICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgaWYgKGluZm8uY2hlY2tvdXRDb3VudCA+IDEpIC8vIHNlYXJjaGVyIGhhcyBv dGhlciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW5m by5jaGVja291dENvdW50LS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNl IC8vIGxhc3QgcmVmZXJlbmNlIHRvIHNlYXJjaGVyCiAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0 TmFtZSgpICsgIiByZWxlYXNlU2VhcmNoZXIoKSBsYXN0IHJlZmVyZW5jZTogY2xvc2UiKTsKICAg ICAgICAgICAgICAgICAgICBpbmZvLnNlYXJjaGVyLmdldFJlYWxTZWFyY2hlcigpLmNsb3NlKCk7 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAvLyBjYW4n dCBmaW5kIHNlYXJjaGVyLCBqdXN0IGNsb3NlIGl0CiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIC8vIEkgdGhpbmsgdGhpcyBpcyBmYWlsdXJlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcg UnVudGltZUV4Y2VwdGlvbigiaHV1cHMhIik7CiAgICAgICAgICAgICAgICAvLyBzZWFyY2hlci5j bG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogKi8KICAgICAgICBzeW5jaHJvbml6ZWQg KHRoaXMpIHsKICAgICAgICAgICAgQ2hlY2tvdXRJbmZvIGluZm8gPSBzZWFyY2hlckluZm87CiAg ICAgICAgICAgIAogICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsIHx8IGluZm8uc2VhcmNoZXIg PT0gbnVsbCB8fCBzZWFyY2hlciAhPSBpbmZvLnNlYXJjaGVyKSAvLyB0aGlzIGlzbid0IHRoZSBp bmZvIHdlJ3JlIGxvb2tpbmcgZm9yCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluZm8g PSBvbGRTZWFyY2hlckluZm87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8gIT0g bnVsbCAmJiBpbmZvLnNlYXJjaGVyICE9IG51bGwpIC8vIGZvdW5kIGEgc2VhcmNoZXIKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgaWYgKGluZm8uY2hlY2tvdXRDb3VudCA+IDEpIC8vIHNl YXJjaGVyIGhhcyBvdGhlciByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICAgICAgaW5mby5jaGVja291dENvdW50LS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICBlbHNlIC8vIGxhc3QgcmVmZXJlbmNlIHRvIHNlYXJjaGVyCiAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50 VGhyZWFkKCkuZ2V0TmFtZSgpICsgIiByZWxlYXNlU2VhcmNoZXIoKSBsYXN0IHJlZmVyZW5jZTog Y2xvc2UiKTsKICAgICAgICAgICAgICAgICAgICBpbmZvLnNlYXJjaGVyLmdldFJlYWxTZWFyY2hl cigpLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgaW5mby5zZWFyY2hlciA9IG51bGw7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAvLyBjYW4ndCBm aW5kIHNlYXJjaGVyLCBqdXN0IGNsb3NlIGl0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IC8vIEkgdGhpbmsgdGhpcyBpcyBmYWlsdXJlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVu dGltZUV4Y2VwdGlvbigiaHV1cHMhIik7CiAgICAgICAgICAgICAgICAvLyBzZWFyY2hlci5jbG9z ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKiogZ2V0IGZvciBk ZWxldGluZyBkb2N1bWVudHMuCiAgICAgKiBibG9ja3M6IHdyaXRlcnMgdW50aWwgcmVsZWFzZWQK ICAgICAqLwogICAgcHVibGljIEluZGV4UmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2Vw dGlvbiB7CiAgICAgICAgSW5kZXhSZWFkZXIgcmVhZGVyID0gbnVsbDsKICAgICAgICAKICAgICAg ICBzeW5jaHJvbml6ZWQgKHRoaXMpIC8vIHN5bmMgb24gc3BlY2lmaWMgaW5kZXgKICAgICAgICB7 CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIENoZWNrb3V0SW5mbyBpbmZvID0KICAg ICAgICAgICAgICAgIChDaGVja291dEluZm8pV1JJVEVSX1BBVEhTLmdldChwYXRoKTsKICAgICAg ICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIC8vIG1heSBhbHJlYWR5IGhhdmUgYSByZWFkZXIs IHVzZSBpdAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLnJl YWRlciAhPSBudWxsKSAvLyB5dXAsIGhhdmUgYSByZWFkZXIKICAgICAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY2hlY2tvdXRDb3VudCsrOwogICAgICAgICAg ICAgICAgICAgICAgICByZWFkZXIgPSBpbmZvLnJlYWRlcjsKICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyBub3QgYSByZWFkZXIsIGl0IG11c3QgYmUgYSB3 cml0ZXIsIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCB0byB0cnkgYWdhaW4KICAgICAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbmZvLndhaXQoKTsgLy8gd2FpdCBmb3IgaW5mbyB0byBiZSByZWxlYXNlZAogICAg ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnRl cnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RP OiBXaWxsIHRoaXMgZXZlciBoYXBwZW4/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBy aW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7 CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIC8vIG5vIHJlYWRlciwgY3JlYXRlIG9uZQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IEluZGV4UmVhZGVy Lm9wZW4ocGF0aCk7CiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG5ldyBDaGVja291dEluZm8o cmVhZGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGls ZSAocmVhZGVyID09IG51bGwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhZGVyOwogICAg fQogICAgCiAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVhZGVyKEluZGV4UmVhZGVyIHJlYWRlcikg dGhyb3dzCiAgICBJT0V4Y2VwdGlvbiB7CiAgICAgICAgCiAgICAgICAgc3luY2hyb25pemVkICh0 aGlzKSB7CiAgICAgICAgICAgIENoZWNrb3V0SW5mbyBpbmZvID0gKENoZWNrb3V0SW5mbylXUklU RVJfUEFUSFMuZ2V0KHBhdGgpOwogICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIHJlYWRl ciA9PSBpbmZvLnJlYWRlcikgLy8gcmVhZGVyIHdhcyBjaGVja2VkICBvdXQKICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgaWYgKGluZm8uY2hlY2tvdXRDb3VudCA+IDEpIC8vIHJlYWRlciBo YXMgb3RoZXIgcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAg IGluZm8uY2hlY2tvdXRDb3VudC0tOwogICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG51bGw7 IC8vIGF2b2lkIGNsb3NlKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2Ug Ly8gbGFzdCByZWZlcmVuY2UgdG8gcmVhZGVyCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICAgICAgV1JJVEVSX1BBVEhTLnJlbW92ZShwYXRoKTsKICAgICAgICAgICAgICAgICAgICBy ZWFkZXIgPSBpbmZvLnJlYWRlcjsKICAgICAgICAgICAgICAgICAgICBpbmZvLm5vdGlmeSgpOyAv LyBub3RpZnkgd2FpdGVycyB0byB0cnkgYWdhaW4KICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgfQogICAgICAgIH0KICAgICAgICAvLyBjbG9zZSB0aGUgcmVhZGVyICh1bmxlc3MgaXQgc3Rp bGwgaGFzIGNoZWNrb3V0cykKICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHJlYWRlci5jbG9z ZSgpOwogICAgfQogICAgCiAgICAvKiogdXNlZCBmb3IgdXBkYXRlcyB0byBtYWtlIHN1cmUgbm9i b2R5IGVsc2UgZ3JhYnMgYQogICAgICogd3JpdGVyIG9yIHJlYWRlcgogICAgICogYmV0d2Vlbgog ICAgICogIHJlbGVhc2UgYW5kIGdldCBvcGVyYXRpb25zLgogICAgICovCiAgICBwdWJsaWMgSW5k ZXhXcml0ZXIgcmVsZWFzZVJlYWRlckFuZEdldFdyaXRlcihJbmRleFJlYWRlciByZWFkZXIpIHRo cm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgCiAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7 CiAgICAgICAgICAgIHJlbGVhc2VSZWFkZXIocmVhZGVyKTsKICAgICAgICAgICAgcmV0dXJuIGdl dFdyaXRlcigpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgCiAgICBwcml2YXRlIHN0YXRpYyBj bGFzcyBDaGVja291dEluZm8gewogICAgICAgIENoZWNrb3V0SW5mbyhJbmRleFdyaXRlciB3cml0 ZXIpIHsKICAgICAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CiAgICAgICAgfQogICAgICAg IENoZWNrb3V0SW5mbyhJbmRleFJlYWRlciByZWFkZXIpIHsKICAgICAgICAgICAgdGhpcy5yZWFk ZXIgPSByZWFkZXI7CiAgICAgICAgfQogICAgICAgIENoZWNrb3V0SW5mbyhNYW5hZ2VkU2VhcmNo ZXIgc2VhcmNoZXIpIHsKICAgICAgICAgICAgdGhpcy5zZWFyY2hlciA9IHNlYXJjaGVyOwogICAg ICAgICAgICB0aGlzLmNyZWF0aW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwog ICAgICAgIH0KICAgICAgICAKICAgICAgICBwdWJsaWMgSW5kZXhSZWFkZXIgcmVhZGVyOwogICAg ICAgIHB1YmxpYyBJbmRleFdyaXRlciB3cml0ZXI7CiAgICAgICAgcHVibGljIE1hbmFnZWRTZWFy Y2hlciBzZWFyY2hlcjsKICAgICAgICBwdWJsaWMgaW50IGNoZWNrb3V0Q291bnQgPSAxOwogICAg ICAgIHB1YmxpYyBsb25nIGNyZWF0aW9uVGltZTsKICAgIH0KICAgIAp9Cgo= ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: application/octet-stream; name="SearcherEvent.java" Content-Transfer-Encoding: base64 Content-Description: SearcherEvent.java Content-Disposition: attachment; filename="SearcherEvent.java" LyoKICogU2VyY2hlckV2ZW50LmphdmEKICoKICogQ3JlYXRlZCBvbiAyMDAyLiDhcHJpbGlzIDYu LCAyMzo0NQogKi8KCnBhY2thZ2UgaWFjOwoKLyoqCiAqIFRoaXMgaXMgYSBzaW1wbGUgZXZlbnQg b2JqZWN0LgogKiBAYXV0aG9yICBQZXRlciBIYWxhY3N5CiAqIEB2ZXJzaW9uIAogKi8KcHVibGlj IGNsYXNzIFNlYXJjaGVyRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgIHsKCiAg ICAvKiogQ3JlYXRlcyBuZXcgU2VyY2hlckV2ZW50ICovCiAgICBwdWJsaWMgU2VhcmNoZXJFdmVu dChPYmplY3Qgc291cmNlKSB7CiAgICAgICAgc3VwZXIoc291cmNlKTsKICAgIH0KCn0K ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: application/octet-stream; name="SearcherListener.java" Content-Transfer-Encoding: base64 Content-Description: SearcherListener.java Content-Disposition: attachment; filename="SearcherListener.java" LyoKICogU2VhcmNoZXJMaXN0ZW5lci5qYXZhCiAqCiAqIENyZWF0ZWQgb24gMjAwMi4g4XByaWxp cyA2LiwgMjM6NDIKICovCgpwYWNrYWdlIGlhYzsKCi8qKgogKiBMaXN0ZW5lciBpbnRlcmZhY2Ug Zm9yIHJlY2VpdmluZyBzZWFyY2hlciBldmVudHMgc2VudCBieSBhIE1hbmFnZWRTZWFyY2hlciBp bnN0YW5jZS4KICogQGF1dGhvciAgQWRtaW5pc3RyYXRvcgogKiBAdmVyc2lvbiAKICovCnB1Ymxp YyBpbnRlcmZhY2UgU2VhcmNoZXJMaXN0ZW5lciBleHRlbmRzIGphdmEudXRpbC5FdmVudExpc3Rl bmVyIHsKCiAgICBwdWJsaWMgdm9pZCBzZWFyY2hlckNsb3NlZChTZWFyY2hlckV2ZW50IGV2ZW50 KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKCn0K ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: application/octet-stream; name="TEST.java" Content-Transfer-Encoding: base64 Content-Description: TEST.java Content-Disposition: attachment; filename="TEST.java" LyoKICogVEVTVC5qYXZhCiAqCiAqIENyZWF0ZWQgb24gMjAwMi4g4XByaWxpcyA3LiwgMDoxOAog Ki8KCnBhY2thZ2UgaWFjOwppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLio7CmltcG9y dCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC4qOwovKioKICoKICogQGF1dGhvciAgUGV0ZXIgSGFs 4WNzeQogKiBAdmVyc2lvbgogKi8KcHVibGljIGNsYXNzIFRFU1QgewoKICAgIC8qKiBDcmVhdGVz IG5ldyBURVNUICovCiAgICBwdWJsaWMgVEVTVCgpIHsKICAgIH0KCiAgICAvKioKICAgICAqIEBw YXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBz dGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewoJCS8vIGtl ZXBpbmcgYSBzZWFyY2hlciBpbnN0YW5jZSBhbGl2ZSBjYXVzZXMgdGhhdCBJQUMgd29uJ3QKCQkv LyBjbG9zZSBTZWFyY2hlciAtLT4gbW9yZSBmYXN0ZXIKICAgICAgICBTZWFyY2hlciBzID0gSW5k ZXhBY2Nlc3NDb250cm9sLmdldEluc3RhbmNlKCJjOlxcdGVtcFxcaW5kZXhcXG1lc3NhZ2VzIiku Z2V0U2VhcmNoZXIoKTsKICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWls bGlzKCk7CiAgICAgICAgSW5kZXhBY2Nlc3NDb250cm9sIGlhYyA9IEluZGV4QWNjZXNzQ29udHJv bC5nZXRJbnN0YW5jZSgiYzpcXHRlbXBcXGluZGV4XFxtZXNzYWdlcyIpOwogICAgICAgIGZvcihp bnQgaSA9IDA7IGk8IDEwMDsgaSsrKXsKICAgICAgICAgICBTZWFyY2hlciBzZWFyY2hlciA9IGlh Yy5nZXRTZWFyY2hlcigpOwogICAgICAgICAgIC8vIFNlYXJjaGVyIHNlYXJjaGVyID0gbmV3IElu ZGV4U2VhcmNoZXIoImM6XFx0ZW1wXFxpbmRleFxcbWVzc2FnZXMiKTsKICAgICAgICAgICBIaXRz IGhpdHMgPSBzZWFyY2hlci5zZWFyY2gobmV3IFRlcm1RdWVyeShuZXcgVGVybSgidGV4dCIsICJn b29nbGUiKSkpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIiArIGhpdHMubGVuZ3Ro KCkpOwogICAgICAgICAgICBzZWFyY2hlci5jbG9zZSgpOwogICAgICAgIH0KCiAgICAgICAgU3lz dGVtLm91dC5wcmludGxuKChmbG9hdCkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFy dCkgLyAoZmxvYXQpIDEwMCk7CiAgICAgICAgcy5jbG9zZSgpOwoKICAgIH0KCn0K ------_=_NextPart_001_01C1DFC2.BE9CD5F7 Content-Type: text/plain; charset=us-ascii -- To unsubscribe, e-mail: For additional commands, e-mail: ------_=_NextPart_001_01C1DFC2.BE9CD5F7--