]> source.dussan.org Git - vaadin-framework.git/commitdiff
Reservr: most of the basic functionality working.
authorMarc Englund <marc.englund@itmill.com>
Wed, 29 Aug 2007 13:09:28 +0000 (13:09 +0000)
committerMarc Englund <marc.englund@itmill.com>
Wed, 29 Aug 2007 13:09:28 +0000 (13:09 +0000)
svn changeset:2151/svn branch:trunk

src/com/itmill/toolkit/demo/reservation/ReservationApplication.java
src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java [new file with mode: 0644]
src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java [new file with mode: 0644]
src/com/itmill/toolkit/demo/reservation/SampleDB.java

index 0f044983368142fb7b2857143e9c6b41b01021a8..07226794e9832593f4503fc2f836627c2247a736 100644 (file)
@@ -1,64 +1,83 @@
 package com.itmill.toolkit.demo.reservation;\r
 \r
 import java.util.Date;\r
-import java.util.HashMap;\r
 import java.util.Iterator;\r
-import java.util.LinkedList;\r
+import java.util.List;\r
 \r
 import com.itmill.toolkit.Application;\r
 import com.itmill.toolkit.data.Container;\r
 import com.itmill.toolkit.data.Item;\r
-import com.itmill.toolkit.data.Property;\r
 import com.itmill.toolkit.data.Property.ValueChangeEvent;\r
 import com.itmill.toolkit.data.Property.ValueChangeListener;\r
 import com.itmill.toolkit.ui.Button;\r
 import com.itmill.toolkit.ui.CalendarField;\r
-import com.itmill.toolkit.ui.Layout;\r
+import com.itmill.toolkit.ui.Label;\r
 import com.itmill.toolkit.ui.OrderedLayout;\r
 import com.itmill.toolkit.ui.Panel;\r
-import com.itmill.toolkit.ui.Select;\r
+import com.itmill.toolkit.ui.TabSheet;\r
 import com.itmill.toolkit.ui.Table;\r
 import com.itmill.toolkit.ui.TextField;\r
 import com.itmill.toolkit.ui.Window;\r
