Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 70726 invoked from network); 21 Jun 2007 19:07:43 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 21 Jun 2007 19:07:43 -0000 Received: (qmail 12401 invoked by uid 500); 21 Jun 2007 19:07:47 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 12184 invoked by uid 500); 21 Jun 2007 19:07:46 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 12175 invoked by uid 99); 21 Jun 2007 19:07:46 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 21 Jun 2007 12:07:46 -0700 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE X-Spam-Check-By: apache.org Received-SPF: pass (herse.apache.org: local policy) Received: from [69.1.66.169] (HELO justcheckin.actuate.com) (69.1.66.169) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 21 Jun 2007 12:07:41 -0700 Received: from exchange8.actuate.com (Not Verified[192.168.3.4]) by justcheckin.actuate.com with MailMarshal (v6,2,0,2977) id ; Thu, 21 Jun 2007 12:07:20 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C7B437.64AAD70F" Subject: Thread safeness using EmbeddedDriver Date: Thu, 21 Jun 2007 12:07:17 -0700 Message-ID: <71F491F5DA99604A80DE49424BF3D02B011D6E17@exchange8.actuate.com> X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: Thread safeness using EmbeddedDriver Thread-Index: Ace0N2LDCoxcDrN1ROWm8zvYH9nD+Q== From: "Jeffrey Clary" To: X-Virus-Checked: Checked by ClamAV on apache.org This is a multi-part message in MIME format. ------_=_NextPart_001_01C7B437.64AAD70F Content-Type: multipart/alternative; boundary="----_=_NextPart_002_01C7B437.64AAD70F" ------_=_NextPart_002_01C7B437.64AAD70F Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Folks, =20 I've run onto what looks like a Derby multithreading bug, but before submitting it to JIRA I thought I'd give this list a chance to comment. I did a keyword search, but it is possible that this has been reported or is commonly known. Is the EmbeddedDriver even expected to be thread safe? =20 I've attached a short test program that displays the error for me. It creates a test database with a table, and a view onto that table. Then it creates N threads, each of which repeatedly (M times) create and drop a view onto the previously created view. Each thread has its own view name to create and drop, so they are not contending for that view. But all the created/dropped views depend on the same underlying view. =20 When the error happens, it is a NullPointerException in org.apache.derby.iapi.sql.dictionary.TableDescriptor.getObjectName. An instance member named referencedColumnMap is checked for null at the top of the method, but later when it is dereferenced it is null, because it was set to null by another thread. I am not sure what getObjectName is used for other than error reporting. I have considered a fix of just saving the non-null reference as a method variable, to avoid the later NullPointerException. But I don't know what unintended consequences this may have. =20 =20 We tried synchronizing the getObjectName and the setReferencedColumnMap methods, but this tanked performance in our application. =20 I have successfully seen the error with N=3D100 and M=3D100, on a = dual-core 3GHz Pentium machine running Windows Vista Business, using JDK 1.4.2_13 and Derby trunk revision 548822. Sometimes I have to run the program several times before I see the error. =20 =20 I'd appreciate any insight before I officially report this as a bug. =20 Thanks, Jeff Clary =20 ------_=_NextPart_002_01C7B437.64AAD70F Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Folks,

 

I’ve run onto what looks like a Derby = multithreading bug, but before submitting it to JIRA I thought I’d give this list = a chance to comment.  I did a keyword search, but it is possible that = this has been reported or is commonly known.  Is the EmbeddedDriver even expected to be thread safe?

 

I’ve attached a short test program that = displays the error for me.  It creates a test database with a table, and a view = onto that table.  Then it creates N threads, each of which repeatedly (M = times) create and drop a view onto the previously created view.  Each = thread has its own view name to create and drop, so they are not contending for = that view.  But all the created/dropped views depend on the same = underlying view.

 

When the error happens, it is a = NullPointerException in = org.apache.derby.iapi.sql.dictionary.TableDescriptor.getObjectName. = An instance member named referencedColumnMap is checked for null at the = top of the method, but later when it is dereferenced it is null, because it was = set to null by another thread.  I am not sure what getObjectName is used = for other than error reporting.  I have considered a fix of just saving = the non-null reference as a method variable, to avoid the later NullPointerException.   But I don’t know what unintended = consequences this may have. 

 

We tried synchronizing the getObjectName and the = setReferencedColumnMap methods, but this tanked performance in our application.

 

