Bonsoir a tous,

J'ai un probleme/exercice de design et je tourne en rond pour le resoudre. Si quelqu'un peut me mettre sur la voix ...

J'ai un systeme qui permet a un utilisateur de communiquer avec une base de donnee. La BDD peut etre en locale, ou se trouve sur un autre reseau. En local, pas de probleme, j'ai reussi. A distance, je me suis lance dans une solution RMI et pas de probleme egalement, j'y suis arrive (de maniere isolee). Maintenant, je veux faire coexister les 2 solutions et c'est la que les choses se gatent, car quelque soit mon angle d'attaque, je me retrouve avec des interfaces/classes/methodes dupliquees et un casse-tete avec mes exceptions.

On part de l'interface (simplifiee) suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
package nuriel.db;
 
public interface Database {
    public String[] read(int recNo) throws RecordNotFoundException;
}
Pour me simplifier la vie, je derive cette interface pour y ajouter des methodes qui seront utiles lorsqu'il faudra parler a la couche metier, et je l'implemente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
package nuriel.db;
 
public interface DataAccess extends Database {
    public int getTotalNbRecord();
}
 
package nuriel.db;
 
public class DB implements DataAccess { ...}
En local, la couche metier a juste a faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
DabaAccess db = new DB();
pour travailler. Mais si je suis en reseau, il faut donc exporter un objet DataAccess depuis le serveur. Puisque je travaille en RMI, il faut donc que DataAccess descende de l'interface Remote, et donc que ces methodes lancent une RemoteException, ce qui est une violation du contrat avec Database.

Ma solution isolee qui marche a ete de dupliquer Database en DatabaseRemote, et toutes ses descendants, en incluant Remote et RemoteException des le depart.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package nuriel.Remote;
 
public interface DatabaseRemote extends Remote {
    public String[] read(int recNo) throws RecordNotFoundException, RemoteException;
}
 
package nuriel.remote;
 
public interface DataAccessRemote extends DatabaseRemoter {
    public int getTotalNbRecord() throws RemoteException;
}
 
package nuriel.remote;
 
public class DBRemote implements DataAccessRemote { ... }
La couche metier l'utilise en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
DatabaseAccessRemote db = (DatabaseRemote)registry.lookup(...);
Et le probleme est que cette solution ne me convient pas car selon que je suis en local ou en reseau, l'objet db est d'un type different (DataAccess ou DataAccessRemote). Et je tourne en rond sur comment faire pour que db soit toujours un DataAccess quelque soit le mode d'access. Toutes propositions seront bienvenues.

Merci

Nuriel