Hi, Luigi, thanks for your responses.

I think everything is covered, except for the question of testing. I recognize you just wanted to get something started and some feedback. But before anything gets checked in, I would need to see some validation that it works, even partially works.

Thinking about it further, rather than building new tests, I guess all you need to exercise this code is to modify the modules.properties file to use this storage factory, and then run some subset of the Derby unit tests.

I don't know the storage area very well, but I did find the following:

java/testing/org/apache/derbyTesting/unitTests/store

I have never run these tests, but if you ask on the list with a new subject header you should get some help. Also, any help you may need on configuring Derby to use your storage factory. What is unclear to me is how to automate running in a Java Web Start environment, vs. in a standard no-sandbox VM. Do you know how to do this?

I also want to see at least some subset of our higher-level system tests run under the JNLP storage factory configuration. Most of the times the database created is quite small, so I don't think it should be an issue. In particular, I'm be curious to see what security bugs/issues we hit as Derby tries to do various things with the system under such a constrained SecurityManager as JWS.

In terms of running derbyall, a general principle is that no checkin takes place without running derbyall. However, I do recognize that in your case this is not necessarily applicaable since your code will never be hit by running the existing regression suites.

What I would like to see is that one you have identified new tests or new configurations of old tests that exercise your storage service, then these new tests/configurations should be added to derbyall. I don't think this is required for initial checkin, though.

Make sense?

Thanks,

David

Luigi Lauro wrote:

On 27 Mar 2007, at 20:01, David Van Couvering wrote:

Hi, Luigi.  Thanks for submitting this!

Thanks for replying.

Here are my comments:

- Your code is very well written - clear, well-commented, nicely structured!

Thanks. I try to do my best, and I value code clarity above all.

My goal is that ppl should understand what I've written with the minimum effort possible.

- Sigh. Does the JNLP persistence service have no concept of a directory? I hate the "length == 0" approach of identifying a directory. But sometimes that's the best we can do. Perhaps we can provide some feedback to the JNLP folks?

Unluckily, no.

The structure is 'somewhat' hierarchical since it's like a Map<URL, FileContent>, but I'm forced to write under my codebase only. I cannot create 'virtual' directory in the URL.

This means that if I'm "http://db.apache.org/derby"; (this is the codebase so), I can write under:

http://db.apache.org/derby
http://db.apache.org
http://apache.org

This is allowed in order to allow data sharing between applications from the same vendor/domain.

BUT, I cannot write to http://db.apache.org/derby/subdir. I get a 'denied access' because PersistenceService enforces the codebase. I cannot go past it.

This is why I had to resort to using the NAME itself (which is completely free, as long as doesn't violate URLs standard) and code an IMPLICIT hierarchy into the name. Of the available separators (pipe, comma, etc...) I chose comma because it seems to me it's the least commonly used in 'files' and the most easily readable (dir,dir2,file is more readable than dir|dir2|file).

This means I will persist the file as

http://db.apache.org/derby/derbyhome,databasehome,directory,subdirectory,filename

for example. For JNLP that's a single file under the http://db.apache.org/derby codebase, so it's allowed, and I code the hierarchy into the name with comma separated paths.

Regarding directories: I've chosen to create directory even if they contain nothing (so I will create a placeholder entry whenever a directory is 'created', otherwise I would have no mean of find out if a directory exists or not, if no file is available under it) and I've chosen to use the 0-length to 'flag them'. Since they won't hold any data at all, this isn't _THAT_ unclean after all.

Other approaches I considered were to use the TAG feature of JNLP to tag directory, but I discarded it because I would have to abuse of the meaning of the TAG and violate the API contract, since the only supported values are DIRTY, CACHED, TEMPORARY. Or to flag them using the name, but this would add even more complications to the name structure, which already contains the path hierarchy and all, so I thought the 0-length was the best I could get.

Don't you need to close any open files on shutdown? This highlights my ignorance of this area of the code...

They are really 'files', you should think of them more like cookies.

I don't need to close anything, I can create/delete any entity and write/read to/from it using streams.

Of course, the streams have to be flushed/close after usage, but that's not my duty: I make them available through the getInputStream/getOutputStream methods on the StorageFile interface, then it's duty of the caller to close them upon usage.

Where does it seems to you I have left something open? Maybe I've done and haven't noticed, but AFAIK I can't see any such mistake.

Beware also that some stuff as sync/supportRws is still in the works for the JNLPStorageFactory. Not everything is in yet

- Next time, please submit your changes as a patch file. You generate a patch file by doing 'svn diff' from the root of your code tree, and routing the output to a file. Make sure you have actually added new files and directories in your local tree using 'svn add'.

Will do, thanks for letting me now. I didn't make a patch of it mainly because these are new files, so I thought it was easier this way, but I will provide a patch next time :)


- You didn't submit any unit tests. Without this, how do we know this feature works? Have you run it through any tests?

Haven't put in any test yet. I don't think this code will run yet, very very few tests done on it, all manual. I plan to provide junit unit tests later, when I get the hang of it and stabilize the code a bit. Yes, I know TDD and all, but given the premises, I focused on understanding how derby works and testing my ideas of a possible implementation against reality :)

And also, I was hoping to find a full StorageFile/StorageFactory testing suite in derby for checking if the interface implementations fully adhere to the API specifications, but no such thing seems available to me. Are there some specific tests I could run against a StorageFactory/StorageFile implementation?


- Did you run derbyall?  Did it pass?

Not at all. In fact, I have yet to see how I can 'pass' my new implementation to derby for testing. :) Any pointer here is appreciated

Take a good gander at http://wiki.apache.org/db-derby/DerbyCommitHowTo - everything here applies except that you can't commit the change yourself, only committers can do that.

- Did you go through the checklist at http://wiki.apache.org/db-derby/DerbyContributorChecklist? This is really important, especially signing and faxing in the ICLA

Will check these later. Thanks!

- There are three versions of JNLPStorageFactory.java. It's really hard to tell which one is the most recent. When submitting updated patches, again it's best if you submit a single patch file, and name it with a version number or a date.

True, in fact I was looking for some 'mod' to delete the old ones. I will submit a patch with date in the name, so to avoid doubts next time. Can you tell someone to clean those attachments in the meanwhile? :)

- Your source files need to have the Apache license header on them. See other files for examples

I will, thanks again. I'm n00b here you know :)

Gotta run, maybe more later.

Thanks again, looking forward for any more help.

Really really appreciated David.

Luigi

Reply via email to