You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2013/02/19 09:00:23 UTC

[8/10] git commit: compound models

compound models


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8d310e9e
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8d310e9e
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8d310e9e

Branch: refs/heads/reference-guide
Commit: 8d310e9efebb5d3e9d7bb8fc48263fad9335ba1d
Parents: 85abead
Author: Michael Mosmann <mi...@mosmann.de>
Authored: Mon Feb 18 21:30:14 2013 +0100
Committer: Michael Mosmann <mi...@mosmann.de>
Committed: Mon Feb 18 21:30:14 2013 +0100

----------------------------------------------------------------------
 .../org/apache/wicket/reference/models/Start.html  |    3 +-
 .../org/apache/wicket/reference/models/Start.java  |    9 +-
 .../wicket/reference/models/compound/Address.java  |   21 +++++
 .../models/compound/CompoundModelBindPanel.html    |    8 ++
 .../models/compound/CompoundModelBindPanel.java    |   36 +++++++++
 .../models/compound/CompoundModelFormPage.html     |   11 +++
 .../models/compound/CompoundModelFormPage.java     |   12 +++
 .../models/compound/CompoundModelPanel.html        |    8 ++
 .../models/compound/CompoundModelPanel.java        |   36 +++++++++
 .../wicket/reference/models/compound/Person.java   |   42 ++++++++++
 .../models/dynamic/CustomModelFormPage.java        |    3 +-
 .../wicket/reference/models/dynamic/Person.java    |   20 +++++
 .../reference/models/dynamic/PersonBean.java       |   20 -----
 .../models/src/main/webapp/WEB-INF/web.xml         |    2 +-
 .../src/documentation/source/models.rst            |   60 ++++++++++++++-
 15 files changed, 263 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.html
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.html b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.html
index a99771b..58b93ce 100644
--- a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.html
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.html
@@ -4,6 +4,7 @@
     <title>Model Start Page</title>
 </head>
 <body>
-    <span wicket:id="message">The real message goes here</span>
+    <a wicket:id="dynamic">Dynamic Models</a>
+    <a wicket:id="compound">Compound Models</a>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.java
index 71b816c..00d829c 100644
--- a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.java
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/Start.java
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 package org.apache.wicket.reference.models;
-//#docu
 import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.reference.models.compound.CompoundModelFormPage;
+import org.apache.wicket.reference.models.dynamic.CustomModelFormPage;
 
 public class Start extends WebPage
 {
 	public Start()
 	{
-		add(new Label("message", "Hello World!"));
+		add(new BookmarkablePageLink<CustomModelFormPage>("dynamic", CustomModelFormPage.class));
+		add(new BookmarkablePageLink<CompoundModelFormPage>("compound", CompoundModelFormPage.class));
 	}
 }
