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:29] Andrei Roșu-Cojocaru |
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 176: | Line 177: | ||
| Compilarea claselor care vor fi incluse în bibliotecile care vor fi expuse la distanță se face în mod obişnuit: | Compilarea claselor care vor fi incluse în bibliotecile care vor fi expuse la distanță se face în mod obişnuit: | ||
| - | <code> | + | * Linux <code> |
| student@aipi2015:~$ javac -cp ../libs/hibernate-jpa-2.1-api-1.0.0.Final.jar ro/pub/cs/aipi/lab03/businesslogic/*Interface.java ro/pub/cs/aipi/lab03/general/Constants.java ro/pub/cs/aipi/lab03/entities/PersistentEntity.java ro/pub/cs/aipi/lab03/result/*.java | student@aipi2015:~$ javac -cp ../libs/hibernate-jpa-2.1-api-1.0.0.Final.jar ro/pub/cs/aipi/lab03/businesslogic/*Interface.java ro/pub/cs/aipi/lab03/general/Constants.java ro/pub/cs/aipi/lab03/entities/PersistentEntity.java ro/pub/cs/aipi/lab03/result/*.java | ||
| </code> | </code> | ||
| - | + | * Windows <code> | |
| - | <code> | + | |
| C:\Users\Aipi2015> javac -cp ..\\libs\\hibernate-jpa-2.1-api-1.0.0.Final.jar ro\\pub\\cs\\aipi\\lab03\\businesslogic\\*Interface.java ro\\pub\\cs\\aipi\\lab03\\general\\Constants.java ro\\pub\\cs\\aipi\\lab03\\entities\\PersistentEntity.java ro\\pub\\cs\\aipi\\lab03\\result\\*.java | C:\Users\Aipi2015> javac -cp ..\\libs\\hibernate-jpa-2.1-api-1.0.0.Final.jar ro\\pub\\cs\\aipi\\lab03\\businesslogic\\*Interface.java ro\\pub\\cs\\aipi\\lab03\\general\\Constants.java ro\\pub\\cs\\aipi\\lab03\\entities\\PersistentEntity.java ro\\pub\\cs\\aipi\\lab03\\result\\*.java | ||
| </code> | </code> | ||
| Line 187: | Line 187: | ||
| <note tip>Se recomandă ca în cazul unor funcționalități diferite, accesate de diverși utilizatori, să se creeze definiții de clase separate, care vor fi expuse către serviciul de nume în mod distinct, astfel încât să poată fi accesate numai în funcție de drepturile stabilite în contextul aplicației integrate pentru întrerprinderi. În situația în care unele clase sunt accesate din arhive .jar diferite, se va construi și o arhivă cu resursele comune, aceasta putând fi partajată între toate entitățile implicate.</note> | <note tip>Se recomandă ca în cazul unor funcționalități diferite, accesate de diverși utilizatori, să se creeze definiții de clase separate, care vor fi expuse către serviciul de nume în mod distinct, astfel încât să poată fi accesate numai în funcție de drepturile stabilite în contextul aplicației integrate pentru întrerprinderi. În situația în care unele clase sunt accesate din arhive .jar diferite, se va construi și o arhivă cu resursele comune, aceasta putând fi partajată între toate entitățile implicate.</note> | ||
| - | + | * Linux <code> | |
| - | <code> | + | |
| student@aipi2015:~$ jar cvf bookstore-common.jar ro/pub/cs/aipi/lab03/general/Constants.class ro/pub/cs/aipi/lab03/entities/PersistentEntity.class | student@aipi2015:~$ jar cvf bookstore-common.jar ro/pub/cs/aipi/lab03/general/Constants.class ro/pub/cs/aipi/lab03/entities/PersistentEntity.class | ||
| student@aipi2015:~$ jar cvf bookstore-bookmanager.jar ro/pub/cs/aipi/lab03/businesslogic/BookManagerInterface.class ro/pub/cs/aipi/lab03/result/BookInformation.class ro/pub/cs/aipi/lab03/result/BookInformationDetailed.class | student@aipi2015:~$ jar cvf bookstore-bookmanager.jar ro/pub/cs/aipi/lab03/businesslogic/BookManagerInterface.class ro/pub/cs/aipi/lab03/result/BookInformation.class ro/pub/cs/aipi/lab03/result/BookInformationDetailed.class | ||
| Line 194: | Line 193: | ||
| student@aipi2015:~$ jar cvf bookstore-writermanager.jar ro/pub/cs/aipi/lab03/businesslogic/WriterManagerInterface.class ro/pub/cs/aipi/lab03/result/WriterInformation.class | student@aipi2015:~$ jar cvf bookstore-writermanager.jar ro/pub/cs/aipi/lab03/businesslogic/WriterManagerInterface.class ro/pub/cs/aipi/lab03/result/WriterInformation.class | ||
| </code> | </code> | ||
| - | + | * Windows <code> | |
| - | <code> | + | |
| C:\Users\Aipi2015> jar cvf bookstore-common.jar ro\\pub\\cs\\aipi\\lab03\\general\\Constants.class ro\\pub\\cs\\aipi\\lab03\\entities\\PersistentEntity.class | C:\Users\Aipi2015> jar cvf bookstore-common.jar ro\\pub\\cs\\aipi\\lab03\\general\\Constants.class ro\\pub\\cs\\aipi\\lab03\\entities\\PersistentEntity.class | ||
| C:\Users\Aipi2015> jar cvf bookstore-bookmanager.jar ro\\pub\\cs\\aipi\\lab03\\businesslogic\\BookManagerInterface.class ro\\pub\\cs\\aipi\\lab03\\result\\BookInformation.class ro\\pub\\cs\\aipi\\lab03\\result\\BookInformationDetailed.class | C:\Users\Aipi2015> jar cvf bookstore-bookmanager.jar ro\\pub\\cs\\aipi\\lab03\\businesslogic\\BookManagerInterface.class ro\\pub\\cs\\aipi\\lab03\\result\\BookInformation.class ro\\pub\\cs\\aipi\\lab03\\result\\BookInformationDetailed.class | ||
| Line 225: | 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 238: | 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 303: | 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 334: | 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 360: | 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 396: | 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 520: | 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 528: | 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 625: | 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]] | ||
