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");
223 public Vector<Offer> getRHsOffer(String name){
224 if (c.isDatabaseLocal() == false)
230 RuralHouse rh = (RuralHouse)db.queryByExample(new RuralHouse(name, null, null, null, null)).get(0);
231 Offer proto = new Offer(0, rh, null, null, 0);
232 ObjectSet<Offer> result = db.queryByExample(proto);
233 return new Vector<Offer>(result);
239 public Administrator getAdminData(){
240 if (c.isDatabaseLocal() == false)
248 List<Administrator> admL = db.query(new Predicate<Administrator>(){
249 private static final long serialVersionUID = 1L;
251 public boolean match(Administrator admin) {
267 public void storeAdmin() {
269 if (c.isDatabaseLocal() == false)
275 List<Administrator> admL = db.query(new Predicate<Administrator>() {
279 private static final long serialVersionUID = 1L;
281 public boolean match(Administrator admin) {
286 admL.get(0).setAddRequest(
287 Administrator.getInstance().getAddRequest());
288 admL.get(0).setRemoveRequest(
289 Administrator.getInstance().getRemoveRequest());
290 admL.get(0).setNewOwnerRequest(
291 Administrator.getInstance().getNewOwnerRequest());
295 } catch (Exception e) {
304 * This method creates a book with a corresponding parameters
307 * day, last day, house number and telephone
310 public Vector<Booking> createBooking(RuralHouse ruralHouse, Date firstDate,
311 Date lastDate, Client cl) throws OfferCanNotBeBooked {
313 if (c.isDatabaseLocal() == false)
318 Vector<Booking> book = new Vector<Booking>() ;
322 if (c.isDatabaseLocal() == false)
325 RuralHouse proto = new RuralHouse(ruralHouse.getHouseName(), null,
326 ruralHouse.getDescription(), ruralHouse.getDistrict(), null);
327 ObjectSet<RuralHouse> result = db.queryByExample(proto);
328 RuralHouse rh = (RuralHouse) result.next();
331 offer = rh.findOffer(firstDate, lastDate);
334 offer.createBooking(theDB4oManagerAux.bookingNumber++, cl);
335 db.store(theDB4oManagerAux); // To store the new value for
340 book = offer.getBookings();
344 } catch (com.db4o.ext.ObjectNotStorableException e) {
346 .println("Error: com.db4o.ext.ObjectNotStorableException in createBooking");
347 } catch (Exception exc) {
348 exc.printStackTrace();
356 * This method existing owners
359 public Vector<Owner> getOwners() throws RemoteException, Exception {
361 if (c.isDatabaseLocal() == false)
367 Owner proto = new Owner(null, null, null);
368 ObjectSet<Owner> result = db.queryByExample(proto);
369 Vector<Owner> owners = new Vector<Owner>();
370 while (result.hasNext())
371 owners.add((Owner) result.next());
379 public Vector<RuralHouse> getAllRuralHouses() throws RemoteException,
382 if (c.isDatabaseLocal() == false)
388 RuralHouse proto = new RuralHouse(null, null, null, null, null);
389 ObjectSet<RuralHouse> result = db.queryByExample(proto);
390 return new Vector<RuralHouse>(result);
396 public boolean existsOverlappingOffer(RuralHouse rh, Date firstDay,
397 Date lastDay) throws RemoteException, OverlappingOfferExists {
399 if (c.isDatabaseLocal() == false)
406 RuralHouse rhn = (RuralHouse) db.queryByExample(
407 new RuralHouse(rh.getHouseName(), null, null, null, null))
409 if (rhn.overlapsWith(firstDay, lastDay) != null)
410 throw new OverlappingOfferExists();
418 public static ObjectContainer getContainer() {
422 public void close() {
424 System.out.println("DataBase closed");
427 public String toString() {
428 return "bookingNumber=" + bookingNumber + " offerNumber=" + offerNumber;
435 * @throws RemoteException
438 public Vector<Account> getAccount(Account proto) throws RemoteException,
441 if (c.isDatabaseLocal() == false)
447 ObjectSet<Account> result = db.queryByExample(proto);
448 Vector<Account> accounts = new Vector<Account>();
449 while (result.hasNext())
450 accounts.add((Account) result.next());
460 public boolean storeRuralHouses(RuralHouse rh) {
462 if (c.isDatabaseLocal() == false)
467 boolean stored = false;
468 RuralHouse house = new RuralHouse(rh.getHouseName(), null, null, null,
471 ObjectSet<RuralHouse> result = db.queryByExample(house);
472 if (result.isEmpty()) {
473 Owner ow = (Owner) db.queryByExample(rh.getOwner()).get(0);
475 ow.addRuralHouse(rh);
480 db.delete(result.get(0));
491 public void removeHouse(RuralHouse rh, Owner owner) {
493 if (c.isDatabaseLocal() == false)
498 ObjectSet<Owner> result = db.queryByExample(owner);
499 ObjectSet<RuralHouse> rhs = db.queryByExample(rh);
500 if (!rhs.isEmpty()) {
501 Owner found = result.get(0);
502 found.getRuralHouses().remove(rhs.get(0));
503 db.delete(rhs.get(0));
507 } catch (Exception exc) {
508 exc.printStackTrace();
515 public Vector<RuralHouse> getRuralHouses(Owner ow, String name, String town,
516 int nBed, int nKit, int nBath, int nPark, int nLiv) {
517 HouseFeatures fea = new HouseFeatures(nBed, nKit, nBath, nLiv, nPark);
518 RuralHouse rh = new RuralHouse(name, ow, null, town, fea);
519 if (c.isDatabaseLocal() == false)
525 ObjectSet<RuralHouse> result = db.queryByExample(rh);
526 Vector<RuralHouse> ruralHouses = new Vector<RuralHouse>();
527 while (result.hasNext())
528 ruralHouses.add(result.next());
531 } catch (NullPointerException e) {
537 public boolean addAccount(Account acc) {
538 if (c.isDatabaseLocal() == false)
544 // TODO realize if there is another account with same username.
545 // Quite difficult with the f***ing salt
548 } catch (Exception exc) {
549 exc.printStackTrace();
556 // TODO remove account
558 public boolean removeAccount(Account acc) {
562 //TODO this method should be improved.
563 public void acceptBooking(Offer of){
564 Offer off = new Offer(of.getOfferNumber(),of.getRuralHouse(),of.getFirstDay(),of.getLastDay(),of.getPrice());
565 if (c.isDatabaseLocal() == false)
571 ObjectSet<Offer> result = db.queryByExample(off);
572 this.deleteOffer(result.get(0));
576 } catch (Exception e) {
577 e.printStackTrace();;
581 public void removeBooking(Booking b){
582 if (c.isDatabaseLocal() == false)
587 ObjectSet<Booking> result = db.queryByExample(b);
588 ObjectSet<Client> result2= db.queryByExample(b.getClient());
589 db.delete(result.get(0));
590 db.delete(result2.get(0));
592 } catch (Exception e) {
593 e.printStackTrace();;