From: Marc Englund Date: Wed, 29 Aug 2007 13:09:28 +0000 (+0000) Subject: Reservr: most of the basic functionality working. X-Git-Tag: 6.7.0.beta1~6054 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=cd31e3f69acba105a9e13375986cf4c725efe5ee;p=vaadin-framework.git Reservr: most of the basic functionality working. svn changeset:2151/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/demo/reservation/ReservationApplication.java b/src/com/itmill/toolkit/demo/reservation/ReservationApplication.java index 0f04498336..07226794e9 100644 --- a/src/com/itmill/toolkit/demo/reservation/ReservationApplication.java +++ b/src/com/itmill/toolkit/demo/reservation/ReservationApplication.java @@ -1,64 +1,83 @@ package com.itmill.toolkit.demo.reservation; import java.util.Date; -import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; +import java.util.List; import com.itmill.toolkit.Application; import com.itmill.toolkit.data.Container; import com.itmill.toolkit.data.Item; -import com.itmill.toolkit.data.Property; import com.itmill.toolkit.data.Property.ValueChangeEvent; import com.itmill.toolkit.data.Property.ValueChangeListener; import com.itmill.toolkit.ui.Button; import com.itmill.toolkit.ui.CalendarField; -import com.itmill.toolkit.ui.Layout; +import com.itmill.toolkit.ui.Label; import com.itmill.toolkit.ui.OrderedLayout; import com.itmill.toolkit.ui.Panel; -import com.itmill.toolkit.ui.Select; +import com.itmill.toolkit.ui.TabSheet; import com.itmill.toolkit.ui.Table; import com.itmill.toolkit.ui.TextField; import com.itmill.toolkit.ui.Window; -import com.itmill.toolkit.ui.Button.ClickEvent; +import com.itmill.toolkit.ui.TabSheet.SelectedTabChangeEvent; public class ReservationApplication extends Application { private SampleDB db; - - private Window mainWindow; + + ResourceSelectorPanel resourcePanel; private CalendarField reservedFrom; private CalendarField reservedTo; + + private Label resourceName; + private Label statusLabel; private TextField description; private Button reservationButton; - - private Integer selectedResource = null; - - public void init() { - mainWindow = new Window("Reservr"); - setMainWindow(mainWindow); - setTheme("example"); + Table allReservations; + + public void init() { db = new SampleDB(true); db.generateResources(); db.generateDemoUser(); - - ResourcePanel resourcePanel = new ResourcePanel("Resources"); + + Window mainWindow = new Window("Reservr"); + setMainWindow(mainWindow); + setTheme("example"); + + TabSheet mainTabs = new TabSheet(); + mainWindow.addComponent(mainTabs); + + mainWindow.addComponent(new Button("close", this, "close")); + + OrderedLayout reservationTab = new OrderedLayout(); + mainTabs.addTab(reservationTab, "Make reservation", null); + + resourcePanel = new ResourceSelectorPanel("Resources"); resourcePanel.setResourceContainer(db.getResources(null)); - mainWindow.addComponent(resourcePanel); - - Panel reservationPanel = new Panel(new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL)); - mainWindow.addComponent(reservationPanel); - + resourcePanel.addListener( + ResourceSelectorPanel.SelectedResourcesChangedEvent.class, + this, "selectedResourcesChanged"); + reservationTab.addComponent(resourcePanel); + + Panel reservationPanel = new Panel(new OrderedLayout( + OrderedLayout.ORIENTATION_HORIZONTAL)); + reservationTab.addComponent(reservationPanel); + OrderedLayout infoLayout = new OrderedLayout(); reservationPanel.addComponent(infoLayout); + resourceName = new Label("Choose resource"); + resourceName.setCaption("Selected resource"); + infoLayout.addComponent(resourceName); description = new TextField(); description.setColumns(30); description.setRows(5); infoLayout.addComponent(description); - reservationButton = new Button("Make reservation",this,"makeReservation"); + reservationButton = new Button("Make reservation", this, + "makeReservation"); infoLayout.addComponent(reservationButton); + statusLabel = new Label(); + infoLayout.addComponent(statusLabel); // TODO Use calendar, set following hour Date now = new Date(); @@ -70,133 +89,121 @@ public class ReservationApplication extends Application { reservedTo.setMinimumDate(now); initCalendarFieldPropertyIds(reservedTo); reservationPanel.addComponent(reservedTo); - refreshReservations(null); reservedFrom.addListener(new ValueChangeListener() { public void valueChange(ValueChangeEvent event) { - Date fd = (Date)reservedFrom.getValue(); - Date td = (Date)reservedTo.getValue(); + Date fd = (Date) reservedFrom.getValue(); + Date td = (Date) reservedTo.getValue(); if (fd == null) { reservedTo.setValue(null); reservedTo.setEnabled(false); + refreshSelectedResources(); return; } else { reservedTo.setEnabled(true); } reservedTo.setMinimumDate(fd); - if (td == null||td.before(fd)) { + if (td == null || td.before(fd)) { reservedTo.setValue(fd); } - } + refreshSelectedResources(); + resetStatus(); + } }); reservedFrom.setImmediate(true); reservedFrom.setValue(now); - - - mainWindow.addComponent(new Button("close",this,"close")); - Table tbl = new Table(); - tbl.setContainerDataSource(db.getUsers()); - mainWindow.addComponent(tbl); + allReservations = new Table(); + mainTabs.addTab(allReservations, "All reservations", null); + mainTabs.addListener(new TabSheet.SelectedTabChangeListener() { + public void selectedTabChange(SelectedTabChangeEvent event) { + refreshReservations(); + } + }); + refreshReservations(); } - public void makeReservation() { - Integer rid = getSelectedResourceId(); - if (rid!=null) { - db.addReservation(rid.intValue(), 0, (Date)reservedFrom.getValue(), (Date)reservedTo.getValue(), (String)description.getValue()); - refreshReservations(new int[] {rid.intValue()}); + try { + Item resource = getActiveResource(); + if (resource != null) { + db.addReservation(resource, 0, (Date) reservedFrom.getValue(), + (Date) reservedTo.getValue(), (String) description + .getValue()); + } + } catch (ResourceNotAvailableException e) { + statusLabel.setCaption("Reservation failed"); + statusLabel + .setValue("The selected resource was not available for the selected period."); } + refreshReservations(); } - - private void refreshReservations(int[] resourceIds) { - Container reservations = db.getReservations(resourceIds);; - System.err.println("Got " + (reservations!=null?reservations.size():0) + " reservations"); + + private Item getActiveResource() throws ResourceNotAvailableException { + List rids = resourcePanel.getSelectedResources(); + if (rids != null && rids.size() > 0) { + for (Iterator it = rids.iterator(); it.hasNext();) { + Item resource = (Item) it.next(); + int id = ((Integer) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_ID).getValue()) + .intValue(); + if (db.isAvailableResource(id, (Date) reservedFrom.getValue(), + (Date) reservedTo.getValue())) + return resource; + } + throw new ResourceNotAvailableException("No available resource"); + } else { + return null; + } + } + + private void refreshReservations() { + Container reservations = db.getReservations(resourcePanel + .getSelectedResources()); reservedFrom.setContainerDataSource(reservations); reservedTo.setContainerDataSource(reservations); + refreshSelectedResources(); + allReservations.setContainerDataSource(db.getReservations(null)); } - private void initCalendarFieldPropertyIds(CalendarField cal) { - cal.setItemStartPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM); - cal.setItemEndPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_TO); - cal.setItemTitlePropertyId(SampleDB.Reservation.PROPERTY_ID_DESCRIPTION); - } - - private void setSelectedResourceId(Integer id) { - selectedResource = id; - if (id == null) { + + private void refreshSelectedResources() { + Item resource = null; + try { + resource = getActiveResource(); + } catch (ResourceNotAvailableException e) { + resourceName.setValue("Not available"); + reservationButton.setEnabled(false); + return; + } + if (resource == null) { + resourceName.setValue("Choose resource"); reservationButton.setEnabled(false); } else { + resourceName.setValue((String) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_NAME).getValue()); reservationButton.setEnabled(true); } + } - private Integer getSelectedResourceId() { - return selectedResource; + + private void initCalendarFieldPropertyIds(CalendarField cal) { + cal + .setItemStartPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM); + cal.setItemEndPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_TO); + cal + .setItemTitlePropertyId(SampleDB.Reservation.PROPERTY_ID_DESCRIPTION); } - private class ResourcePanel extends Panel implements Button.ClickListener { - - private HashMap categoryLayouts = new HashMap(); - private HashMap categoryResources = new HashMap(); - - public ResourcePanel(String caption) { - super(caption,new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL)); - } - - public void setResourceContainer(Container resources) { - this.removeAllComponents(); - categoryLayouts.clear(); - categoryResources.clear(); - if (resources!=null&&resources.size()>0) { - for (Iterator it = resources.getItemIds().iterator();it.hasNext();) { - Item resource = (Item)resources.getItem(it.next()); - Integer id = (Integer)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_ID).getValue(); - String category = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_CATEGORY).getValue(); - String name = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_NAME).getValue(); - String description = (String)resource.getItemProperty(SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue(); - Button rButton = new Button(name,this); - rButton.setStyle("link"); - rButton.setDescription(description); - rButton.setData(id); - Layout resourceLayout = (Layout)categoryLayouts.get(category); - LinkedList resourceList = (LinkedList)categoryResources.get(category); - if (resourceLayout==null) { - resourceLayout = new OrderedLayout(); - this.addComponent(resourceLayout); - categoryLayouts.put(category, resourceLayout); - resourceList = new LinkedList(); - categoryResources.put(category, resourceList); - Button cButton = new Button(category + " (any)",this); - cButton.setStyle("link"); - cButton.setData(category); - resourceLayout.addComponent(cButton); - } - resourceLayout.addComponent(rButton); - resourceList.add(id); - } - } - } + private void resetStatus() { + statusLabel.setCaption(null); + statusLabel.setValue(null); + } - public void buttonClick(ClickEvent event) { - Object source = event.getSource(); - if (source instanceof Button) { - Object data = ((Button)source).getData(); - if (data instanceof Integer) { - Integer resourceId = (Integer)data; - setSelectedResourceId(resourceId); - refreshReservations(new int[] {resourceId.intValue()}); - } else { - setSelectedResourceId(null); - String category = (String)data; - LinkedList resources = (LinkedList)categoryResources.get(category); - int[] rids = new int[resources.size()]; - for (int i = 0; i< rids.length;i++) { - rids[i] = ((Integer)resources.get(i)).intValue(); - } - refreshReservations(rids); - } - } - - } - + public void selectedResourcesChanged( + ResourceSelectorPanel.SelectedResourcesChangedEvent event) { + refreshReservations(); + resetStatus(); } + + } diff --git a/src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java b/src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java new file mode 100644 index 0000000000..af46e2f4d3 --- /dev/null +++ b/src/com/itmill/toolkit/demo/reservation/ResourceNotAvailableException.java @@ -0,0 +1,7 @@ +package com.itmill.toolkit.demo.reservation; + +public class ResourceNotAvailableException extends Exception { + public ResourceNotAvailableException(String message) { + super(message); + } +} diff --git a/src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java b/src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java new file mode 100644 index 0000000000..170a53c984 --- /dev/null +++ b/src/com/itmill/toolkit/demo/reservation/ResourceSelectorPanel.java @@ -0,0 +1,99 @@ +package com.itmill.toolkit.demo.reservation; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; + +import com.itmill.toolkit.data.Container; +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.Layout; +import com.itmill.toolkit.ui.OrderedLayout; +import com.itmill.toolkit.ui.Panel; +import com.itmill.toolkit.ui.Button.ClickEvent; + +public class ResourceSelectorPanel extends Panel implements + Button.ClickListener { + private HashMap categoryLayouts = new HashMap(); + private HashMap categoryResources = new HashMap(); + + private Container allResources; + private LinkedList selectedResources = null; + + public ResourceSelectorPanel(String caption) { + super(caption, new OrderedLayout(OrderedLayout.ORIENTATION_HORIZONTAL)); + } + + public void setResourceContainer(Container resources) { + this.removeAllComponents(); + categoryLayouts.clear(); + categoryResources.clear(); + if (resources != null && resources.size() > 0) { + for (Iterator it = resources.getItemIds().iterator(); it.hasNext();) { + Item resource = (Item) resources.getItem(it.next()); + Integer id = (Integer) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_ID).getValue(); + String category = (String) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_CATEGORY).getValue(); + String name = (String) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_NAME).getValue(); + String description = (String) resource.getItemProperty( + SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue(); + Button rButton = new Button(name, this); + rButton.setStyle("link"); + rButton.setDescription(description); + rButton.setData(resource); + Layout resourceLayout = (Layout) categoryLayouts.get(category); + LinkedList resourceList = (LinkedList) categoryResources + .get(category); + if (resourceLayout == null) { + resourceLayout = new OrderedLayout(); + this.addComponent(resourceLayout); + categoryLayouts.put(category, resourceLayout); + resourceList = new LinkedList(); + categoryResources.put(category, resourceList); + Button cButton = new Button(category + " (any)", this); + cButton.setStyle("link"); + cButton.setData(category); + resourceLayout.addComponent(cButton); + } + resourceLayout.addComponent(rButton); + resourceList.add(resource); + } + } + } + + private void setSelectedResources(LinkedList resources) { + selectedResources = resources; + fireEvent(new SelectedResourcesChangedEvent()); + } + + public LinkedList getSelectedResources() { + return selectedResources; + } + + public void buttonClick(ClickEvent event) { + Object source = event.getSource(); + if (source instanceof Button) { + Object data = ((Button) source).getData(); + String name = ((Button) source).getCaption(); + if (data instanceof Item) { + LinkedList rlist = new LinkedList(); + rlist.add(data); + setSelectedResources(rlist); + } else { + String category = (String) data; + LinkedList resources = (LinkedList) categoryResources + .get(category); + setSelectedResources(resources); + } + } + + } + + public class SelectedResourcesChangedEvent extends Event { + public SelectedResourcesChangedEvent() { + super(ResourceSelectorPanel.this); + } + } +} diff --git a/src/com/itmill/toolkit/demo/reservation/SampleDB.java b/src/com/itmill/toolkit/demo/reservation/SampleDB.java index 419ab1288f..b3465f3be0 100644 --- a/src/com/itmill/toolkit/demo/reservation/SampleDB.java +++ b/src/com/itmill/toolkit/demo/reservation/SampleDB.java @@ -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 + ","