The big problem with this is the use of UUIDs. Although UUIDs (sort of) are guaranteed to be unique, pretty much what they contain is pretty predictable; significant amounts remain constant across all UUIDs generated on the same machine. Thus, if a person gains access to (for example) his own key, they probably can quite easily guess many other people.
The other part, which is problematic, stores the user's secret keys on the server. This makes the rest of the circuit relatively fragile, since access to these keys obviously gives access to all other data. It also (apparently) means that you usually decrypt the data on the server, so when the user accesses this data over the network, it must either be re-encrypted for transmission, or decrypted on the user's computer, or else you will transfer the data to clarity (thus, most of the encryption will be useless).
Edit: Regarding how I think I will do this:
I will have a list of public keys on the server. When a client wants to share a file with some other clients, he receives the public keys for these clients from the server. Then it generates a secure random key and encrypts the data using this key. It then encrypts the random key using the public keys of all the other clients that must have access to the data. Put them together in a stream and transfer them to the server. Other clients can then download the stream, decrypt the key with their private key, and use it to decrypt the data itself.
This means that each client’s private key remains truly confidential - he should never leave his car in any form. All they have ever had to share with the rest of the world is their public key (which by definition should not cause security problems).
In this case, two obvious lines of attack relate to the random number generator and to the RSA itself. For a random number generator, I would use Java SecureRandom - this is exactly the purpose for which it was intended, and if the memory is served, it has been carefully studied, and significant interruptions in it look rather unlikely.
I will not try to comment on the security of the RSA itself. At the moment, I think your main problem is with the protocol, not with the encryption algorithm. Suffice it to say that if the RSA were significantly broken, you obviously need to change your code, but you will have many companies.
This way, the client will almost certainly keep their private keys. I like smart cards for this job, but there are many alternatives. In terms of server and protocol, this is no longer a factor, though.
Editing 2: Regarding working with multiple devices, I think that I just consider each device as a separate user with its own public / private key pair. I would then (possibly) combine them with the actual users, so I can easily select "Joe Blow" to give him access on all his devices - but with a hierarchical display, I could also quite easily restrict access to a subset of them, so if I want to share it with Joe in his office car, but he is sensitive enough so that I don’t want him to go where someone could look over his shoulder while he looks at him, I can easily do it too .
This makes life easier for users, but retains the same basic security model (i.e. private keys remain private).