|
From: <jue...@we...> - 2003-07-17 06:10:59
|
VGhvbWFzLA0KIA0KVGhlIHJlYXNvbiB3aHkgdGhlcmUgaXMgbm8gYXV0b21hdGljIHN1cHBvcnQg Zm9yIEludGVnZXIgb3IgRGF0ZSBpcyB0aGF0IGl0J3MgdW5jbGVhciBob3cgdG8gcGFyc2UgdGhl bSBieSBkZWZhdWx0LiBBcyB5b3Ugbm90ZWQsIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgd2F5IHRv IGhhbmRsZSBlbXB0eSB2YWx1ZXMgd2hlbiBiaW5kaW5nIHRvIEludGVnZXIsIGFuZCBwYXJzaW5n IGZsb2F0aW5nIHBvaW50IGRlY2ltYWxzIGlzIGxvY2FsZS1zcGVjaWZpYyAoZS5nLiAiMTIzNC41 IiBpbiBFbmdsaXNoIHZzICIxLjIzNCw1IiBpbiBHZXJtYW4gbm90YXRpb24pLCBhcyBpcyBwYXJz aW5nIERhdGVzLiBUaGF0J3Mgd2h5IEkgaW50cm9kdWNlZCBDdXN0b21EYXRlRWRpdG9yLCBDdXN0 b21OdW1iZXJFZGl0b3IsIGFuZCBDdXN0b21Cb29sZWFuRWRpdG9yOiBUaGV5IGFsbG93IHlvdSB0 byBzcGVjaWZ5IHRoZSBleGFjdCBwYXJzaW5nIGJlaGF2aW9yLCBkZXBlbmRpbmcgb24gdGhlIGN1 cnJlbnQgX3JlcXVlc3RfLCB0byBiZSBhYmxlIHRvIHJlc3BlY3QgY3VycmVudCBsb2NhbGUgZXRj Lg0KIA0KTm90ZSB0aGF0IHRoZXNlIGVkaXRvcnMgZG8gbm90IG9ubHkgcGFyc2Ugc3RyaW5ncyBp bnRvIHRoZSByZXNwZWN0aXZlIHByb3BlcnR5IHR5cGUgYnV0IGFsc28gdmljZSB2ZXJzYSwgYmVp bmcgYXBwbGllZCBvbiBFcnJvcnMuZ2V0RmllbGRWYWx1ZS4gU28gbG9jYWxlLXNwZWNpZmljIGZv cm0gZmllbGQgdmFsdWVzIGNhbiBiZSBzZXQgdG8gcmVzcGVjdGl2ZSBiZWFuIHByb3BlcnRpZXMg YnV0IGFsc28gcmVuZGVyZWQgaW4gYSBzdWl0YWJsZSB3YXkgb24gcmVkaXNwbGF5IG9mIHRoZSBm b3JtIChlLmcuIHZpYSB0aGUgYmluZCB0YWcpLiBXaXRob3V0IHByb3BlciBmcmFtZXdvcmsgc3Vw cG9ydCwgc3VjaCBzdHVmZiBjYW4gYmUgcXVpdGUgdGVkaW91cyB0byB3cml0ZS4gVHJ5IHRvIGFj aGlldmUgdGhpcyB3aXRoIGEgU3RydXRzIEFjdGlvbkZvcm0sIGZvciBleGFtcGxlOiBFdmVyeSBz dWNoIGZpZWxkIGhhZCB0byBiZSBhIFN0cmluZyB0aGVyZSB0byBhY2NlcHQgaW52YWxpZCB2YWx1 ZXMsIGFuZCB5b3Ugd291bGQgaGF2ZSB0byBkbyBhbGwgdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXJz aW5nIGFuZCByZW5kZXJpbmcgeW91cnNlbGYuDQogDQpCVFcsIHdlIHVzZSBib3RoIEN1c3RvbURh dGVFZGl0b3IgYW5kIEN1c3RvbU51bWJlckVkaXRvciBpbiBwcmFjdGljZSBhdCB3ZXJrM0FULiBG b3IgdXMsIHRoaXMgcGF0dGVybiBpcyBjb252ZW5pZW50IGFuZCB3b3JrcyBuaWNlbHkuDQogDQpS ZWdhcmRpbmcgZGlzdGluY3QgInR5cGVNaXNtYXRjaCIgZXJyb3IgbWVzc2FnZXM6IEtlbiwgYXMg eW91J3ZlIG5vdGVkLCB5b3UgY2FuIHNwZWNpZnkgInR5cGVNaXNtYXRjaC5teUZpZWxkIiBtZXNz YWdlcyBmb3IgdHlwZSBtaXNtYXRjaGVzIG9uIHRoZSByZXNwZWN0aXZlIGZpZWxkLiBEb24ndCBm b3JnZXQgdGhhdCB5b3UgY2FuIGV2ZW4gc3BlY2lmeSAidHlwZU1pc21hdGNoLm15QmVhbi5teUZp ZWxkIiBtZXNzYWdlcyBmb3IgdHlwZSBtaXNtYXRjaGVzIG9uIHRoZSByZXNwZWN0aXZlIGZpZWxk IG9mIHRoZSByZXNwZWN0aXZlIGJlYW4gKCJteUJlYW4iIGJlaW5nIHRoZSBuYW1lIG9mIHRoZSBi ZWFuIGluIHRoZSBtb2RlbCkhIFdoYXQgbW9yZSBmaW5lLWdyYW51bGFyIHdheSBvZiBhc3NvY2lh dGluZyBtZXNzYWdlcyB3b3VsZCB5b3UgbmVlZD8NCiANClRob21hcywgaWYgeW91J2QgbGlrZSB0 byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIHRvIEN1c3RvbU51bWJlckVkaXRvciwgZS5nLiBCaWdE ZWNpbWFsIGFuZCBCaWdJbnRlZ2VyIHN1cHBvcnQgYXMgeW91J3ZlIHByb3Bvc2VkLCBwbGVhc2Ug Z28gYWhlYWQhIFdlIGNhbiBkZWZpbml0ZWx5IGJlbmVmaXQgZnJvbSBtb3JlIHR5cGUgcGFyc2lu ZyBhbmQgcmVuZGVyaW5nIG9wdGlvbnMuDQogDQpSZWdhcmRzLA0KSnVlcmdlbg0KIA0KIA0KDQoJ LS0tLS1VcnNwcsO8bmdsaWNoZSBOYWNocmljaHQtLS0tLSANCglWb246IEtlbiBLcmVicyBbbWFp bHRvOmtrQGtrdGVjLmNvbV0gDQoJR2VzZW5kZXQ6IE1pIDE2LjA3LjIwMDMgMjI6NTIgDQoJQW46 IHRyaXNiZXJnQHRyaWRiLmNvbSANCglDYzogc3ByaW5nZnJhbWV3b3JrLWRldmVsb3BlckBsaXN0 cy5zb3VyY2Vmb3JnZS5uZXQgDQoJQmV0cmVmZjogW1NwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXJd IFByb3BlcnR5RWRpdGluZw0KCQ0KCQ0KCVRob21hcywNCgkNCgk8VGhvbWFzPg0KCUFsc28sIGlz IHRoZXJlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZWVuIGEgYmxhbmsgYW5kIGFuDQoJaW52 YWxpZCBudW1iZXIgLSBJIGdldCB0eXBlTWlzbWF0Y2ggZm9yIGJvdGgsIGJ1dCBzb21ldGltZXMg YSBibGFuayBjb3VsZCBiZSBPSy4NCgk8L1Rob21hcz4NCgkNCglJZiB5b3Ugb3ZlcnJpZGUgaW5p dEJpbmRlcigpIGluIHlvdXIgRm9ybSB0byBpbnN0YWxsIGEgQ3VzdG9tTnVtYmVyRWRpdG9yLCB5 b3UgY2FuIHNwZWNpZnkgYWxsb3dFbXB0eT10cnVlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBhbGxv dyBhbiBlbXB0eSBTdHJpbmcgdG8gcGFzcyB0aHJvdWdoLiBZb3UgY2FuIHRoZW4gaGFuZGxlIHRo ZSBlbXB0eSBTdHJpbmcgaW4geW91ciBWYWxpZGF0b3IgaWYgeW91IHdpc2guDQoJDQoJSXQgc2Vl bXMgdG8gbWUgdGhhdCBQcm9wZXJ0eUVkaXRvcnMgY291bGQgYmUgZmVydGlsZSBncm91bmQgZm9y IHVzZWZ1bCBleHRlbnNpb24uDQoJDQoJSSBkbyB0aGluayB3ZSBuZWVkIHNvbWV0aGluZyBtb3Jl IGZsZXhpYmxlIGluIHRoZSB3YXkgQmVhbldyYXBwZXJJbXBsLCBQcm9wZXJ0eUVkaXRvcnMsIGFu ZCBWYWxpZGF0b3JzIGNvb3JkaW5hdGUgZXJyb3IgaGFuZGxpbmcuIFRoZSB0eXBlTWlzbWF0Y2gg ZXJyb3Igc3RyaW5ncyBhcmUgdGllZCB0byBhIHBhcnRpY3VsYXIgZmllbGROYW1lIGJ1dCB0aGUg c2FtZSBmaWVsZE5hbWUgY291bGQgcG9zc2libHkgYmUgdXNlZCBvbiBkaWZmZXJlbnQgRm9ybXMg dG8gZnVsZmlsbCBhIHNvbWV3aGF0IGRpZmZlcmVudCBmdW5jdGlvbi4gSXQncyBub3QgY2xlYXIg aW4gbXkgbWluZCB5ZXQgd2hhdCB0aGUgcmlnaHQgbWVjaGFuaXNtIGZvciBkb2luZyB0aGlzIGlz Lg0KCQ0KCVJlZ2FyZHMsDQoJS2VuDQoJIA0KCXRyaXNiZXJnQHRyaWRiLmNvbSB3cm90ZToNCgkN Cg0KCQlLZW4sDQoJCQ0KCQlUaGFua3MsIHRoYXQgbWFrZXMgaXQgY2xlYXJlci4NCgkJDQoJCUl0 IHNlZW1zIHRvIG1lIHRob3VnaCB0aGF0IHRoZSBiZWFuIGZhY3RvcmllcyBzdXBwb3J0IGRpZmZl cmVudCBkZWZhdWx0IG1hcHBpbmdzDQoJCWNvbXBhcmVkIHRvIHdoYXQgaXMgcHJvdmlkZWQgaW4g dGhlIGJpbmRpbmcgb2YgZm9ybSBmaWVsZHMuICBJIGNhbiBtYXAgdG8gYW4NCgkJSW50ZWdlciBp biBhIGJlYW4sIGJ1dCBub3QgaW4gYSBmb3JtIHdpdGhvdXQgZ2V0dGluZyBpbnRvIHByb3ZpZGlu ZyBhIGN1c3RvbQ0KCQlQcm9wZXJ0eUVkaXRvci4gIEFsc28sIGlzIHRoZXJlIGEgd2F5IHRvIGRp c3Rpbmd1aXNoIGJldHdlZWVuIGEgYmxhbmsgYW5kIGFuDQoJCWludmFsaWQgbnVtYmVyIC0gSSBn ZXQgdHlwZU1pc21hdGNoIGZvciBib3RoLCBidXQgc29tZXRpbWVzIGEgYmxhbmsgY291bGQgYmUg T0suDQoJCSBJZiB3ZSBzdXBwb3J0ZWQgSW50ZWdlciwgdGhlbiB0aGF0IHNob3VsZCBtYXAgdG8g YSBudWxsLCBhbmQgSSBjb3VsZCBkbyBteSBvbg0KCQl2YWxpZGF0aW9uIGluIGEgVmFsaWRhdG9y IGNsYXNzLiAgQW0gSSBtaXNzaW5nIHNvbWV0aGluZyBoZXJlPw0KCQkNCgkJSSBoYXZlIG5vdCBz cGVudCBhIGxvdCBvZiB0aW1lIGxvb2tpbmcgdGhyb3VnaCB0aGUgc291cmNlIGNvZGUsIGJ1dCB0 aGVyZSBzZWVtcw0KCQl0byBiZSBzb21lIGFkZGl0aW9uYWwgbWFwcGluZyB0aGF0IHdlIHNob3Vs ZCBwcm92aWRlIGluIHRoZSBkZWZhdWx0IHNldHVwLiAgV2UNCgkJZG9uJ3Qgc2VlbSB0byBzdXBw b3J0IG1hcHBpbmcgYSBudW1lcmljIHN0cmluZyB0byBhIGphdmEubWF0aC5CaWdEZWNpbWFsLCBi dXQNCgkJdGhhdCBpcyBzb21ldGhpbmcgSSB0aGluayB3b3VsZCBiZSBoYW5keSBmb3IgZW50ZXJp bmcgbW9uZXRhcnkgYW1vdW50cyBldGMuICBJZg0KCQlhbnlib2R5IGlzIGFscmVhZHkgd29ya2lu ZyBvbiBhbnkgb2YgdGhpcywgbGV0IG1lIGtub3cgLSBpZiBub3QgSSdsbCBzcGVuZCBzb21lDQoJ CW1vcmUgdGltZSBhZGRpbmcgc29tZSBmdW5jdGlvbmFsaXR5Lg0KCQkNCgkJVGhvbWFzDQoJCQ0K CQkgIA0KDQoJCQlUaG9tYXMsDQoJCQkNCgkJCUp1ZXJnZW4gc2hvd2VkIG1lIGEgd2F5IHRvIGhh bmRsZSBhIHNpbWlsYXIgc2l0dWF0aW9uIGZvciBQZXRjbGluaWMncyANCgkJCURhdGUgZW50cnkg cmVxdWlyZW1lbnRzLg0KCQkJDQoJCQk8SnVlcmdlbj4NCgkJCQ0KCQkJDQoJCQlZb3UgY2FuIGVh c2lseSByZXBsYWNlIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgYnkgZGVmaW5pbmcgYSANCgkJ CU1lc3NhZ2VTb3VyY2UsIGkuZS4gYSAibWVzc2FnZXMucHJvcGVydGllcyIgYnVuZGxlIG9yIHRo ZSBsaWtlLiBJZiB5b3UgDQoJCQlkZWZpbmUgYSBtZXNzYWdlIGZvciB0aGUga2V5ICJ0eXBlTWlz bWF0Y2giIHRoZXJlLCB5b3UnbGwgc2VlIHRoYXQgDQoJCQltZXNzYWdlIGluIHlvdXIgZm9ybSBp biBjYXNlIG9mIGFuIGVycm9yIHdpdGggY29kZSAidHlwZU1pc21hdGNoIi4gWW91IA0KCQkJY2Fu IGV2ZW4gZGVmaW5lIG1vcmUgc3BlY2lmaWMgbWVzc2FnZXMgbGlrZSBmb3IgInR5cGVNaXNtYXRj aC5teUZpZWxkIiANCgkJCW9yIGV2ZW4gInR5cGVNaXNtYXRjaC5teU9iamVjdC5teUZpZWxkIiB0 aGF0IHdpbGwgb25seSBnZXQgdXNlZCBvbiB0aGUgDQoJCQlzcGVjaWZpZWQgZmllbGQgcmVzcC4g b2JqZWN0IGFuZCBmaWVsZC4gT2YgY291cnNlIHRoaXMgd29ya3Mgd2l0aCB5b3VyIA0KCQkJb3du IGVycm9yIGNvZGVzIHRoYXQgeW91ciBvd24gdmFsaWRhdG9yIHByb2R1Y2VzIHRvby4gU2VlIHRo ZSBGaWVsZEVycm9yIA0KCQkJamF2YWRvYyBmb3IgZGV0YWlscy4NCgkJCQ0KCQkJPC9KdWVyZ2Vu Pg0KCQkJDQoJCQlUaGUgbWVzc2FnZSBnZXRzIHRyaWdnZXJlZCB2aWEgYW4gSWxsZWdhbEFyZ3Vt ZW50RXhjZXB0aW9uIHRocm93biBieSB0aGUgDQoJCQlQcm9wZXJ0eUVkaXRvci4gVGhlIGhhbmRs ZXIgdGhhdCBjYXRjaGVzIHRoZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gDQoJCQlhbmQgdHJp Z2dlcnMgdGhlIG1lc3NhZ2UgaXMgZG9UeXBlQ29udmVyc2lvbklmTmVjZXNzYXJ5KCkgaW4gDQoJ CQlCZWFuV3JhcHBlckltcGwuIFlvdSBtYXkgYWxzbyB3YW50IHRvIGhhdmUgYSBsb29rIGF0IA0K CQkJYmVhbnMucHJvcGVydHllZGl0b3JzLkN1c3RvbU51bWJlckVkaXRvci4gUGV0Y2xpbmljJ3Mg QWJzdHJhY3RDbGluaWNGb3JtIA0KCQkJc2hvd3MgaG93IHRvIGluc3RhbGwgYSBwcm9wZXJ0eSBl ZGl0b3IgaW4gaXQncyBvdmVycmlkZSBvZiANCgkJCUJhc2VDb21tYW5kQ29udHJvbGxlci5pbml0 QmluZGVyKCkuDQoJCQkNCgkJCVJlZ2FyZHMsDQoJCQlLZW4NCgkJCQ0KCQkJdHJpc2JlcmdAdHJp ZGIuY29tIHdyb3RlOg0KCQkJDQoJCQkgICAgDQoNCgkJCQlLZW4gYW5kIEFsbCwNCgkJCQkNCgkJ CQlBcmUgdGhlcmUgYW55IGV4YW1wbGVzIHdoZXJlIHRoZSBIVE1MIEZvcm0gaGFzIHNvbWUgaW5w dXQgZmllbGRzIHRoYXQgYXJlDQoJCQkJICAgICAgDQoNCgkJCXVzZWQNCgkJCSAgICANCg0KCQkJ CXRvIGVudGVyIG51bWVyaWMgdmFsdWVzLiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gaGFuZGxl IG5vbiBudW1lcmljIGlucHV0DQoJCQkJICAgICAgDQoNCgkJCWZvcg0KCQkJICAgIA0KDQoJCQkJ bnVtZXJpYyBmaWVsZHM/ICBJJ20gdHJ5aW5nIHRvIGJpbmQgdG8gYSBjb21tYW5kT2JqZWN0IHRo YXQgaGFzIGEgZmllbGQgdGhhdA0KCQkJCSAgICAgIA0KDQoJCQlpcw0KCQkJICAgIA0KDQoJCQkJ YW4gaW50ZWdlci4NCgkJCQkNCgkJCQlJIGhhdmUgdHJpZWQgdXNpbmcgYW4gaW50IGFuZCBpdCB3 b3JrcyBpZiBJIGVudGVyIGEgbnVtYmVyIGJ1dCBpZiBJIGxlYXZlDQoJCQkJICAgICAgDQoNCgkJ CXRoZQ0KCQkJICAgIA0KDQoJCQkJZmllbGQgYmxhbmsgb3IgZW50ZXIgYW4gbm9uIG51ZXJpYyB2 YWx1ZSwgdGhlbiBJIGdldCB0aGUgZm9sbG93aW5nIGVycm9yDQoJCQkJICAgICAgDQoNCgkJCW1l c3NhZ2UNCgkJCT5mcm9tIHRoZSBiaW5kIGR1cmluZyB2YWxpZGF0aW9uOg0KCQkJICAgIA0KDQoJ CQkJRmFpbGVkIHRvIGNvbnZlcnQgcHJvcGVydHkgdmFsdWUgb2YgdHlwZSBbamF2YS5sYW5nLlN0 cmluZ10gdG8gcmVxdWlyZWQNCgkJCQkgICAgICANCg0KCQkJdHlwZQ0KCQkJICAgIA0KDQoJCQkJ W2ludF07IG5lc3RlZCBleGNlcHRpb24gaXM6IGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRp b246IEZvciBpbnB1dA0KCQkJCSAgICAgIA0KDQoJCQlzdHJpbmc6ICIiDQoJCQkgICAgDQoNCgkJ CQlVc2luZyBhbiBJbnRlZ2VyIGl0IGRvZXMgbm90IHdvcmsgYXQgYWxsIC0gSSBnZXQgdGhpcyBl cnJvciBtZXNzYWdlOg0KCQkJCQ0KCQkJCUZhaWxlZCB0byBjb252ZXJ0IHByb3BlcnR5IHZhbHVl IG9mIHR5cGUgW2phdmEubGFuZy5TdHJpbmddIHRvIHJlcXVpcmVkDQoJCQkJICAgICAgDQoNCgkJ CXR5cGUNCgkJCSAgICANCg0KCQkJCVtqYXZhLmxhbmcuSW50ZWdlcl07IG5lc3RlZCBleGNlcHRp b24gaXM6DQoJCQkJICAgICAgDQoNCgkJCWphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRp b246DQoJCQkgICAgDQoNCgkJCQlhcmd1bWVudCB0eXBlIG1pc21hdGNoDQoJCQkJDQoJCQkJVGhv bWFzDQoJCQkJDQoJCQkJDQoJCQkJIA0KCQkJCQ0KCQkJCSAgICAgIA0KDQoJCQkgICAgDQoNCgkJ DQoJCQ0KCQkgIA0KDQoNCg== |
|
From: Ken K. <kk...@kk...> - 2003-07-17 14:57:24
|
Juergen,
Way cool!! I guess it is pretty flexible, as I should have suspected ;-)
. I'll be sure to discuss this in the petclinic tutorial.
Ken
jürgen höller [werk3AT] wrote:
>Thomas,
>
>The reason why there is no automatic support for Integer or Date is that it's unclear how to parse them by default. As you noted, there is more than one way to handle empty values when binding to Integer, and parsing floating point decimals is locale-specific (e.g. "1234.5" in English vs "1.234,5" in German notation), as is parsing Dates. That's why I introduced CustomDateEditor, CustomNumberEditor, and CustomBooleanEditor: They allow you to specify the exact parsing behavior, depending on the current _request_, to be able to respect current locale etc.
>
>Note that these editors do not only parse strings into the respective property type but also vice versa, being applied on Errors.getFieldValue. So locale-specific form field values can be set to respective bean properties but also rendered in a suitable way on redisplay of the form (e.g. via the bind tag). Without proper framework support, such stuff can be quite tedious to write. Try to achieve this with a Struts ActionForm, for example: Every such field had to be a String there to accept invalid values, and you would have to do all the locale-specific parsing and rendering yourself.
>
>BTW, we use both CustomDateEditor and CustomNumberEditor in practice at werk3AT. For us, this pattern is convenient and works nicely.
>
>Regarding distinct "typeMismatch" error messages: Ken, as you've noted, you can specify "typeMismatch.myField" messages for type mismatches on the respective field. Don't forget that you can even specify "typeMismatch.myBean.myField" messages for type mismatches on the respective field of the respective bean ("myBean" being the name of the bean in the model)! What more fine-granular way of associating messages would you need?
>
>Thomas, if you'd like to add additional options to CustomNumberEditor, e.g. BigDecimal and BigInteger support as you've proposed, please go ahead! We can definitely benefit from more type parsing and rendering options.
>
>Regards,
>Juergen
>
>
>
> -----Ursprüngliche Nachricht-----
> Von: Ken Krebs [mailto:kk...@kk...]
> Gesendet: Mi 16.07.2003 22:52
> An: tri...@tr...
> Cc: spr...@li...
> Betreff: [Springframework-developer] PropertyEditing
>
>
> Thomas,
>
> <Thomas>
> Also, is there a way to distinguish betweeen a blank and an
> invalid number - I get typeMismatch for both, but sometimes a blank could be OK.
> </Thomas>
>
> If you override initBinder() in your Form to install a CustomNumberEditor, you can specify allowEmpty=true in the constructor to allow an empty String to pass through. You can then handle the empty String in your Validator if you wish.
>
> It seems to me that PropertyEditors could be fertile ground for useful extension.
>
> I do think we need something more flexible in the way BeanWrapperImpl, PropertyEditors, and Validators coordinate error handling. The typeMismatch error strings are tied to a particular fieldName but the same fieldName could possibly be used on different Forms to fulfill a somewhat different function. It's not clear in my mind yet what the right mechanism for doing this is.
>
> Regards,
> Ken
>
>
>
|