4 //import java.util.Enumeration;
5 //import java.util.Vector;
6 import java.rmi.RemoteException;
9 import java.util.ListIterator;
10 import java.util.Vector;
12 import com.db4o.Db4oEmbedded;
13 import com.db4o.ObjectContainer;
14 import com.db4o.ObjectSet;
15 import com.db4o.config.EmbeddedConfiguration;
16 import com.db4o.cs.Db4oClientServer;
17 import com.db4o.cs.config.ClientConfiguration;
18 import com.db4o.query.Predicate;
20 import configuration.ConfigXML;
21 import domain.Account;
22 import domain.Administrator;
23 import domain.Booking;
25 import domain.HouseFeatures;
27 //import dataModel.Offer;
29 import domain.RuralHouse;
30 import exceptions.OfferCanNotBeBooked;
31 import exceptions.OverlappingOfferExists;
33 public class DB4oManager {
35 private static ObjectContainer db;
36 private static EmbeddedConfiguration configuration;
37 private static ClientConfiguration configurationCS;
38 private int bookingNumber = 0; // if it is "static" then it is not
40 private int offerNumber = 0; // if it is "static" then it is not serialized
41 private static DB4oManager theDB4oManager = null;
43 private static DB4oManagerAux theDB4oManagerAux;
47 private DB4oManager() throws Exception {
48 theDB4oManagerAux = new DB4oManagerAux(0, 0);
49 c = ConfigXML.getInstance();
50 System.out.println("Creating DB4oManager instance => isDatabaseLocal: "
51 + c.isDatabaseLocal() + " getDatabBaseOpenMode: "
52 + c.getDataBaseOpenMode());
54 if ((c.getDataBaseOpenMode().equals("initialize"))
55 && (c.isDatabaseLocal()))
56 new File(c.getDb4oFilename()).delete();
58 if (c.isDatabaseLocal()) {
60 System.out.println("DataBase opened");
61 } else // c.isDatabaseLocal==false
64 System.out.println("Remote DataBase opened");
66 if (c.getDataBaseOpenMode().equals("initialize")) {
68 System.out.println("DataBase initialized");
69 } else // c.getDataBaseOpenMode().equals("open")
72 ObjectSet<DB4oManagerAux> res = db
73 .queryByExample(DB4oManagerAux.class);
74 ListIterator<DB4oManagerAux> listIter = res.listIterator();
75 if (listIter.hasNext())
76 theDB4oManagerAux = (DB4oManagerAux) res.next();
80 private static void openDB() {
81 configuration = Db4oEmbedded.newConfiguration();
82 configuration.common().activationDepth(c.getActivationDepth());
83 configuration.common().updateDepth(c.getUpdateDepth());
84 configuration.common().objectClass(Owner.class).cascadeOnUpdate(true);
85 configuration.common().objectClass(Owner.class).cascadeOnDelete(true);
86 configuration.common().objectClass(RuralHouse.class)
87 .cascadeOnUpdate(true);
88 configuration.common().objectClass(Account.class).cascadeOnUpdate(true);
89 db = Db4oEmbedded.openFile(configuration, c.getDb4oFilename());
92 private void openSDB() {
94 configurationCS = Db4oClientServer.newClientConfiguration();
95 configurationCS.common().activationDepth(c.getActivationDepth());
96 configurationCS.common().updateDepth(c.getUpdateDepth());
97 configurationCS.common().objectClass(Owner.class).cascadeOnDelete(true);
98 db = Db4oClientServer.openClient(configurationCS, c.getDatabaseNode(),
99 c.getDatabasePort(), c.getUser(), c.getPassword());
103 class DB4oManagerAux {
107 DB4oManagerAux(int bookingNumber, int offerNumber) {
108 this.bookingNumber = bookingNumber;
109 this.offerNumber = offerNumber;
113 public static DB4oManager getInstance() throws Exception {
114 if (theDB4oManager == null)
115 theDB4oManager = new DB4oManager();
116 return theDB4oManager;
119 public void initializeDB() {
122 Owner jon = new Owner("Jon", "1349 5677 21 2133567777",
124 Owner alfredo = new Owner("Alfredo", "4144 0087 23 9700002133",
125 "alfredo@gmail.com");
126 jon.addRuralHouse("Ezkioko", "Ezkioko etxea", "Beatriz", 3, 3, 3,
128 jon.addRuralHouse("Eskiatze", "Eskiatzeko etxea", "Guazate", 4, 4,
130 alfredo.addRuralHouse("Aitonako", "Casa del abuelo", "Vegas", 5, 5,
133 alfredo.addRuralHouse("Murgoitz", "", "Cedro", 6, 6, 6, 6, 6);
134 Account jonAcc = new Account("1", "1", jon);
135 Account alfredoAcc = new Account("userAlfredo", "passAlfredo",
139 Account admin = new Account("admin", "admin", true);
140 db.store(Administrator.getInstance());
142 db.store(alfredoAcc);
150 public void deleteDB() {
152 if (c.isDatabaseLocal() == false)
158 Owner proto = new Owner(null, null, null);
159 ObjectSet<Owner> result = db.queryByExample(proto);
160 while (result.hasNext()) {
161 Owner o = (Owner) result.next();
162 System.out.println("Deleted owner: " + o.toString());
171 public Offer createOffer(RuralHouse ruralHouse, Date firstDay,
172 Date lastDay, float price) throws RemoteException, Exception {
175 if (c.isDatabaseLocal() == false)
182 RuralHouse proto = new RuralHouse(ruralHouse.getHouseName(), null,
184 ObjectSet<RuralHouse> result = db.queryByExample(proto);
185 RuralHouse rh = (RuralHouse) result.next();
186 o = rh.createOffer(theDB4oManagerAux.offerNumber++, firstDay,
188 db.store(theDB4oManagerAux); // To store the new value for
193 } catch (com.db4o.ext.ObjectNotStorableException e) {
195 .println("Error: com.db4o.ext.ObjectNotStorableException in createOffer");
202 public void deleteOffer(Offer offer) throws RemoteException, Exception {
203 if (c.isDatabaseLocal() == false)
209 ObjectSet<Offer> of = db.queryByExample(offer);
210 RuralHouse rh = of.get(0).getRuralHouse();
211 System.out.println(rh.offers.remove(of.get(0)));
215 } catch (com.db4o.ext.ObjectNotStorableException e) {
217 .println("Error: com.db4o.ext.ObjectNotStorableException in createOffer");
225 public Administrator getAdminData(){
226 if (c.isDatabaseLocal() == false)
234 List<Administrator> admL = db.query(new Predicate<Administrator>(){
235 private static final long serialVersionUID = 1L;
237 public boolean match(Administrator admin) {
253 public void storeAdmin() {
255 if (c.isDatabaseLocal() == false)
261 List<Administrator> admL = db.query(new Predicate<Administrator>() {
265 private static final long serialVersionUID = 1L;
267 public boolean match(Administrator admin) {
272 admL.get(0).setAddRequest(
273 Administrator.getInstance().getAddRequest());
274 admL.get(0).setRemoveRequest(
275 Administrator.getInstance().getRemoveRequest());
276 admL.get(0).setNewOwnerRequest(
277 Administrator.getInstance().getNewOwnerRequest());
281 } catch (Exception e) {
290 * This method creates a book with a corresponding parameters
293 * day, last day, house number and telephone
296 public Vector<Booking> createBooking(RuralHouse ruralHouse, Date firstDate,
297 Date lastDate, Client cl) throws OfferCanNotBeBooked {
299 if (c.isDatabaseLocal() == false)
304 Vector<Booking> book = new Vector<Booking>() ;
308 if (c.isDatabaseLocal() == false)
311 RuralHouse proto = new RuralHouse(ruralHouse.getHouseName(), null,
312 ruralHouse.getDescription(), ruralHouse.getDistrict(), null);
313 ObjectSet<RuralHouse> result = db.queryByExample(proto);
314 RuralHouse rh = (RuralHouse) result.next();
317 offer = rh.findOffer(firstDate, lastDate);
320 offer.createBooking(theDB4oManagerAux.bookingNumber++, cl);
321 db.store(theDB4oManagerAux); // To store the new value for
326 book = offer.getBookings();
330 } catch (com.db4o.ext.ObjectNotStorableException e) {
332 .println("Error: com.db4o.ext.ObjectNotStorableException in createBooking");
333 } catch (Exception exc) {
334 exc.printStackTrace();
342 * This method existing owners
345 public Vector<Owner> getOwners() throws RemoteException, Exception {
347 if (c.isDatabaseLocal() == false)
353 Owner proto = new Owner(null, null, null);
354 ObjectSet<Owner> result = db.queryByExample(proto);
355 Vector<Owner> owners = new Vector<Owner>();
356 while (result.hasNext())
357 owners.add((Owner) result.next());
364 public Vector<RuralHouse> getAllRuralHouses() throws RemoteException,
367 if (c.isDatabaseLocal() == false)
373 RuralHouse proto = new RuralHouse(null, null, null, null, null);
374 ObjectSet<RuralHouse> result = db.queryByExample(proto);
375 Vector<RuralHouse> ruralHouses = new Vector<RuralHouse>();
376 while (result.hasNext())
377 ruralHouses.add((RuralHouse) result.next());
384 public boolean existsOverlappingOffer(RuralHouse rh, Date firstDay,
385 Date lastDay) throws RemoteException, OverlappingOfferExists {
387 if (c.isDatabaseLocal() == false)
394 RuralHouse rhn = (RuralHouse) db.queryByExample(
395 new RuralHouse(rh.getHouseName(), null, null, null, null))
397 if (rhn.overlapsWith(firstDay, lastDay) != null)
398 throw new OverlappingOfferExists();
406 public static ObjectContainer getContainer() {
410 public void close() {
412 System.out.println("DataBase closed");
415 public String toString() {
416 return "bookingNumber=" + bookingNumber + " offerNumber=" + offerNumber;
423 * @throws RemoteException
426 public Vector<Account> getAccount(Account proto) throws RemoteException,
429 if (c.isDatabaseLocal() == false)
435 ObjectSet<Account> result = db.queryByExample(proto);
436 Vector<Account> accounts = new Vector<Account>();
437 while (result.hasNext())
438 accounts.add((Account) result.next());
448 public boolean storeRuralHouses(RuralHouse rh) {
450 if (c.isDatabaseLocal() == false)
455 boolean stored = false;
456 RuralHouse house = new RuralHouse(rh.getHouseName(), null, null, null,
459 ObjectSet<RuralHouse> result = db.queryByExample(house);
460 if (result.isEmpty()) {
461 Owner ow = (Owner) db.queryByExample(rh.getOwner()).get(0);
463 ow.addRuralHouse(rh);
468 db.delete(result.get(0));
479 public void removeHouse(RuralHouse rh, Owner owner) {
481 if (c.isDatabaseLocal() == false)
486 ObjectSet<Owner> result = db.queryByExample(owner);
487 ObjectSet<RuralHouse> rhs = db.queryByExample(rh);
488 if (!rhs.isEmpty()) {
489 Owner found = result.get(0);
490 found.getRuralHouses().remove(rhs.get(0));
491 db.delete(rhs.get(0));
495 } catch (Exception exc) {
496 exc.printStackTrace();
503 public Vector<RuralHouse> getRuralHouses(String name, String town,
504 int nBed, int nKit, int nBath, int nPark, int nLiv) {
505 HouseFeatures fea = new HouseFeatures(nBed, nKit, nBath, nLiv, nPark);
506 RuralHouse rh = new RuralHouse(name, null, null, town, fea);
507 if (c.isDatabaseLocal() == false)
513 ObjectSet<RuralHouse> result = db.queryByExample(rh);
514 Vector<RuralHouse> ruralHouses = new Vector<RuralHouse>();
515 while (result.hasNext())
516 ruralHouses.add(result.next());
519 } catch (NullPointerException e) {
525 public boolean addAccount(Account acc) {
526 if (c.isDatabaseLocal() == false)
532 // TODO realize if there is another account with same username.
533 // Quite difficult with the f***ing salt
536 } catch (Exception exc) {
537 exc.printStackTrace();
544 // TODO remove account
546 public boolean removeAccount(Account acc) {
550 //TODO this method should be improved.
551 public void acceptBooking(Offer of){
552 Offer off = new Offer(of.getOfferNumber(),of.getRuralHouse(),of.getFirstDay(),of.getLastDay(),of.getPrice());
553 if (c.isDatabaseLocal() == false)
559 ObjectSet<Offer> result = db.queryByExample(off);
560 this.deleteOffer(result.get(0));
564 } catch (Exception e) {
565 e.printStackTrace();;
569 public void removeBooking(Booking b){
570 if (c.isDatabaseLocal() == false)
575 ObjectSet<Booking> result = db.queryByExample(b);
576 ObjectSet<Client> result2= db.queryByExample(b.getClient());
577 db.delete(result.get(0));
578 db.delete(result2.get(0));
580 } catch (Exception e) {
581 e.printStackTrace();;