incubator-empire-db-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From andrew cooke <>
Subject Re: Scala inter-op issue [Was: Importing XML]
Date Fri, 16 Oct 2009 13:00:55 GMT
I don't have a test, I'm afraid (this is a very quick + dirty project,
but if I do end up adding tests I'll get back to you).

However, I do have a solution to the problem, which is to subclass
DBTable in Scala, as done here -

Also, I think columns must be "var" (mutable).  There's a schema in
Scala that uses the table above here -

You could modify the DBTable code directly to address this by placing
the following code in the "catch" for an illegal access exception (in
the clone method):

  val getter = getClass.getDeclaredMethod(fields(j).getName)
  if (getter.invoke(clone) == srcCol) {
    val setter = getClass.getDeclaredMethod(fields(j).getName + "_$eq", tipe)
    setter.invoke(clone, newCol)

(that's in Scala, but the translation to Java is obvious if you have
used Java's reflection API).  All the above does is use the method
name to infer and access the auto-generated getter/setter (the getter
has the same name as the attribute, the setter has "_$eq" appended).

With that, my SQL generation appears to work fine (apart from logging
messages from the super.clone, which thinks it has failed).


2009/10/16 Francis De Brabandere <>:
> Hi Andrew,
> Since I'm also interested in scala I think it would be nice to
> actually have a scala example in our examples module. Would you be
> able and willing to create a scala version of our current simple
> example? I suppose we can set up maven to use scala.
> I don't have a good enough view on the framework to help you with the
> problem. I've mostly been taken care of the maven build. But Rainer
> will probably be able to answer your question.
> Cheers,
> Francis
> On Fri, Oct 16, 2009 at 2:07 AM, andrew cooke <> wrote:
>> Hi,
>> I just hit quite a serious issue for using Empire DB in Scala which I
>> thought I would flag, since you asked.
>> The clone() method of DBTable (and perhaps any other clone method that
>> might be used) requires access to the attributes of an object (so that
>> it can copy columns).  Unfortunately in Scala the attributes of an
>> instance are always private.  It doesn't appear that way in Scala
>> code, because Scala automatically generates matching getters and
>> setters (that, simplifying slightly, have the same name as the
>> attribute - it sounds odd, but Scala has some unusual syntax that
>> makes it work).
>> This means that cloning fails, because the private attribute generates
>> an illegal access exception.  So any query that uses a table twice
>> (with different aliases) cannot be expressed in Empire DB (at least, I
>> assume this is solved by using DBTable.clone() - I have not yet got it
>> to work, for this reason).
>> I can write my own clone function, I hope, once I learn some more
>> about Scala, or I can define my schema in Java.  So this is not a
>> deal-breaker for me, but it would make using Empire DB from Scala much
>> simpler if the clone method either:
>>  1 - checked for the Scala syntax and used the Scala getters/setters or
>>  2 - provided a separate method (cloneScala?) that used the Scala
>> getters/setters
>> It is possible to make Scala objects conform to JavaBean standards, so
>> another solution would be to use setters that follow that convention,
>> but the code would be uglier in Scala and never used from Java, so I
>> don't think that is a good idea.
>> Cheers,
>> Andrew
>> 2009/10/13 Francis De Brabandere <>:
>>> Hi andrew,
>>> A bit offtopic. Do you use scala a lot? Do you think it is the future
>>> for java? Would there be a need for empire-db - scala integration
>>> code?
>>> Thanks,
>>> Francis
>>> On Tue, Oct 13, 2009 at 2:17 PM, andrew cooke <> wrote:
>>>> Sorry, no - my fault.  I was using getRecordData instead of open.  Andrew
>>>> 2009/10/13 andrew cooke <>:
>>>>> Also, the dump is missing the first element of each table.  I believe
>>>>> that is a bug in Empire DB, but I will first try to reproduce it in
>>>>> Java and then file a report with a simple example.
>>> --
>>> Microsoft gives you windows, Linux gives you the whole house.
> --
> Microsoft gives you windows, Linux gives you the whole house.

View raw message