-//#docu
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Address.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Address.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Address.java
new file mode 100644
index 0000000..8d1b285
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Address.java
@@ -0,0 +1,21 @@
+package org.apache.wicket.reference.models.compound;
+
+import java.io.Serializable;
+
+//#classOnly
+public class Address implements Serializable
+{
+	String city;
+
+	public String getCity()
+	{
+		return city;
+	}
+
+	public void setCity(String city)
+	{
+		this.city = city;
+	}
+}
+//#classOnly
+

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.html
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.html b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.html
new file mode 100644
index 0000000..704b3e9
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.html
@@ -0,0 +1,8 @@
+<wicket:panel>
+	<form wicket:id="form">
+		<label>Name</label> <input wicket:id="name" />
+		<label>Age</label><input wicket:id="age" />
+		<label>City</label><input wicket:id="city" />
+		<input type="submit" value="Submit">
+	</form>
+</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.java
new file mode 100644
index 0000000..2b31fb7
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.java
@@ -0,0 +1,36 @@
+package org.apache.wicket.reference.models.compound;
+
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+
+public class CompoundModelBindPanel extends Panel
+{
+
+	public CompoundModelBindPanel(String id)
+	{
+		super(id);
+		
+		Person person = new Person();
+		person.setAge(12);
+		person.setName("Klaus");
+		Address address = new Address();
+		address.setCity("Lübeck");
+		person.setAddress(address);
+		
+		//#bind
+		CompoundPropertyModel<Person> personModel = new CompoundPropertyModel<Person>(
+			person);
+		Form<Person> form = new Form<Person>("form", personModel);
+		form.add(new RequiredTextField<String>("city", personModel.<String>bind("address.city")));
+		//#bind
+		
+		form.add(new RequiredTextField<String>("name"));
+		form.add(new RequiredTextField<Integer>("age", Integer.class));
+		
+		add(form);
+		
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.html
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.html b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.html
new file mode 100644
index 0000000..9456b53
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.html
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:wicket="http://wicket.apache.org">
+<head>
+<title>Compound Model Form</title>
+</head>
+<body>
+	<wicket:container wicket:id="compound"></wicket:container>
+	<wicket:container wicket:id="bind"></wicket:container>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.java
new file mode 100644
index 0000000..0ebb432
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelFormPage.java
@@ -0,0 +1,12 @@
+package org.apache.wicket.reference.models.compound;
+
+import org.apache.wicket.markup.html.WebPage;
+
+public class CompoundModelFormPage extends WebPage
+{
+	public CompoundModelFormPage()
+	{
+		add(new CompoundModelPanel("compound"));
+		add(new CompoundModelBindPanel("bind"));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.html
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.html b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.html
new file mode 100644
index 0000000..e674242
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.html
@@ -0,0 +1,8 @@
+<wicket:panel>
+	<form wicket:id="form">
+		<label>Name</label> <input wicket:id="name" />
+		<label>Age</label><input wicket:id="age" />
+		<label>City</label><input wicket:id="address.city" />
+		<input type="submit" value="Submit">
+	</form>
+</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java
new file mode 100644
index 0000000..f8f5cd3
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java
@@ -0,0 +1,36 @@
+package org.apache.wicket.reference.models.compound;
+
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+
+public class CompoundModelPanel extends Panel
+{
+
+	public CompoundModelPanel(String id)
+	{
+		super(id);
+		
+		Person person = new Person();
+		person.setAge(12);
+		person.setName("Klaus");
+		Address address = new Address();
+		address.setCity("Lübeck");
+		person.setAddress(address);
+		//#form
+		Form<Person> form = new Form<Person>("form", new CompoundPropertyModel<Person>(
+			person));
+		form.add(new RequiredTextField<String>("name"));
+		form.add(new RequiredTextField<Integer>("age", Integer.class));
+		//#form
+
+		//#addressCity
+		form.add(new RequiredTextField<String>("address.city"));
+		//#addressCity
+
+		add(form);
+		
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Person.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Person.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Person.java
new file mode 100644
index 0000000..3f27e85
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/compound/Person.java
@@ -0,0 +1,42 @@
+package org.apache.wicket.reference.models.compound;
+
+import java.io.Serializable;
+
+//#classOnly
+public class Person implements Serializable
+{
+	String name;
+	Integer age;
+	Address address;
+
+	public String getName()
+	{
+		return name;
+	}
+
+	public void setName(String name)
+	{
+		this.name = name;
+	}
+
+	public Integer getAge()
+	{
+		return age;
+	}
+
+	public void setAge(Integer age)
+	{
+		this.age = age;
+	}
+
+	public Address getAddress()
+	{
+		return address;
+	}
+
+	public void setAddress(Address address)
+	{
+		this.address = address;
+	}
+}
+//#classOnly

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/CustomModelFormPage.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/CustomModelFormPage.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/CustomModelFormPage.java
index e47bdc0..d15142d 100644
--- a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/CustomModelFormPage.java
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/CustomModelFormPage.java
@@ -9,7 +9,8 @@ public class CustomModelFormPage extends WebPage
 {
 	public CustomModelFormPage()
 	{
-		final PersonBean person = new PersonBean();
+		final Person person = new Person();
+		person.setName("Klaus");
 
 		Form<Void> personForm = new Form<Void>("form");
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/Person.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/Person.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/Person.java
new file mode 100644
index 0000000..f8e9bd4
--- /dev/null
+++ b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/Person.java
@@ -0,0 +1,20 @@
+package org.apache.wicket.reference.models.dynamic;
+
+import java.io.Serializable;
+
+//#classOnly
+public class Person implements Serializable
+{
+	String name;
+
+	public String getName()
+	{
+		return name;
+	}
+
+	public void setName(String name)
+	{
+		this.name = name;
+	}
+}
+//#classOnly

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/PersonBean.java
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/PersonBean.java b/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/PersonBean.java
deleted file mode 100644
index 0446835..0000000
--- a/wicket-reference-guide/models/src/main/java/org/apache/wicket/reference/models/dynamic/PersonBean.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.wicket.reference.models.dynamic;
-
-import java.io.Serializable;
-
-//#classOnly
-public class PersonBean implements Serializable
-{
-	String name;
-
-	public String getName()
-	{
-		return name;
-	}
-
-	public void setName(String name)
-	{
-		this.name = name;
-	}
-}
-//#classOnly

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/models/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/models/src/main/webapp/WEB-INF/web.xml b/wicket-reference-guide/models/src/main/webapp/WEB-INF/web.xml
index ae1b6e9..a2e3cf1 100644
--- a/wicket-reference-guide/models/src/main/webapp/WEB-INF/web.xml
+++ b/wicket-reference-guide/models/src/main/webapp/WEB-INF/web.xml
@@ -31,7 +31,7 @@
 
 	<filter-mapping>
 		<filter-name>ModelsApplication</filter-name>
-		<url-pattern>/models/*</url-pattern>
+		<url-pattern>/*</url-pattern>
 		<dispatcher>REQUEST</dispatcher>
 		<dispatcher>INCLUDE</dispatcher>
         <dispatcher>ERROR</dispatcher>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8d310e9e/wicket-reference-guide/src/documentation/source/models.rst
----------------------------------------------------------------------
diff --git a/wicket-reference-guide/src/documentation/source/models.rst b/wicket-reference-guide/src/documentation/source/models.rst
index 5c31d2d..0840927 100644
--- a/wicket-reference-guide/src/documentation/source/models.rst
+++ b/wicket-reference-guide/src/documentation/source/models.rst
@@ -87,7 +87,7 @@ The PropertyModel class allows you to create a model that accesses a particular
 		
 which takes a model object and a property expression. When the property model is asked for its value by the framework, it will use the property expression to access the model object's property. For example, if we have a Java Bean or "POJO" (Plain Old Java Object) like this:
 
-.. includecode:: ../../../models/src/main/java/org/apache/wicket/reference/models/dynamic/PersonBean.java#classOnly
+.. includecode:: ../../../models/src/main/java/org/apache/wicket/reference/models/dynamic/Person.java#classOnly
 
 then the property expression "name" can be used to access the "name" property of any Person object via the ``getName()`` getter method.
 
@@ -120,6 +120,64 @@ There are three principal reasons why you might use PropertyModel instead of Mod
 
 
 
+Compound Property Models
+------------------------
+
+Compound models allow containers to share models with their children. This saves memory, but more importantly, it makes replication of models much cheaper in a clustered environment. The basic idea is that the contained components usually want model data that can be easily derived at runtime from the model of their container. So, give the contained components no explicit model, and when a model is needed, Wicket will search up the containment hierarchy for a compound model. The compound model can retrieve model data for any of its contained components.
+
+``CompoundPropertyModel`` is the most commonly used compound model. An instance of this class uses the name of the contained component as a property expression to retrieve data from its own model data.
+
+To use a ``CompoundPropertyModel``, simply set one as the model for a container, such as a Form or a Page. Create the contained components with no model of their own. Insure that the component identifier names match the appropriate property names.
+
+Here's a simple example using a ``CompoundPropertyModel``. Suppose we have a Person class, with two properties: Name and Age. We want a simple form for the user to edit a Person.
+
+.. includecode:: ../../../models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java#form
+
+.. note::
+
+	A complete working example would require a save button and so forth but the use of a compound model doesn't change those.
+
+The component name can in fact be a more complicated property expression. Suppose for example that the Person class also has an address property, of class Address, and that class in turn has a city property. To define this field in the form we can do this:
+
+.. includecode:: ../../../models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelPanel.java#addressCity
+
+The corresponding input field in the html must have a wicket id of ``'address.city'``. This works, but it does expose the internal structure of the model data in the html. ``CompoundPropertyModel`` has a method that can be used to rectify this.
+
+The model associates a different property expression with the component being bound.
+
+.. todo:: replace with real code
+
+::
+
+	public <S> IModel<S> bind(String property)
+	
+With this association in place the child component can have whatever name we like, rather than having the match the property expression.
+
+To use ``CompoundPropertyModel.bind`` for the city field discussed above we might do something like this:
+
+.. includecode:: ../../../models/src/main/java/org/apache/wicket/reference/models/compound/CompoundModelBindPanel.java#bind
+	
+Also, note that if you are using a component that you do not want to reference the compound property model, but is a child of the form, that you define a model for that component. For example:
+
+.. todo:: replace with real code
+
+::
+
+	// throws exception
+	personForm.add(new Label("non-compound-model-reference"));
+	// does not throw an exception
+	personForm.add(new Label("non-compound-model-reference", new Model<String>()));
+
+
+
+
+
+
+
+
+
+
+