3 import java
.rmi
.RemoteException
;
4 import java
.rmi
.server
.UnicastRemoteObject
;
5 import java
.util
.HashMap
;
6 import java
.util
.Vector
;
8 import drno
.exception
.ConsistanceException
;
9 import drno
.exception
.DatabaseDisconnectedException
;
10 import drno
.exception
.ObjectLockException
;
11 import drno
.exception
.SecurityDisallowedException
;
12 import drno
.exception
.UnkErrException
;
13 import drno
.interfaces
.EmployeeHandler
;
14 import drno
.interfaces
.IEmployee
;
15 import drno
.interfaces
.IEmployeeEditable
;
16 import drno
.server
.database
.broker
.BrokerController
;
17 import drno
.server
.database
.broker
.EmployeeBroker
;
18 import drno
.server
.database
.persistence
.LockObject
;
19 import drno
.server
.event
.Signal
;
20 import drno
.server
.event
.SignalImpl
;
21 import drno
.server
.marshall
.Marshall
;
22 import drno
.server
.model
.EmployeeImpl
;
25 * Implementationen af interfacet EmployeeHandler.
* <p>
* Denne klasse har nogle enkelte ting som er en smule anderledes end
* de andre handler klasser da det her er muligt at en employee ikke
* er i stand til at udføre alle operationer på dette interface.
* Det er krævet at brugeren er administrator i systemet for at man
* kan udføre ændringer af de andre brugere.
*
* @see drno.interfaces.IEmployee
* @author Tobias Nielsen, tobibobi@mip.sdu.dk
* @author Kim Slot, sloggi@mip.sdu.dk
27 * @uml.dependency supplier="drno.server.LoginHandler"
30 class EmployeeHandlerImpl
extends UnicastRemoteObject
implements EmployeeHandler
{
34 private static final long serialVersionUID
= -8525951853532865571L;
36 /** Connection to the actual broker */
37 private EmployeeBroker broker
;
38 private EmployeeImpl mUser
;
39 private HashMap
<EmployeeImpl
,LockObject
> Locks
= new HashMap
<EmployeeImpl
,LockObject
>();
40 private static SignalImpl onUpdate
;
42 public final SignalImpl onEmployeeIsUpdated
= new SignalImpl();
45 * Test for om den aktuelle bruger må instantiere denne klasse.
49 EmployeeHandlerImpl(IEmployee employee
) throws SecurityDisallowedException
,
52 EmployeeImpl e
= (EmployeeImpl
)employee
;
53 if(e
.isVerified() == false) {
54 throw new SecurityDisallowedException();
56 if(onUpdate
== null)onUpdate
= new SignalImpl();
59 broker
= BrokerController
.instance().getEmployeeBroker();
61 catch (DatabaseDisconnectedException e1
) {
62 // TODO Auto-generated catch block
68 * Opretter et tomt IPatient objekt.
70 * Objektet kan direkte aflæses redigeres eller blot
71 * droppes. Objektet bliver først gemt med et kald til
72 * {@link #saveEmployee(IEmployeeEditable employee) saveEmployee}
73 * hvorefter at man således igen er nødt til at låse objektet.
75 * @return e a new editable IPatientEditable object
77 * @deprecated brug den mere udvidede version af createNewEmployee.
80 public IEmployeeEditable
createNewEmployee()
81 throws SecurityDisallowedException
, RemoteException
84 "IEmployeeEditable createNewEmployee()",
85 "use public IEmployee createNewEmployee(" +
86 "String fornavn, String efternavn, " +
87 "String login, String password, " +
88 "String tlf, int tidsopdeling, " +
91 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
92 throw new SecurityDisallowedException();
93 return (IEmployeeEditable
)Marshall
.marshall(new EmployeeImpl());
97 * Opretter en medarbejder og gemmer ham i databasen.
99 * Hvis ikke at den nuværende bruger er administrator,
100 * får vedkommende en drno.exception kastet.
102 * @see drno.exception.SecurityDisallowedException
109 * @param tidsopdeling
111 * @return Et (@link drno.interfaces.IEmployee medarbejder) objekt som
112 * repræsenterer det nyligt oprettede objekt.
113 * @throws SecurityDisallowedException
114 * @throws RemoteException
115 * @throws ConsistanceException
116 * @throws UnkErrException
118 public IEmployee
createNewEmployee(
127 throws SecurityDisallowedException
, RemoteException
, ConsistanceException
, UnkErrException
129 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
130 throw new SecurityDisallowedException();
131 EmployeeImpl emp
= new EmployeeImpl();
132 setEmployee(emp
, fornavn
, efternavn
, tlf
, tidsopdeling
, login
, password
, type
);
135 } catch (ObjectLockException ex
) {
139 return (IEmployee
)Marshall
.marshall(emp
);
147 * @param tidsopdeling
151 * @throws ConsistanceException
153 private void setEmployee(EmployeeImpl emp
, String fornavn
, String efternavn
, String tlf
, int tidsopdeling
, String login
, String password
, int type
) throws ConsistanceException
155 emp
.setFornavn(fornavn
);
156 emp
.setEfternavn(efternavn
);
158 emp
.setPassword(password
);
159 emp
.setTelefonNummer(tlf
);
160 emp
.setTidsOpdeling(tidsopdeling
);
165 * Sletter en medarbejder.
167 * Det er selvfølgeligt nødvendigt at den enkelte medarbejder er
168 * låst ved et kald til {@link #lockEmployee(IEmployee)}
170 * Efterfølgende kald med dette objekt, vil ikke kunne udføres.
173 * {@link IPatientEditable} object former marked as editable
174 * @throws ObjectLockException
175 * @throws UnkErrException
179 public void deleteEmployee(IEmployee e
) throws
180 ObjectLockException
, RemoteException
, SecurityDisallowedException
, UnkErrException
182 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
183 throw new SecurityDisallowedException();
184 EmployeeImpl employee
= (EmployeeImpl
) Marshall
.unMarshall(e
);
185 if(e
.getLogin().equals("admin"))
186 throw new SecurityDisallowedException("Cannot delete admin user");
187 LockObject lo
= (LockObject
)Locks
.get(employee
);
189 broker
.deleteEmployee(employee
,lo
);
190 } catch (ConsistanceException ignore
) { }
196 * Låser et medarbejder objekt for editering.
198 * By locking an object, it means that the <code>set..()</code>
199 * operations can be called on the returned object. If the operation is not called,
200 * and the class is simply typecast to {@link drno.interfaces.IPatientEditable}
202 * @param employee the readonly employee object (IEmployee) that needs to be edited.
203 * @return An IPatient object ready to be edited. The object must be
204 * released by a call to either
205 * {@link #deleteEmployee(IEmployeeEditable)},
206 * {@link #saveEmployee(IEmployeeEditable)}
209 * @see IPatientEditable
210 * @deprecated anvend i stedet LockObject
212 public IEmployeeEditable
editEmployee(IEmployee employee
)
213 throws ObjectLockException
, SecurityDisallowedException
, RemoteException
216 "IEmployeeEditable editEmployee(IEmployee employee)",
217 "use lockEmployee Instead"
219 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
220 throw new SecurityDisallowedException();
222 EmployeeImpl e
= (EmployeeImpl
)Marshall
.unMarshall(employee
);
223 LockObject lo
= e
.save();
225 return (IEmployeeEditable
) Marshall
.marshall(e
);
229 * Hjælpe funktion til at beskrive hvis en funktion er forældet.
230 * @param func Navn på funktionen som er forældet.
231 * @param use Alternativ ny funktion som man kan anvende i stedet.
234 private void warnDeprecated(
239 System
.out
.println("<WARNING> Using deprecated funktion");
240 System
.out
.println(" Function: " + func
);
241 System
.out
.println(" use " + use
);
245 * @see drno.interfaces.EmployeeHandler#freeLockedEmployee(drno.interfaces.IEmployeeEditable)
246 * @deprecated use unLockEmployee Instead;
248 public IEmployee
freeLockedEmployee(IEmployeeEditable employee
)
249 throws SecurityDisallowedException
,
254 warnDeprecated("IEmployee freeLockedEmployee(IEmployeeEditable employee)",
255 "use unLockEmployee instead");
256 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
257 throw new SecurityDisallowedException();
259 EmployeeImpl e
= (EmployeeImpl
) Marshall
.unMarshall(employee
);
261 e
.rollback((LockObject
)Locks
.get(e
));
265 return (IEmployee
) Marshall
.marshall(e
);
269 * Returnerer alle medarbejdere i databasen.
271 * @return Vector med {@link drno.interfaces.IEmployee IEmployee} objekter
273 public Vector
getAllEmployees()
274 throws UnkErrException
,
277 return Marshall
.marshallVector(broker
.getAll());
281 * Returnerer alle medarbejdere som er af typen
282 * {@link drno.interfaces.IEmployee.TYPE_DOCTOR TYPE_DOCTOR} i databasen.
284 * @return Vector med {@link drno.interfaces.IEmployee IEmployee} objekter
286 public Vector
getAllDoctors()
287 throws UnkErrException
,
290 return Marshall
.marshallVector(broker
.getAllDoctors());
294 * Gemmer objektet hvis det er konsistent.
296 * Medarbejderen skal være låst inden at man kalder denne
297 * funktion, ellers vil man få kastet en
298 * {$link drno.exception.ObjectLockException ObjectLockException}
300 * Objktet kan låses ved et kald til enten
301 * {@link #createNewEmployee()} eller
302 * {@link #editEmployee(IEmployee)}
304 * If the object is not locked, it will throw one of two
305 * possible drno.exception.
306 * - drno.exception.ObjectLockException
307 * - drno.exception.DatabaseDisconnectedException
310 * The employee to be saved. If the object is not locked, the
311 * function will fail.
312 * @throws UnkErrException
313 * @throws ObjectLockException
314 * @throws ConsistanceException
315 * @throws RemoteException
317 * @see #createNewEmployee()
318 * @see #editEmployee(IEmployee)
322 public IEmployee
saveEmployee(IEmployeeEditable employee
)
323 throws SecurityDisallowedException
,
329 warnDeprecated("IEmployee saveEmployee(IEmployeeEditable employee)",
330 "IEmployee saveEmployee(IEmployee employee, String fornavn, " +
331 "String efternavn, String login, String password, String tlf, " +
332 "int tidsopdeling, int type) "
335 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
336 throw new SecurityDisallowedException();
338 EmployeeImpl e
= (EmployeeImpl
)Marshall
.unMarshall(employee
);
339 e
.commit((LockObject
)Locks
.get(e
));
341 // we must invalidate the lock before unloading it.
342 //((LockObject)Locks.get(e)).invalidate();
345 return (IEmployee
) Marshall
.marshall(e
);
350 * Gem en medarbejder ved at specificere hans nye egenskaber.
352 * {@link drno.interfaces.IEmployee employee} skal være låst inden dette kald. Hvis ikke at det er sket, vil
353 * en drno.exception blive kastet.
357 * @param employee (@see drno.interfaces.IEmployee)
363 * @param tidsopdeling
365 * @return the same employee object as passed in.
366 * @throws SecurityDisallowedException
367 * @throws UnkErrException
368 * @throws RemoteException
369 * @throws ObjectLockException
370 * @throws ConsistanceException
372 public IEmployee
saveEmployee(
381 throws SecurityDisallowedException
,
387 EmployeeImpl e
= (EmployeeImpl
)Marshall
.unMarshall(employee
);
389 if(mUser
.getType() != IEmployee
.TYPE_ADMIN
)
390 throw new SecurityDisallowedException();
392 setEmployee(e
, fornavn
, efternavn
, tlf
, tidsopdeling
, login
, password
, type
);
394 e
.commit((LockObject
)Locks
.get(e
));
396 //The lock has already been invalidated.
398 return (IEmployee
) Marshall
.marshall(e
);
402 * searches for all employee fitting with name resolvement.
404 * The name can contain both first and last name. Both will be tested.
407 * An name or names of the person that is to be searched for.
408 * @return a Vector with objects fitting the description of the search
410 * @throws UnkErrException
412 public Vector
searchEmployeesByName(String name
)
413 throws UnkErrException
,
416 return Marshall
.marshallVector(broker
.searchEmployeeByName(name
));
420 * ObUpdate signal bliver signaleret hvis et objekte i denne handler
422 * @return Signal interface.
424 public Signal
getOnUpdate() throws RemoteException
{