I have successfully seen the error with N=3D100 and = M=3D100, on a dual-core 3GHz Pentium machine running Windows Vista Business, using = JDK 1.4.2_13 and Derby trunk revision 548822.  Sometimes I have to run = the program several times before I see the error. 

 

I’d appreciate any insight before I = officially report this as a bug.

 

Thanks,

Jeff Clary

 

------_=_NextPart_002_01C7B437.64AAD70F-- ------_=_NextPart_001_01C7B437.64AAD70F Content-Type: application/octet-stream; name="TestEmbeddedMultiThreading.java" Content-Transfer-Encoding: base64 Content-Description: TestEmbeddedMultiThreading.java Content-Disposition: attachment; filename="TestEmbeddedMultiThreading.java" LyoqDQogKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSB0aHJlYWQtc2FmZW5lc3Mgb2YgdGhlIERlcmJ5 IGRhdGFiYXNlIHN5c3RlbSwgdXNpbmcgdGhlIGVtYmVkZGVkIGRyaXZlci4gIFdpdGggdGhlDQog KiBwcm9wZXIgY2hvaWNlIG9mIG1haW4gYXJndW1lbnRzLCB3aGljaCBhcmUgcHJvYmFibHkgZGlm ZmVyZW50IGZvciBkaWZmZXJlbnQgbWFjaGluZXMsIGl0IHdpbGwgc29tZXRpbWVzIHNob3cgYW4N CiAqIFNRTEV4Y2VwdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0IGZyb20gcHJpbnRTdGFj a1RyYWNlKCkuICBJdCBtYXkgbmVlZCB0byBiZSBydW4gbW9yZSB0aGFuIG9uY2UsIGFzIGhhdmlu Zw0KICogbGVmdG92ZXIgdmlld3MgZXhpc3RpbmcgZnJvbSBwcmlvciBydW5zIHNvbWV0aW1lcyBz ZWVtcyB0byBoYXZlIGFuIGVmZmVjdC4NCiAqICANCiAqIDxwcmU+DQogKiBqYXZhLmxhbmcuTnVs bFBvaW50ZXJFeGNlcHRpb24NCiAqICAgICBhdCBvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3FsLmRp Y3Rpb25hcnkuVGFibGVEZXNjcmlwdG9yLmdldE9iamVjdE5hbWUoVGFibGVEZXNjcmlwdG9yLmph dmE6NzU4KQ0KICogICAgYXQgb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5kZXBlbmQuQmFzaWNE ZXBlbmRlbmN5TWFuYWdlci5nZXRQZXJzaXN0ZW50UHJvdmlkZXJJbmZvcyhCYXNpY0RlcGVuZGVu Y3lNYW5hZ2VyLmphdmE6Njc3KQ0KICogICAgIGF0IG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwu Y29tcGlsZS5DcmVhdGVWaWV3Tm9kZS5iaW5kVmlld0RlZmluaXRpb24oQ3JlYXRlVmlld05vZGUu amF2YToyODcpDQogKiAgICAgYXQgb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5jb21waWxlLkNy ZWF0ZVZpZXdOb2RlLmJpbmQoQ3JlYXRlVmlld05vZGUuamF2YToxODMpDQogKiAgICAgYXQgb3Jn LmFwYWNoZS5kZXJieS5pbXBsLnNxbC5HZW5lcmljU3RhdGVtZW50LnByZXBNaW5pb24oR2VuZXJp Y1N0YXRlbWVudC5qYXZhOjM0NSkNCiAqICAgICBhdCBvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3Fs LkdlbmVyaWNTdGF0ZW1lbnQucHJlcGFyZShHZW5lcmljU3RhdGVtZW50LmphdmE6MTE5KQ0KICog ICAgIGF0IG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwuY29ubi5HZW5lcmljTGFuZ3VhZ2VDb25u ZWN0aW9uQ29udGV4dC5wcmVwYXJlSW50ZXJuYWxTdGF0ZW1lbnQoR2VuZXJpY0xhbmd1YWdlQ29u bmVjdGlvbkNvbnRleHQuamF2YTo3NDUpDQogKiAgICAgYXQgb3JnLmFwYWNoZS5kZXJieS5pbXBs LmpkYmMuRW1iZWRTdGF0ZW1lbnQuZXhlY3V0ZShFbWJlZFN0YXRlbWVudC5qYXZhOjU2OCkNCiAq ICAgICBhdCBvcmcuYXBhY2hlLmRlcmJ5LmltcGwuamRiYy5FbWJlZFN0YXRlbWVudC5leGVjdXRl KEVtYmVkU3RhdGVtZW50LmphdmE6NTE3KQ0KICogICAgIGF0IFRlc3RFbWJlZGRlZE11bHRpVGhy ZWFkaW5nLmV4ZWN1dGVTdGF0ZW1lbnQoVGVzdEVtYmVkZGVkTXVsdGlUaHJlYWRpbmcuamF2YTox MDkpDQogKiAgICAgYXQgVGVzdEVtYmVkZGVkTXVsdGlUaHJlYWRpbmcuYWNjZXNzJDEwMChUZXN0 RW1iZWRkZWRNdWx0aVRocmVhZGluZy5qYXZhOjEwKQ0KICogICAgIGF0IFRlc3RFbWJlZGRlZE11 bHRpVGhyZWFkaW5nJFZpZXdDcmVhdG9yRHJvcHBlci5ydW4oVGVzdEVtYmVkZGVkTXVsdGlUaHJl YWRpbmcuamF2YToxNzMpDQogKiAgICAgYXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmph dmE6NTM0KQ0KICogU3RvcCBoZXJlLg0KICogPC9wcmU+DQogKi8NCnB1YmxpYyBjbGFzcyBUZXN0 RW1iZWRkZWRNdWx0aVRocmVhZGluZw0Kew0KICAgIC8qKg0KICAgICAqIEludm9rZSB0aGUgdGVz dCwgcHJvdmlkaW5nIGEgbnVtYmVyIG9mIHRocmVhZHMgYW5kIGEgbnVtYmVyIG9mIGl0ZXJhdGlv bnMuDQogICAgICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiwgbXVzdCBi ZSB0d28gaW50ZWdlcnM6IG51bWJlciBvZiB0aHJlYWQgYW5kIG51bWJlciBvZiBpdGVyYXRpb25z DQogICAgICovDQogICAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykNCiAg ICB7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICBUZXN0RW1iZWRkZWRNdWx0 aVRocmVhZGluZyBpbnN0YW5jZSA9IG5ldyBUZXN0RW1iZWRkZWRNdWx0aVRocmVhZGluZygpOw0K DQogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKQ0KICAgICAgICAgICAgew0KICAgICAg ICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IG1haW4gTlVNQkVSX09GX1RIUkVB RFMgTlVNQkVSX09GX0lURVJBVElPTlMiKTsNCiAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgt MSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpbnN0YW5jZS5kb2l0KEludGVnZXIucGFy c2VJbnQoYXJnc1swXSksIEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSkpOw0KICAgICAgICB9DQog ICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCiAgICAgICAgew0KICAgICAgICAgICAgZS5wcmlu dFN0YWNrVHJhY2UoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0 ZXMgdGhlIHRlc3Qgb2JqZWN0LCByZWdpc3RlcmluZyB0aGUgRGVyYnkgZW1iZWRkZWQgZHJpdmVy LiAgSWYgdGhlIHRlc3QgZGF0YWJhc2UgZG9lcyBub3QgYWxyZWFkeSBleGlzdHMsDQogICAgICog Y3JlYXRlcyB0aGF0IERlcmJ5IGRhdGFiYXNlLg0KICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3Vu ZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGRyaXZlciBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQs IHByb2JhYmx5IGR1ZSB0byBjbGFzc3BhdGggcHJvYmxlbXMNCiAgICAgKi8NCiAgICBwcml2YXRl IFRlc3RFbWJlZGRlZE11bHRpVGhyZWFkaW5nKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRp b24NCiAgICB7DQogICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5F bWJlZGRlZERyaXZlciIpOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICBq YXZhLnNxbC5Ecml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oImpkYmM6ZGVyYnk6TVRURVNUREI7 Y3JlYXRlPXRydWUiKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoamF2YS5zcWwuU1FMRXhj ZXB0aW9uIGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhj ZXB0aW9uIGNyZWF0aW5nIGRhdGFiYXNlLi4uYXNzdW1pbmcgYWxyZWFkeSBleGlzdHMiKTsNCiAg ICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJ1bnMgdGhlIHRocmVhZC1zYWZlbmVz cyB0ZXN0Lg0KICAgICAqIEBwYXJhbSBudW1UaHJlYWRzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0 byBzcGF3biBmb3IgdGhlIHRlc3QNCiAgICAgKiBAcGFyYW0gbnVtSXRlcmF0aW9ucyB0aGUgbnVt YmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuIGVhY2ggdGhyZWFkDQogICAgICogQHRocm93cyBqYXZh LnNxbC5TUUxFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGFuIFNRTCBlcnJvciBzZXR0aW5n IHVwIHRoZSB0ZXN0DQogICAgICovDQogICAgcHJpdmF0ZSB2b2lkIGRvaXQoaW50IG51bVRocmVh ZHMsIGludCBudW1JdGVyYXRpb25zKSB0aHJvd3MgamF2YS5zcWwuU1FMRXhjZXB0aW9uDQogICAg ew0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgZXhlY3V0ZVN0YXRlbWVudChn ZXRDb25uZWN0aW9uKCksICJDUkVBVEUgVEFCTEUgc2NoZW1hbWFpbi5TT1VSQ0VUQUJMRSAoY29s MSBpbnQsIGNvbDIgY2hhcigxMCksIGNvbDMgdmFyY2hhcigyMCksIGNvbDQgZGVjaW1hbCgxMCw1 KSkiKTsNCiAgICAgICAgICAgIGV4ZWN1dGVTdGF0ZW1lbnQoZ2V0Q29ubmVjdGlvbigpLCAiQ1JF QVRFIFZJRVcgdmlld1NvdXJjZSBBUyBTRUxFQ1QgY29sMSwgY29sMiBGUk9NIHNjaGVtYW1haW4u U09VUkNFVEFCTEUiKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoamF2YS5zcWwuU1FMRXhj ZXB0aW9uIGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEp1c3QgcmVwb3J0IHRoaXMuLi5w cm9iYWJseSB0aGUgdGFibGUgb3IgdmlldyBhbHJlYWR5IGV4aXN0cw0KICAgICAgICAgICAgU3lz dGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIFRo cmVhZFtdIHRocmVhZHMgPSBuZXcgVGhyZWFkW251bVRocmVhZHNdOw0KICAgICAgICBmb3IgKGlu dCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhy ZWFkc1tpXSA9IG5ldyBUaHJlYWQobmV3IFZpZXdDcmVhdG9yRHJvcHBlcigic2NoZW1hMS5WSUVX IiArIGksICJ2aWV3U291cmNlIiwgIioiLCBudW1JdGVyYXRpb25zKSk7DQogICAgICAgIH0NCiAg ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspDQogICAgICAgIHsNCiAg ICAgICAgICAgIHRocmVhZHNbaV0uc3RhcnQoKTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAg LyoqDQogICAgICogIFJldHVybnMgYSBuZXcgY29ubmVjdGlvbiB0byB0aGUgdGVzdCBkYXRhYmFz ZQ0KICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGUgY29ubmVjdGlvbg0KICAgICAqIEB0aHJv d3MgamF2YS5zcWwuU1FMRXhjZXB0aW9uIHRocm93biBpZiB0aGUgY29ubmVjdGlvbiBjYW5ub3Qg YmUgY3JlYXRlZA0KICAgICAqLw0KICAgIHByaXZhdGUgamF2YS5zcWwuQ29ubmVjdGlvbiBnZXRD b25uZWN0aW9uKCkgdGhyb3dzIGphdmEuc3FsLlNRTEV4Y2VwdGlvbg0KICAgIHsNCiAgICAgICAg cmV0dXJuIGphdmEuc3FsLkRyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbigiamRiYzpkZXJieTpN VFRFU1REQiIpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZXMgYW5kIGV4ZWN1dGVz IGEgbmV3IFNRTCBzdGF0ZW1lbnQgb24gdGhlIGNvbm5lY3Rpb24sIGVuc3VyaW5nIHRoYXQgdGhl IHN0YXRlbWVudCBpcyBjbG9zZWQsIHJlZ2FyZGxlc3MNCiAgICAgKiBvZiB3aGV0aGVyIHRoZSBz dGF0ZW1lbnQgZXhlY3V0aW9uIHRocm93cyBhbiBleGNlcHRpb24NCiAgICAgKiBAcGFyYW0gY29u biB0aGUgY29ubmVjdGlvbiBhZ2FpbnN0IHdoaWNoIHRvIHJ1biB0aGUgc3RhdGVtZW50DQogICAg ICogQHBhcmFtIHNxbCB0aGUgU1FMIHRvIGV4ZWN1dGUNCiAgICAgKiBAdGhyb3dzIGphdmEuc3Fs LlNRTEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW55IFNRTCBlcnJvciBleGVjdXRpbmcg dGhlIHN0YXRlbWVudCAob3IgY3JlYXRpbmcgaXQpDQogICAgICovDQogICAgcHJpdmF0ZSB2b2lk IGV4ZWN1dGVTdGF0ZW1lbnQoamF2YS5zcWwuQ29ubmVjdGlvbiBjb25uLCBTdHJpbmcgc3FsKSB0 aHJvd3MgamF2YS5zcWwuU1FMRXhjZXB0aW9uDQogICAgew0KICAgICAgICAvL1N5c3RlbS5vdXQu cHJpbnRsbigiIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIGV4ZWN1dGluZyAiICsgc3Fs KTsNCiAgICAgICAgamF2YS5zcWwuU3RhdGVtZW50IHN0bXQgPSBudWxsOw0KICAgICAgICB0cnkN CiAgICAgICAgew0KICAgICAgICAgICAgc3RtdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7DQog ICAgICAgICAgICBzdG10LmV4ZWN1dGUoc3FsKTsNCiAgICAgICAgfQ0KICAgICAgICBmaW5hbGx5 DQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpDQogICAgICAgICAgICB7 DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAg ICAgICBzdG10LmNsb3NlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNh dGNoIChqYXZhLnNxbC5TUUxFeGNlcHRpb24gZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAg ICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWF0aW5nIGNsb3NlKCkgZXhjZXB0aW9u OiAiICsgZS5nZXRNZXNzYWdlKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0N CiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50 cyBhIHJ1biBwcm9jZWR1cmUgdG8gcmVwZWF0ZWRseSBjcmVhdGUgYW5kIGRyb3AgYSBEZXJieSB2 aWV3LiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgcnVuDQogICAgICogb24gYSB0aHJlYWQgdG8gdGVz dCB3aGV0aGVyIGl0IGlzIHRocmVhZC1zYWZlIGluIGRlcmJ5IHRvIGJlIGNvbmN1cnJlbnRseSBj cmVhdGluZyBhbmQgZHJvcHBpbmcgdmlld3MgdGhhdA0KICAgICAqIHJlZmVyZW5jZSB0aGUgc2Ft ZQ0KICAgICAqIHVuZGVybHlpbmcgZGF0YWJhc2Ugb2JqZWN0Lg0KICAgICAqLw0KICAgIHByaXZh dGUgY2xhc3MgVmlld0NyZWF0b3JEcm9wcGVyIGltcGxlbWVudHMgUnVubmFibGUNCiAgICB7DQog ICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgdmlldyB0byBjcmVhdGUgYW5kIGRyb3AgKi8NCiAg ICAgICAgU3RyaW5nIG1fdmlld05hbWU7DQogICAgICAgIC8qKiBUaGUgc291cmNlICh2aWV3KSBy ZWZlcmVuY2VkIGJ5IHRoZSBjcmVhdGVkIHZpZXcgKi8NCiAgICAgICAgU3RyaW5nIG1fc291cmNl TmFtZTsNCiAgICAgICAgLyoqIFRoZSBTUUwgZnJhZ21lbnQgc3BlY2lmeWluZyB0aGUgY29sdW1u cyB0byBpbmNsdWRlZCBpbiB0aGUgY3JlYXRlZCB2aWV3ICovDQogICAgICAgIFN0cmluZyBtX2Nv bHVtbnM7DQogICAgICAgIC8qKiBIb3cgbWFueSB0aW1lcyB0byBjcmVhdGUvZHJvcCB0aGUgdmll dyAqLw0KICAgICAgICBpbnQgbV9pdGVyYXRpb25zOw0KDQogICAgICAgIC8qKg0KICAgICAgICAg KiBDb25zdHJ1Y3RzIHRoZSBydW5uYWJsZSBvYmplY3QgZm9yIHRoZSB0ZXN0Lg0KICAgICAgICAg KiBAcGFyYW0gdmlld05hbWUgdGhlIG5hbWUgb2YgdGhlIHZpZXcgdG8gY3JlYXRlIGFuZCBkcm9w DQogICAgICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBzb3VyY2UgKHZpZXcpIHJlZmVyZW5j ZWQgYnkgdGhlIGNyZWF0ZWQgdmlldw0KICAgICAgICAgKiBAcGFyYW0gY29sdW1ucyB0aGUgU1FM IGZyYWdtZW50IHNwZWNpZnlpbmcgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZWQgaW4gdGhlIGNyZWF0 ZWQgdmlldw0KICAgICAgICAgKiBAcGFyYW0gaXRlcmF0aW9ucyBob3cgbWFueSB0aW1lcyB0byBj cmVhdGUvZHJvcCB0aGUgdmlldw0KICAgICAgICAgKiBAdGhyb3dzIGphdmEuc3FsLlNRTEV4Y2Vw dGlvbg0KICAgICAgICAgKi8NCiAgICAgICAgcHVibGljIFZpZXdDcmVhdG9yRHJvcHBlcihTdHJp bmcgdmlld05hbWUsIFN0cmluZyBzb3VyY2VOYW1lLCBTdHJpbmcgY29sdW1ucywgaW50IGl0ZXJh dGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIG1fdmlld05hbWUgPSB2aWV3TmFtZTsNCiAg ICAgICAgICAgIG1fc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7DQogICAgICAgICAgICBtX2NvbHVt bnMgPSBjb2x1bW5zOw0KICAgICAgICAgICAgbV9pdGVyYXRpb25zID0gaXRlcmF0aW9uczsNCiAg ICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBAc2VlIFRocmVhZCNydW4oKQ0KICAg ICAgICAgKi8NCiAgICAgICAgcHVibGljIHZvaWQgcnVuKCkNCiAgICAgICAgew0KICAgICAgICAg ICAgaW50IGkgPSAwOw0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAg ICAgICAgamF2YS5zcWwuQ29ubmVjdGlvbiBjb25uID0gZ2V0Q29ubmVjdGlvbigpOw0KICAgICAg ICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2l0ZXJhdGlvbnM7IGkrKykNCiAgICAgICAgICAg ICAgICB7DQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBjb25uICE9IG51bGw7DQogICAgICAg ICAgICAgICAgICAgIC8vaWYgKGkgJSA1ID09IDApIFN5c3RlbS5vdXQucHJpbnRsbigiICgiICsg VGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgaXRlcmF0aW9uICIgKyBpICsgIikgIik7DQogICAg ICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGF0ZW1lbnQoY29ubiwgIkNSRUFURSBWSUVXICIgKyBt X3ZpZXdOYW1lICsgIiBBUyBTRUxFQ1QgIiArIG1fY29sdW1ucyArICIgRlJPTSAiICsgbV9zb3Vy Y2VOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0YXRlbWVudChjb25uLCAiRFJP UCBWSUVXICIgKyBtX3ZpZXdOYW1lKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9 DQogICAgICAgICAgICBjYXRjaCAoamF2YS5zcWwuU1FMRXhjZXB0aW9uIGUpDQogICAgICAgICAg ICB7DQogICAgICAgICAgICAgICAgLy8gR3JhYiB1cCBhbGwgdGhlIGVycm9yIG1lc3NhZ2UgaW4g b25lIHN0cmluZywgdG8gZ3VhcmQgYWdhaW5zdCBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgdGhyZWFk cyBiZWluZw0KICAgICAgICAgICAgICAgIC8vIGludGVybGVhdmVkIGluIHRoZSBjb25zb2xlLiAg KFRoYXQgbWlnaHQgaGFwcGVuIGFueXdheSwgYnV0IHNvIGl0IGdvZXMuKQ0KICAgICAgICAgICAg ICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBqYXZhLmlvLkJ5dGVB cnJheU91dHB1dFN0cmVhbSgpOw0KICAgICAgICAgICAgICAgIGphdmEuaW8uUHJpbnRTdHJlYW0g cCA9IG5ldyBqYXZhLmlvLlByaW50U3RyZWFtKGJvcyk7DQogICAgICAgICAgICAgICAgLy9wLnBy aW50bG4oIiIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBleGNlcHRpb24gYWZ0ZXIgIiAr IGkgKyAiaXRlcmF0aW9uczoiKTsNCiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShw KTsNCiAgICAgICAgICAgICAgICBwLmZsdXNoKCk7DQoNCiAgICAgICAgICAgICAgICBTdHJpbmcg bXNnID0gYm9zLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCht c2cpOw0KDQogICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoZSBleGNlcHRpb24gd2Ugd2Vy ZSB0ZXN0aW5nIGZvciwganVzdCBxdWl0Lg0KICAgICAgICAgICAgICAgIGlmIChtc2cuc3RhcnRz V2l0aCgiamF2YS5sYW5nLk51bGxQIikpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3AgaGVyZS4iKTsNCiAgICAgICAgICAgICAg ICAgICAgU3lzdGVtLmV4aXQoLTEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0N CiAgICAgICAgfQ0KICAgIH0NCn0NCg== ------_=_NextPart_001_01C7B437.64AAD70F--