package elte.java2_utikalauz5.rmi;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.util.Vector;
import java.util.Hashtable;
/**
Egy naptár feladatait megvalósító osztály.
Főprogramja létrehoz egy új üres naptár objektumot, és bejegyzi
az RMI névszolgáltatójába. A naptár tulajdonosának a nevét az egyetlen
programparaméterben várja, ezen a néven jegyzi be a naptár objektumot a
névszolgáltatóba.
Használatakor ne feledjünk el a következő jogokat megadni!
grant signedBy "utikalauz" {
permission java.security.AllPermission;
};
@link.forrásfájl {@docRoot}/../data/rmi/src Naptar.java
@link.letöltés {@docRoot}/../data/rmi Naptar.jar
@since Java 2 Útikalauz programozóknak
*/
public class Naptar extends UnicastRemoteObject
implements NaptarInterface, TranzakcioResztvevoInterface {
/** Verziószám. */
private final static long serialVersionUID = 15L;
String tulajneve; // A naptár tulajdonosának neve
Hashtable elfoglaltsag; // (DatumString, String)
Hashtable> visszacsinal; // (Tid, Vektor(DatumString)) párok; ezek jelzik,
// hogy mikor is módosított az illető tranzakció
Hashtable kommittalhat; // (Tid, Valami) pár, amelyik tranzakció már
// biztosan nem véglegesíthető.
private static Object mutex = new Object(); // Kölcsönös kizáráshoz
// A konstruktor művelet létrehoz egy üres naptárat
public Naptar(String tulajneve) throws RemoteException {
super(); // FONTOS, ezzel lesz távolról elérhető az objektum
this.tulajneve=tulajneve;
this.elfoglaltsag=new Hashtable();
this.visszacsinal=new Hashtable>();
this.kommittalhat=new Hashtable();
// üres naptár elkészült ...
}
// Ezzel lehet egy adott időpontra egy elfoglaltságot bejegyezni
public void Lefoglal(String mikor, String mi,
TranzakcioManagerInterface ti)
throws java.rmi.RemoteException {
// Értesíti a koordinátort, hogy ebben a tranzakcióban
// résztvevőként tartsa nyilván ezt az objektumot is.
ti.Tranzakcio_Resztvevo_Bejegyzese(tulajneve,this);
// Kölcsönösen kizárjuk az esetleges párhuzamos módosításokat
synchronized (mutex) {
// Ha erről a tranzakcióról még nem tárolunk adatokat,
// akkor létrehozzuk a szükséges állapothordozókat.
if (!(visszacsinal.containsKey(ti.getTid()))) {
Vector umodositasok=new Vector();
visszacsinal.put(ti.getTid(), umodositasok);
umodositasok=null;
}
// Megnézzük, hogy szabadok vagyunk-e még a
// a kérdéses napon.
if (elfoglaltsag.containsKey(mikor)) {
// Ha a kérdéses nap már foglalt, akkor nem
// jegyzünk be semmit, hanem
// abortáljuk a tranzakciót (MAJD)
// (Mindegy mit tárolunk a 2. paraméterben!)
kommittalhat.put(ti.getTid(),mikor);
return; // vissza a hívóhoz ...
}
// Eltároljuk, hogy mikorra jegyzett be elfoglaltságot
// az illető tranzakció.
Vector modositasok=visszacsinal.get(ti.getTid());
modositasok.insertElementAt(mikor,modositasok.size());
// És be is jegyezzük, nehogy másvalaki bejegyezzen
// valami más elfoglaltságot.
elfoglaltsag.put(mikor,mi);
System.out.println("Lefoglalási kísérlet:"+mikor.toString()+
"-kor elfoglaltság:"+mi);
}
}
// Egy abortált tranzakció tevékenységeit semlegesítjük
private void Visszacsinal(String tid) {
int index;
// Megszerezzük a módosítások listáját
Vector modositasok=(Vector) visszacsinal.get(tid);
index=0;
for (index=0;index