|
From: <jue...@we...> - 2003-10-10 17:08:03
|
Rm9ydHVuYXRlbHksIHRoaXMgKmlzKiBhdmFpbGFibGUgZm9yIFhtbEJlYW5GYWN0b3J5IHRvbywg bGlrZSBhcyBmb2xsb3dzIC0tIA0Kd2l0aCB0aGUgdmVyeSBzYW1lIEFQSSB0aGF0IFhtbFdlYkFw cGxpY2F0aW9uQ29udGV4dCBpbnRlcm5hbGx5IHVzZXMgdG8gbG9hZCBtdWx0aXBsZSBmaWxlcy4N CiANCiAgWG1sQmVhbkZhY3RvcnkgYmYgPSBuZXcgWG1sQmVhbkZhY3RvcnkoKTsNCiAgYmYubG9h ZEJlYW5EZWZpbml0aW9ucygiYXBwQ3R4MS54bWwiKTsNCiAgYmYubG9hZEJlYW5EZWZpbml0aW9u cygiYXBwQ3R4MS54bWwiKTsNCiAgYmYucHJlSW5zdGFudGlhdGVTaW5nbGV0b25zKCk7DQogDQpJ dCdzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlIGluIEZpbGVTeXN0ZW1YbWxBcHBsaWNhdGlvbkNv bnRleHQgdGhvdWdoLCBtYWlubHkgdG8gbm90IHBsYWNlIGFueSByZXN0cmljdGlvbnMgb24gZmls ZSBuYW1lcyBpbiB0ZXJtcyBvZiBzcGFjZXMgb3IgY29tbWFzLiBGaWxlU3lzdGVtWG1sQXBwbGlj YXRpb25Db250ZXh0IGFscmVhZHkgaGFzIGEgY29uc3RydWN0b3Igd2l0aCBhIFN0cmluZyBhcnJh eSwgZm9yIGF1dG9tYXRpY2FsbHkgc2V0dGluZyB1cCAqbmVzdGVkKiBjb250ZXh0cy4gV2UgY291 bGQgcmVkZWZpbmUgdGhhdCBjb25zdHJ1Y3RvciB0byBzcGVjaWZ5IG11bHRpcGxlIGZpbGVzIHRo YXQgbWFrZSB1cCBhICpzaW5nbGUqIGNvbnRleHQsIGFuZCBvZmZlciBhbiBvdmVybG9hZGVkIHZl cnNpb24gdGhhdCB0YWtlcyBhIHBhcmVudCBBcHBsaWNhdGlvbkNvbnRleHQgcmVmZXJlbmNlLiBU aGF0IHdheSwgYm90aCBtdWx0aXBsZSBmaWxlcyBmb3IgYSBzaW5nbGUgY29udGV4dCBhbmQgbmVz dGluZyB3b3VsZCBiZSBwb3NzaWJsZS4NCiANCi0tLS0tDQogDQpXaGF0IEknbSBtb3N0IGV4Y2l0 ZWQgYWJvdXQgaXMgdGhlIEJlYW5Qb3N0UHJvY2Vzc29yIGhvb2suIEkgZXhwZWN0IHRoYXQgdG8g YmUgdmVyeSBwb3dlcmZ1bCwgYXMgYWxyZWFkeSBpbmRpY2F0ZWQgYnkgdGhlIHJlc3BlY3RpdmUg dGVzdCBjYXNlIGluIFN0YXRpY0FwcGxpY2F0aW9uQ29udGV4dFN1aXRlLiBBbm90aGVyIGV4YW1w bGUgdGhhdCBJJ3ZlIHByb3RvdHlwZWQgaXMgdGhlIGZvbGxvd2luZyAobm90IHlldCBpbiBDVlMp Og0KcHVibGljIGNsYXNzIEF1dG9Qcm94eUNyZWF0b3IgaW1wbGVtZW50cyBCZWFuUG9zdFByb2Nl c3NvciB7DQogIHByaXZhdGUgTGlzdCBiZWFuTmFtZXM7DQogIHByaXZhdGUgSW50ZXJjZXB0b3Jb XSBpbnRlcmNlcHRvcnM7DQoNCiAgcHVibGljIHZvaWQgc2V0QmVhbk5hbWVzKFN0cmluZ1tdIGJl YW5OYW1lcykgew0KICAgIHRoaXMuYmVhbk5hbWVzID0gQXJyYXlzLmFzTGlzdChiZWFuTmFtZXMp Ow0KICB9DQoNCiAgcHVibGljIHZvaWQgc2V0SW50ZXJjZXB0b3JzKEludGVyY2VwdG9yW10gaW50 ZXJjZXB0b3JzKSB7DQogICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRvcnM7DQogIH0N Cg0KICBwdWJsaWMgT2JqZWN0IHBvc3RQcm9jZXNzQmVhbihPYmplY3QgYmVhbiwgU3RyaW5nIG5h bWUsIFJvb3RCZWFuRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7DQogICAgaWYgKHRoaXMuYmVhbk5h bWVzICE9IG51bGwgJiYgdGhpcy5iZWFuTmFtZXMuY29udGFpbnMobmFtZSkpIHsNCiAgICAgIFBy b3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSBuZXcgUHJveHlGYWN0b3J5KCk7DQogICAgICBmb3Ig KGludCBpID0gMDsgaSA8IHRoaXMuaW50ZXJjZXB0b3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAg IHByb3h5RmFjdG9yeS5hZGRJbnRlcmNlcHRvcih0aGlzLmludGVyY2VwdG9yc1tpXSk7DQogICAg ICB9DQogICAgICBwcm94eUZhY3RvcnkuYWRkSW50ZXJjZXB0b3IobmV3IEludm9rZXJJbnRlcmNl cHRvcihiZWFuKSk7DQogICAgICByZXR1cm4gcHJveHlGYWN0b3J5LmdldFByb3h5KCk7DQogICAg fQ0KICAgIGVsc2Ugew0KICAgICAgcmV0dXJuIGJlYW47DQogICAgfQ0KICB9DQp9DQoNClRoaXMg aXMgYSBCZWFuUG9zdFByb2Nlc3NvciBiZWFuIHRoYXQgY2FuIGJlIHNldCB1cCBhcyBmb2xsb3dz IHRvIHByb3h5IHRoZSBiZWFucyB3aXRoIHRoZSBnaXZlbiBuYW1lcyB3aXRoIHRoZSBnaXZlbiBp bnRlcmNlcHRvcnMuIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgb25lIGJlYW4gd2l0aCBwcm94eSBz ZXR0aW5ncyB0byBkZWZpbmUsIGFsdGhvdWdoIHRoZXJlIG1pZ2h0IGJlIGRvemVucyBvZiB0YXJn ZXQgYmVhbnMgd2l0aCB0aGUgc2FtZSBwcm94eSBiZWhhdmlvci4NCg0KPGJlYW4gaWQ9ImF1dG9Q cm94eUNyZWF0b3IiIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC5mcmFtZXdvcmsuc3Vw cG9ydC5BdXRvUHJveHlDcmVhdG9yIj4NCiAgPHByb3BlcnR5IG5hbWU9ImJlYW5OYW1lcyI+PHZh bHVlPm15QmVhbjEsbXlCZWFuMixteUJlYW4zPC92YWx1ZT48L3Byb3BlcnR5Pg0KICA8cHJvcGVy dHkgbmFtZT0iaW50ZXJjZXB0b3JzPg0KICAgIDxsaXN0Pg0KICAgICAgPHJlZiBiZWFuPSJteUlu dGVyY2VwdG9yMSIvPg0KICAgICAgPHJlZiBiZWFuPSJteUludGVyY2VwdG9yMiIvPg0KICAgIDwv bGlzdD4NCiAgPC9wcm9wZXJ0eT4NCjwvYmVhbj4NCg0KU28gc2V0dGluZyB1cCAxMCB0cmFuc2Fj dGlvbmFsIGJlYW5zIHdvdWxkIGp1c3QgaW52b2x2ZSAxIEF1dG9Qcm94eUNyZWF0b3IgYW5kIDEg dHJhbnNhY3Rpb24gaW50ZXJjZXB0b3IgcGx1cyB0aGUgMTAgdGFyZ2V0IGJlYW5zICgxMiBiZWFu cyBpbiB0b3RhbCksIGluc3RlYWQgb2YgMTAgVHJhbnNhY3Rpb25Qcm94eUZhY3RvcnlCZWFucyBw bHVzIHRoZSAxMCB0YXJnZXQgYmVhbnMgKDIwIGJlYW5zIGluIHRvdGFsKS4gVGhlIHRyYW5zYWN0 aW9uIGF0dHJpYnV0ZXMgd291bGQgYmUgY2VudHJhbGl6ZWQgdGhvdWdoLCBpbiBjb250cmFzdCB0 byBUcmFuc2FjdGlvblByb3h5RmFjdG9yeUJlYW4gdGhhdCBrZWVwcyB0aGVtIGxvY2FsIHBlciBp bmRpdmlkdWFsIHByb3h5IGRlZmluaXRpb24uDQogDQpPZiBjb3Vyc2UsIHNvdXJjZS1sZXZlbCBt ZXRhZGF0YSB3b3VsZCBhbGxvdyBmb3IganVzdCAxIEJlYW5Qb3N0UHJvY2Vzc29yIHBsdXMgdGhl IDEwIHRhcmdldCBiZWFucyAoMTEgYmVhbnMgaW4gdG90YWwpLCB3aXRoIHRoZSB0cmFuc2FjdGlv biBhdHRyaWJ1dGVzIGJlaW5nIGtlcHQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBtZXRob2RzIGluIHRo ZSBzb3VyY2UgY29kZS4gVGhpcyB3b3VsZCBqdXN0IGdldCByaWQgb2YgMSBiZWFuIGJ1dCBvZiBh IHByZXR0eSBibG9hdGVkIG9uZTogdGhlIFRyYW5zYWN0aW9uSW50ZXJjZXB0b3IgZGVmaW5pdGlv biB3aXRoIGl0cyBjZW50cmFsaXplZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciB0aGUgd2hv bGUgYXBwLg0KIA0KSnVlcmdlbg0KIA0KIA0KDQoJLS0tLS1VcnNwcsO8bmdsaWNoZSBOYWNocmlj aHQtLS0tLSANCglWb246IFJvZCBKb2huc29uIFttYWlsdG86cm9kLmpvaG5zb25AaW50ZXJmYWNl MjEuY29tXSANCglHZXNlbmRldDogRnIgMTAuMTAuMjAwMyAxNjo0MSANCglBbjogc3ByaW5nZnJh bWV3b3JrLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgDQoJQ2M6IA0KCUJldHJlZmY6 IFJlOiBbU3ByaW5nZnJhbWV3b3JrLWRldmVsb3Blcl0gbmV3IGJlYW4gZmFjdG9yeSBhbmQgYXBw bGljYXRpb24gY29udGV4dCBmZWF0dXJlcw0KCQ0KCQ0KDQoJSSB0aGluayB0aGlzIGlzIHZlcnkg dXNlZnVsLg0KCQ0KCUl0IHdvdWxkIGJlIGdvb2QgdG8gaGF2ZSB0aGlzIGF2YWlsYWJsZSBmb3Ig dGhlIFhtbEJlYW5GYWN0b3J5IGFzIHdlbGwuDQoJT2Z0ZW4sIGVzcGVjaWFsbHkgZm9yIGludGVn cmF0aW9uIHRlc3RpbmcsIEkgdGVuZCB0byB1c2UgYSBCZWFuRmFjdG9yeQ0KCXVubGVzcyBteSBj b2RlIGhhcyBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgb24gYW4gYXBwbGljYXRpb24gY29udGV4dCBm b3INCglzb3VyY2luZyBtZXNzYWdlcyBldGMuDQoJDQoJUmVnYXJkcywNCglSb2QNCgkNCgktLS0t LSBPcmlnaW5hbCBNZXNzYWdlIC0tLS0tDQoJRnJvbTogImrDvHJnZW4gaMO2bGxlciBbd2VyazNB VF0iIDxqdWVyZ2VuLmhvZWxsZXJAd2VyazNhdC5jb20+DQoJVG86IDxzcHJpbmdmcmFtZXdvcmst ZGV2ZWxvcGVyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4NCglTZW50OiBGcmlkYXksIE9jdG9iZXIg MTAsIDIwMDMgMzozMCBQTQ0KCVN1YmplY3Q6IFtTcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVyXSBu ZXcgYmVhbiBmYWN0b3J5IGFuZCBhcHBsaWNhdGlvbg0KCWNvbnRleHQgZmVhdHVyZXMNCgkNCgkN CglFdmVyeWJvZHksDQoJDQoJUmVsYXRlZCB0byB0aGUgZGlzY3Vzc2lvbiBhYm91dCBoaWVyYXJj aGljYWwgbG9hZGluZywgSSd2ZSBqdXN0IGNvbW1pdHRlZA0KCXN1cHBvcnQgZm9yIGFzc2VtYmxp bmcgYW4gYXBwbGljYXRpb24gY29udGV4dCBmcm9tIG1vcmUgdGhhbiBvbmUgWE1MIGZpbGUsDQoJ anVzdCBhdmFpbGFibGUgdmlhIFhtbFdlYkFwcGxpY2F0aW9uQ29udGV4dCBmb3IgdGhlIG1vbWVu dC4gSXQgYWxsb3dzIHRvDQoJc3BlY2lmeSBjb25maWcgbG9jYXRpb25zIHdpdGggbXVsdGlwbGUg cGF0aHMgaW4gaXQsIGxpa2UgaW4gdGhlIHdlYiBjYXNlOg0KCQ0KCSAgPGNvbnRleHQtcGFyYW0+ DQoJICAgIDxwYXJhbS1uYW1lPmNvbnRleHRDb25maWdMb2NhdGlvbjwvcGFyYW0tbmFtZT4NCgkg ICAgICA8cGFyYW0tdmFsdWU+DQoJICAgICAgICBXRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dDEu eG1sDQoJICAgICAgICBXRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dDIueG1sDQoJICAgICAgPC9w YXJhbS12YWx1ZT4NCgkgIDwvY29udGV4dC1wYXJhbT4NCgkNCglBbnkgbnVtYmVyIG9mIHRoZSBj aGFyYWN0ZXJzICI7LCAiIGJldHdlZW4gcGF0aHMgYXJlIGlnbm9yZWQsIHRvIGFsbG93IGZvcg0K CWxlbmllbnQgcGFyc2luZy4gVGhlIHJlc3VsdCBpcyBhICpzaW5nbGUqIHJvb3Qgd2ViIGFwcGxp Y2F0aW9uIGNvbnRleHQgdGhhdA0KCWhhcyBiZWVuIGxvYWRlZCBmcm9tIG11bHRpcGxlIFhNTCBm aWxlcywgZWFjaCBjb25mb3JtaW5nIHRvIHRoZSBzcHJpbmctYmVhbnMNCglEVEQuIEJlYW4gcmVm ZXJlbmNlcyBiZXR3ZWVuIHRoZSBpbmRpdmlkdWFsIGZpbGVzIG5lZWQgdG8gYmUgPHJlZg0KCWV4 dGVybmFsPSIuLi4iPiBpbnN0ZWFkIG9mIDxyZWYgYmVhbj0iLi4uIj4gdGhhdCByZWZlcmVuY2Vz IFhNTCBlbnRpdGllcyBpbg0KCXRoZSBzYW1lIGZpbGUuDQoJDQoJVGhpcyBhbGxvd3MgdG8gc3Bs aXQgYSBsYXJnZSBkZWZpbml0aW9uIG9mIGEgbWlkZGxlIHRpZXIgYXBwbGljYXRpb24gY29udGV4 dA0KCWludG8gbXVsdGlwbGUgWE1MIGZpbGVzLCBlaXRoZXIgc2VwYXJhdGluZyBieSBzeXN0ZW0g bW9kdWxlcyBvciBieSBzdWINCglsYXllcnMuIE9idmlvdXNseSB0aGlzIGRvZXNuJ3QgYWRkcmVz cyB0aGUgRUpCL211bHRpcGxlIHdlYiBhcHAgY2FzZSwgYnV0IGl0DQoJc2hvdWxkIGJlIHdlbGwg c3VpdGVkIGZvciB0eXBpY2FsIGxhcmdlIHdlYiBhcHBsaWNhdGlvbnMuDQoJDQoJQlRXLCBJJ3Zl IGFsc28gYWRkZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVzb3VyY2UgYnVuZGxlIGJhc2VuYW1l cyBpbg0KCVJlc291cmNlQnVuZGxlTWVzc2FnZVNvdXJjZSwgdmlhIHRoZSAiYmFzZW5hbWVzIiBw cm9wZXJ0eSAoaW4gYWRkaXRpb24gdG8NCgl0aGUgZXhpc3RpbmcgImJhc2VuYW1lIiBvbmUpLiBU aG9zZSByZXNvdXJjZSBidW5kbGVzIGdldCBjaGVja2VkDQoJc2VxdWVudGlhbGx5IHdpdGhpbiBh ICpzaW5nbGUqIE1lc3NhZ2VTb3VyY2UsIGFsbG93aW5nIHRvIHNwbGl0IGxhcmdlDQoJbWVzc2Fn ZSBidW5kbGVzIGludG8gbXVsdGlwbGUgZmlsZXMuDQoJDQoJRnVydGhlcm1vcmUsIEkndmUgcmV2 aXNlZCB0aGUgbm90YXRpb24gb2YgbmFtZSBhbGlhc2VzIGxpa2UgPGJlYW4gLi4uDQoJbmFtZT0i bXlhbGlhczEsbXlhbGlhczIiPiB0byBtYXRjaCB0aGUgcnVsZXMgYWJvdmU6IEFueSBudW1iZXIg b2YgdGhlDQoJY2hhcmFjdGVycyAiOywgIiBiZXR3ZWVuIGJlYW4gbmFtZXMgYXJlIGlnbm9yZWQu IFRoaXMgcGFydGljdWxhcmx5IGFsbG93cw0KCUJlYW5OYW1lVXJsSGFuZGxlck1hcHBpbmcgdG8g aW50ZXJwcmV0IG11bHRpcGxlIGFsaWFzZXMgYXMgbXVsdGlwbGUgbWFwcGluZ3MNCgl3aXRob3V0 IGN1c3RvbSBwYXJzaW5nLCBubyBtYXR0ZXIgaWYgc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3Bh Y2UgKHRoZQ0KCWxhdHRlciBsb29rcyBjbGVhbmVyIHdpdGggVVJMcykuDQoJDQoJVGhlIGRyYXdi YWNrIG9mIHRoZSBsYXR0ZXIgaXMgdGhhdCBYTUwgYmVhbiBhbGlhc2VzIGFyZSBub3QgYWxsb3dl ZCB0bw0KCWNvbnRhaW5zIHNwYWNlcyBvciBjb21tYXMgYW55bW9yZSAtLSBmb3IgdGhlIGJlbmVm aXQgb2YgYmVpbmcgYWJsZSB0bw0KCXNwZWNpZnkgbXVsdGlwbGUgYWxpYXNlcy4gRG9lcyBhbnlv bmUgb2JqZWN0IHRvIHRoYXQgdHJhZGVvZmY/DQoJDQoJLS0tLS0NCgkNCglJJ3ZlIGFsc28gYWRk ZWQgYSBuZXcgcG9zdCBwcm9jZXNzb3IgdHlwZTogQmVhblBvc3RQcm9jZXNzb3IsIGluIGFkZGl0 aW9uIHRvDQoJdGhlIGV4aXN0aW5nIEJlYW5GYWN0b3J5UG9zdFByb2Nlc3Nvci4gTm90ZSB0aGF0 IHRoZSBmb3JtZXIgaXMgaW4gdGhlDQoJYmVhbnMuZmFjdG9yeS5zdXBwb3J0IHBhY2thZ2UsIHdp dGggQWJzdHJhY3RCZWFuRmFjdG9yeSBvZmZlcmluZyBzdXBwb3J0IGZvcg0KCWl0IC0tIHdoaWxl IHRoZSBsYXR0ZXIgaXMgaW4gY29udGV4dC5jb25maWcsIGFzIGl0IGFsbG93cyBhcHBsaWNhdGlv bg0KCWNvbnRleHRzIHRvIG92ZXJyaWRlIHByb3BlcnR5IHZhbHVlcyAqYWZ0ZXIqIHRoZWlyIGJl YW4gZmFjdG9yeSAoYQ0KCUxpc3RhYmxlQmVhbkZhY3RvcnlJbXBsLCB0byBiZSBleGFjdCkgaGFz IGxvYWRlZC4NCgkNCglBIEJlYW5GYWN0b3J5UG9zdFByb2Nlc3NvciBnZXRzIGludm9rZWQgb25j ZSBwZXIgYmVhbiBmYWN0b3J5IGxvYWRpbmc7DQoJQmVhblBvc3RQcm9jZXNzb3Igb25jZSBwZXIg YmVhbiBjcmVhdGlvbi4gQm90aCB0eXBlcyBvZiBwb3N0IHByb2Nlc3NvciBjYW4NCgliZSBkZWZp bmVkIGFzIG5vcm1hbCBiZWFucyBpbiBhbiBhcHBsaWNhdGlvbiBjb250ZXh0LCBnZXR0aW5nIGF1 dG9tYXRpY2FsbHkNCglkZXRlY3RlZCBhdCBzdGFydHVwLCBhbmQgYXBwbGllZCBiZWZvcmUgdGhl IHJlc3Qgb2YgdGhlIGJlYW5zIGdldHMgY3JlYXRlZC4NCglXaXRoIGEgcGxhaW4gYmVhbiBmYWN0 b3J5LCBvbmx5IEJlYW5Qb3N0UHJvY2Vzc29yIGlzIGFwcGxpY2FibGUsIGJ1dCBub3QNCglkZWZp bmVkIGFzIGEgbm9ybWFsIGJlYW4gYnV0IHJhdGhlciBzZXQgdmlhIEFic3RyYWN0QmVhbkZhY3Rv cnkncw0KCXNldEJlYW5Qb3N0UHJvY2Vzc29ycyBtZXRob2QuDQoJDQoJSSd2ZSBhcHBsaWVkIHRo ZSBwcmluY2lwbGUgdGhhdCBiZWFuIGZhY3RvcmllcyBhcmUgbm90IHN1cHBvc2VkIHRvDQoJdW5k ZXJzdGFuZCBzcGVjaWFsIGJlYW5zIGluIHRoZSBiZWFuIGRlZmluaXRpb25zIHRoYXQgaW5mbHVl bmNlIHRoZSBiZWhhdmlvcg0KCW9mIHRoZSBmYWN0b3J5IGl0c2VsZiAtLSBqdXN0IGFwcGxpY2F0 aW9uIGNvbnRleHRzIGFyZSwgbGlrZSB3aXRoIHRoZQ0KCW1lc3NhZ2Ugc291cmNlLCBvcHRpb25z IGJlYW5zLCBhbmQgcG9zdCBwcm9jZXNzb3JzLiBCZWFuIGZhY3RvcmllcyBjYW4gYmUNCgljdXN0 b21pemVkIHRocm91Z2ggdGhlaXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIHRob3VnaCAtIGUuZy4N CglzZXRFbnRpdHlSZXNvbHZlciwgc2V0VmFsaWRhdGluZywgYW5kIHNldEJlYW5Qb3N0UHJvY2Vz c29ycyBvbg0KCVhtbEJlYW5GYWN0b3J5Lg0KCQ0KCUEgc3BlY2lhbCBpbXBsZW1lbnRhdGlvbiBv ZiBCZWFuUG9zdFByb2Nlc3NvciBpcyBhcHBsaWVkIHVuZGVyIHRoZSBob29kIGJ5DQoJQWJzdHJh Y3RBcHBsaWNhdGlvbkNvbnRleHQ6IEFwcGxpY2F0aW9uQ29udGV4dEF3YXJlUHJvY2Vzc29yIGlz IGltcGxpY3RseQ0KCXJlZ2lzdGVyZWQgd2l0aCB0aGUgdW5kZXJseWluZyBiZWFuIGZhY3Rvcnkg dG8gYXV0b21hdGljYWxseSBwYXNzIHRoZQ0KCWFwcGxpY2F0aW9uIGNvbnRleHQgdG8gQXBwbGlj YXRpb25Db250ZXh0QXdhcmUgYmVhbnMuIFRoaXMgYWxsb3dlZCBtZSB0byBnZXQNCglyaWQgb2Yg dGhlIHJhdGhlciB1Z2x5IG1hbnVhbCBjaGVjayBmb3IgQXBwbGljYXRpb25Db250ZXh0QXdhcmUg d2l0aCBhIGNhY2hlDQoJb2YgYWxyZWFkeSBtYW5hZ2VkIGluc3RhbmNlcyB0byBhdm9pZCBkb3Vi bGUgc2V0dGluZyBvZiB0aGUgYXBwbGljYXRpb24NCgljb250ZXh0IC0tIHRoZSBjdXJyZW50IHNv bHV0aW9uIGlzIG11Y2ggY2xlYW5lci4NCgkNCglOb3RlIHRoYXQgYSBjdXN0b20gQmVhblBvc3RQ cm9jZXNzb3IgZGVmaW5pdGlvbiBpbiBhbiBhcHBsaWNhdGlvbiBjb250ZXh0DQoJY2FuIG5vdCBv bmx5IGJlIHVzZWQgdG8gY2hlY2sgZm9yIG1hcmtlciBpbnRlcmZhY2VzIGJ1dCBhbHNvIHRvIHdy YXAgY2VydGFpbg0KCWJlYW4gaW5zdGFuY2VzIHdpdGggcHJveGllcywgYXMgaXQgY2FuIHJldHVy biBhIGRpZmZlcmVudCBiZWFuIGluc3RhbmNlIHRoYW4NCgl0aGUgb25lIHRoYXQgY2FtZSBpbi4g TG9vayBhdCB0aGUgcmVzcGVjdGl2ZSB0ZXN0IGNhc2UgaW4NCglTdGF0aWNBcHBsaWNhdGlvbkNv bnRleHRUZXN0U3VpdGUgdGhhdCBpbXBsaWNpdGx5IHdyYXBzIGVhY2ggYmVhbiBpbnN0YW5jZQ0K CXdpdGggYSBDR0xJQiBwcm94eS4NCgkNCglOb3cgaW1hZ2luZSBhIEJlYW5Qb3N0UHJvY2Vzc29y IGltcGxlbWVudGF0aW9uIHRoYXQgY2hlY2tzIGZvciBjZXJ0YWluDQoJYXR0cmlidXRlcyBpbiB0 aGUgYmVhbiBjbGFzcyBmaWxlIGFuZCBhcHBsaWVzIHJlc3BlY3RpdmUgaW50ZXJjZXB0b3JzIC0t DQoJbGlrZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIHRoYXQgdHJpZ2dlciBhIENHTElCIHByb3h5 IGFuZCBhbiBpbXBsaWNpdA0KCVRyYW5zYWN0aW9uSW50ZXJjZXB0b3IhIEkgY29uc2lkZXIgdGhp cyBhcyB0aGUgcGVyZmVjdCBob29rIGZvciBzdWNoDQoJaW1wbGljaXQgd3JhcHBpbmcgYXQgYmVh biBjcmVhdGlvbiB0aW1lLg0KCQ0KCUp1ZXJnZW4NCgkNCgkNCgktLS0tLU9yaWdpbmFsIE1lc3Nh Z2UtLS0tLQ0KCUZyb206IENvbGluIFNhbXBhbGVhbnUgW21haWx0bzpjb2xpbm1sMUBleGlzLmNv bV0NCglTZW50OiBUaHVyc2RheSwgU2VwdGVtYmVyIDE4LCAyMDAzIDU6MTUgUE0NCglUbzogc3By aW5nZnJhbWV3b3JrLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0DQoJU3ViamVjdDogW1Nwcmlu Z2ZyYW1ld29yay11c2VyXSBIaWVyYXJjaGljYWwgbG9hZGluZyBvZiBBcHBsaWNhdGlvbg0KCUNv bnRleHRzDQoJDQoJDQoJSSB3YW50ZWQgdG8gc3B1ciBzb21lIGRpc2N1c3Npb24gb2YgYmVzdCBw cmFjdGljZXMgZm9yIGhpZXJhY2hpY2FsDQoJbG9hZGluZyBvZiBBcHBsaWNhdGlvbkNvbnRleHRz LiBBcHBsaWNhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb25zIGNhbg0KCW9mIGNvdXJzZSBiZSBj cmVhdGVkIHdpdGggYSBwYXJlbnQgY29udGV4dCBzcGVjaWZpZWQuIEN1cnJlbnRseSwgdGhlcmUN CglpcyBzb21lIGNvZGUgc3VwcG9ydCBmb3IgYWN0dWFsbHkgbWFuYWdpbmcgdGhpcyBsb2FkaW5n IGluIHRoZSB3ZWIgdWkNCglsYXllciAod2hlcmUgaXQncyBlYXN5IHRvIGhhdmUgYSBzZXR1cCB3 aXRoIGEgcm9vdA0KCVdlYkFwcGxpY2F0aW9uQ29udGV4dCwgYW5kIG11bHRpcGxlIGNoaWxkIGNv bnRleHRzLCBwZXIgc2VydmxldC4NCgkNCglNb3N0IFNwcmluZyB1c2FnZSBleGFtcGxlcyBhc3N1 bWUgKHVubGVzcyBJJ20gbWlzc2luZyBzb21ldGhpbmcpIHRoYXQNCgl0aGUgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQgd2lsbCBjb250YWluIHRoZSBlbnRpcmUgbGF5ZXIgc3RhY2ssIHRoYXQN CglpcywgZGF0YS1hY2Nlc3MgYmVhbnMgYW5kIHNlcnZpY2UgbGF5ZXIgYmVhbnMgd2lsbCBiZSBk ZWZpbmVkIGluIHRoZXJlLg0KCVRoaXMgZG9lcyB3b3JrIGdyZWF0IHdoZW4gdGhlcmUgdGhlcmUg aXMgb25seSBvbmUgd2ViLWFwcC4NCgkNCglOb3cgaW4gbXkgY2FzZSwgSSBuZWVkIHNvbWV0aGlu ZyBhIGxpdHRsZSBiaXQgZGlmZmVyZW50LiBJIGhhdmUgYSBKMkVFDQoJYXBwbGljYXRpb24gYXMg YW4gRUFSIGZpbGUsIHdoaWNoIGNvbnRhaW5zIDMgd2ViLWFwcHMgKGFzIFdBUnMpIGF0IHRoZQ0K CXRvcCBsYXllci4gQW1vbmcgb3RoZXIgbGF5ZXJzLCBiZWxvdyB0aGUgd2ViIHVpIGxheWVyIHRo ZXJlIGlzIGENCglzZXJ2aWNlcyBsYXllciwgYW5kIGEgZGF0YS1hY2Nlc3MgbGF5ZXIuICBOb3cg SSBjb3VsZCBnZXQgYnkgd2l0aCB0aHJlZQ0KCWRpZmZlcmVudCwgcGFyYWxsZWwsIGFwcGxpY2F0 aW9uIGNvbnRleHRzIGRlZmluZWQsIG9uZSBmb3IgZWFjaCBvZiB0aGUNCgl3ZWItYXBwcywgd2hl cmUgYWxsIHRoZSBiZWFuIGRlZmluaXRpb25zIGZvciB0aGUgZGF0YS1hY2Nlc3MgYW5kDQoJc2Vy dmljZXMgbGF5ZXIgd2FzIGR1cGxpY2F0ZWQgaW4gZWFjaCBhcHBsaWNhdGlvbiBjb250ZXh0LiBJ IGRvIG5vdCB3YW50DQoJdG8gZG8gdGhpcyBob3dldmVyLCBzaW5jZSBJIGFtIHVzaW5nIEhpYmVy bmF0ZSwgYW5kIGRvIG5vdCB3YW50IHRvIGZvcmNlDQoJdGhlIEhpYmVybmF0ZSBtZXRhLWRhdGEg dG8gYmUgcmVhZCBpbiAzIHRpbWVzIChpdCdzIGEgc2xvdyBwcm9jZXNzKS4gSQ0KCW11Y2ggcHJl ZmVyIHRvIGhhdmUgYSBoaWVyYWNoaWNhbCBzZXR1cCBmb3IgdGhlIHdob2xlIGoyZWUgYXBwLCB3 aGVyZSAgSQ0KCWhhdmUgYW4gYXBwbGljYXRpb24gY29udGV4dCBkZWZpbml0aW9uIGZvciB0aGUg ZGF0YS1hY2Nlc3MgbGF5ZXIsIHdoaWNoDQoJbmVlZHMgdG8gYmUgdGhlIHBhcmVudCBvZiBhbiBh cHBsaWNhdGlvbiBjb250ZXh0IGRlZmluaXRpb24gZm9yIHRoZQ0KCXNlcnZpY2VzIGxheWVyLCB3 aGljaCBuZWVkcyB0byBiZSB0aGUgcGFyZW50IG9mIHRocmVlIHNlcGFyYXRlIHdlYg0KCWFwcGxp Y2F0aW9uIGNvbnRleHQgZGVmaW5pdGlvbnMsIG9uZSBpbiBlYWNoIHdlYi1hcHAuDQoJDQoJSSBo YXZlIGJlZW4gYWJsZSB0byBhY2hpZXZlIHRoaXMgYXMgZm9sbG93cyAoYW5kIHdhbnQgdG8gZ2V0 IGZlZWRiYWNrIGlmDQoJc29tZWJvZHkgY2FuIHRoaW5rIG9mIGEgYmV0dGVyIHdheSk6IEkgaGF2 ZSBhbiBhcHBsaWNhdGlvbiBjb250ZXh0DQoJZGVmaW50aW9uIGZvciBteSBkYXRhIGFjY2VzcyBs YXllcg0KCSAgZGF0YS1hY2Nlc3MtYXBwbGljYXRpb25Db250ZXh0LnhtbA0KCUkgaGF2ZSBhbiBh cHBsaWNhdGlvbiBjb250ZXh0IGRlZmluaXRpb24gZm9yIG15IHNlcnZpY2VzIGxheWVyLCB3aGlj aCBpcw0KCWEgY2hpbGQgb2YgdGhlIGRhdGEtYWNjZXNzIGNvbnRleHQsIGFuZCByZWZlcnMgdG8g YmVhbnMgaW4gaXQuOg0KCSAgY29yZS1zZXJ2aWVzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCglJ IHRoZW4gaGF2ZSB0aGUgdGhyZWUgYXBwbGljYXRpb24gY29udGV4dHMgZm9yIHRoZSB3ZWIgYXBw cywgd2hpY2ggYXJlDQoJY2hpbGRyZW4gb2YgdGhlIHNlcnZpY2VzIGNvbnRleHQsIGFuZCByZWZl ciB0byBiZWFucyB3aXRoaW4gaXQuDQoJDQoJTm93IHdoYXQgSSBkbywgaXMgKGluIGEgc29tZXdo YXQgbGF6eSBmYXNoaW9uKSB0cmlnZ2VyIGxvYWRpbmcgKG9uY2UpIG9mDQoJdGhlIHNlcnZpY2Vz IGFuZCBkYXRhLWFjY2VzcyBjb250ZXh0cywgd2hlbiBJIGxvYWQgdGhlIGZpcnN0IHdlYg0KCWFw cGxpY2F0aW9uIGNvbnRleHQuIFRoZSAybmQgYW5kIDNyZCB3ZWIgYXBwbGljYXRpb24gY29udGV4 dCBlbmQgdXANCgl1c2luZyB0aGUgcHJldmlvdXNseSBsb2FkZWQgc2VydmljZSBjb250ZXh0IGlu c3RhbmNlLiBJIGhhdmUgYW4NCglpbnRlcmZhY2UsIENvbnRleHRGYWN0b3J5LCBhcyBmb2xsb3dz Og0KCQ0KCS8qKg0KCSAqIERlZmluZXMgaW50ZXJmYWNlIGZvciBhbiBBcHBsaWNhdGlvbkNvbnRl eHQgZmFjdG9yeS4NCgkgKg0KCSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS40MCAkDQoJICogQGF1 dGhvciAgY29saW4NCgkgKi8NCglwdWJsaWMgaW50ZXJmYWNlIENvbnRleHRGYWN0b3J5IHsNCgkN CgkgIC8qKg0KCSAgICogVXNlIHRoZSBBcHBsaWNhdGlvbkNvbnRleHQgc3BlY2lmaWVkIGJ5IHRo ZSBrZXkgcGFyYW1ldGVyLiBUaGUNCgljb250ZXh0IGlzIHBvc3NpYmx5DQoJICAgKiBsb2FkZWQv Y3JlYXRlZCBhcyBuZWVkZWQuDQoJICAgKg0KCSAgICogQHBhcmFtIGtleSBhIHZhbHVlIHNwZWNp Znlpbmcgd2hpY2ggY29udGV4dCB0byB1c2UNCgkgICAqIEByZXR1cm4gdGhlIEFwcGxpY2F0aW9u Q29udGV4dCBpbnN0YW5jZQ0KCSAgICogQHRocm93cyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRp b24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgbG9hZGluZw0KCW9uZSBvciBtb3JlIGNvbnRleHRzDQoJ ICAgKi8NCgkgIEFwcGxpY2F0aW9uQ29udGV4dCB1c2VDb250ZXh0KFN0cmluZyBrZXkpIHRocm93 cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbjsNCgkNCgkgIC8qKg0KCSAgICogSW5kaWNh dGUgdGhhdCB0aGUgc3BlY2lmaWVkIEFwcGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZSBpcyBub3QN CgluZWVkZWQgYnkgYSB1c2VyIG9mIGl0LA0KCSAgICogd2hvIGhhcyBwcmV2aXNvdWx5IG9idGFp bmVkIGl0IHZpYSB7QGxpbmsgdXNlQ29udGV4dH0uIEl0IGlzIGFuDQoJZXJyb3IgZm9yIHJlbGVh c2VDb250ZXh0DQoJICAgKiB0byBiZSBjYWxsZWQgYSBncmVhdGVyIG51bWJlciBvZiB0aW1lcyB0 aGFuIHVzZUNvbnRleHQuIENhbGxpbmcNCgl0aGlzIHJlbGVhc2UgbWV0aG9kIG1heQ0KCSAgICog Y2F1c2UgY2xvc2UoKSB0byBiZSBjYWxsZWQgb24gdGhlIHNwZWNpZmllZCBjb250ZXh0LCBpZiB0 aGlzIGlzIHRoZQ0KCWxhc3QgdXNlciBvZiBpdC4NCgkgICAqDQoJICAgKiBAcGFyYW0gYWMgdGhl IEFwcGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZQ0KCSAgICogQHRocm93cyBBcHBsaWNhdGlvbkNv bnRleHRFeGNlcHRpb24NCgkgICAqLw0KCSAgdm9pZCByZWxlYXNlQ29udGV4dChBcHBsaWNhdGlv bkNvbnRleHQgYWMpIHRocm93cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbjsNCgkNCgl9 DQoJDQoJTm93IEkgaGF2ZSBhbiBhY3R1YWwgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSB1 c2VkIHRvIGdldCBhY2Nlc3MgdG8NCglhIHJlZmVyZW5jZSBjb3VudGVkIGNvbnRleHQsIHRyaWdn ZXJpbmcgbG9hZGluZyBhcyBuZWVkZWQsIGFuZCBsb2FkaW5nDQoJcGFyZW50cyBvZiB0aGF0IGNv bnRleHQsIGlmIG5lZWRlZDoNCgkNCgkvKioNCgkgKiBJbXBsZW1lbnRhdGlvbiBvZiBDb250ZXh0 RmFjdG9yeS48YnIgLz4NCgkgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUga2V5IGlzIGFj dHVhbGx5IHRoZSBuYW1lIG9mIGEgcHJvcGVydGllcw0KCWZpbGUgYWNjZXNzZWQgYXMNCgkgKiBh IHJlc291cmNlLCBlYWNoIGxpbmUgb2Ygd2hpY2ggc3BlY2lmaWVzIGFuIEFwcGxpY2F0aW9uQ29u dGV4dCB0bw0KCWxvYWQuIEVhY2ggbGluZSBpbg0KCSAqIHRoZSBmaWxlIGlzIHRoZSBwYXJlbnQg b2YgdGhlIHN1YnNlcXVlbnQgbGluZS4gVGhlIGxhc3QgY29udGV4dCBpcw0KCXRoZSBvbmUgcmV0 dXJuZWQuDQoJICoNCgkgKiBAdmVyc2lvbiAkUmV2aXNpb246ICQNCgkgKiBAYXV0aG9yICBjb2xp bg0KCSovDQoJcHVibGljIGNsYXNzIENvbnRleHRGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENvbnRl eHRGYWN0b3J5IHsNCgkNCgkgIC8vIC0tLSBzdGF0aWNzDQoJDQoJICBwdWJsaWMgc3RhdGljIGZp bmFsIExvZ2dlciBfbG9nID0NCglMb2dnZXIuZ2V0TG9nZ2VyKENvbnRleHRGYWN0b3J5SW1wbC5j bGFzcyk7DQoJDQoJICAvLyB3ZSBtYXAgQ29udGV4dEluZm8gb2JqZWN0cyBieSBTdHJpbmcga2V5 cywgYW5kIGJ5IENvbnRleHRzDQoJICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGluc3RhbmNlc0J5 S2V5ID0gbmV3IEhhc2hNYXAoKTsNCgkgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgaW5zdGFuY2Vz QnlPYmogPSBuZXcgSGFzaE1hcCgpOw0KCQ0KCSAgLy8gLS0tIG1ldGhvZHMNCgkNCgkgIC8qIChu b24tSmF2YWRvYykNCgkgICAqIEBzZWUNCgljb20udGlyYS5jb3Jlc2Vydi53ZWJ1dGlsLkNvbnRl eHRGYWN0b3J5I3VzZUNvbnRleHQoamF2YS5sYW5nLlN0cmluZykNCgkgICAqLw0KCSAgcHVibGlj IEFwcGxpY2F0aW9uQ29udGV4dCB1c2VDb250ZXh0KFN0cmluZyBrZXkpIHRocm93cw0KCUFwcGxp Y2F0aW9uQ29udGV4dEV4Y2VwdGlvbiB7DQoJDQoJICAgIHN5bmNocm9uaXplZChpbnN0YW5jZXNC eUtleSkgew0KCSAgICAgIENvbnRleHRJbmZvIGNpID0gKENvbnRleHRJbmZvKSBpbnN0YW5jZXNC eUtleS5nZXQoa2V5KTsNCgkgICAgICBpZiAoY2kgIT0gbnVsbCkgew0KCSAgICAgICAgX2xvZy5k ZWJ1ZygiQ29udGV4dCB3aXRoIGtleSAnIiArIGtleSArICInIHJlcXVlc3RlZC4gUmV0dXJuaW5n DQoJZXhpc3RpbmcgaW5zdGFuY2VzIik7DQoJICAgICAgICBjaS5yZWZjb3VudCsrOw0KCSAgICAg ICAgcmV0dXJuIGNpLmNvbnRleHQ7DQoJICAgICAgfQ0KCQ0KCSAgICAgIF9sb2cuZGVidWcoIkNv bnRleHQgd2l0aCBrZXkgJyIgKyBrZXkgKyAiJyByZXF1ZXN0ZWQuIENyZWF0aW5nIG5ldw0KCWlu c3RhbmNlIik7DQoJDQoJICAgICAgLy8gdGhpcyBjb250ZXh0IGRvZXNuJ3QgZXhpc3QsIHdlIG5l ZWQgdG8gdHJ5IHRvIGxvYWQgaXQNCgkgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldENsYXNzKCku Z2V0UmVzb3VyY2VBc1N0cmVhbShrZXkpOw0KCSAgICAgIGlmIChpcyA9PSBudWxsKQ0KCSAgICAg ICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQN Cgljb250ZXh0KHMpLiBLZXkgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCByZXNvdXJjZTogIiAr IGtleSk7DQoJDQoJICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7DQoJ ICAgICAgdHJ5IHsNCgkgICAgICAgIHByb3BzLmxvYWQoaXMpOw0KCSAgICAgICAgaXMuY2xvc2Uo KTsNCgkgICAgICB9DQoJICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkgICAgICAgIHRo cm93IG5ldyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgYXBwbGlj YXRpb24NCgljb250ZXh0IHBvaW50ZXIgZGVmaW5pdGlvbi4iLCBlKTsNCgkgICAgICB9DQoJDQoJ ICAgICAgQXJyYXlMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOw0KCSAgICAgIGZvciAo aW50IGkgPSAwOyA7ICsraSkgew0KCSAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBwcm9wcy5nZXRQ cm9wZXJ0eShJbnRlZ2VyLnRvU3RyaW5nKGkpKTsNCgkgICAgICAgIGlmIChjb250ZXh0ID09IG51 bGwpDQoJICAgICAgICAgIGJyZWFrOw0KCSAgICAgICAgY29udGV4dHMuYWRkKGNvbnRleHQpOw0K CSAgICAgIH0NCgkNCgkgICAgICBpZiAoY29udGV4dHMuc2l6ZSgpID09IDApDQoJICAgICAgICB0 aHJvdyBuZXcgQXBwbGljYXRpb25Db250ZXh0RXhjZXB0aW9uKCJObyBhcHBsaWNhdGlvbiBjb250 ZXh0DQoJZGVmaW5pdGlvbnMgc3BlY2lmaWVkIGluIGRlZmluaXRpb24gZmlsZTogIiArIGtleSk7 DQoJDQoJICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFjOw0KCSAgICAgIHRy eSB7DQoJICAgICAgICBhYyA9IG5ldw0KCUNsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dCgo U3RyaW5nW10pY29udGV4dHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7DQoJICAgICAgfQ0KCSAg ICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRp b25Db250ZXh0RXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGFwcGxpY2F0aW9uDQoJY29udGV4dCBk ZWZpbml0aW9uIiwgZSk7DQoJICAgICAgfQ0KCQ0KCSAgICAgIGNpID0gbmV3IENvbnRleHRJbmZv KCk7DQoJICAgICAgY2kuY29udGV4dCA9IGFjOw0KCSAgICAgIGNpLmtleSA9IGtleTsNCgkgICAg ICBjaS5yZWZjb3VudCA9IDE7DQoJICAgICAgaW5zdGFuY2VzQnlLZXkucHV0KGtleSwgY2kpOw0K CSAgICAgIGluc3RhbmNlc0J5T2JqLnB1dChhYywgY2kpOw0KCQ0KCSAgICAgIHJldHVybiBhYzsN CgkgICAgfQ0KCSAgfQ0KCQ0KCSAgLyoqDQoJICAgKiBSZWxlYXNlcyB0aGUgc3BlY2lmaWVkIEFw cGxpY2F0aW9uQ29udGV4dCBpbnN0YW5jZS4gSWYgdGhlcmUgYXJlIG5vDQoJbW9yZSB1c2VycyBv ZiB0aGlzDQoJICAgKiBjb250ZXh0LCBjbG9zZSgpIHdpbGwgYmUgY2FsbGVkIG9uIGl0LiBOb3Rl IHRoYXQgY2xvc2Ugd2lsbCBiZQ0KCWNhbGxlZCBvbiBpdHMgcGFyZW50cyBhcw0KCSAgICogd2Vs bCwgcmVjdXJzaXZlbHkuDQoJICAgKiBAc2VlDQoJY29tLnRpcmEuY29yZXNlcnYud2VidXRpbC5D b250ZXh0RmFjdG9yeSNSZWxlYXNlQ29udGV4dChvcmcuc3ByaW5nZnJhbWV3b3JrLg0KCWNvbnRl eHQuQXBwbGljYXRpb25Db250ZXh0KQ0KCSAgICovDQoJICBwdWJsaWMgdm9pZCByZWxlYXNlQ29u dGV4dChBcHBsaWNhdGlvbkNvbnRleHQgYWMpIHRocm93cw0KCUFwcGxpY2F0aW9uQ29udGV4dEV4 Y2VwdGlvbiB7DQoJDQoJICAgIHN5bmNocm9uaXplZChpbnN0YW5jZXNCeUtleSkgew0KCSAgICAg IENvbnRleHRJbmZvIGNpID0gKENvbnRleHRJbmZvKSBpbnN0YW5jZXNCeU9iai5nZXQoYWMpOw0K CSAgICAgIGlmIChjaSAhPSBudWxsKSB7DQoJICAgICAgICBjaS5yZWZjb3VudC0tOw0KCSAgICAg ICAgaWYgKGNpLnJlZmNvdW50IDwgMCkNCgkgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9u Q29udGV4dEV4Y2VwdGlvbigiSWxsZWdhbCBzdGF0ZTogY29udGV4dA0KCXJlbGVhc2VkIG1vcmUg dGltZXMgdGhhbiBhY3F1aXJlZCIpOw0KCQ0KCSAgICAgICAgaWYgKGNpLnJlZmNvdW50ID09IDAp IHsNCgkgICAgICAgICAgX2xvZy5kZWJ1ZygiUmVsZWFzZSByZXF1ZXN0ZWQgb24gQ29udGV4dCB3 aXRoIGtleSAnIiArIGNpLmtleQ0KCSsgIicuIExhc3QgcmVmZXJlbmNlLCBzbyBjbG9zaW5nIGFs b25nIHdpdGggcGFyZW50cyIpOw0KCSAgICAgICAgICBpbnN0YW5jZXNCeU9iai5yZW1vdmUoYWMp Ow0KCSAgICAgICAgICBpbnN0YW5jZXNCeUtleS5yZW1vdmUoY2kua2V5KTsNCgkgICAgICAgICAg QXBwbGljYXRpb25Db250ZXh0IGNoaWxkID0gY2kuY29udGV4dDsNCgkgICAgICAgICAgQXBwbGlj YXRpb25Db250ZXh0IHBhcmVudDsNCgkgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpIHsN CgkgICAgICAgICAgICBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsNCgkgICAgICAgICAgICBj aGlsZC5jbG9zZSgpOw0KCSAgICAgICAgICAgIGNoaWxkID0gcGFyZW50Ow0KCSAgICAgICAgICB9 DQoJICAgICAgICB9DQoJICAgICAgICBlbHNlDQoJICAgICAgICAgIF9sb2cuZGVidWcoIlJlbGVh c2UgcmVxdWVzdGVkIG9uIENvbnRleHQgd2l0aCBrZXkgJyIgKyBjaS5rZXkNCgkrICInLiBSZWZl cmVuY2VzIHJlbWFpbiwgc28gbm90IGNsb3NpbmcuIik7DQoJICAgICAgfQ0KCSAgICAgIGVsc2UN CgkgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkNvbnRleHRFeGNlcHRpb24oIkF0dGVtcHRl ZCB0byByZWxlYXNlDQoJY29udGV4dCByZWZlcmVuY2UgZm9yIGNvbnRleHQgbm90IGtub3duIHRv IHRoaXMgZmFjdG9yeSIpOw0KCSAgICB9DQoJICB9DQoJDQoJICAvLyB3ZSB0cmFjayBjb250ZXh0 cyB3aXRoIHRoaXMgY2xhc3MNCgkgIHByaXZhdGUgY2xhc3MgQ29udGV4dEluZm8gew0KCSAgICBw dWJsaWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7DQoJICAgIHB1YmxpYyBTdHJpbmcga2V5 Ow0KCSAgICBwdWJsaWMgaW50IHJlZmNvdW50ID0gMDsNCgkgIH0NCgkNCgl9DQoJDQoJU28gbXkg Q29udGV4dEZhY3RvcnkgaW1wbCBjYW4gbG9hZCB0aGUgc2VydmljZXMgYXBwbGljYXRpb24gY29u dGV4dCwgYW5kDQoJZmlyc3QgaXRzIHBhcmVudCwgdGhlIGRhdGEtYWNjZXNzIGNvbnRleHQsIG9u IGRlbWFuZCwgYW5kIHN1YnNlcXVlbnQNCglyZXF1ZXN0IHdpbGwganVzdCByZXR1cm4gYSByZWZl cmVuY2UgdG8gdGhlIHNhbWUgY29udGV4dC4gVGhlICdrZXknDQoJc3BlY2lmaWVkIHRvIHRoZSBj b250ZXh0IGZhY3RvcnkgaXMganVzdCB0aGUgbmFtZSBvZiBhIGZpbGUgc3BlY2lmeWluZw0KCXdo aWNoIGNvbnRleHRzIHRvIGxvYWQ6DQoJDQoJRmlsZSBjb3JlLXNlcnZpY2VzLWFwcGxpY2F0aW9u Q29udGV4dHMucHJvcGVydGllczoNCgkjIGRlZmluZXMgb25lIG9yIG1vcmUgaGllcmFyY2hpY2Fs IHhtbCBBcHBsaWNhdGlvbkNvbnRleHQgaW5zdGFuY2VzDQoJd2hpY2ggYXJlIGNvbnNpZGVyZWQN CgkjIHRvIG1ha2UgdXAgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgc3RhY2sgZm9yIGNvcmUtc2Vy dmljZXMuIEVhY2ggbGluZQ0KCWlzIGEgcGFyZW50IG9mIHRoZQ0KCSMgc3Vic2VxdWVudCBsaW5l Lg0KCTA9L2RhdGEtYWNjZXNzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCgkxPS9jb3JlLXNlcnZp Y2VzLWFwcGxpY2F0aW9uQ29udGV4dC54bWwNCgkNCglOb3cgSSBqdXN0IG5lZWQgdG8gaGF2ZSBh IG1vZGlmaWVkIHZlcnNpb24gb2YgQ29udGV4dExvYWRlciBmcm9tIFNwcmluZw0KCXdoaWNoIGFs b25nIHdpdGggbG9hZGluZyBhIHNwZWNpZmllZCBXZWJBcHBsaWNhdGlvbkNvbnRleHQgaW5zdGFu Y2UsDQoJd2lsbCBvcHRpb2luYWxseSB1c2UgdGhlIENvbnRleHRGYWN0b3J5IHRvIGxvYWQgYSBw YXJlbnQgY29udGV4dCBmaXJzdC4NCglIZXJlJ3MgdGhlIGNvZGU6DQoJDQoJLyoqDQoJICogQ2xh c3MgdXNlZCB0byBsb2FkIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQsIGluY2x1ZGluZyBwb3Nz aWJseQ0KCXRyaWdnZXJpbmcgbG9hZGluZyBvZiBhIHBhcmVudA0KCSAqIGNvbnRleHQgdGhyb3Vn aCBhIENvbnRleHRGYWN0b3J5IGluc3RhbmNlDQoJICoNCgkgKiBAdmVyc2lvbiAkUmV2aXNpb246 ICAkDQoJKi8NCglwdWJsaWMgY2xhc3MgQ29udGV4dExvYWRlciB7DQoJDQoJICAvLyAtLS0gc3Rh dGljcw0KCQ0KCSAgLyoqPw0KCSAgICogQ29uZmlnIHBhcmFtIGZvciB0aGUgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24NCgljbGFzcyB0byB1c2UuDQoJICAgKi8NCgkg IHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfQ0xBU1NfUEFSQU0gPSAiY29udGV4 dENsYXNzIjsNCgkNCgkgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgREVGQVVMVF9DT05URVhU X0NMQVNTID0NCglYbWxXZWJBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3M7DQoJDQoJICBwdWJsaWMg c3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX0NMQVNTX1BBUkFNID0N CgkicGFyZW50Q29udGV4dEZhY3RvcnlDbGFzcyI7DQoJDQoJICBwdWJsaWMgc3RhdGljIGZpbmFs IFN0cmluZyBQQVJFTlRfQ09OVEVYVF9GQUNUT1JZX1BBUkFNMV9QQVJBTSA9DQoJInBhcmVudENv bnRleHRGYWN0b3J5UGFyYW0iOw0KCQ0KCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFS RU5UX0NPTlRFWFRfS0VZX1BBUkFNID0gInBhcmVudENvbnRleHRLZXkiOw0KCQ0KCSAgcHVibGlj IHN0YXRpYyBmaW5hbCBMb2dnZXIgX2xvZyA9IExvZ2dlci5nZXRMb2dnZXIoQ29udGV4dExvYWRl ci5jbGFzcyk7DQoJDQoJICAvKioNCgkgICAqIEluaXRpYWxpemUgU3ByaW5nJ3Mgd2ViIGFwcGxp Y2F0aW9uIGNvbnRleHQgZm9yIHRoZSBnaXZlbiBzZXJ2bGV0DQoJY29udGV4dCwNCgkgICAqIHJl Z2FyZGluZyB0aGUgImNvbnRleHRDbGFzcyIgc2VydmxldCBjb250ZXh0IGluaXQgcGFyYW1ldGVy Lg0KCSAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0IGN1cnJlbnQgc2VydmxldCBjb250ZXh0DQoJ ICAgKiBAcmV0dXJuIHRoZSBuZXcgV2ViQXBwbGljYXRpb25Db250ZXh0DQoJICAgKi8NCgkgIHB1 YmxpYyBzdGF0aWMgV2ViQXBwbGljYXRpb25Db250ZXh0IGluaXRDb250ZXh0KFNlcnZsZXRDb250 ZXh0DQoJc2VydmxldENvbnRleHQpDQoJICAgIHRocm93cyBBcHBsaWNhdGlvbkNvbnRleHRFeGNl cHRpb24gew0KCQ0KCSAgICBzZXJ2bGV0Q29udGV4dC5sb2coIkxvYWRpbmcgcm9vdCBXZWJBcHBs aWNhdGlvbkNvbnRleHQiKTsNCgkgICAgU3RyaW5nIGNvbnRleHRDbGFzcyA9DQoJc2VydmxldENv bnRleHQuZ2V0SW5pdFBhcmFtZXRlcihDT05URVhUX0NMQVNTX1BBUkFNKTsNCgkNCgkgICAgU3Ry aW5nIGNsYXNzTmFtZSA9IG51bGw7DQoJICAgIHRyeSB7DQoJICAgICAgY2xhc3NOYW1lID0NCglz ZXJ2bGV0Q29udGV4dC5nZXRJbml0UGFyYW1ldGVyKFBBUkVOVF9DT05URVhUX0ZBQ1RPUllfQ0xB U1NfUEFSQU0pOw0KCSAgICAgIENvbnRleHRGYWN0b3J5IHBhcmVudENvbnRleHRGYWN0b3J5ID0N CglnZXRQYXJlbnRDb250ZXh0RmFjdG9yeShzZXJ2bGV0Q29udGV4dCk7DQoJDQoJICAgICAgQXBw bGljYXRpb25Db250ZXh0IHBhcmVudENvbnRleHQgPSBudWxsOw0KCSAgICAgIGlmIChwYXJlbnRD b250ZXh0RmFjdG9yeSAhPSBudWxsKSB7DQoJICAgICAgICBTdHJpbmcgcGFyZW50Q29udGV4dEtl eSA9DQoJc2VydmxldENvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcihQQVJFTlRfQ09OVEVYVF9LRVlf UEFSQU0pOw0KCSAgICAgICAgX2xvZy5pbmZvKA0KCSAgICAgICAgICAiR2V0dGluZyBwYXJlbnQg Y29udGV4dDogdXNpbmcgY29udGV4dCBmYWN0b3J5IGNsYXNzICciICsNCgljbGFzc05hbWUgKyAi Jywga2V5ICciICsNCgkgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0S2V5ICsgIiciKTsN CgkgICAgICAgIHBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0RmFjdG9yeS51c2VDb250ZXh0 KHBhcmVudENvbnRleHRLZXkpOw0KCSAgICAgIH0NCgkNCgkgICAgICAvLyBOb3cgd2UgbXVzdCBs b2FkIHRoZSBXZWJBcHBsaWNhdGlvbkNvbnRleHQuDQoJICAgICAgLy8gSXQgY29uZmlndXJlcyBp dHNlbGY6IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdCB0aGUgY2xhc3MNCgl3aXRoIHRo ZSBwcm9wZXINCgkgICAgICAvLyBjb25zdHJ1Y3RvciwgYW5kIGludm9rZSBzZXRTZXJ2bGV0Q29u dGV4dC4NCgkgICAgICBDbGFzcyBjbGF6eiA9IChjb250ZXh0Q2xhc3MgIT0gbnVsbCA/IENsYXNz LmZvck5hbWUoY29udGV4dENsYXNzKQ0KCTogREVGQVVMVF9DT05URVhUX0NMQVNTKTsNCgkgICAg ICBfbG9nLmluZm8oDQoJICAgICAgICAiTG9hZGluZyByb290IFdlYkFwcGxpY2F0aW9uQ29udGV4 dDogdXNpbmcgY29udGV4dCBjbGFzcyAnIiArDQoJY2xhenouZ2V0TmFtZSgpICsgIiciKTsNCgkg ICAgICBpZiAoIVdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNs YXp6KSkgew0KCSAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbigN CgkgICAgICAgICAgIkNvbnRleHQgY2xhc3MgaXMgbm8gV2ViQXBwbGljYXRpb25Db250ZXh0OiAi ICsgY29udGV4dENsYXNzKTsNCgkgICAgICB9DQoJDQoJICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJU eXBlczsNCgkgICAgICBPYmplY3RbXSBwYXJhbXM7DQoJICAgICAgaWYgKHBhcmVudENvbnRleHQg PT0gbnVsbCkgew0KCSAgICAgICAgcGFyYW1ldGVyVHlwZXMgPSBuZXcgQ2xhc3NbMF07DQoJICAg ICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0WzBdOw0KCSAgICAgIH0NCgkgICAgICBlbHNlIHsNCgkg ICAgICAgIHBhcmFtZXRlclR5cGVzID0gbmV3IENsYXNzW10ge0FwcGxpY2F0aW9uQ29udGV4dC5j bGFzcywNCglTdHJpbmcuY2xhc3N9Ow0KCSAgICAgICAgcGFyYW1zID0gbmV3IE9iamVjdFtdIHtw YXJlbnRDb250ZXh0LCBudWxsfTsNCgkgICAgICB9DQoJDQoJICAgICAgQ29uc3RydWN0b3IgY29u c3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7DQoJICAgICAg V2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9DQoJKFdlYkFwcGxp Y2F0aW9uQ29udGV4dCkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UocGFyYW1zKTsNCgkgICAgICB3 ZWJBcHBsaWNhdGlvbkNvbnRleHQuc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0K CSAgICAgIHJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQ7DQoJICAgIH0NCgkgICAgY2F0Y2gg KEFwcGxpY2F0aW9uQ29udGV4dEV4Y2VwdGlvbiBleCkgew0KCSAgICAgIGhhbmRsZUV4Y2VwdGlv bigiRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb24gY29udGV4dCIsIGV4KTsNCgkgICAg fQ0KCSAgICBjYXRjaCAoQmVhbnNFeGNlcHRpb24gZXgpIHsNCgkgICAgICBoYW5kbGVFeGNlcHRp b24oIkZhaWxlZCB0byBpbml0aWFsaXplIGJlYW5zIGluIGFwcGxpY2F0aW9uDQoJY29udGV4dCIs IGV4KTsNCgkgICAgfQ0KCSAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgew0K CSAgICAgIGhhbmRsZUV4Y2... [truncated message content] |
|
From: <jue...@we...> - 2003-10-10 18:17:36
|
Pj4gSXQncyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZSBpbiBGaWxlU3lzdGVtWG1sQXBwbGljYXRp b25Db250ZXh0IHRob3VnaCwgbWFpbmx5IHRvIG5vdCBwbGFjZSBhbnkgcmVzdHJpY3Rpb25zIG9u IGZpbGUgbmFtZXMgaW4gdGVybXMgb2Ygc3BhY2VzIG9yIGNvbW1hcy4gRmlsZVN5c3RlbVhtbEFw cGxpY2F0aW9uQ29udGV4dCBhbHJlYWR5IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYSBTdHJpbmcg YXJyYXksIGZvciBhdXRvbWF0aWNhbGx5IHNldHRpbmcgdXAgKm5lc3RlZCogY29udGV4dHMuIFdl IGNvdWxkIHJlZGVmaW5lIHRoYXQgY29uc3RydWN0b3IgdG8gc3BlY2lmeSBtdWx0aXBsZSBmaWxl cyB0aGF0IG1ha2UgdXAgYSAqc2luZ2xlKiBjb250ZXh0LCBhbmQgb2ZmZXIgYW4gb3ZlcmxvYWRl ZCB2ZXJzaW9uIHRoYXQgdGFrZXMgYSBwYXJlbnQgQXBwbGljYXRpb25Db250ZXh0IHJlZmVyZW5j ZS4gVGhhdCB3YXksIGJvdGggbXVsdGlwbGUgZmlsZXMgZm9yIGEgc2luZ2xlIGNvbnRleHQgYW5k IG5lc3Rpbmcgd291bGQgYmUgcG9zc2libGUuDQo+DQo+IFRoYXQgc291bmRzIGdvb2QuIFRoZXJl IGFyZSBjZXJ0YWluIGRlcGxveW1lbnQgc2NlbmFyaW9zIHdoZXJlIGNvbmZpZw0KZmlsZXMgcmVm ZXJlbmNlcyB2aWEgZmlsZW5hbWVzIChhcyBvcHBvc2VkIHRvIGhhdmluZyB0byBiZSBvbiB0aGUN CmNsYXNzcGF0aCkgYXJlIGEgbG90IG1vcmUgY29udmVuaWVudCwgYW5kIEkgdGhpbmsuIEkgYW0g dHJ5aW5nIHRvIHRoaW5rDQppZiB0aGVyZSBhcmUgYW55IHVzZSBjYXNlcyB3aGVyZSBzb21lYm9k eSB3b3VsZCBiZSBmZWVkaW5nIGluIGEgbGlzdCBvZg0KY29udGV4dHMgaW4gdGhlIGV4aXN0aW5n IGltcGxlbWVudGF0aW9uLCBhbmQgd291bGQgYmUgd29yc3Qgb2ZmIGlmIHRoZXkNCndlcmUgbmVz dGVkIGFzIG9wcG9zZWQgdG8gZmxhdHRlbmVkIGludG8gb25lIGFzIHlvdSBwcm9wb3NlLiBJIGNh bid0DQpyZWFsbHkgdGhpbmsgb2YgYW55LiBJIHRoaW5rIHRoZSBuZXN0aW5nIGRvZXMgbWFrZSBh IGxvdCBvZiBzZW5zZSB3aGVuDQp5b3UgYXJlIGFzc2VtYmxpbmcgdG9nZXRoZXIgY29udGV4dHMg ZnJvbSBkaWZmZXJlbnQgbGF5ZXJzIHdoaWNoIG1heQ0KYWxyZWFkeSBleGlzdCAodGhhdCBpcywg dGhlIGxvd2VyIGxheWVyKHMpIG1heSBhbHJlYWR5IGV4aXN0KSwgYXMgcGVyIG15DQptdWx0aS13 ZWJhcHAgdXNlY2FzZSwgYnV0IGluIHRoaXMgY2FzZSB5b3UgYXJlIGRvaW5nIGl0IGR5bmFtaWNh bGx5DQphbnl3YXlzLCBhbmQgY2FuJ3QgZG8gaXQgYXMgYSBsaXN0Lg0KDQpJZiBldmVyeW9uZSBh Z3JlZXMsIEknbGwgbWFrZSB0aGUgY2hhbmdlIHRoaXMgd2Vla2VuZCAtLSB0aGUgU3RyaW5nIGFy cmF5IG9mIGxvY2F0aW9ucyBmZWQgaW50byBGaWxlU3lzdGVtWG1sQXBwbGljYXRpb25Db250ZXh0 IGFuZCBpdHMgc3ViY2xhc3MgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IHdpbGwgdGhl biBidWlsZCBhIHNpbmdsZSBjb250ZXh0IHRoYXQgaXMgZGVmaW5lZCBieSBwb3RlbnRpYWxseSBt dWx0aXBsZSBYTUwgZmlsZXMuDQogDQo+PnB1YmxpYyBjbGFzcyBBdXRvUHJveHlDcmVhdG9yIGlt cGxlbWVudHMgQmVhblBvc3RQcm9jZXNzb3Igew0KPj4gIHByaXZhdGUgTGlzdCBiZWFuTmFtZXM7 DQo+PiAgcHJpdmF0ZSBJbnRlcmNlcHRvcltdIGludGVyY2VwdG9yczsNCj4+DQo+PiAgcHVibGlj IHZvaWQgc2V0QmVhbk5hbWVzKFN0cmluZ1tdIGJlYW5OYW1lcykgew0KPj4gICAgdGhpcy5iZWFu TmFtZXMgPSBBcnJheXMuYXNMaXN0KGJlYW5OYW1lcyk7DQo+PiAgfQ0KPj4NCj4+ICBwdWJsaWMg dm9pZCBzZXRJbnRlcmNlcHRvcnMoSW50ZXJjZXB0b3JbXSBpbnRlcmNlcHRvcnMpIHsNCj4+ICAg IHRoaXMuaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JzOw0KPj4gIH0NCj4+DQo+PiAgcHVibGlj IE9iamVjdCBwb3N0UHJvY2Vzc0JlYW4oT2JqZWN0IGJlYW4sIFN0cmluZyBuYW1lLCBSb290QmVh bkRlZmluaXRpb24gZGVmaW5pdGlvbikgew0KPj4gICAgaWYgKHRoaXMuYmVhbk5hbWVzICE9IG51 bGwgJiYgdGhpcy5iZWFuTmFtZXMuY29udGFpbnMobmFtZSkpIHsNCj4+ICAgICAgUHJveHlGYWN0 b3J5IHByb3h5RmFjdG9yeSA9IG5ldyBQcm94eUZhY3RvcnkoKTsNCj4+ICAgICAgZm9yIChpbnQg aSA9IDA7IGkgPCB0aGlzLmludGVyY2VwdG9ycy5sZW5ndGg7IGkrKykgew0KPj4gICAgICAgIHBy b3h5RmFjdG9yeS5hZGRJbnRlcmNlcHRvcih0aGlzLmludGVyY2VwdG9yc1tpXSk7DQo+PiAgICAg IH0NCj4+ICAgICAgcHJveHlGYWN0b3J5LmFkZEludGVyY2VwdG9yKG5ldyBJbnZva2VySW50ZXJj ZXB0b3IoYmVhbikpOw0KPj4gICAgICByZXR1cm4gcHJveHlGYWN0b3J5LmdldFByb3h5KCk7DQo+ PiAgICB9DQo+PiAgICBlbHNlIHsNCj4+ICAgICAgcmV0dXJuIGJlYW47DQo+PiAgICB9DQo+PiAg fQ0KPj59DQo+Pg0KPiBJIHJlYWxseSBsaWtlIHRoaXMuIEl0IHdpbGwgcmVkdWNlIGJvaWxlcnBs YXRlIHByb3h5IGRlZmluaXRpb25zIGZvciA4MCUNCm9mIHRoZSBjb2RlIHRoYXQgbmVlZHMgc2lt cGxlIHdyYXBwaW5nIG9mIGV2ZXJ5dGhpbmcuLi4NCg0KQXV0b1Byb3h5Q3JlYXRvciBpcyBub3Qg eWV0IGluIENWUywgYnV0IEkgY2FuIGFkZCBpdCBwcm9tcHRseS4gQlRXLCBJJ20gbm90IHJlYWxs eSBzdXJlIGFib3V0IHRoZSBuYW1lIC0tIGRvIHlvdSBoYXZlIGEgYmV0dGVyIG5hbWUgZm9yIHN1 Y2ggYSBiZWFuIHRoYXQgYXV0b21hdGljYWxseSB3cmFwcyBvdGhlciBiZWFucyB3aXRoIHByb3hp ZXM/DQogDQpKdWVyZ2VuDQo= |
|
From: <jue...@we...> - 2003-10-14 22:55:16
|
Q29saW4sDQogDQo+IEhvdyBkbyB5b3Ugc2VlIHRoaXMgYmVpbmcgdXNlZCAoaWYgYXQgYWxsKSB3 aXRoIHRoZSBjdXJyZW50DQpUcmFuc2FjdGlvbkludGVyY2VwdG9yLCBzaW5jZSBpdHMgVHJhbnNh Y3Rpb25BdHRyaWJ1dGVTb3VyY2UgcHJvcGVydHkNCmdldHMgc2F0aXNmaWVkIHZpYSBhIE1ldGhv ZE1hcFRyYW5zYWN0aW9uQXR0cmlidXRlU291cmNlIGluc3RhbmNlICh3aGljaA0KbmVlZHMgZGVm aW5pdGlvbnMgaW4gdGhlIGZvcm1hdCAnRlFOLm1ldGhvZE5hbWUnKS4gV2hpbGUgdGhpcyB3b3Jr cyBmaW5lDQp3aGVuIGRvaW5nIGluZGl2aWR1YWwgaW50ZXJjZXB0b3JzIGZvciB1c2Ugd2l0aCBQ cm94eUZhY3RvcnlCZWFuLCBzaG9ydA0Kb2YgYWRkaW5nIG5ldyBjb2RlIEknbSBhdCBhIGxvc3Mg YXMgdG8gaG93IEkgY291bGQgdXNlDQpUcmFuc2FjdGlvbkludGVyY2VwdG9yIHdpdGggQmVhbk5h bWVBdXRvUHJveHkgdG8gZG8gdHJhbnNhY3Rpb25zIG9uIGFsbA0KbWV0aG9kcyBpbiBhbGwgdGhl IGJlYW5zIEkgZmVlZCB0byB0aGUgYXV0byBwcm94eS4NCg0KWW91IG5lZWQgdG8gdXNlIG9uZSBz aGFyZWQgVHJhbnNhY3Rpb25JbnRlcmNlcHRvciBpbnN0YW5jZSBoZXJlLCBkZWZpbmluZyB0aGUg YXR0cmlidXRlcyBmb3IgdGhlIHRyYW5zYWN0aW9uYWwgbWV0aG9kcyBvZiBhbGwgdGhlIGludGVy ZmFjZXMgYW5kIGNsYXNzZXMgaW52b2x2ZWQ6DQo8YmVhbiBpZD0iZXhhbXBsZVRyYW5zYWN0aW9u SW50ZXJjZXB0b3IiIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLnRyYW5zYWN0aW9uLmludGVy Y2VwdG9yLlRyYW5zYWN0aW9uSW50ZXJjZXB0b3IiPg0KICA8cHJvcGVydHkgbmFtZT0idHJhbnNh Y3Rpb25NYW5hZ2VyIj48cmVmIGJlYW49Im15VHJhbnNhY3Rpb25NYW5hZ2VyIi8+PC9wcm9wZXJ0 eT4NCiAgPHByb3BlcnR5IG5hbWU9InRyYW5zYWN0aW9uQXR0cmlidXRlU291cmNlIj4NCiAgICA8 dmFsdWU+DQogICAgICBleGFtcGxlLkV4YW1wbGVCdXNpbmVzc0ludGVyZmFjZS5leGFtcGxlTWV0 aG9kPVBST1BBR0FUSU9OX1JFUVVJUkVEDQogICAgICBleGFtcGxlLkV4YW1wbGVCdXNpbmVzc0lu dGVyZmFjZS5hbm90aGVyRXhhbXBsZU1ldGhvZD1QUk9QQUdBVElPTl9SRVFVSVJFRA0KICAgICAg ZXhhbXBsZS5Bbm90aGVyRXhhbXBsZUJ1c2luZXNzSW50ZXJmYWNlLmV4YW1wbGVNZXRob2Q9UFJP UEFHQVRJT05fUkVRVUlSRUQNCiAgICA8L3ZhbHVlPg0KICA8L3Byb3BlcnR5Pg0KPC9iZWFuPg0K DQpUaGF0IHNob3VsZCB3b3JrIHdpdGggbXVsdGlwbGUgUHJveHlGYWN0b3J5QmVhbnMgdGhhdCBy ZWZlcmVuY2Ugb25lIHNpbmdsZSBUcmFuc2FjdGlvbkludGVyY2VwdG9yLCBhbmQgdGh1cyBhbHNv IHdpdGggQmVhbk5hbWVBdXRvUHJveHlDcmVhdG9yLg0KIA0KSnVlcmdlbg0KIA0K |
|
From: Colin S. <col...@ex...> - 2003-10-15 01:31:27
|
jürgen höller [werk3AT] wrote: >Colin, > > > >>How do you see this being used (if at all) with the current >> >> >TransactionInterceptor, since its TransactionAttributeSource property >gets satisfied via a MethodMapTransactionAttributeSource instance (which >needs definitions in the format 'FQN.methodName'). While this works fine >when doing individual interceptors for use with ProxyFactoryBean, short >of adding new code I'm at a loss as to how I could use >TransactionInterceptor with BeanNameAutoProxy to do transactions on all >methods in all the beans I feed to the auto proxy. > >You need to use one shared TransactionInterceptor instance here, defining the attributes for the transactional methods of all the interfaces and classes involved: ><bean id="exampleTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> > <property name="transactionManager"><ref bean="myTransactionManager"/></property> > <property name="transactionAttributeSource"> > <value> > example.ExampleBusinessInterface.exampleMethod=PROPAGATION_REQUIRED > example.ExampleBusinessInterface.anotherExampleMethod=PROPAGATION_REQUIRED > example.AnotherExampleBusinessInterface.exampleMethod=PROPAGATION_REQUIRED > </value> > </property> ></bean> > >That should work with multiple ProxyFactoryBeans that reference one single TransactionInterceptor, and thus also with BeanNameAutoProxyCreator. > > > Sure, that would work of course. I was thinking more along the lines of being able to handle at least the case of treating _everything_ with a set of specified transaction semantics (e.g. PROPOGATION_REQUIRED), without having to specify individual method matching regexes on each class. There is a use case (especially when you don't care about ultimate 'tuning' or when you want to defer that until later) for just turning on transactions for everything. This seems even more relevant when combine with BeanNameAutoProxy, so that you only have to add one simple bean ref in one place, and you have transactionional wrapping. In my case for example, this would happilly cover the majority of my transaction handling needs, with some fine tuning here and there (using TransactionProxyFactoryBean) for maybe the 10-20% of the remaining cases... Regards, Colin |
|
From: <jue...@we...> - 2003-10-15 08:20:21
|
Q29saW4sDQogDQpUaGlzIGlzIGJhc2ljYWxseSBhYm91dCBhIHNwZWNpYWwgVHJhbnNhY3Rpb25B dHRyaWJ1dGVTb3VyY2UgaW1wbGVtZW50YXRpb24gdGhhdCB3b3VsZCBzaW1wbHkgcmV0dXJuIHRo ZSBzYW1lIFRyYW5zYWN0aW9uQXR0cmlidXRlIGZvciBldmVyeSBtZXRob2QgaW52b2NhdGlvbi4g VGhhdCBzaG91bGQgYmUgZWFzeSBlbm91Z2ggdG8gZG86DQogDQpwdWJsaWMgY2xhc3MgTXlUcmFu c2FjdGlvbkF0dHJpYnV0ZVNvdXJjZSBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uQXR0cmlidXRlU291 cmNlIHsNCiAgcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlIGdldFRyYW5zYWN0aW9uQXR0cmli dXRlKE1ldGhvZEludm9jYXRpb24gaW52b2NhdGlvbikgew0KICAgIHJldHVybiBuZXcgRGVmYXVs dFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uRGVmaW5pdGlvbi5QUk9QQUdBVElPTl9S RVFVSVJFRCk7DQogIH0NCn0NCiANClNpbXBseSBkZWZpbmUgaXQgYXMgYSBiZWFuIHRoZW4sIGxp bmtpbmcgaXQgdG8gVHJhbnNhY3Rpb25JbnRlcmNlcHRvcidzIHRyYW5zYWN0aW9uQXR0cmlidXRl U291cmNlIHByb3BlcnR5IHZpYSBhIGJlYW4gcmVmZXJlbmNlLg0KIA0KQXMgYW4gYWx0ZXJuYXRp dmUsIHdlIGNvdWxkIHJlZmluZSB0aGUgVHJhbnNhY3Rpb25BdHRyaWJ1dGVTb3VyY2VFZGl0b3Ig dG8gYWxsb3cgZm9yIHdpbGRjYXJkcyBub3Qgb25seSBhdCB0aGUgZW5kIG9mIG1ldGhvZCBuYW1l cyBidXQgYWxyZWFkeSBmb3IgdGhlIGNsYXNzbmFtZToNCiANCm5vdCBvbmx5ICJteXBhY2thZ2Uu TXlDbGFzcy5teU1ldGhvZD1QUk9QQUdBVElPTl9SRVFVSVJFRCINCmFuZCAibXlwYWNrYWdlLk15 Q2xhc3MubXkqPVBST1BBR0FUSU9OX1JFUVVJUkVEIg0KYnV0IGFsc28gKGF0IGxlYXN0KSAiKj1Q Uk9QQUdBVElPTl9SRVFVSVJFRCINCiANCkp1ZXJnZW4NCiANCg0KCS0tLS0tVXJzcHLDvG5nbGlj aGUgTmFjaHJpY2h0LS0tLS0gDQoJVm9uOiBDb2xpbiBTYW1wYWxlYW51IFttYWlsdG86Y29saW5t bDFAZXhpcy5jb21dIA0KCUdlc2VuZGV0OiBNaSAxNS4xMC4yMDAzIDAzOjMxIA0KCUFuOiBqw7xy Z2VuIGjDtmxsZXIgW3dlcmszQVRdIA0KCUNjOiBzcHJpbmdmcmFtZXdvcmstZGV2ZWxvcGVyQGxp c3RzLnNvdXJjZWZvcmdlLm5ldCANCglCZXRyZWZmOiBSZTogW1NwcmluZ2ZyYW1ld29yay1kZXZl bG9wZXJdIG5ldyBiZWFuIGZhY3RvcnkgYW5kIGFwcGxpY2F0aW9uIGNvbnRleHQgZmVhdHVyZXMN CgkNCgkNCg0KCVN1cmUsIHRoYXQgd291bGQgd29yayBvZiBjb3Vyc2UuIEkgd2FzIHRoaW5raW5n IG1vcmUgYWxvbmcgdGhlIGxpbmVzIG9mDQoJYmVpbmcgYWJsZSB0byBoYW5kbGUgYXQgbGVhc3Qg dGhlIGNhc2Ugb2YgdHJlYXRpbmcgX2V2ZXJ5dGhpbmdfIHdpdGggYQ0KCXNldCBvZiBzcGVjaWZp ZWQgdHJhbnNhY3Rpb24gc2VtYW50aWNzIChlLmcuIFBST1BPR0FUSU9OX1JFUVVJUkVEKSwNCgl3 aXRob3V0IGhhdmluZyB0byBzcGVjaWZ5IGluZGl2aWR1YWwgbWV0aG9kIG1hdGNoaW5nIHJlZ2V4 ZXMgb24gZWFjaA0KCWNsYXNzLiBUaGVyZSBpcyBhIHVzZSBjYXNlIChlc3BlY2lhbGx5IHdoZW4g eW91IGRvbid0IGNhcmUgYWJvdXQNCgl1bHRpbWF0ZSAndHVuaW5nJyBvciB3aGVuIHlvdSB3YW50 IHRvIGRlZmVyIHRoYXQgdW50aWwgbGF0ZXIpIGZvciBqdXN0DQoJdHVybmluZyBvbiB0cmFuc2Fj dGlvbnMgZm9yIGV2ZXJ5dGhpbmcuIFRoaXMgc2VlbXMgZXZlbiBtb3JlIHJlbGV2YW50DQoJd2hl biBjb21iaW5lIHdpdGggQmVhbk5hbWVBdXRvUHJveHksIHNvIHRoYXQgeW91IG9ubHkgaGF2ZSB0 byBhZGQgb25lDQoJc2ltcGxlIGJlYW4gcmVmIGluIG9uZSBwbGFjZSwgYW5kIHlvdSBoYXZlIHRy YW5zYWN0aW9uaW9uYWwgd3JhcHBpbmcuDQoJDQoJSW4gbXkgY2FzZSBmb3IgZXhhbXBsZSwgdGhp cyB3b3VsZCBoYXBwaWxseSBjb3ZlciB0aGUgbWFqb3JpdHkgb2YgbXkNCgl0cmFuc2FjdGlvbiBo YW5kbGluZyBuZWVkcywgd2l0aCBzb21lIGZpbmUgdHVuaW5nIGhlcmUgYW5kIHRoZXJlICh1c2lu Zw0KCVRyYW5zYWN0aW9uUHJveHlGYWN0b3J5QmVhbikgZm9yIG1heWJlIHRoZSAxMC0yMCUgb2Yg dGhlIHJlbWFpbmluZyBjYXNlcy4uLg0KCQ0KCVJlZ2FyZHMsDQoJQ29saW4NCgkNCgkNCgkNCgkN Cg0K |
|
From: Colin S. <col...@ex...> - 2003-10-15 13:41:11
|
The specialized TransactionAttributeSource approach would work fine.
This is obviously a trivial little class, but it would probably be worth
adding it to Spring itself (with the transaction attribute as a
parameter) so people could just create an instance as needed for this
type of usecase.
W/regards to redefining TransactionAttributeSourceEditor to allow for
wildcards also in the classname, that's a useful feature, but the
internal workings of the class would have to change. Right now, using a
MethodMapTransactionAttributeSource, essentially all the methods of the
specified classes get added to the transactional method map (if they
match the method regex). So this approach wouldn't work for regexes at
the class level. You'd probably have to do matches at runtime, with
consequently slower performance (although I guess you could cache the
hits and misses, to alleviate this, making the performance pretty well
identical on second and subsequent calls to the same method). What do
you think of this idea?
Regards,
Colin
jürgen höller [werk3AT] wrote:
>Colin,
>
>This is basically about a special TransactionAttributeSource implementation that would simply return the same TransactionAttribute for every method invocation. That should be easy enough to do:
>
>public class MyTransactionAttributeSource implements TransactionAttributeSource {
> public TransactionAttribute getTransactionAttribute(MethodInvocation invocation) {
> return new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED);
> }
>}
>
>Simply define it as a bean then, linking it to TransactionInterceptor's transactionAttributeSource property via a bean reference.
>
>As an alternative, we could refine the TransactionAttributeSourceEditor to allow for wildcards not only at the end of method names but already for the classname:
>
>not only "mypackage.MyClass.myMethod=PROPAGATION_REQUIRED"
>and "mypackage.MyClass.my*=PROPAGATION_REQUIRED"
>but also (at least) "*=PROPAGATION_REQUIRED"
>
>Juergen
>
>
> -----Ursprüngliche Nachricht-----
> Von: Colin Sampaleanu [mailto:col...@ex...]
> Gesendet: Mi 15.10.2003 03:31
> An: jürgen höller [werk3AT]
> Cc: spr...@li...
> Betreff: Re: [Springframework-developer] new bean factory and application context features
>
>
>
> Sure, that would work of course. I was thinking more along the lines of
> being able to handle at least the case of treating _everything_ with a
> set of specified transaction semantics (e.g. PROPOGATION_REQUIRED),
> without having to specify individual method matching regexes on each
> class. There is a use case (especially when you don't care about
> ultimate 'tuning' or when you want to defer that until later) for just
> turning on transactions for everything. This seems even more relevant
> when combine with BeanNameAutoProxy, so that you only have to add one
> simple bean ref in one place, and you have transactionional wrapping.
>
> In my case for example, this would happilly cover the majority of my
> transaction handling needs, with some fine tuning here and there (using
> TransactionProxyFactoryBean) for maybe the 10-20% of the remaining cases...
>
> Regards,
> Colin
>
>
>
>
>
>
>
|
|
From: Rod J. <rod...@in...> - 2003-10-15 13:52:45
|
> W/regards to redefining TransactionAttributeSourceEditor to allow for > wildcards also in the classname, that's a useful feature, but the > internal workings of the class would have to change. Right now, using a > MethodMapTransactionAttributeSource, essentially all the methods of the > specified classes get added to the transactional method map (if they > match the method regex). So this approach wouldn't work for regexes at > the class level. You'd probably have to do matches at runtime, with > consequently slower performance (although I guess you could cache the > hits and misses, to alleviate this, making the performance pretty well > identical on second and subsequent calls to the same method). What do > you think of this idea I prototyped such an approach a couple of months ago. The performance seemed not too bad. I haven't committed it. However, maybe I should when I get time, if people are interested. |
|
From: Colin S. <col...@ex...> - 2003-10-15 15:32:51
|
Rod Johnson wrote: >>W/regards to redefining TransactionAttributeSourceEditor to allow for >>wildcards also in the classname, that's a useful feature, but the >>internal workings of the class would have to change. Right now, using a >>MethodMapTransactionAttributeSource, essentially all the methods of the >>specified classes get added to the transactional method map (if they >>match the method regex). So this approach wouldn't work for regexes at >>the class level. You'd probably have to do matches at runtime, with >>consequently slower performance (although I guess you could cache the >>hits and misses, to alleviate this, making the performance pretty well >>identical on second and subsequent calls to the same method). What do >>you think of this idea >> >> > >I prototyped such an approach a couple of months ago. The performance seemed >not too bad. I haven't committed it. However, maybe I should when I get >time, if people are interested. > > I think this would be useful to some people (although the ability to handle the 'all' case with another mechanism like the specialized TransactionalAttributeSource would cover most of my needs).. If there are performance concerns, it could use a dual approach where regexes on methods only (ie everything up to and including the class name is specified) get handled as they do now, and other regexes get handled with a runtime lookup with cache. My feeling is that the runtime lookup with cache would perform well enough though. One consideration is that the config semantics would change in terms of typos. Right now MethodMapTransactionalAttributeSource gives you an exception if you feed it a FQN which can't be resolved, or there are no matching methods. I like the idea of detecting typos in this fashion, if at all possible. Considering that your code may appear to run fine even without the transaction, if you mess up the regex, I think the error detection is valuable. So if the code is extended, maybe one way to do it would be to have two sets of properties, one which behaves exactly like the present property (config time regexes on methods only), and a new one which adds runtime regex matching on the package and class portion as well. Regards, Colin |
|
From: Colin S. <col...@ex...> - 2003-10-15 21:46:00
|
Colin Sampaleanu wrote: > Rod Johnson wrote: > >>> W/regards to redefining TransactionAttributeSourceEditor to allow for >>> wildcards also in the classname, that's a useful feature, but the >>> internal workings of the class would have to change. Right now, using a >>> MethodMapTransactionAttributeSource, essentially all the methods of the >>> specified classes get added to the transactional method map (if they >>> match the method regex). So this approach wouldn't work for regexes at >>> the class level. You'd probably have to do matches at runtime, with >>> consequently slower performance (although I guess you could cache the >>> hits and misses, to alleviate this, making the performance pretty well >>> identical on second and subsequent calls to the same method). What do >>> you think of this idea >>> >> >> >> I prototyped such an approach a couple of months ago. The performance >> seemed >> not too bad. I haven't committed it. However, maybe I should when I get >> time, if people are interested. >> >> > I think this would be useful to some people (although the ability to > handle the 'all' case with another mechanism like the specialized > TransactionalAttributeSource would cover most of my needs).. > > If there are performance concerns, it could use a dual approach where > regexes on methods only (ie everything up to and including the class > name is specified) get handled as they do now, and other regexes get > handled with a runtime lookup with cache. My feeling is that the > runtime lookup with cache would perform well enough though. One > consideration is that the config semantics would change in terms of > typos. Right now MethodMapTransactionalAttributeSource gives you an > exception if you feed it a FQN which can't be resolved, or there are > no matching methods. I like the idea of detecting typos in this > fashion, if at all possible. Considering that your code may appear to > run fine even without the transaction, if you mess up the regex, I > think the error detection is valuable. So if the code is extended, > maybe one way to do it would be to have two sets of properties, one > which behaves exactly like the present property (config time regexes > on methods only), and a new one which adds runtime regex matching on > the package and class portion as well. > > Regards, > Colin For the time being I have added a new class MatchAllwaysTransactionAttributeSource, which will always return the same TransactionAttribute (which may be set, otherwise it will default to PROPOGATION_REQUIRED). I also tried to check in a unit test for it, but Eclipse barfed, then Tortoise as well on a re-attempt, with the error you get when there is a file in the attic wth the same name but a different case. This is definitely not the case, since this is a new file. Here's the error message from Tortoise. I don't know what to do since we don't have physical access to the repo to see what is going on. ----- In D:\src\open\spring-colin\spring: cvs -q commit -m "add MatchAllwaysTransactionAttributeSource, which returns the same TransactionAttribute for all methods" test/org/springframework/transaction/interceptor/MatchAllwaysTransactionAttributeSourceTest.java CVSROOT=:ext:co...@cv...:/cvsroot/springframework cvs: hash.c:312: findnode: Assertion `key != ((void *)0)' failed. cvs [server aborted]: received abort signal Error, CVS operation failed Tortoise Tip: This error can be caused because there used to be a file in the repository with a name differing only by case from the one you are adding. For example TEST.EXE rather than test.exe. To fix this go into the repository, or get your administrator to, and rename that file to have the same case. It will be in the Attic folder underneath the folder you are in. You will also need to get the local sandbox folder you are in out of CVS again, as it may have bogus entries to the misspelt filename. ----- |
|
From: Colin S. <col...@ex...> - 2003-10-15 22:32:24
|
Colin Sampaleanu wrote: > Colin Sampaleanu wrote: > >> Rod Johnson wrote: >> >>>> W/regards to redefining TransactionAttributeSourceEditor to allow for >>>> wildcards also in the classname, that's a useful feature, but the >>>> internal workings of the class would have to change. Right now, >>>> using a >>>> MethodMapTransactionAttributeSource, essentially all the methods of >>>> the >>>> specified classes get added to the transactional method map (if they >>>> match the method regex). So this approach wouldn't work for regexes at >>>> the class level. You'd probably have to do matches at runtime, with >>>> consequently slower performance (although I guess you could cache the >>>> hits and misses, to alleviate this, making the performance pretty well >>>> identical on second and subsequent calls to the same method). What do >>>> you think of this idea >>>> >>> >>> >>> >>> I prototyped such an approach a couple of months ago. The >>> performance seemed >>> not too bad. I haven't committed it. However, maybe I should when I get >>> time, if people are interested. >>> >>> >> I think this would be useful to some people (although the ability to >> handle the 'all' case with another mechanism like the specialized >> TransactionalAttributeSource would cover most of my needs).. >> >> If there are performance concerns, it could use a dual approach where >> regexes on methods only (ie everything up to and including the class >> name is specified) get handled as they do now, and other regexes get >> handled with a runtime lookup with cache. My feeling is that the >> runtime lookup with cache would perform well enough though. One >> consideration is that the config semantics would change in terms of >> typos. Right now MethodMapTransactionalAttributeSource gives you an >> exception if you feed it a FQN which can't be resolved, or there are >> no matching methods. I like the idea of detecting typos in this >> fashion, if at all possible. Considering that your code may appear to >> run fine even without the transaction, if you mess up the regex, I >> think the error detection is valuable. So if the code is extended, >> maybe one way to do it would be to have two sets of properties, one >> which behaves exactly like the present property (config time regexes >> on methods only), and a new one which adds runtime regex matching on >> the package and class portion as well. >> >> Regards, >> Colin > > > For the time being I have added a new class > MatchAllwaysTransactionAttributeSource, which will always return the > same TransactionAttribute (which may be set, otherwise it will default > to PROPOGATION_REQUIRED). > > I also tried to check in a unit test for it, but Eclipse barfed, then > Tortoise as well on a re-attempt, with the error you get when there is > a file in the attic wth the same name but a different case. This is > definitely not the case, since this is a new file. Here's the error > message from Tortoise. I don't know what to do since we don't have > physical access to the repo to see what is going on. > > ----- > In D:\src\open\spring-colin\spring: cvs -q commit -m "add > MatchAllwaysTransactionAttributeSource, which returns the same > TransactionAttribute for all methods" > test/org/springframework/transaction/interceptor/MatchAllwaysTransactionAttributeSourceTest.java > > CVSROOT=:ext:co...@cv...:/cvsroot/springframework > > cvs: hash.c:312: findnode: Assertion `key != ((void *)0)' failed. > cvs [server aborted]: received abort signal > > Error, CVS operation failed > > Tortoise Tip: This error can be caused because there used to be a file > in the repository with a name differing only by case from the one you > are adding. For example TEST.EXE rather than test.exe. To fix this go > into the repository, or get your administrator to, and rename that > file to have the same case. It will be in the Attic folder underneath > the folder you are in. You will also need to get the local sandbox > folder you are in out of CVS again, as it may have bogus entries to > the misspelt filename. > ----- > > Never mind. Maybe it didn't like the spelling error :-). When I changed the name to MatchAlways..., both files checked in... |
|
From: Colin S. <col...@ex...> - 2003-10-10 17:40:29
|
jürgen höller [werk3AT] wrote:
>Fortunately, this *is* available for XmlBeanFactory too, like as follows --
>with the very same API that XmlWebApplicationContext internally uses to load multiple files.
>
> XmlBeanFactory bf = new XmlBeanFactory();
> bf.loadBeanDefinitions("appCtx1.xml");
> bf.loadBeanDefinitions("appCtx1.xml");
> bf.preInstantiateSingletons();
>
>It's currently not available in FileSystemXmlApplicationContext though, mainly to not place any restrictions on file names in terms of spaces or commas. FileSystemXmlApplicationContext already has a constructor with a String array, for automatically setting up *nested* contexts. We could redefine that constructor to specify multiple files that make up a *single* context, and offer an overloaded version that takes a parent ApplicationContext reference. That way, both multiple files for a single context and nesting would be possible.
>
>
>
That sounds good. There are certain deployment scenarios where config
files references via filenames (as opposed to having to be on the
classpath) are a lot more convenient, and I think. I am trying to think
if there are any use cases where somebody would be feeding in a list of
contexts in the existing implementation, and would be worst off if they
were nested as opposed to flattened into one as you propose. I can't
really think of any. I think the nesting does make a lot of sense when
you are assembling together contexts from different layers which may
already exist (that is, the lower layer(s) may already exist), as per my
multi-webapp usecase, but in this case you are doing it dynamically
anyways, and can't do it as a list.
>-----
>
>What I'm most excited about is the BeanPostProcessor hook. I expect that to be very powerful, as already indicated by the respective test case in StaticApplicationContextSuite. Another example that I've prototyped is the following (not yet in CVS):
>public class AutoProxyCreator implements BeanPostProcessor {
> private List beanNames;
> private Interceptor[] interceptors;
>
> public void setBeanNames(String[] beanNames) {
> this.beanNames = Arrays.asList(beanNames);
> }
>
> public void setInterceptors(Interceptor[] interceptors) {
> this.interceptors = interceptors;
> }
>
> public Object postProcessBean(Object bean, String name, RootBeanDefinition definition) {
> if (this.beanNames != null && this.beanNames.contains(name)) {
> ProxyFactory proxyFactory = new ProxyFactory();
> for (int i = 0; i < this.interceptors.length; i++) {
> proxyFactory.addInterceptor(this.interceptors[i]);
> }
> proxyFactory.addInterceptor(new InvokerInterceptor(bean));
> return proxyFactory.getProxy();
> }
> else {
> return bean;
> }
> }
>}
>
>This is a BeanPostProcessor bean that can be set up as follows to proxy the beans with the given names with the given interceptors. Note that this is only one bean with proxy settings to define, although there might be dozens of target beans with the same proxy behavior.
>
><bean id="autoProxyCreator" class="org.springframework.aop.framework.support.AutoProxyCreator">
> <property name="beanNames"><value>myBean1,myBean2,myBean3</value></property>
> <property name="interceptors>
> <list>
> <ref bean="myInterceptor1"/>
> <ref bean="myInterceptor2"/>
> </list>
> </property>
></bean>
>
>So setting up 10 transactional beans would just involve 1 AutoProxyCreator and 1 transaction interceptor plus the 10 target beans (12 beans in total), instead of 10 TransactionProxyFactoryBeans plus the 10 target beans (20 beans in total). The transaction attributes would be centralized though, in contrast to TransactionProxyFactoryBean that keeps them local per individual proxy definition.
>
>
I really like this. It will reduce boilerplate proxy definitions for 80%
of the code that needs simple wrapping of everything...
|
|
From: Rod J. <rod...@in...> - 2003-10-10 17:59:05
|
>I really like this. It will reduce boilerplate proxy definitions for 80% of the code that needs simple wrapping of everything... I think making common things trivially simple is tremendously important to users (including me!). This is exactly what Microsoft do well, what Java does well and what J2EE doesn't do so well out of the box. We still have all the extensibility features in there for power users, but I'd be happy not to have to use them most of the time. Pareto Principle, anyone? |
|
From: Rod J. <rod...@in...> - 2003-10-10 18:09:02
|
> What I'm most excited about is the BeanPostProcessor hook. I expect that
to be very powerful, as already indicated by the respective test case in
StaticApplicationContextSuite. Another example that I've prototyped is the
following (not yet in CVS):
> public class AutoProxyCreator implements BeanPostProcessor {
> private List beanNames;
> private Interceptor[] interceptors;
>
> public void setBeanNames(String[] beanNames) {
> this.beanNames = Arrays.asList(beanNames);
> }
>
> public void setInterceptors(Interceptor[] interceptors) {
> this.interceptors = interceptors;
> }
>
> public Object postProcessBean(Object bean, String name,
RootBeanDefinition definition) {
> if (this.beanNames != null && this.beanNames.contains(name)) {
> ProxyFactory proxyFactory = new ProxyFactory();
> for (int i = 0; i < this.interceptors.length; i++) {
> proxyFactory.addInterceptor(this.interceptors[i]);
> }
> proxyFactory.addInterceptor(new InvokerInterceptor(bean));
> return proxyFactory.getProxy();
> }
> else {
> return bean;
> }
> }
> }
> Of course, source-level metadata would allow for just 1 BeanPostProcessor
plus the 10 target beans (11 beans in total), with the transaction
attributes being kept with the respective methods in the source code. This
would just get rid of 1 bean but of a pretty bloated one: the
TransactionInterceptor definition with its centralized transaction
attributes for the whole app.
This _is_ exciting.
Source-level metadata might also mean we wouldn't need to know the names of
the transactional beans. We sould simply need to install a BeanPostProcessor
that would look up metadata. It could work with arbitrary attributes,
depending on registered "attribute scanners".
Combined with good metadata support, I think we can match the ease of use of
.NET for enterprise services in M3. I have always seen this as the killer
application for Spring AOP.
Regards,
Rod
|
|
From: Colin S. <col...@ex...> - 2003-10-14 21:49:22
|
jürgen höller [werk3AT] wrote: >... > >This is a BeanPostProcessor bean that can be set up as follows to proxy the beans with the given names with the given interceptors. Note that this is only one bean with proxy settings to define, although there might be dozens of target beans with the same proxy behavior. > ><bean id="autoProxyCreator" class="org.springframework.aop.framework.support.AutoProxyCreator"> > <property name="beanNames"><value>myBean1,myBean2,myBean3</value></property> > <property name="interceptors> > <list> > <ref bean="myInterceptor1"/> > <ref bean="myInterceptor2"/> > </list> > </property> ></bean> > >So setting up 10 transactional beans would just involve 1 AutoProxyCreator and 1 transaction interceptor plus the 10 target beans (12 beans in total), instead of 10 TransactionProxyFactoryBeans plus the 10 target beans (20 beans in total). The transaction attributes would be centralized though, in contrast to TransactionProxyFactoryBean that keeps them local per individual proxy definition. > > > Hi Juergen, How do you see this being used (if at all) with the current TransactionInterceptor, since its TransactionAttributeSource property gets satisfied via a MethodMapTransactionAttributeSource instance (which needs definitions in the format 'FQN.methodName'). While this works fine when doing individual interceptors for use with ProxyFactoryBean, short of adding new code I'm at a loss as to how I could use TransactionInterceptor with BeanNameAutoProxy to do transactions on all methods in all the beans I feed to the auto proxy. Just wondering if I missed something? Regards, Colin |