4 //import java.util.Enumeration;
5 //import java.util.Vector;
6 import java.rmi.RemoteException;
8 import java.util.LinkedList;
10 import java.util.ListIterator;
11 import java.util.Vector;
13 import com.db4o.Db4oEmbedded;
14 import com.db4o.ObjectContainer;
15 import com.db4o.ObjectSet;
16 import com.db4o.config.EmbeddedConfiguration;
17 import com.db4o.cs.Db4oClientServer;
18 import com.db4o.cs.config.ClientConfiguration;
19 import com.db4o.query.Predicate;
21 import configuration.ConfigXML;
22 import domain.Account;
23 import domain.Administrator;
24 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",
138 Account admin = new Account("admin", "admin", true);
139 db.store(Administrator.getInstance());
141 db.store(alfredoAcc);
149 public void deleteDB() {
151 if (c.isDatabaseLocal() == false)
157 Owner proto = new Owner(null, null, null);
158 ObjectSet<Owner> result = db.queryByExample(proto);
159 while (result.hasNext()) {
160 Owner o = (Owner) result.next();
161 System.out.println("Deleted owner: " + o.toString());
170 public Offer createOffer(RuralHouse ruralHouse, Date firstDay,
171 Date lastDay, float price) throws RemoteException, Exception {
174 if (c.isDatabaseLocal() == false)
181 RuralHouse proto = new RuralHouse(ruralHouse.getHouseName(), null,
183 ObjectSet<RuralHouse> result = db.queryByExample(proto);
184 RuralHouse rh = (RuralHouse) result.next();
185 o = rh.createOffer(theDB4oManagerAux.offerNumber++, firstDay,
187 db.store(theDB4oManagerAux); // To store the new value for
192 } catch (com.db4o.ext.ObjectNotStorableException e) {
194 .println("Error: com.db4o.ext.ObjectNotStorableException in createOffer");
201 public void deleteOffer(Offer offer) throws RemoteException, Exception {
202 if (c.isDatabaseLocal() == false)
208 ObjectSet<Offer> of = db.queryByExample(offer);
209 RuralHouse rh = of.get(0).getRuralHouse();
210 System.out.println(rh.offers.remove(of.get(0)));
214 } catch (com.db4o.ext.ObjectNotStorableException e) {
216 .println("Error: com.db4o.ext.ObjectNotStorableException in createOffer");
222 public Administrator getAdminData() {
223 if (c.isDatabaseLocal() == false)
230 List<Administrator> admL = db.query(new Predicate<Administrator>() {
234 private static final long serialVersionUID = 1L;
236 public boolean match(Administrator admin) {
249 @SuppressWarnings("static-access")
250 public void storeAdmin() {
251 if (c.isDatabaseLocal() == false)
257 List<Administrator> admL = db.query(new Predicate<Administrator>() {
261 private static final long serialVersionUID = 1L;
263 public boolean match(Administrator admin) {
268 admL.get(0).setAddRequest(
269 Administrator.getInstance().getAddRequest());
270 admL.get(0).setRemoveRequest(
271 Administrator.getInstance().getRemoveRequest());
272 admL.get(0).setNewOwnerRequest(
273 Administrator.getInstance().getNewOwnerRequest());
276 } catch (Exception e) {
285 * This method creates a book with a corresponding parameters
288 * day, last day, house number and telephone
291 public Booking createBooking(RuralHouse ruralHouse, Date firstDate,
292 Date lastDate, String bookTelephoneNumber)
293 throws OfferCanNotBeBooked {
295 if (c.isDatabaseLocal() == false)
304 if (c.isDatabaseLocal() == false)
307 RuralHouse proto = new RuralHouse(ruralHouse.getHouseName(), null,
308 ruralHouse.getDescription(), ruralHouse.getDistrict(), null);
309 ObjectSet<RuralHouse> result = db.queryByExample(proto);
310 RuralHouse rh = (RuralHouse) result.next();
313 offer = rh.findOffer(firstDate, lastDate);
316 offer.createBooking(theDB4oManagerAux.bookingNumber++,
317 bookTelephoneNumber);
318 db.store(theDB4oManagerAux); // To store the new value for
322 bok = offer.getBooking();
325 } catch (com.db4o.ext.ObjectNotStorableException e) {
327 .println("Error: com.db4o.ext.ObjectNotStorableException in createBooking");
328 } catch (Exception exc) {
329 exc.printStackTrace();
337 * This method existing owners
340 public Vector<Owner> getOwners() throws RemoteException, Exception {
342 if (c.isDatabaseLocal() == false)
348 Owner proto = new Owner(null, null, null);
349 ObjectSet<Owner> result = db.queryByExample(proto);
350 Vector<Owner> owners = new Vector<Owner>();
351 while (result.hasNext())
352 owners.add((Owner) result.next());
359 public Vector<RuralHouse> getAllRuralHouses() throws RemoteException,
362 if (c.isDatabaseLocal() == false)
368 RuralHouse proto = new RuralHouse(null, null, null, null, null);
369 ObjectSet<RuralHouse> result = db.queryByExample(proto);
370 Vector<RuralHouse> ruralHouses = new Vector<RuralHouse>();
371 while (result.hasNext())
372 ruralHouses.add((RuralHouse) result.next());
379 public boolean existsOverlappingOffer(RuralHouse rh, Date firstDay,
380 Date lastDay) throws RemoteException, OverlappingOfferExists {
382 if (c.isDatabaseLocal() == false)
389 RuralHouse rhn = (RuralHouse) db.queryByExample(
390 new RuralHouse(rh.getHouseName(), null, null, null, null))
392 if (rhn.overlapsWith(firstDay, lastDay) != null)
393 throw new OverlappingOfferExists();
401 public static ObjectContainer getContainer() {
405 public void close() {
407 System.out.println("DataBase closed");
410 public String toString() {
411 return "bookingNumber=" + bookingNumber + " offerNumber=" + offerNumber;
418 * @throws RemoteException
421 public Vector<Account> getAccount(Account proto) throws RemoteException,
424 if (c.isDatabaseLocal() == false)
430 ObjectSet<Account> result = db.queryByExample(proto);
431 Vector<Account> accounts = new Vector<Account>();
432 while (result.hasNext())
433 accounts.add((Account) result.next());
443 public boolean storeRuralHouses(RuralHouse rh) {
445 if (c.isDatabaseLocal() == false)
450 boolean stored = false;
451 RuralHouse house = new RuralHouse(rh.getHouseName(), null, null, null,
454 ObjectSet<RuralHouse> result = db.queryByExample(house);
455 if (result.isEmpty()) {
456 Owner ow = (Owner) db.queryByExample(rh.getOwner()).get(0);
458 ow.addRuralHouse(rh);
463 db.delete(result.get(0));
474 public void removeHouse(RuralHouse rh, Owner owner) {
476 if (c.isDatabaseLocal() == false)
481 ObjectSet<Owner> result = db.queryByExample(owner);
482 ObjectSet<RuralHouse> rhs = db.queryByExample(rh);
483 if (!rhs.isEmpty()) {
484 Owner found = result.get(0);
485 found.getRuralHouses().remove(rhs.get(0));
486 db.delete(rhs.get(0));
490 } catch (Exception exc) {
491 exc.printStackTrace();
498 public Vector<RuralHouse> getRuralHouses(String name, String town,
499 int nBed, int nKit, int nBath, int nPark, int nLiv) {
500 HouseFeatures fea = new HouseFeatures(nBed, nKit, nBath, nLiv, nPark);
501 RuralHouse rh = new RuralHouse(name, null, null, town, fea);
502 if (c.isDatabaseLocal() == false)
508 ObjectSet<RuralHouse> result = db.queryByExample(rh);
509 Vector<RuralHouse> ruralHouses = new Vector<RuralHouse>();
510 while (result.hasNext())
511 ruralHouses.add(result.next());
514 } catch (NullPointerException e) {
520 public boolean addAccount(Account acc) {
521 if (c.isDatabaseLocal() == false)
527 //TODO realize if there is another account with same username. Quite difficult with the f***ing salt
530 } catch (Exception exc) {
531 exc.printStackTrace();
538 //TODO remove account
540 public boolean removeAccount(Account acc) {