-import com.itmill.toolkit.ui.Button.ClickEvent;\r
+import com.itmill.toolkit.ui.TabSheet.SelectedTabChangeEvent;\r
 \r
 public class ReservationApplication extends Application {\r
 \r
     private SampleDB db;\r
-    \r
-    private Window mainWindow;\r
+\r
+    ResourceSelectorPanel resourcePanel;\r
 \r
     private CalendarField reservedFrom;\r
     private CalendarField reservedTo;\r
+\r
+    private Label resourceName;\r
+    private Label statusLabel;\r
     private TextField description;\r
     private Button reservationButton;\r
-    \r
-    private Integer selectedResource = null;\r
-    \r
-    public void init() {\r
-       mainWindow = new Window("Reservr");\r
-       setMainWindow(mainWindow);\r
-       setTheme("example");\r
 \r
+    Table allReservations;\r
+\r
+    public void init() {\r
        db = new SampleDB(true);\r
        db.generateResources();\r
        db.generateDemoUser();\r
-               \r
-       ResourcePanel resourcePanel = new ResourcePanel("Resources");\r
+\r
+       Window mainWindow = new Window("Reservr");\r
+       setMainWindow(mainWindow);\r
+       setTheme("example");\r
+\r
+       TabSheet mainTabs = new TabSheet();\r
+       mainWindow.addComponent(mainTabs);\r
+\r
+       mainWindow.addComponent(new Button("close", this, "close"));\r
+\r
+       OrderedLayout reservationTab = new OrderedLayout();\r
+       mainTabs.addTab(reservationTab, "Make reservation", null);\r
+\r
+       resourcePanel = new ResourceSelectorPanel("Resources");\r
        resourcePanel.setResourceContainer(db.getResources(null));\r
-       mainWindow.addComponent(resourcePanel);\r
-               \r
-       Panel reservationPanel = new Panel(new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL));\r
-       mainWindow.addComponent(reservationPanel);\r
-       \r
+       resourcePanel.addListener(\r
+               ResourceSelectorPanel.SelectedResourcesChangedEvent.class,\r
+               this, "selectedResourcesChanged");\r
+       reservationTab.addComponent(resourcePanel);\r
+\r
+       Panel reservationPanel = new Panel(new OrderedLayout(\r
+               OrderedLayout.ORIENTATION_HORIZONTAL));\r
+       reservationTab.addComponent(reservationPanel);\r
+\r
        OrderedLayout infoLayout = new OrderedLayout();\r
        reservationPanel.addComponent(infoLayout);\r
+       resourceName = new Label("Choose resource");\r
+       resourceName.setCaption("Selected resource");\r
+       infoLayout.addComponent(resourceName);\r
        description = new TextField();\r
        description.setColumns(30);\r
        description.setRows(5);\r
        infoLayout.addComponent(description);\r
-       reservationButton = new Button("Make reservation",this,"makeReservation");\r
+       reservationButton = new Button("Make reservation", this,\r
+               "makeReservation");\r
        infoLayout.addComponent(reservationButton);\r
+       statusLabel = new Label();\r
+       infoLayout.addComponent(statusLabel);\r
 \r
        // TODO Use calendar, set following hour\r
        Date now = new Date();\r
@@ -70,133 +89,121 @@ public class ReservationApplication extends Application {
        reservedTo.setMinimumDate(now);\r
        initCalendarFieldPropertyIds(reservedTo);\r
        reservationPanel.addComponent(reservedTo);\r
-       refreshReservations(null);\r
        reservedFrom.addListener(new ValueChangeListener() {\r
            public void valueChange(ValueChangeEvent event) {\r
-               Date fd = (Date)reservedFrom.getValue();\r
-               Date td = (Date)reservedTo.getValue();\r
+               Date fd = (Date) reservedFrom.getValue();\r
+               Date td = (Date) reservedTo.getValue();\r
                if (fd == null) {\r
                    reservedTo.setValue(null);\r
                    reservedTo.setEnabled(false);\r
+                   refreshSelectedResources();\r
                    return;\r
                } else {\r
                    reservedTo.setEnabled(true);\r
                }\r
                reservedTo.setMinimumDate(fd);\r
-               if (td == null||td.before(fd)) {\r
+               if (td == null || td.before(fd)) {\r
                    reservedTo.setValue(fd);\r
                }\r
-           }       \r
+               refreshSelectedResources();\r
+               resetStatus();\r
+           }\r
        });\r
        reservedFrom.setImmediate(true);\r
        reservedFrom.setValue(now);\r
 \r
-       \r
-\r
-       mainWindow.addComponent(new Button("close",this,"close"));\r
-       Table tbl = new Table();\r
-       tbl.setContainerDataSource(db.getUsers());\r
-       mainWindow.addComponent(tbl);\r
+       allReservations = new Table();\r
+       mainTabs.addTab(allReservations, "All reservations", null);\r
+       mainTabs.addListener(new TabSheet.SelectedTabChangeListener() {\r
+           public void selectedTabChange(SelectedTabChangeEvent event) {\r
+               refreshReservations();\r
+           }\r
+       });\r
 \r
+       refreshReservations();\r
     }\r
 \r
-\r
     public void makeReservation() {\r
-       Integer rid = getSelectedResourceId();\r
-       if (rid!=null) {\r
-           db.addReservation(rid.intValue(), 0, (Date)reservedFrom.getValue(), (Date)reservedTo.getValue(), (String)description.getValue());\r
-           refreshReservations(new int[] {rid.intValue()});\r
+       try {\r
+           Item resource = getActiveResource();\r
+           if (resource != null) {\r
+               db.addReservation(resource, 0, (Date) reservedFrom.getValue(),\r
+                       (Date) reservedTo.getValue(), (String) description\r
+                               .getValue());\r
+           }\r
+       } catch (ResourceNotAvailableException e) {\r
+           statusLabel.setCaption("Reservation failed");\r
+           statusLabel\r
+                   .setValue("The selected resource was not available for the selected period.");\r
        }\r
+       refreshReservations();\r
     }\r
-    \r
-    private void refreshReservations(int[] resourceIds) {\r
-       Container reservations = db.getReservations(resourceIds);;\r
-       System.err.println("Got " + (reservations!=null?reservations.size():0) + " reservations");\r
+\r
+    private Item getActiveResource() throws ResourceNotAvailableException {\r
+       List rids = resourcePanel.getSelectedResources();\r
+       if (rids != null && rids.size() > 0) {\r
+           for (Iterator it = rids.iterator(); it.hasNext();) {\r
+               Item resource = (Item) it.next();\r
+               int id = ((Integer) resource.getItemProperty(\r
+                       SampleDB.Resource.PROPERTY_ID_ID).getValue())\r
+                       .intValue();\r
+               if (db.isAvailableResource(id, (Date) reservedFrom.getValue(),\r
+                       (Date) reservedTo.getValue()))\r
+                   return resource;\r
+           }\r
+           throw new ResourceNotAvailableException("No available resource");\r
+       } else {\r
+           return null;\r
+       }\r
+    }\r
+\r
+    private void refreshReservations() {\r
+       Container reservations = db.getReservations(resourcePanel\r
+               .getSelectedResources());\r
        reservedFrom.setContainerDataSource(reservations);\r
        reservedTo.setContainerDataSource(reservations);\r
+       refreshSelectedResources();\r
+       allReservations.setContainerDataSource(db.getReservations(null));\r
     }\r
-    private void initCalendarFieldPropertyIds(CalendarField cal) {\r
-       cal.setItemStartPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM);\r
-       cal.setItemEndPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_TO);\r
-       cal.setItemTitlePropertyId(SampleDB.Reservation.PROPERTY_ID_DESCRIPTION);\r
-    }\r
-    \r
-    private void setSelectedResourceId(Integer id) {\r
-       selectedResource = id;\r
-       if (id == null) {\r
+\r
+    private void refreshSelectedResources() {\r
+       Item resource = null;\r
+       try {\r
+           resource = getActiveResource();\r
+       } catch (ResourceNotAvailableException e) {\r
+           resourceName.setValue("Not available");\r
+           reservationButton.setEnabled(false);\r
+           return;\r
+       }\r
+       if (resource == null) {\r
+           resourceName.setValue("Choose resource");\r
            reservationButton.setEnabled(false);\r
        } else {\r
+           resourceName.setValue((String) resource.getItemProperty(\r
+                   SampleDB.Resource.PROPERTY_ID_NAME).getValue());\r
            reservationButton.setEnabled(true);\r
        }\r
+       \r
     }\r
-    private Integer getSelectedResourceId() {\r
-       return selectedResource;\r
+\r
+    private void initCalendarFieldPropertyIds(CalendarField cal) {\r
+       cal\r
+               .setItemStartPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM);\r
+       cal.setItemEndPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_TO);\r
+       cal\r
+               .setItemTitlePropertyId(SampleDB.Reservation.PROPERTY_ID_DESCRIPTION);\r
     }\r
     \r
-    private class ResourcePanel extends Panel implements Button.ClickListener {\r
-       \r
-       private HashMap categoryLayouts = new HashMap();\r
-       private HashMap categoryResources = new HashMap();\r
-       \r
-       public ResourcePanel(String caption) {\r
-           super(caption,new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL));\r
-       }\r
-       \r
-       public void setResourceContainer(Container resources) {\r
-           this.removeAllComponents();\r
-           categoryLayouts.clear();\r
-           categoryResources.clear();\r
-           if (resources!=null&&resources.size()>0) {\r
-               for (Iterator it = resources.getItemIds().iterator();it.hasNext();) {\r
-                   Item resource = (Item)resources.getItem(it.next());\r
-                   Integer id = (Integer)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_ID).getValue();\r
-                   String category = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_CATEGORY).getValue();\r
-                   String name = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_NAME).getValue();\r
-                   String description = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue();\r
-                   Button rButton = new Button(name,this);\r
-                   rButton.setStyle("link");\r
-                   rButton.setDescription(description);\r
-                   rButton.setData(id);\r
-                   Layout resourceLayout = (Layout)categoryLayouts.get(category);\r
-                   LinkedList resourceList = (LinkedList)categoryResources.get(category);\r
-                   if (resourceLayout==null) {\r
-                       resourceLayout = new OrderedLayout();\r
-                       this.addComponent(resourceLayout);\r
-                       categoryLayouts.put(category, resourceLayout);\r
-                       resourceList = new LinkedList();\r
-                       categoryResources.put(category, resourceList);\r
-                       Button cButton = new Button(category + " (any)",this);\r
-                       cButton.setStyle("link");\r
-                       cButton.setData(category);\r
-                       resourceLayout.addComponent(cButton);\r
-                   } \r
-                   resourceLayout.addComponent(rButton);\r
-                   resourceList.add(id);\r
-               }\r
-           }\r
-       }\r
+    private void resetStatus() {\r
+       statusLabel.setCaption(null);\r
+       statusLabel.setValue(null);\r
+    }\r
 \r
