Merge /pub/main
[educational.data.git] / Dr.NO / src / drno / server / EmployeeHandlerImpl.java
blob800f249b2a5efbddd3b61ac8de5a992d44c86e2c
1 package drno.server;
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;
24 /**
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 {
31 /**
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();
44 /**
45 * Test for om den aktuelle bruger må instantiere denne klasse.
46 * <p>
47 * @callgraph
49 EmployeeHandlerImpl(IEmployee employee) throws SecurityDisallowedException,
50 RemoteException
52 EmployeeImpl e = (EmployeeImpl)employee;
53 if(e.isVerified() == false) {
54 throw new SecurityDisallowedException();
56 if(onUpdate == null)onUpdate = new SignalImpl();
57 mUser = e;
58 try {
59 broker = BrokerController.instance().getEmployeeBroker();
61 catch (DatabaseDisconnectedException e1) {
62 // TODO Auto-generated catch block
63 e1.printStackTrace();
67 /**
68 * Opretter et tomt IPatient objekt.
69 * <p>
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
76 * @throws Exception
77 * @deprecated brug den mere udvidede version af createNewEmployee.
79 @Deprecated
80 public IEmployeeEditable createNewEmployee()
81 throws SecurityDisallowedException, RemoteException
83 warnDeprecated(
84 "IEmployeeEditable createNewEmployee()",
85 "use public IEmployee createNewEmployee(" +
86 "String fornavn, String efternavn, " +
87 "String login, String password, " +
88 "String tlf, int tidsopdeling, " +
89 "int type)"
91 if(mUser.getType() != IEmployee.TYPE_ADMIN)
92 throw new SecurityDisallowedException();
93 return (IEmployeeEditable)Marshall.marshall(new EmployeeImpl());
96 /**
97 * Opretter en medarbejder og gemmer ham i databasen.
98 * <p>
99 * Hvis ikke at den nuværende bruger er administrator,
100 * får vedkommende en drno.exception kastet.
102 * @see drno.exception.SecurityDisallowedException
104 * @param fornavn
105 * @param efternavn
106 * @param login
107 * @param password
108 * @param tlf
109 * @param tidsopdeling
110 * @param type
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(
119 String fornavn,
120 String efternavn,
121 String login,
122 String password,
123 String tlf,
124 int tidsopdeling,
125 int type
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);
133 try {
134 emp.commit(null);
135 } catch (ObjectLockException ex) {
138 onUpdate.emit(null);
139 return (IEmployee)Marshall.marshall(emp);
143 * @param emp
144 * @param fornavn
145 * @param efternavn
146 * @param tlf
147 * @param tidsopdeling
148 * @param login
149 * @param password
150 * @param type
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);
157 emp.setLogin(login);
158 emp.setPassword(password);
159 emp.setTelefonNummer(tlf);
160 emp.setTidsOpdeling(tidsopdeling);
161 emp.setType(type);
165 * Sletter en medarbejder.
166 * <p>
167 * Det er selvfølgeligt nødvendigt at den enkelte medarbejder er
168 * låst ved et kald til {@link #lockEmployee(IEmployee)}
169 * forinden.
170 * Efterfølgende kald med dette objekt, vil ikke kunne udføres.
172 * @param e
173 * {@link IPatientEditable} object former marked as editable
174 * @throws ObjectLockException
175 * @throws UnkErrException
176 * @throws Exception
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);
188 try {
189 broker.deleteEmployee(employee,lo);
190 } catch (ConsistanceException ignore) { }
191 onUpdate.emit(null);
196 * Låser et medarbejder objekt for editering.
197 * <p>
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)}
208 * @throws Exception
209 * @see IPatientEditable
210 * @deprecated anvend i stedet LockObject
212 public IEmployeeEditable editEmployee(IEmployee employee)
213 throws ObjectLockException, SecurityDisallowedException, RemoteException
215 warnDeprecated(
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();
224 Locks.put(e,lo);
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(
235 String func,
236 String use
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,
250 UnkErrException,
251 ObjectLockException,
252 RemoteException
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));
263 Locks.remove(e);
265 return (IEmployee) Marshall.marshall(e);
269 * Returnerer alle medarbejdere i databasen.
270 * <p>
271 * @return Vector med {@link drno.interfaces.IEmployee IEmployee} objekter
273 public Vector getAllEmployees()
274 throws UnkErrException,
275 RemoteException
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.
283 * <p>
284 * @return Vector med {@link drno.interfaces.IEmployee IEmployee} objekter
286 public Vector getAllDoctors()
287 throws UnkErrException,
288 RemoteException
290 return Marshall.marshallVector(broker.getAllDoctors());
294 * Gemmer objektet hvis det er konsistent.
295 * <p>
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}
299 * <p>
300 * Objktet kan låses ved et kald til enten
301 * {@link #createNewEmployee()} eller
302 * {@link #editEmployee(IEmployee)}
303 * <p>
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
309 * @param employee
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
316 * @throws Exception
317 * @see #createNewEmployee()
318 * @see #editEmployee(IEmployee)
320 * @deprecated
322 public IEmployee saveEmployee(IEmployeeEditable employee)
323 throws SecurityDisallowedException,
324 UnkErrException,
325 RemoteException,
326 ObjectLockException,
327 ConsistanceException
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();
343 Locks.remove(e);
344 onUpdate.emit(null);
345 return (IEmployee) Marshall.marshall(e);
350 * Gem en medarbejder ved at specificere hans nye egenskaber.
351 * <p>
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.
355 * \callgraph
357 * @param employee (@see drno.interfaces.IEmployee)
358 * @param fornavn
359 * @param efternavn
360 * @param login
361 * @param password
362 * @param tlf
363 * @param tidsopdeling
364 * @param type
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(
373 IEmployee employee,
374 String fornavn,
375 String efternavn,
376 String login,
377 String password,
378 String tlf,
379 int tidsopdeling,
380 int type)
381 throws SecurityDisallowedException,
382 UnkErrException,
383 RemoteException,
384 ObjectLockException,
385 ConsistanceException
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));
395 onUpdate.emit(null);
396 //The lock has already been invalidated.
397 Locks.remove(e);
398 return (IEmployee) Marshall.marshall(e);
402 * searches for all employee fitting with name resolvement.
403 * <p>
404 * The name can contain both first and last name. Both will be tested.
406 * @param name
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
409 * parameters.
410 * @throws UnkErrException
412 public Vector searchEmployeesByName(String name)
413 throws UnkErrException,
414 RemoteException
416 return Marshall.marshallVector(broker.searchEmployeeByName(name));
420 * ObUpdate signal bliver signaleret hvis et objekte i denne handler
421 * bliver opdateret.
422 * @return Signal interface.
424 public Signal getOnUpdate() throws RemoteException {
425 return onUpdate;