Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator03 [2015/11/06 07:30] Andrei Roșu-Cojocaru [Clase și Interfețe la distanță] |
laboratoare:laborator03 [2015/12/01 15:07] (current) Andrei Roșu-Cojocaru |
||
|---|---|---|---|
| Line 137: | Line 137: | ||
| import java.util.List; | import java.util.List; | ||
| - | import ro.pub.cs.aipi.lab03.result.ResultType1; | + | import ro.pub.cs.aipi.lab03.result.*Information; |
| - | import ro.pub.cs.aipi.lab03.result.ResultType2; | + | |
| - | public interface BookManagerInterface extends Remote { | + | public interface *ManagerInterface extends Remote { |
| - | public List<ResultType1> method1() throws RemoteException; | + | public List<*Information> method1(int param) throws RemoteException; |
| - | public List<ResultType2> method2() throws RemoteException; | + | public List<*Information> method2(String param) throws RemoteException; |
| } | } | ||
| </file> | </file> | ||
| + | |||
| + | <note tip>Prin noteția * se înțelege faptul că acest caracter poate fi înlocuit cu orice unitate de gestiune a unui serviciu, respectiv cu orice entitate persistentă.</note> | ||
| Prin extinderea interfeţei ''java.rmi.Remote'' se specifică faptul că metodele declarate de interfaţa ''Reservation'' vor putea fi apelate din altă maşină virtuală Java. Orice obiect care implementează interfaţa ''Reservation'' va putea fi considerat un obiect "la distanţă". | Prin extinderea interfeţei ''java.rmi.Remote'' se specifică faptul că metodele declarate de interfaţa ''Reservation'' vor putea fi apelate din altă maşină virtuală Java. Orice obiect care implementează interfaţa ''Reservation'' va putea fi considerat un obiect "la distanţă". | ||
| Line 150: | Line 151: | ||
| Metodele definite în cadrul acestei interfeţe vor putea fi apelate din cadrul altei maşini virtuale ("la distanţă"), prin urmare este obligatoriu să genereze excepţii de tip ''java.rmi.RemoteException''. O astfel de excepţie este aruncată de sistemul RMI dintr-un apel de metodă la distanţă pentru indicarea situaţiei în care a intervenit o eroare de comunicare sau de protocol. Codul sursă care apelează metode "la distanţă" trebuie să trateze o astfel de excepţie (prin prinderea ei sau transmiterea ei mai departe). | Metodele definite în cadrul acestei interfeţe vor putea fi apelate din cadrul altei maşini virtuale ("la distanţă"), prin urmare este obligatoriu să genereze excepţii de tip ''java.rmi.RemoteException''. O astfel de excepţie este aruncată de sistemul RMI dintr-un apel de metodă la distanţă pentru indicarea situaţiei în care a intervenit o eroare de comunicare sau de protocol. Codul sursă care apelează metode "la distanţă" trebuie să trateze o astfel de excepţie (prin prinderea ei sau transmiterea ei mai departe). | ||
| - | Se observă că metodele ''getBooksList()'', ''getBooksListWithStockpile()'', ''updateBookPresentationPriceForBooksWithMultipleFormats()'', ''makeSupplyOrderBasedOnStockpile()'', ''deleteWritersWithoutBooks()'' şi ''getWritersBibliography()'' au parametri de tip date primitive, întoarcând un rezultat de tip ''*Information'', derivate din ''PersistentEntity''. Întrucât acestea nu reprezintă un tip de bază, ele trebuie să fie serializabile. Se pot defini ca serializabile tipurile de date ''*Information'', fiind de asemenea posibil ca această proprietate să aparțină totodată clasei din care acestea sunt extinse. Proprietățile acestor clase nu trebuie să poată fi accesate decât prin intermediul unor metode de tip getter / setter. | + | Se observă că metodele ''method1()'' și ''method2()'' au parametri de tip date primitive, întoarcând un rezultat de tip ''*Information'', derivate din ''PersistentEntity''. Întrucât acestea nu reprezintă un tip de bază, ele trebuie să fie serializabile. Se pot defini ca serializabile tipurile de date ''*Information'', fiind de asemenea posibil ca această proprietate să aparțină totodată clasei din care acestea sunt extinse. Proprietățile acestor clase nu trebuie să poată fi accesate decât prin intermediul unor metode de tip getter / setter. |
| <file java *Information.java> | <file java *Information.java> | ||
| Line 222: | Line 223: | ||
| import java.rmi.server.UnicastRemoteObject; | import java.rmi.server.UnicastRemoteObject; | ||
| - | import ro.pub.cs.aipi.lab03.businesslogic.BookManager; | + | import ro.pub.cs.aipi.lab03.businesslogic.*Manager; |
| - | import ro.pub.cs.aipi.lab03.businesslogic.BookManagerInterface; | + | import ro.pub.cs.aipi.lab03.businesslogic.*ManagerInterface; |
| - | import ro.pub.cs.aipi.lab03.businesslogic.BookPresentationManager; | + | |
| - | import ro.pub.cs.aipi.lab03.businesslogic.BookPresentationManagerInterface; | + | |
| - | import ro.pub.cs.aipi.lab03.businesslogic.WriterManager; | + | |
| - | import ro.pub.cs.aipi.lab03.businesslogic.WriterManagerInterface; | + | |
| import ro.pub.cs.aipi.lab03.general.Constants; | import ro.pub.cs.aipi.lab03.general.Constants; | ||
| Line 235: | Line 232: | ||
| if (System.getSecurityManager() == null) { | if (System.getSecurityManager() == null) { | ||
| System.setSecurityManager(new SecurityManager()); | System.setSecurityManager(new SecurityManager()); | ||
| - | } | + | } |
| - | try { | + | try { |
| - | Registry registry = LocateRegistry.getRegistry(); | + | Registry registry = LocateRegistry.getRegistry(); |
| - | + | String *ManagerServiceName = Constants.*_MANAGER_SERVICE_NAME; | |
| - | String *ManagerServiceName = Constants.*_MANAGER_SERVICE_NAME; | + | *ManagerInterface *ManagerService = new *Manager(); |
| - | *ManagerInterface *ManagerService = new *Manager(); | + | *ManagerInterface *ManagerProxy = (*ManagerInterface)UnicastRemoteObject.exportObject(*ManagerService, 0); |
| - | *ManagerInterface *ManagerProxy = (*ManagerInterface)UnicastRemoteObject.exportObject(*ManagerService, 0); | + | registry.rebind(*ManagerServiceName, *ManagerProxy); |
| - | registry.rebind(*ManagerServiceName, *ManagerProxy); | + | System.out.format("[%s] successfully bounded%n", Constants.*_MANAGER_SERVICE_NAME); |
| - | System.out.format("[%s] successfully bounded%n", Constants.*_MANAGER_SERVICE_NAME); | + | } catch (Exception exception) { |
| - | } catch (Exception exception) { | + | |
| System.out.println("An exception has occurred: " + exception.getMessage()); | System.out.println("An exception has occurred: " + exception.getMessage()); | ||
| if (Constants.DEBUG) { | if (Constants.DEBUG) { | ||
| Line 300: | Line 296: | ||
| Lansarea în execuţie a serverului se face prin comanda: | Lansarea în execuţie a serverului se face prin comanda: | ||
| - | * Linux <code bash> | + | * Linux <code> |
| - | student@aipi2015:~$ java -classpath .:libs/bookstore-common.jar:libs/bookstore-bookmanager.jar:libs/bookstore-bookpresentationmanager.jar:libs/bookstore-writermanager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-bookmanager.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-bookpresentationmanager.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-writermanager.jar" -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.BookStore | + | student@aipi2015:~$ java -classpath .:libs/bookstore-common.jar:libs/bookstore-*manager.jar:... -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-*manager.jar ..." -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.BookStore |
| </code> | </code> | ||
| - | C:\Users\Aipi2015> java -classpath .;libs/bookstore-common.jar;libs/bookstore-bookmanager.jar;libs/bookstore-bookpresentationmanager.jar;libs/bookstore-writermanager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-bookmanager.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-bookpresentationmanager.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-writermanager.jar" -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.BookStore | + | * Windows <code> |
| + | C:\Users\Aipi2015> java -classpath .;libs/bookstore-common.jar;libs/bookstore-*manager.jar;... -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Server/libs/bookstore-*manager.jar ..." -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.BookStore | ||
| </code> | </code> | ||
| + | |||
| + | <note tip>Prin notația ... se înțelege faptul că în continuare pot urma și alte elemente de același tip.</note> | ||
| Proprietatea ''java.rmi.server.codebase'' specifică locaţia de unde pot fi încărcate definiţii pentru clasele provenind de la server. Dacă în locul unei arhive se specifică o ierarhie de directoare, aceasta trebuie încheiată prin caracterul ''’/’''. În situația în care sunt incluse mai multe fișiere, acestea trebuie să fie delimitate prin separatorul spațiu. Pentru fiecare resursă trebuie indicat și protocoul prin care aceasta este accesată (''file:%%///%%'' sau ''http:%%//%%''). | Proprietatea ''java.rmi.server.codebase'' specifică locaţia de unde pot fi încărcate definiţii pentru clasele provenind de la server. Dacă în locul unei arhive se specifică o ierarhie de directoare, aceasta trebuie încheiată prin caracterul ''’/’''. În situația în care sunt incluse mai multe fișiere, acestea trebuie să fie delimitate prin separatorul spațiu. Pentru fiecare resursă trebuie indicat și protocoul prin care aceasta este accesată (''file:%%///%%'' sau ''http:%%//%%''). | ||
| Line 331: | Line 330: | ||
| import ro.pub.cs.aipi.lab03.general.Constants; | import ro.pub.cs.aipi.lab03.general.Constants; | ||
| import ro.pub.cs.aipi.lab03.general.Utilities; | import ro.pub.cs.aipi.lab03.general.Utilities; | ||
| - | import ro.pub.cs.aipi.lab03.result.ResultType1; | + | import ro.pub.cs.aipi.lab03.result.*Information; |
| - | import ro.pub.cs.aipi.lab03.result.ResultType2; | + | |
| public class *ManagerClient { | public class *ManagerClient { | ||
| Line 357: | Line 355: | ||
| switch (option) { | switch (option) { | ||
| case Constants.OPTION_1: | case Constants.OPTION_1: | ||
| - | Utilities.displayResults(service.method1(), ResultType1.class); | + | Utilities.displayResults(service.method1(), *Information.class); |
| break; | break; | ||
| case Constants.OPTION_2: | case Constants.OPTION_2: | ||
| - | Utilities.displayResults(service.method2(), ResultType2.class); | + | Utilities.displayResults(service.method2(), *Information.class); |
| break; | break; | ||
| // ... | // ... | ||
| Line 393: | Line 391: | ||
| student@aipi2015:~$ java -classpath .:libs/bookstore-common.jar:libs/bookstore-*manager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-*manager.jar" -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.*ManagerClient | student@aipi2015:~$ java -classpath .:libs/bookstore-common.jar:libs/bookstore-*manager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-*manager.jar" -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.*ManagerClient | ||
| </code> | </code> | ||
| - | * Windows <code> | + | * Windows <code> |
| C:\Users\Aipi2015> java -classpath .;libs/bookstore-common.jar;libs/bookstore-*manager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-*manager.jar" -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.*ManagerClient | C:\Users\Aipi2015> java -classpath .;libs/bookstore-common.jar;libs/bookstore-*manager.jar -Djava.rmi.server.codebase="file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-common.jar file:///<absolute_path>/03-BookStore-RMI-Client-*Manager/libs/bookstore-*manager.jar" -Djava.rmi.server.hostname=localhost -Djava.security.policy=configuration/policy ro.pub.cs.aipi.lab03.main.*ManagerClient | ||
| </code> | </code> | ||
| Line 517: | Line 515: | ||
| student@aipi2015:~$ ./startRmiRegistry.sh | student@aipi2015:~$ ./startRmiRegistry.sh | ||
| </code> | </code> | ||
| + | |||
| + | <note tip>În situația în care scriptul nu are drepturi de execuție, acestea vor fi acordate <code> | ||
| + | student@aipi2015:~$ chmod +x startRmiRegistry.sh | ||
| + | </code></note> | ||
| + | |||
| * Windows <code> | * Windows <code> | ||
| C:\Users\Aipi2015> startRmiRegistry.bat | C:\Users\Aipi2015> startRmiRegistry.bat | ||
| Line 525: | Line 528: | ||
| Precizarea căii către directorul ''bin'' al SDK-ului Java în variabila de mediu ''PATH'' se realizează astfel: | Precizarea căii către directorul ''bin'' al SDK-ului Java în variabila de mediu ''PATH'' se realizează astfel: | ||
| * Linux <code> | * Linux <code> | ||
| - | export PATH=$PATH:/usr/local/java/jdk1.8.0_60 | + | export PATH=$PATH:/usr/local/java/jdk1.8.0_60/bin |
| </code> | </code> | ||
| * Windows: //Computer Properties// → //Control Panel Home/Advanced System Properties// → //System Properties/Advanced/Environment Variables// → //System Variables / Path / Edit// <code bash> | * Windows: //Computer Properties// → //Control Panel Home/Advanced System Properties// → //System Properties/Advanced/Environment Variables// → //System Variables / Path / Edit// <code bash> | ||
| Line 622: | Line 625: | ||
| [[http://docs.oracle.com/javase/tutorial/rmi/index.html|The Java Tutorials - Trail: RMI]]\\ | [[http://docs.oracle.com/javase/tutorial/rmi/index.html|The Java Tutorials - Trail: RMI]]\\ | ||
| [[http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html|Remote Method Invocation Home]]\\ | [[http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html|Remote Method Invocation Home]]\\ | ||
| - | [[http://www.genady.net/rmi/v20/downloads.html|RMI Plug-in for Eclipse v2.0]] | + | [[http://www.genady.net/rmi/v20/downloads.html|RMI Plug-in for Eclipse v2.0]]\\ |
| + | [[http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/codebase.html|Dynamic Code Downloading using Java RMI]] | ||
| ===== Soluții ===== | ===== Soluții ===== | ||
| - | TODO | + | [[https://github.com/aipi2015/Laborator03/tree/master/solutions/eclipse|Proiect Eclipse]]\\ |
| + | [[https://github.com/aipi2015/Laborator03/tree/master/solutions/netbeans|Proiect NetBeans]] | ||