-       public void buttonClick(ClickEvent event) {\r
-           Object source = event.getSource();\r
-           if (source instanceof Button) {\r
-               Object data = ((Button)source).getData();\r
-               if (data instanceof Integer) {\r
-                   Integer resourceId = (Integer)data;\r
-                   setSelectedResourceId(resourceId);\r
-                   refreshReservations(new int[] {resourceId.intValue()});\r
-               } else {\r
-                   setSelectedResourceId(null);\r
-                   String category = (String)data;\r
-                   LinkedList resources = (LinkedList)categoryResources.get(category);\r
-                   int[] rids = new int[resources.size()];\r
-                   for (int i = 0; i< rids.length;i++) {\r
-                       rids[i] = ((Integer)resources.get(i)).intValue();\r
-                   }\r
-                   refreshReservations(rids);\r
-               }\r
-           }\r
-           \r
-       }\r
-       \r
+    public void selectedResourcesChanged(\r
+           ResourceSelectorPanel.SelectedResourcesChangedEvent event) {\r
+       refreshReservations();\r
+       resetStatus();\r
     }\r
+    \r
+\r
 }\r
diff --git a/src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java b/src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java
new file mode 100644 (file)
index 0000000..af46e2f
--- /dev/null
@@ -0,0 +1,7 @@
+package com.itmill.toolkit.demo.reservation;\r
+\r
+public class ResourceNotAvailableException extends Exception {\r
+       public ResourceNotAvailableException(String message) {\r
+           super(message);\r
+       }\r
+}\r
diff --git a/src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java b/src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java
new file mode 100644 (file)
index 0000000..170a53c
--- /dev/null
@@ -0,0 +1,99 @@
+package com.itmill.toolkit.demo.reservation;\r
+\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.LinkedList;\r
+\r
+import com.itmill.toolkit.data.Container;\r
+import com.itmill.toolkit.data.Item;\r
+import com.itmill.toolkit.ui.Button;\r
+import com.itmill.toolkit.ui.Layout;\r
+import com.itmill.toolkit.ui.OrderedLayout;\r
+import com.itmill.toolkit.ui.Panel;\r
+import com.itmill.toolkit.ui.Button.ClickEvent;\r
+\r
+public class ResourceSelectorPanel extends Panel implements\r
+       Button.ClickListener {\r
+    private HashMap categoryLayouts = new HashMap();\r
+    private HashMap categoryResources = new HashMap();\r
+\r
+    private Container allResources;\r
+    private LinkedList selectedResources = null;\r
+\r
+    public ResourceSelectorPanel(String caption) {\r
+       super(caption, new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL));\r
+    }\r
+\r
+    public void setResourceContainer(Container resources) {\r
+       this.removeAllComponents();\r
+       categoryLayouts.clear();\r
+       categoryResources.clear();\r
+       if (resources != null && resources.size() > 0) {\r
+           for (Iterator it = resources.getItemIds().iterator(); it.hasNext();) {\r
+               Item resource = (Item) resources.getItem(it.next());\r
+               Integer id = (Integer) resource.getItemProperty(\r
+                       SampleDB.Resource.PROPERTY_ID_ID).getValue();\r
+               String category = (String) resource.getItemProperty(\r
+                       SampleDB.Resource.PROPERTY_ID_CATEGORY).getValue();\r
+               String name = (String) resource.getItemProperty(\r
+                       SampleDB.Resource.PROPERTY_ID_NAME).getValue();\r
+               String description = (String) resource.getItemProperty(\r
+                       SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue();\r
+               Button rButton = new Button(name, this);\r
+               rButton.setStyle("link");\r
+               rButton.setDescription(description);\r
+               rButton.setData(resource);\r
+               Layout resourceLayout = (Layout) categoryLayouts.get(category);\r
+               LinkedList resourceList = (LinkedList) categoryResources\r
+                       .get(category);\r
+               if (resourceLayout == null) {\r
+                   resourceLayout = new OrderedLayout();\r
+                   this.addComponent(resourceLayout);\r
+                   categoryLayouts.put(category, resourceLayout);\r
+                   resourceList = new LinkedList();\r
+                   categoryResources.put(category, resourceList);\r
+                   Button cButton = new Button(category + " (any)", this);\r
+                   cButton.setStyle("link");\r
+                   cButton.setData(category);\r
+                   resourceLayout.addComponent(cButton);\r
+               }\r
+               resourceLayout.addComponent(rButton);\r
+               resourceList.add(resource);\r
+           }\r
+       }\r
+    }\r
+\r
+    private void setSelectedResources(LinkedList resources) {\r
+       selectedResources = resources;\r
+       fireEvent(new SelectedResourcesChangedEvent());\r
+    }\r
+\r
+    public LinkedList getSelectedResources() {\r
+       return selectedResources;\r
+    }\r
+\r
+    public void buttonClick(ClickEvent event) {\r
+       Object source = event.getSource();\r
+       if (source instanceof Button) {\r
+           Object data = ((Button) source).getData();\r
+           String name = ((Button) source).getCaption();\r
+           if (data instanceof Item) {\r
+               LinkedList rlist = new LinkedList();\r
+               rlist.add(data);\r
+               setSelectedResources(rlist);\r
+           } else {\r
+               String category = (String) data;\r
+               LinkedList resources = (LinkedList) categoryResources\r
+                       .get(category);\r
+               setSelectedResources(resources);\r
+           }\r
+       }\r
+\r
+    }\r
+\r
+    public class SelectedResourcesChangedEvent extends Event {\r
+       public SelectedResourcesChangedEvent() {\r
+           super(ResourceSelectorPanel.this);\r
+       }\r
+    }\r
+}\r
index 419ab1288fd8d6435e0013193ef1892dc9abaf57..b3465f3be0ac49b90a41db10d4bbd9a075709170 100644 (file)
@@ -7,8 +7,11 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
 
 import com.itmill.toolkit.data.Container;
