Return-Path: Delivered-To: apmail-ibatis-user-java-archive@www.apache.org Received: (qmail 36777 invoked from network); 3 Jan 2010 02:42:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 3 Jan 2010 02:42:47 -0000 Received: (qmail 27657 invoked by uid 500); 3 Jan 2010 02:42:46 -0000 Delivered-To: apmail-ibatis-user-java-archive@ibatis.apache.org Received: (qmail 27565 invoked by uid 500); 3 Jan 2010 02:42:46 -0000 Mailing-List: contact user-java-help@ibatis.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user-java@ibatis.apache.org Delivered-To: mailing list user-java@ibatis.apache.org Received: (qmail 27557 invoked by uid 99); 3 Jan 2010 02:42:46 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 03 Jan 2010 02:42:46 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: local policy) Received: from [209.85.210.202] (HELO mail-yx0-f202.google.com) (209.85.210.202) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 03 Jan 2010 02:42:36 +0000 Received: by yxe40 with SMTP id 40so13840036yxe.28 for ; Sat, 02 Jan 2010 18:42:13 -0800 (PST) Received: by 10.100.17.7 with SMTP id 7mr11667833anq.194.1262486533563; Sat, 02 Jan 2010 18:42:13 -0800 (PST) Received: from mail-iw0-f197.google.com (mail-iw0-f197.google.com [209.85.223.197]) by mx.google.com with ESMTPS id 20sm16238036iwn.1.2010.01.02.18.42.12 (version=SSLv3 cipher=RC4-MD5); Sat, 02 Jan 2010 18:42:12 -0800 (PST) Received: by iwn35 with SMTP id 35so9734329iwn.4 for ; Sat, 02 Jan 2010 18:42:12 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.153.69 with SMTP id j5mr2608325ibw.33.1262486532041; Sat, 02 Jan 2010 18:42:12 -0800 (PST) In-Reply-To: <8c7de9a60912311905r60471dcfpc4358b169fd8a114@mail.gmail.com> References: <8c7de9a60912302141j5c4c0c82uf6ef27eecf3daa8e@mail.gmail.com> <16178eb10912310800r383a9eecn4ac768073d50707a@mail.gmail.com> <8c7de9a60912311905r60471dcfpc4358b169fd8a114@mail.gmail.com> Date: Sat, 2 Jan 2010 21:42:11 -0500 Message-ID: <8c7de9a61001021842u4722c8a2pa0e2bedae9f947bd@mail.gmail.com> Subject: Re: Scala object support in iBATIS 3 From: Chris Reeves To: user-java@ibatis.apache.org Content-Type: multipart/mixed; boundary=001636d33c7c46ab06047c398d0d X-Virus-Checked: Checked by ClamAV on apache.org --001636d33c7c46ab06047c398d0d Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable For those who may be interested, here is my implementation of a scala object wrapper. It includes an abstract base class that could be used to implement a plain javabean wrapper, a javabean wrapper that uses method names that don't exactly match the property name (i.e. first_name -> getFirstName/setFirstName), etc. If for some reason you don't want to use reflection, you could also use this support to generate static wrappers for your domain objects. I'm not sure where else reflection is used in iBATIS though, so that may not be useful. Thanks, Chris On Thu, Dec 31, 2009 at 10:05 PM, Chris Reeves wrote: > Thanks Clinton; for an excellent mapper that's well designed and for > the pointers. > > Here is what I came up with for an object wrapper factory. I don't > really like keeping it in static field on MetaObject, but I couldn't > come up with anything better. I'm not entirely certain the xml > configuration part is done correctly, but it adds > in the same > way as ObjectFactory. > > I was hoping to be able to subclass BeanWrapper to accomplish my goal > of supporting scala objects, but it looks like it delegates to much to > Reflector and MetaClass. I will post my code for a scala object > wrapper and more generic base class when I complete it, if anyone is > interested. > > Thanks, Chris > > > > On Thu, Dec 31, 2009 at 11:00 AM, Clinton Begin = wrote: >> For both cases, I believe all necessary changes would be in the wrappers= . >> However, there are places where Map is treated like a special case.=A0 B= ut as >> long as you stick to making a peer to the bean wrapper, then you should = be >> fine. >> >> While there's no factory class, the MetaObject framework uses a factory >> method w/ delegates rather than a constructor, and is aware of all known >> implementations. >> >> =A0 private MetaObject(Object object, ObjectFactory objectFactory) { >> =A0=A0=A0 this.originalObject =3D object; >> =A0=A0=A0 this.objectFactory =3D objectFactory; >> =A0=A0=A0 if (object instanceof ObjectWrapper) { >> =A0=A0=A0=A0=A0 this.objectWrapper =3D (ObjectWrapper) object; >> =A0=A0=A0 } else if (object instanceof Map) { >> =A0=A0=A0=A0=A0 this.objectWrapper =3D new MapWrapper(this, (Map) object= ); >> =A0=A0=A0 } else { >> =A0=A0=A0=A0=A0 this.objectWrapper =3D new BeanWrapper(this, object); >> =A0=A0=A0 } >> =A0 } >> >> =A0 public static MetaObject forObject(Object object, ObjectFactory >> objectFactory) { >> =A0=A0=A0 if (object =3D=3D null) { >> =A0=A0=A0=A0=A0 return NULL_META_OBJECT; >> =A0=A0=A0 } else { >> =A0=A0=A0=A0=A0 return new MetaObject(object, objectFactory); >> =A0=A0=A0 } >> =A0 } >> >> >> So perhaps one implementation could be a 3rd party wrapper factory that = can >> provide the new delegate.=A0 It should be easy for you to code this, but= the >> pain in the butt always comes down to where to configure such a thing.= =A0 I >> suppose just a new root config level element like > type=3D"com.something.ScalaObjectWrappperFactory"/>=A0 The factory could= have a >> method like:=A0=A0 isWrapperFor(Class type). >> >> Sounds perfectly possible.=A0 Then we could add external support for thi= ngs >> like dynabeans etc. >> >> Also, for Martin, I _think_ this might be all that is needed to create >> support for custom column translations like:=A0 first_name =3D> firstNam= e etc. >> >> Clinton >> >> >> >> On Thu, Dec 31, 2009 at 5:11 AM, Martin Ellis wrot= e: >>> >>> 2009/12/31 Chris Reeves : >>> > I would like to add support for scala objects to iBATIS 3 for a >>> > project I'm working on, and I have a few questions before I dive in >>> > too deep. >>> >>> Sounds interesting. >>> I assume you're referring to the need to call foo_=3D instead of setFoo= . >>> >>> > This would allow the scala support to be added to the >>> > project in a contrib module so the main project would have no >>> > dependencies on the scala libraries, as I will probably use the >>> > ScalaObject marker interface to create the appropriate wrapper. Of >>> > course, if no one else is interested in native scala object support, >>> > this is moot. >>> >>> Not sure I follow. =A0Is there any benefit in casting to ScalaObject? I >>> wonder whether it's possible to reference the ScalaObject interface by >>> name only (hence, no need to link to it). >>> >>> Another option (if you do want to link to the scala libraries) might >>> be to make it an optional dependency. =A0Currently, iBATIS has build >>> dependencies on all sorts of logging frameworks, but they're all >>> optional at runtime. =A0Could do a similar thing with the scala libs (I >>> assume you're thinking about writing the integration in Java). >>> >>> > However, other getter/setter naming strategies that don't conform to >>> > the javabeans spec could also be plugged in if there was a >>> > configurable wrapper factory, which probably isn't very useful to mos= t >>> > java developers, but may be useful for other jvm languages or some >>> > seriously strange legacy cruft. >>> >>> On the other hand, even for code with conventional getter/setter >>> naming, it might be useful for handling different column naming >>> conventions. >>> >>> In the iBATIS app I'm working on, all the database columns have >>> underscore_names, so I've ended up using column aliasing (SELECT >>> foo_bar fooBar, ...) for each column. >>> >>> I never figured out whether there was a better way to do this, but at >>> the time I was looking for a way to implement exactly the 'pluggable' >>> naming strategies you describe. >>> >>> >>> Martin >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org >>> For additional commands, e-mail: user-java-help@ibatis.apache.org >>> >> >> > --001636d33c7c46ab06047c398d0d Content-Type: application/zip; name="org.zip" Content-Disposition: attachment; filename="org.zip" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g3z7vnye1 UEsDBAoDAAAAAI+MITwAAAAAAAAAAAAAAAAEAAAAb3JnL1BLAwQKAwAAAACPjCE8AAAAAAAAAAAA AAAACwAAAG9yZy9hcGFjaGUvUEsDBAoDAAAAAI+MITwAAAAAAAAAAAAAAAASAAAAb3JnL2FwYWNo ZS9pYmF0aXMvUEsDBAoDAAAAAI+MITwAAAAAAAAAAAAAAAAdAAAAb3JnL2FwYWNoZS9pYmF0aXMv cmVmbGVjdGlvbi9QSwMECgMAAAAANHoiPAAAAAAAAAAAAAAAACUAAABvcmcvYXBhY2hlL2liYXRp cy9yZWZsZWN0aW9uL3dyYXBwZXIvUEsDBBQDAAAIAAl5IjwxE/eQ7wkAAE40AAA/AAAAb3JnL2Fw YWNoZS9pYmF0aXMvcmVmbGVjdGlvbi93cmFwcGVyL0Fic3RyYWN0T2JqZWN0V3JhcHBlci5qYXZh 7RtXz9Mw8Ln8CsMDBFECvFKGmGWDKEMIIWRStw1NkypOgTL+O3fejp02ZSOo+NrEvn1n33mwptmS zhmp6nlK4WXB0vwNbXKe1mxWsKzJqzJ9X9P1mtWjI0fy1bqqG/KWvqNpQcu5hkrvs2ZRTUfdADdz Vuzqv12+qzKK7J7Qes6aGx8ytsZXH2fT5EV6n64jrbcoX8R77uW8iTaXSzbt6LxWFUp9bvTeaSU0 AX345i28jXrBPzaPRtd+iDOaNVW9TSWzm/KtH+q6rsCRzTZ9pB6eVEtW5h+Fc9ebN0WeEfqGNzUQ JVlBOSdX1Kvk9lyGAmEfGlZOOblKOdNtn44Qsq7zd7RhhDe0AVqzvKQFAa9cuIbEhuQaCja9Xc6q S+T2g5sPX1+7cu3WDXKROPZO+bbMFnWFck0BNynZe4LejdNJTp4cAWfBvGqABpsSKSyppDu8LotJ cvgKUFm5WREZzk+2a4ZawWfMmobVQ/E8cZ4fVCWDhy/wZ7WXllOctKUVIcto0tR5OSfaJSO/W4lA 5oJZRyePdoqhRmb4LbvEl/RuS6ikJcTQZzv0GZ1EHcSnWUBcaSRy0Srh9ksa0CsfvD6u+jwVvhws raPqgcIJHOgUvz+AfctyvjSJQVGy7rdTKIzkjkAP6IollkPNmk1dGrG68MXIQXQZyxDcLpF8RhIl yNGLpNwUhemzLCQACvxYNAgaoMxgMPhCWMGZICNUdKkM4KMoiD4koFAVB4kdMBQUDMw+vSZdevF9 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 63XV7cxaTMc9shGPbODRSOOotGr0jNTLw54HE3BbvjqU5PaRpwcnBe6AvD7aKfAUAqcwW9gr5hRM WY7Gbr0OfPbYtD+tnTvr3oSFbTveEUhoGotb9nHXFieSUhAWwHU96EXXfn113V9sTorWzq3O8R9Q SwMEFAMAAAgA646fO9qFbp/VAAAA5gEAAEMAAABvcmcvYXBhY2hlL2liYXRpcy9yZWZsZWN0aW9u L3dyYXBwZXIvU2NhbGFPYmplY3RXcmFwcGVyRmFjdG9yeS5qYXZhfVC7bsMwDNz1FRxdoNAPeO9W dOjQmRZoR60sChSNoCjy71XlZ5MgBPQg7448MKH7woGAZbBYkhNZ36H6bIX6QE49R3sWTImkNcaP iUUfs19J8a37LFm78rPDgPa93Bti0tQF78AFzBkO0Mc87AWdsnxD6RBopKgZ7uI/BmBp1TEHwggn zCuJpamqYrk+T3/8Er6HhmfAx6wYHXG/uNiJNYR0kggqE7W1dAEKma7xHktxIZj5bM7+O4eB9OBv XxeM2/cZbm3vsyKd72ysOchXXVutXH4BUEsBAhQDCgMAAAAAj4whPAAAAAAAAAAAAAAAAAQAAAAA AAAAAAAQgO1BAAAAAG9yZy9QSwECFAMKAwAAAACPjCE8AAAAAAAAAAAAAAAACwAAAAAAAAAAABCA 7UEiAAAAb3JnL2FwYWNoZS9QSwECFAMKAwAAAACPjCE8AAAAAAAAAAAAAAAAEgAAAAAAAAAAABCA 7UFLAAAAb3JnL2FwYWNoZS9pYmF0aXMvUEsBAhQDCgMAAAAAj4whPAAAAAAAAAAAAAAAAB0AAAAA AAAAAAAQgO1BewAAAG9yZy9hcGFjaGUvaWJhdGlzL3JlZmxlY3Rpb24vUEsBAhQDCgMAAAAANHoi PAAAAAAAAAAAAAAAACUAAAAAAAAAAAAQgO1BtgAAAG9yZy9hcGFjaGUvaWJhdGlzL3JlZmxlY3Rp b24vd3JhcHBlci9QSwECFAMUAwAACAAJeSI8MRP3kO8JAABONAAAPwAAAAAAAAAAACCApIH5AAAA b3JnL2FwYWNoZS9pYmF0aXMvcmVmbGVjdGlvbi93cmFwcGVyL0Fic3RyYWN0T2JqZWN0V3JhcHBl ci5qYXZhUEsBAhQDFAMAAAgATHwiPAH8zqs8AQAA0AMAAD0AAAAAAAAAAAAggKSBRQsAAG9yZy9h cGFjaGUvaWJhdGlzL3JlZmxlY3Rpb24vd3JhcHBlci9NdWx0aVdyYXBwZXJGYWN0b3J5LmphdmFQ SwECFAMUAwAACADFaCI8QH7iA3sBAAAkBAAAPAAAAAAAAAAAACCApIHcDAAAb3JnL2FwYWNoZS9p YmF0aXMvcmVmbGVjdGlvbi93cmFwcGVyL1NjYWxhT2JqZWN0V3JhcHBlci5qYXZhUEsBAhQDFAMA AAgA646fO9qFbp/VAAAA5gEAAEMAAAAAAAAAAAAggKSBsQ4AAG9yZy9hcGFjaGUvaWJhdGlzL3Jl ZmxlY3Rpb24vd3JhcHBlci9TY2FsYU9iamVjdFdyYXBwZXJGYWN0b3J5LmphdmFQSwUGAAAAAAkA CQD8AgAA5w8AAAAA --001636d33c7c46ab06047c398d0d Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org For additional commands, e-mail: user-java-help@ibatis.apache.org --001636d33c7c46ab06047c398d0d--