+import com.itmill.toolkit.data.Item;
 import com.itmill.toolkit.data.util.QueryContainer;
 
 public class SampleDB {
@@ -41,7 +44,7 @@ public class SampleDB {
        public static final String PROPERTY_ID_RESERVED_FROM = "RESERVED_FROM";
        public static final String PROPERTY_ID_RESERVED_TO = "RESERVED_TO";
     }
-
+    
     // TODO -> param
     private static final String DB_URL = "jdbc:hsqldb:file:reservation.db";
 
@@ -206,6 +209,7 @@ public class SampleDB {
     }
 
     public Container getCategories() {
+       // TODO where deleted=?
        String q = "SELECT DISTINCT(" + Resource.PROPERTY_ID_CATEGORY
                + ") FROM " + Resource.TABLE + " ORDER BY "
                + Resource.PROPERTY_ID_CATEGORY;
@@ -220,6 +224,7 @@ public class SampleDB {
     }
 
     public Container getResources(String category) {
+       // TODO where deleted=?
        String q = "SELECT * FROM " + Resource.TABLE;
        if (category != null) {
            q += " WHERE " + Resource.PROPERTY_ID_CATEGORY + "='" + category
@@ -237,15 +242,20 @@ public class SampleDB {
 
     }
 
-    public Container getReservations(int[] resourceIds) {
-       String q = "SELECT * FROM " + Reservation.TABLE ;
-       if (resourceIds != null && resourceIds.length > 0) {
+    public Container getReservations(List resources) {
+       // TODO where reserved_by=?
+       // TODO where from=?
+       // TODO where to=?
+       // TODO where deleted=?
+       String q = "SELECT * FROM " + Reservation.TABLE;
+       if (resources != null && resources.size() > 0) {
            StringBuilder s = new StringBuilder();
-           for (int i = 0; i < resourceIds.length; i++) {
-               if (i > 0) {
+           for (Iterator it = resources.iterator(); it.hasNext();) {
+               if (s.length() > 0) {
                    s.append(",");
                }
-               s.append(resourceIds[i]);
+               s.append(((Item) it.next())
+                       .getItemProperty(Resource.PROPERTY_ID_ID));
            }
            q += " HAVING " + Reservation.PROPERTY_ID_RESOURCE_ID + " IN (" + s
                    + ")";
@@ -265,20 +275,15 @@ public class SampleDB {
        }
     }
 
-
-    public void addReservation(int resourceId, int reservedById,
+    public void addReservation(Item resource, int reservedById,
            Date reservedFrom, Date reservedTo, String description) {
-       // TODO swap dates if from>to
-       String checkQ = "SELECT count(*) FROM " + Reservation.TABLE + " WHERE "
-               + Reservation.PROPERTY_ID_RESOURCE_ID + "=? AND (("
-               + Reservation.PROPERTY_ID_RESERVED_FROM + ">=? AND "
-               + Reservation.PROPERTY_ID_RESERVED_FROM + "<=?) OR ("
-               + Reservation.PROPERTY_ID_RESERVED_TO + ">=? AND "
-               + Reservation.PROPERTY_ID_RESERVED_TO + "<=?) OR ("
-               + Reservation.PROPERTY_ID_RESERVED_FROM + "<=? AND "
-               + Reservation.PROPERTY_ID_RESERVED_TO + ">=?)"
-               +")";
-       System.err.println(checkQ);
+       if (reservedFrom.after(reservedTo)) {
+           Date tmp = reservedTo;
+           reservedTo = reservedFrom;
+           reservedFrom = tmp;
+       }
+       int resourceId = ((Integer) resource.getItemProperty(
+               Resource.PROPERTY_ID_ID).getValue()).intValue();
        String q = "INSERT INTO " + Reservation.TABLE + " ("
                + Reservation.PROPERTY_ID_RESOURCE_ID + ","
                + Reservation.PROPERTY_ID_RESERVED_BY_ID + ","
@@ -288,21 +293,10 @@ public class SampleDB {
                + "VALUES (?,?,?,?,?)";
        synchronized (DB_URL) {
            try {
-               PreparedStatement p = connection.prepareStatement(checkQ);
-               p.setInt(1, resourceId);
-               p.setTimestamp(2, new java.sql.Timestamp(reservedFrom.getTime()));
-               p.setTimestamp(3, new java.sql.Timestamp(reservedTo.getTime()));
-               p.setTimestamp(4, new java.sql.Timestamp(reservedFrom.getTime()));
-               p.setTimestamp(5, new java.sql.Timestamp(reservedTo.getTime()));
-               p.setTimestamp(6, new java.sql.Timestamp(reservedFrom.getTime()));
-               p.setTimestamp(7, new java.sql.Timestamp(reservedTo.getTime()));
-               p.execute();
-               ResultSet rs = p.getResultSet();
-               if (rs.next() && rs.getInt(1) > 0) {
-                   // TODO custom exception
-                   throw new RuntimeException("Not free!");
+               if (!isAvailableResource(resourceId, reservedFrom, reservedTo)) {
+                   throw new ResourceNotAvailableException("The resource is not available at that time.");
                }
-               p = connection.prepareStatement(q);
+               PreparedStatement p = connection.prepareStatement(q);
                p.setInt(1, resourceId);
                p.setInt(2, reservedById);
                p.setTimestamp(3,
@@ -311,14 +305,49 @@ public class SampleDB {
                p.setString(5, description);
                p.execute();
            } catch (Exception e) {
-               // TODO
-               System.err.println(e);
-               e.printStackTrace(System.err);
+               throw new RuntimeException(e);
            }
        }
     }
 
+    public boolean isAvailableResource(int resourceId, Date reservedFrom,
+           Date reservedTo) {
+       // TODO where deleted=?
+       if (reservedFrom.after(reservedTo)) {
+           Date tmp = reservedTo;
+           reservedTo = reservedFrom;
+           reservedFrom = tmp;
+       }
+       String checkQ = "SELECT count(*) FROM " + Reservation.TABLE + " WHERE "
+               + Reservation.PROPERTY_ID_RESOURCE_ID + "=? AND (("
+               + Reservation.PROPERTY_ID_RESERVED_FROM + ">=? AND "
+               + Reservation.PROPERTY_ID_RESERVED_FROM + "<=?) OR ("
+               + Reservation.PROPERTY_ID_RESERVED_TO + ">=? AND "
+               + Reservation.PROPERTY_ID_RESERVED_TO + "<=?) OR ("
+               + Reservation.PROPERTY_ID_RESERVED_FROM + "<=? AND "
+               + Reservation.PROPERTY_ID_RESERVED_TO + ">=?)" + ")";
+       try {
+           PreparedStatement p = connection.prepareStatement(checkQ);
+           p.setInt(1, resourceId);
+           p.setTimestamp(2, new java.sql.Timestamp(reservedFrom.getTime()));
+           p.setTimestamp(3, new java.sql.Timestamp(reservedTo.getTime()));
+           p.setTimestamp(4, new java.sql.Timestamp(reservedFrom.getTime()));
+           p.setTimestamp(5, new java.sql.Timestamp(reservedTo.getTime()));
+           p.setTimestamp(6, new java.sql.Timestamp(reservedFrom.getTime()));
+           p.setTimestamp(7, new java.sql.Timestamp(reservedTo.getTime()));
+           p.execute();
+           ResultSet rs = p.getResultSet();
+           if (rs.next() && rs.getInt(1) > 0) {
+               return false;
+           }
+       } catch (Exception e) {
+           throw new RuntimeException(e);
+       }
+       return true;
+    }
+
     public Container getUsers() {
+       // TODO where deleted=?
        String q = "SELECT * FROM " + User.TABLE + " ORDER BY "
                + User.PROPERTY_ID_FULLNAME;
        try {
@@ -330,18 +359,19 @@ public class SampleDB {
            throw new RuntimeException(e);
        }
     }
-    
+
     public void generateResources() {
        String[][] resources = {
                { "IT Mill Toolkit Manual", "the manual", "Books" },
-               { "IT Mill Toolkit for Dummies", "the hardcover version", "Books" },
+               { "IT Mill Toolkit for Dummies", "the hardcover version",
+                       "Books" },
                { "Sony", "Old Sony video projector", "AV equipment" },
                { "Sanyo", "Brand new hd-ready video projector", "AV equipment" },
                { "Room 7", "Converence room in the lobby", "Conference rooms" },
-               { "Luokkahuone", "Classroom right next to IT Mill", "Conference rooms" },
-               { "Nintendo Wii", "Teh uber fun", "Entertainment" }, 
-               { "Playstation", "We don't actually have one", "Entertainment" } 
-               };
+               { "Luokkahuone", "Classroom right next to IT Mill",
+                       "Conference rooms" },
+               { "Nintendo Wii", "Teh uber fun", "Entertainment" },
+               { "Playstation", "We don't actually have one", "Entertainment" } };
 
        String q = "INSERT INTO " + Resource.TABLE + "("
                + Resource.PROPERTY_ID_NAME + ","