summaryrefslogtreecommitdiffstats
path: root/uitest/src/com/vaadin/tests/util
diff options
context:
space:
mode:
Diffstat (limited to 'uitest/src/com/vaadin/tests/util')
-rw-r--r--uitest/src/com/vaadin/tests/util/Address.java66
-rw-r--r--uitest/src/com/vaadin/tests/util/AlwaysFailValidator.java23
-rw-r--r--uitest/src/com/vaadin/tests/util/Log.java63
-rw-r--r--uitest/src/com/vaadin/tests/util/LogPrintWriter.java34
-rw-r--r--uitest/src/com/vaadin/tests/util/LoremIpsum.java13
-rw-r--r--uitest/src/com/vaadin/tests/util/Millionaire.java22
-rw-r--r--uitest/src/com/vaadin/tests/util/Person.java96
-rw-r--r--uitest/src/com/vaadin/tests/util/PersonContainer.java98
-rw-r--r--uitest/src/com/vaadin/tests/util/PortableRandom.java52
-rw-r--r--uitest/src/com/vaadin/tests/util/Product.java40
-rw-r--r--uitest/src/com/vaadin/tests/util/Role.java37
-rw-r--r--uitest/src/com/vaadin/tests/util/SampleDirectory.java87
-rw-r--r--uitest/src/com/vaadin/tests/util/TestClickListener.java38
-rw-r--r--uitest/src/com/vaadin/tests/util/TestUtils.java140
-rw-r--r--uitest/src/com/vaadin/tests/util/User.java54
15 files changed, 863 insertions, 0 deletions
diff --git a/uitest/src/com/vaadin/tests/util/Address.java b/uitest/src/com/vaadin/tests/util/Address.java
new file mode 100644
index 0000000000..5ef0669e1b
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Address.java
@@ -0,0 +1,66 @@
+package com.vaadin.tests.util;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class Address implements Serializable {
+
+ private String streetAddress = "";
+ private Integer postalCode = null;
+ private String city = "";
+
+ public Address() {
+ }
+
+ public Address(String streetAddress, int postalCode, String city) {
+ setStreetAddress(streetAddress);
+ setPostalCode(postalCode);
+ setCity(city);
+ }
+
+ /**
+ * @return the streetAddress
+ */
+ public String getStreetAddress() {
+ return streetAddress;
+ }
+
+ /**
+ * @param streetAddress
+ * the streetAddress to set
+ */
+ public void setStreetAddress(String streetAddress) {
+ this.streetAddress = streetAddress;
+ }
+
+ /**
+ * @return the postalCode
+ */
+ public Integer getPostalCode() {
+ return postalCode;
+ }
+
+ /**
+ * @param postalCode
+ * the postalCode to set
+ */
+ public void setPostalCode(Integer postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ /**
+ * @return the city
+ */
+ public String getCity() {
+ return city;
+ }
+
+ /**
+ * @param city
+ * the city to set
+ */
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/AlwaysFailValidator.java b/uitest/src/com/vaadin/tests/util/AlwaysFailValidator.java
new file mode 100644
index 0000000000..ddb58999ee
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/AlwaysFailValidator.java
@@ -0,0 +1,23 @@
+package com.vaadin.tests.util;
+
+import com.vaadin.data.validator.AbstractValidator;
+
+public class AlwaysFailValidator extends AbstractValidator<Object> {
+ public AlwaysFailValidator() {
+ super("Validation error");
+ }
+
+ public AlwaysFailValidator(String message) {
+ super(message);
+ }
+
+ @Override
+ protected boolean isValidValue(Object value) {
+ return false;
+ }
+
+ @Override
+ public Class getType() {
+ return Object.class;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/util/Log.java b/uitest/src/com/vaadin/tests/util/Log.java
new file mode 100644
index 0000000000..7a58a4c80c
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Log.java
@@ -0,0 +1,63 @@
+package com.vaadin.tests.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.VerticalLayout;
+
+public class Log extends VerticalLayout {
+ List<Label> eventLabels = new ArrayList<Label>();
+ private boolean numberLogRows = true;
+ private int nextLogNr = 1;
+
+ public Log(int nr) {
+ for (int i = 0; i < nr; i++) {
+ Label l = createEventLabel();
+ l.setId("Log_row_" + i);
+ eventLabels.add(l);
+ addComponent(l);
+ }
+ setId("Log");
+ setCaption("Events:");
+ }
+
+ /**
+ * Clears the rows and reset the row number to zero.
+ */
+ public Log clear() {
+ for (Label l : eventLabels) {
+ l.setValue("&nbsp;");
+ }
+ nextLogNr = 0;
+ return this;
+ }
+
+ public Log log(String event) {
+ int nr = eventLabels.size();
+ for (int i = nr - 1; i > 0; i--) {
+ eventLabels.get(i).setValue(eventLabels.get(i - 1).getValue());
+ }
+ String msg = event;
+ if (numberLogRows) {
+ msg = nextLogNr + ". " + msg;
+ nextLogNr++;
+ }
+ eventLabels.get(0).setValue(msg);
+ System.out.println(event);
+ return this;
+ }
+
+ private Label createEventLabel() {
+ Label l = new Label("&nbsp;", ContentMode.XHTML);
+ l.setWidth(null);
+ return l;
+ }
+
+ public Log setNumberLogRows(boolean numberLogRows) {
+ this.numberLogRows = numberLogRows;
+ return this;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/LogPrintWriter.java b/uitest/src/com/vaadin/tests/util/LogPrintWriter.java
new file mode 100644
index 0000000000..1f07a9c7ae
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/LogPrintWriter.java
@@ -0,0 +1,34 @@
+package com.vaadin.tests.util;
+
+import java.io.PrintWriter;
+import java.io.Writer;
+
+/**
+ * Use for collecting HTTP response.
+ *
+ */
+public class LogPrintWriter extends PrintWriter {
+
+ private final StringBuffer result = new StringBuffer(256);
+
+ public LogPrintWriter(Writer out) {
+ super(out);
+ }
+
+ @Override
+ public void print(String s) {
+ result.append(s);
+ super.print(s);
+ }
+
+ @Override
+ public void write(String s) {
+ result.append(s);
+ super.write(s);
+ }
+
+ public String getResult() {
+ return result.toString();
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/util/LoremIpsum.java b/uitest/src/com/vaadin/tests/util/LoremIpsum.java
new file mode 100644
index 0000000000..3dc775badf
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/LoremIpsum.java
@@ -0,0 +1,13 @@
+package com.vaadin.tests.util;
+
+public class LoremIpsum {
+ private static final String LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacinia sollicitudin neque, vitae cursus eros scelerisque sit amet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin sollicitudin tempus lorem, sed consectetur nibh ultrices nec. Ut tempus laoreet dolor non molestie. Quisque consectetur tellus ut tortor imperdiet semper. In tempor odio eu metus hendrerit pharetra. Aliquam erat volutpat. Aliquam erat volutpat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec sit amet turpis facilisis ipsum cursus viverra ut vitae turpis. Integer tincidunt sem id sem tristique a laoreet eros euismod. Ut quis leo vel neque pellentesque ullamcorper. Aliquam at fermentum justo. Sed eget laoreet elit. Pellentesque commodo dui quis metus ornare bibendum. Ut tempus, ipsum in euismod scelerisque, augue ante lacinia sem, scelerisque imperdiet felis lectus rhoncus felis.Fusce vitae nisl lorem, id ultricies massa. Phasellus augue eros, dapibus vel fermentum non, sodales id mi. Nulla tincidunt diam a justo ultricies vestibulum nec sed tellus. Morbi faucibus leo et odio condimentum at porttitor diam auctor. Aenean volutpat lacinia mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean malesuada ullamcorper elit ut eleifend. Etiam tempor, mauris id aliquet tempor, erat felis rutrum eros, a aliquam dolor nunc nec enim. Sed enim dolor, tristique ut tempus vitae, elementum at velit. Duis vulputate ultricies risus, ac gravida erat tincidunt posuere. Pellentesque dapibus tincidunt rhoncus. Phasellus eleifend molestie eros. Praesent id imperdiet urna. Etiam fermentum interdum quam, in tempus quam condimentum at.Curabitur eget ultrices augue. Suspendisse potenti. Nam hendrerit, dolor eget adipiscing lobortis, enim risus dignissim orci, a imperdiet tellus nulla id nibh. Praesent eu dui sit amet nulla interdum dignissim vel quis ante. Sed a lectus metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus eget ultrices neque. Cras adipiscing condimentum justo adipiscing consequat. In accumsan mollis sapien ut euismod. Nulla sodales pulvinar leo, nec condimentum leo vestibulum ut. Phasellus risus metus, aliquet quis porta at, imperdiet vitae metus. Proin nec odio odio. Quisque nec elit id lacus iaculis ullamcorper sit amet vel ipsum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In non lacus sed libero euismod rhoncus. Suspendisse augue massa, ullamcorper at accumsan at, porttitor ac odio.Morbi imperdiet, lectus vehicula eleifend ornare, lectus arcu ullamcorper augue, a imperdiet eros augue id justo. Integer eget pretium lorem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras vehicula leo eget metus consectetur viverra. Nullam a mi nisl, in lacinia metus. Curabitur mollis eleifend augue, consectetur imperdiet velit sagittis aliquet. In tempor tempor orci eu faucibus. Mauris nisi neque, vulputate eu dignissim eget, aliquet sed nibh. Mauris rhoncus elit eget lectus dignissim bibendum. Phasellus sed nunc lacus, nec aliquet elit. Fusce blandit, sem vitae gravida elementum, sem orci porttitor eros, id porta tortor massa ut velit. Nulla pretium mi at tortor porttitor sollicitudin.Ut gravida est at lectus eleifend non ultrices ligula blandit. Sed purus lectus, adipiscing ut mollis vel, interdum quis diam. Phasellus eget nibh augue. Fusce justo felis, facilisis in auctor ut, cursus et enim. Praesent hendrerit venenatis elit, iaculis cursus ligula auctor in. Proin mollis malesuada dolor at elementum. Maecenas sit amet leo odio. Integer ac enim in justo eleifend dapibus. Pellentesque consequat, libero congue sagittis pulvinar, odio eros porta quam, et aliquet dolor turpis non lacus. Sed eu risus nunc. Aliquam tempus nulla a purus auctor mattis. Nullam adipiscing nisl nec purus porttitor rutrum. Sed pellentesque tincidunt posuere. Nulla varius cursus eros. Phasellus vel neque at metus tempus placerat laoreet ac dolor. Nulla faucibus leo nisi, vel placerat lectus.Donec non leo lacinia metus euismod dignissim suscipit ut neque. Donec iaculis, lacus ut luctus bibendum, mi libero tristique sem, vel consectetur risus ligula in turpis. Nulla lorem justo, porttitor non sollicitudin at, pharetra non ante. Phasellus tristique, purus at luctus auctor, nisl neque congue lacus, eget convallis mauris libero sit amet arcu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tellus quam, lobortis vitae commodo id, ultrices a augue. Nam tellus erat, varius vel iaculis et, fermentum ut tellus. Donec id urna orci. Curabitur eleifend hendrerit libero, id tempor dolor faucibus eu. Quisque aliquam sapien a tortor mollis sollicitudin. Duis augue erat, sagittis eget consequat vel, volutpat et augue. Sed vehicula mattis nisi, non porta elit imperdiet vitae. Curabitur scelerisque mollis lectus, consequat suscipit est ultricies sit amet. Aenean in sem libero, id adipiscing urna. Aenean eleifend posuere lorem in aliquet. Praesent arcu est, tristique quis adipiscing ac, tincidunt nec dui. Nunc sed leo quis justo posuere suscipit. Fusce vitae lectus vitae urna sodales aliquam.Sed velit purus, ullamcorper non interdum quis, facilisis eget tortor. Etiam vestibulum venenatis aliquet. Fusce felis felis, venenatis id tincidunt at, vehicula et erat. Curabitur eu sagittis nisl. Curabitur nisi sapien, venenatis nec pulvinar ut, tempor id diam. Suspendisse metus libero, placerat in fermentum a, aliquam id arcu. Nulla quis accumsan massa. Curabitur consectetur pulvinar sapien non consequat. Etiam sem dolor, posuere id laoreet a, tempor vel nisl. Fusce eu lacus orci. Pellentesque tellus dui, pulvinar nec egestas vitae, adipiscing euismod nunc. Mauris consequat felis sit amet justo pellentesque venenatis. Donec dignissim porta dolor, eget pellentesque lorem porta eu. Donec eget enim eu leo mattis ornare in ut libero. Maecenas sit amet ante mauris.Praesent ultrices diam id lectus viverra sed lobortis risus adipiscing. Nulla in risus est. Proin vitae dolor ligula, a placerat enim. Integer hendrerit erat tincidunt leo malesuada sit amet tincidunt justo mattis. Morbi ut neque urna, ut blandit erat. Donec eleifend justo ac augue ultrices consectetur. In rutrum, leo ac porttitor volutpat, neque mi lacinia diam, id fermentum risus neque vitae risus. Suspendisse in justo libero, eget ultrices nisl. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sollicitudin, arcu et convallis fermentum, est tellus pellentesque neque, ac faucibus tellus orci non purus. Ut aliquet facilisis ullamcorper. Cras justo ipsum, mollis vel ultricies non, consectetur a libero.Aliquam erat volutpat. Nunc ut mauris eu lorem consequat placerat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse sapien nisi, pellentesque ut porttitor eget, auctor vitae massa. Fusce et euismod massa. In dolor enim, commodo vitae scelerisque sit amet, vulputate quis nibh. Donec ut mollis elit. Nullam placerat sem at urna euismod tempus vitae a mi. Curabitur ac sem non tortor dapibus euismod in et augue. Phasellus elit nisi, ornare eget aliquam et, convallis vitae eros. Vivamus vitae facilisis quam. Nullam a dolor sit amet ante sodales vulputate. Sed vel elit libero. Vestibulum vestibulum porttitor orci, a elementum risus congue in. Mauris ut justo sed dolor rhoncus viverra nec non eros. Phasellus dignissim, mi id laoreet venenatis, enim lacus pharetra arcu, sit amet consectetur velit elit hendrerit arcu. Integer hendrerit suscipit pretium. Proin orci quam, vehicula vel accumsan tempor, facilisis tempus tortor.Etiam et nunc id odio lobortis ornare ac eget lorem. Proin tristique iaculis felis, ut gravida lacus congue ut. Etiam nibh turpis, congue vel ornare ut, feugiat ut mi. Etiam id ante eget turpis laoreet dapibus. Vivamus accumsan sem at est lacinia sagittis vitae a erat. Etiam mollis justo et felis faucibus sodales. Etiam placerat felis sed ante sollicitudin dignissim. Nunc fringilla nunc in lacus ultricies rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed venenatis porta turpis dignissim tempor. Etiam consequat vulputate elementum. Sed augue lacus, aliquam eu ornare vel, aliquam at turpis.Ut lacinia velit odio. Nulla sapien tellus, fringilla dignissim porta sed, elementum eget diam. Quisque pulvinar commodo massa, vitae lobortis velit iaculis id. Vestibulum id dolor vel mauris auctor commodo id at odio. Suspendisse consectetur consequat erat. Aliquam in purus at sem pretium ultricies. In urna elit, porttitor vel gravida at, varius non nisi. Nullam id eros at lorem posuere ullamcorper eget in dui. Sed sit amet mi vel quam vestibulum imperdiet. Ut ullamcorper purus nibh, a commodo tortor. Phasellus pretium, nulla ut venenatis euismod, augue arcu volutpat nulla, id semper est purus eget urna. Vivamus pharetra diam ac ante cursus tempus.Cras in rhoncus felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In semper leo sit amet nisi rutrum et interdum odio fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras sollicitudin dui non risus iaculis a lobortis odio consequat. Sed consectetur nisl eu nisi pulvinar fermentum. Etiam placerat tincidunt pellentesque. Etiam luctus auctor nulla ac pulvinar. Pellentesque sit amet eros est. Sed hendrerit sem rhoncus purus rhoncus ullamcorper. Integer vitae commodo sem. Donec orci lectus, gravida sit amet viverra ut, suscipit eu odio. Vivamus ac dolor sit amet augue porttitor imperdiet nec quis mauris. Etiam luctus pharetra lectus sed mattis. Proin tincidunt ultricies dolor, at sagittis ante tincidunt ac.Morbi sit amet sem ut leo ornare luctus at sed odio. Donec vestibulum consequat consectetur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Integer sit amet leo eget ipsum eleifend commodo et vel sapien. Donec vulputate facilisis nisi in bibendum. Vestibulum justo magna, mollis in varius a, malesuada id nisl. Vestibulum fermentum leo at ipsum euismod scelerisque. Donec id diam eget sapien varius ultricies. Quisque mollis vehicula lorem, vitae suscipit lorem gravida vel. Cras ipsum odio, pellentesque vitae molestie at, facilisis eget felis. Morbi gravida velit eget ante posuere id pharetra dolor vehicula. Praesent lectus sem, pretium sit amet eleifend non, ultricies vitae eros.Etiam consequat felis quis elit semper sed lobortis risus faucibus. Quisque diam ante, gravida ut mollis tristique, auctor ac mauris. Phasellus vestibulum sapien et justo sagittis sed dignissim dui sollicitudin. Maecenas egestas quam et odio mattis eu posuere est sagittis. Nulla nec posuere turpis. In mauris sapien, pharetra et placerat eu, dictum quis justo. Curabitur sit amet varius nulla. Cras feugiat erat quis ante aliquam blandit. In ac libero id massa dapibus ultrices. Donec non massa orci.In gravida justo vitae eros ultrices fringilla. Sed mi quam, lobortis eu pharetra nec, pulvinar eu justo. Sed ornare diam sed nulla pellentesque at tincidunt lacus cursus. Donec vel neque et urna euismod suscipit. Proin in tortor eget felis euismod ultrices. Nunc ut orci elit, vitae pellentesque ligula. Vivamus in mi felis, at congue nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi mattis, ligula id sollicitudin posuere, eros odio pellentesque felis, in auctor libero mi nec massa. Praesent fringilla pretium tempus. Sed quis leo nulla, a pretium mi. Sed malesuada quam eget lorem tristique eget accumsan libero auctor. Vestibulum metus nisl, rutrum vel ullamcorper scelerisque, ultrices cursus purus. Aliquam convallis sollicitudin elit at mattis. Phasellus vitae magna id quam laoreet gravida quis ac metus.Duis lobortis arcu a elit porta laoreet. Pellentesque at condimentum sapien. Maecenas rutrum eleifend quam, eu pellentesque quam tincidunt ac. Vivamus fermentum justo ac dui dapibus ut tempus massa congue. Phasellus fermentum placerat enim, et dignissim mi feugiat in. Etiam odio diam, mollis vitae viverra a, egestas eget arcu. Curabitur purus lectus, accumsan quis lobortis ut, faucibus ac magna. Vivamus consectetur, ligula sit amet convallis rhoncus, risus lorem scelerisque arcu, eu fermentum felis leo sit amet eros. In hac habitasse platea dictumst. Sed congue pretium erat, vel hendrerit velit dapibus ut. Aliquam porta porttitor nunc facilisis pretium. Aliquam tincidunt porttitor tincidunt. Sed at erat a arcu elementum dignissim nec et ipsum. In et magna erat. In hac habitasse platea dictumst. Nulla sit amet enim vitae magna ullamcorper auctor ac id lectus. Fusce id sapien massa.Fusce porta nisl non leo iaculis sed elementum purus viverra. Aenean vitae erat elit. Proin id tincidunt nibh. Fusce faucibus dignissim laoreet. Etiam volutpat ultricies magna in euismod. Quisque luctus malesuada massa, ac ullamcorper dui luctus quis. Mauris a felis ut urna blandit semper egestas vel dui. Nulla facilisi. Ut dapibus bibendum bibendum. Curabitur id facilisis tellus. Vestibulum arcu orci, pretium vestibulum accumsan ut, feugiat eget eros. Mauris dapibus sem a massa ornare id posuere purus ornare. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus mollis, orci ac eleifend pharetra, risus turpis euismod urna, ut congue neque nunc ut felis. Aliquam a nisi leo. Nulla consequat faucibus ligula consectetur tristique. Duis at lacus orci, eget pulvinar tortor.Aenean nisi justo, dictum ac sagittis a, mollis ut orci. Donec faucibus congue neque ut gravida. Nam interdum nunc vel ipsum molestie elementum. Aliquam a eros non mi accumsan lacinia ut eu justo. Donec id ipsum purus, sed congue nunc. Donec euismod ante quis metus interdum feugiat. Sed nec dictum neque. Vivamus sed felis non lorem placerat facilisis eu sit amet nisi. Morbi dolor dolor, malesuada eu congue at, sollicitudin ut metus. In sit amet ipsum purus, ut dignissim dolor. Pellentesque quis velit velit. Aenean dapibus ipsum eu felis placerat volutpat. Donec auctor dictum ligula ut facilisis. Aliquam vulputate nunc nec diam ultricies auctor dictum dui fringilla. Cras urna metus, porttitor et sodales eu, tempus non mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.Etiam tempor, mi ut tempor adipiscing, nunc lorem gravida odio, scelerisque aliquet ante massa id nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus eu nisl urna. Quisque vel leo in lorem bibendum bibendum ut eget massa. Morbi dictum, metus eu pellentesque lobortis, augue nisi facilisis velit, sit amet feugiat risus nunc vitae elit. Fusce blandit mi a augue gravida eu tristique sem consequat. Suspendisse non malesuada nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque commodo lorem id ipsum cursus posuere. Proin euismod facilisis est, vel imperdiet lectus commodo blandit. Proin luctus dapibus purus, id vulputate mauris tincidunt vel. Vestibulum volutpat molestie nulla faucibus malesuada. Aenean ut ornare lectus.Maecenas vel mauris in dolor imperdiet gravida eu nec mi. Vestibulum varius sem et nibh aliquet eu posuere tellus luctus. Fusce blandit, odio ut gravida semper, tellus lorem porta felis, vitae posuere mi lorem eget magna. Sed tristique nisi ut ipsum adipiscing molestie. Donec volutpat nunc eget neque posuere aliquam. Vivamus vel sem lectus. In volutpat dictum eros. Curabitur mollis pretium arcu ut rhoncus. Vivamus eros risus, sagittis posuere suscipit sit amet, consectetur eget elit. Mauris porttitor feugiat magna, sed lobortis ante porttitor at. Etiam non enim quam, nec tempus erat. Ut porta pharetra nibh vel laoreet. Sed euismod elit eget sem tempus non sodales massa cursus. Aliquam erat volutpat. Nulla a tortor ornare nibh feugiat venenatis. Mauris interdum mattis odio eget porta. Maecenas ac ullamcorper velit. Nulla id sagittis ligula. Aliquam pharetra, diam ut euismod pellentesque, sapien ligula sagittis nisi, sed dictum dolor purus sit amet elit.Aenean quis metus velit. In at fermentum nunc. Cras in magna sapien, sed vestibulum lacus. Sed pellentesque, massa sed malesuada tincidunt, erat tortor consectetur lacus, vel congue arcu enim id libero. Donec elit neque, egestas a faucibus ut, tempor nec diam. Donec turpis est, vulputate id venenatis vitae, vulputate sit amet elit. Ut semper nibh orci. Fusce nibh nisi, tristique eu dapibus id, faucibus nec augue. Sed sagittis malesuada leo, pretium porttitor ante lacinia in. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.Sed quis libero ante, ac consequat nisl. Cras nisl urna, ultrices eu dapibus sed, pretium quis diam. Curabitur aliquam, dolor et convallis viverra, purus orci commodo neque, a sagittis felis tellus quis mi. In mi orci, tempus ut sodales imperdiet, condimentum ac tortor. Phasellus ornare, tortor eget egestas ultricies, est risus ultricies lorem, ac tempus nibh ligula ac ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum nibh vitae tortor laoreet sed rutrum arcu suscipit. Fusce iaculis nisl in justo pretium a interdum ipsum dignissim. Sed sed semper metus. Aenean ante turpis, fermentum vestibulum dapibus eget, dictum id leo. Nam nec lorem erat.Cras dolor nulla, suscipit nec viverra ac, egestas vitae enim. Quisque vel laoreet sem. Sed non felis at nisl ultricies pharetra vitae a lorem. Suspendisse tempor arcu id massa laoreet congue. Nam eu turpis justo, nec adipiscing tortor. Etiam mattis lorem tincidunt diam molestie semper. Vivamus rutrum est in tortor egestas consequat. Sed vitae ultrices leo. Aenean pulvinar malesuada enim, eget elementum purus bibendum a. Vivamus sit amet mauris mauris, placerat varius lorem. Sed diam tortor, posuere non convallis molestie, dictum quis libero. Nulla quis tellus a nunc semper elementum vel sed odio. Cras ac mattis lectus. Proin placerat imperdiet sodales. Fusce quis magna dolor, eget porttitor lectus. Mauris elementum lorem vitae lectus porta scelerisque nec a sapien. Vivamus dapibus volutpat leo nec vehicula. Praesent ac diam ipsum.Pellentesque nec ullamcorper nulla. Nam lectus dolor, porttitor vitae varius sed, egestas a arcu. Suspendisse malesuada venenatis erat nec consequat. Morbi consequat magna a neque ultrices eget aliquet sapien ultrices. Aenean vel diam ipsum, ac scelerisque dui. Morbi quis arcu neque, eget auctor enim. Etiam pretium est sit amet nunc porta ornare vel quis sapien. Aliquam pulvinar pharetra risus, vel mollis mauris cursus sed. In sagittis nisl ac nunc placerat bibendum. Proin in risus lorem, sed fringilla eros.Proin luctus aliquam metus vitae euismod. Maecenas hendrerit sollicitudin hendrerit. Etiam magna elit, fringilla ut suscipit at, viverra eget ante. Morbi consequat, dui non tristique varius, eros ipsum vulputate sem, eu tristique nibh lacus vel felis. Maecenas eget eros a urna consectetur interdum. Integer est nibh, semper sed feugiat quis, lacinia eget diam. In ultricies mollis lectus sed imperdiet. Proin sed magna nec tortor blandit lacinia in sit amet nibh. Nullam ultrices tempor lacus, vel tincidunt eros vulputate euismod. Praesent justo nibh, convallis ut vehicula consequat, molestie posuere nulla. Mauris sollicitudin egestas vestibulum. Suspendisse auctor imperdiet eros, sit amet dignissim magna dapibus in. Praesent ultrices sem et risus interdum vel pharetra dolor tristique. Proin eleifend nunc eget risus venenatis posuere. Sed est nisi, interdum porta dapibus a, laoreet ac mi. Praesent sit amet varius lectus. Phasellus suscipit lacinia velit, sed tempus odio varius at. Fusce eleifend elementum aliquet. Proin ultricies libero at ipsum condimentum rhoncus.Quisque convallis, arcu at vehicula imperdiet, velit eros posuere sem, sit amet pulvinar purus massa a tellus. Maecenas cursus neque in dolor facilisis ac aliquam ligula eleifend. Fusce quis faucibus nisl. Fusce pulvinar magna vel enim scelerisque id cursus tortor faucibus. Nunc est turpis, iaculis ac sodales non, euismod vitae nunc. Fusce felis purus, iaculis dapibus mollis quis, condimentum consequat eros. Ut a lectus nec mi lacinia fringilla. Donec eget metus lectus, et rhoncus enim. Donec pharetra malesuada enim at rutrum. Vestibulum tincidunt gravida viverra. Vestibulum commodo sem nisl.Vivamus iaculis mollis arcu, quis dapibus risus semper quis. Quisque consectetur ullamcorper arcu id lacinia. Proin non tellus tellus. Nunc vehicula, arcu in pharetra feugiat, ante ante viverra urna, at convallis ligula odio id purus. Morbi quis orci non ante imperdiet luctus. Maecenas et ipsum est, at viverra sem. Morbi placerat ultrices imperdiet. Nullam id arcu at quam mollis hendrerit eu ac lectus. Etiam a neque sed turpis vestibulum posuere. Ut elementum tincidunt nulla at pellentesque. Integer nisl nunc, faucibus non sollicitudin eu, vestibulum ut nulla. In auctor est blandit purus rhoncus et sagittis eros convallis. Mauris sodales ultricies varius. Nulla facilisi. Donec ut nisl nunc, id accumsan erat. Praesent gravida molestie lobortis. In suscipit nisi sed elit sagittis tristique. Pellentesque vitae ante elit. Nullam diam est, ultrices vitae molestie at, tempus et magna. In hac habitasse platea dictumst.Vestibulum id tristique quam. Vivamus dui nulla, pretium eget elementum et, pulvinar a diam. Sed sed arcu sapien, et pharetra nisl. Nunc dignissim, lectus ac fringilla cursus, risus ante pretium justo, nec molestie sem urna id velit. Aenean tincidunt felis sed risus vestibulum ultricies. Aliquam lacinia scelerisque hendrerit. Morbi tincidunt molestie sapien sed faucibus. Vivamus et nisl velit, in semper libero. Duis elementum, dolor eget euismod porttitor, tortor eros tristique risus, eget posuere purus leo venenatis leo. Quisque in elit hendrerit felis accumsan gravida id sed sem.Sed massa turpis, interdum eget adipiscing a, tempor non enim. Vivamus sit amet purus tortor, quis tincidunt nunc. Nam vehicula dolor vitae est bibendum sed condimentum nisl pretium. Aenean pellentesque egestas lacinia. Vestibulum id felis sapien, vestibulum pharetra mauris. Donec quis ligula quis risus ultrices pharetra ac et quam. Nunc aliquam adipiscing mauris id euismod. Suspendisse potenti. Ut pharetra tristique pellentesque. Fusce tristique nisl vitae eros adipiscing lobortis. Ut porttitor porttitor est, vel euismod mi feugiat quis. Sed bibendum lacus vel sem hendrerit a ultricies sapien mattis.Vestibulum a tempus urna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean tincidunt interdum dui, in accumsan ante placerat non. Aliquam suscipit eros eget quam ullamcorper consequat. Nulla facilisi. Phasellus porttitor interdum quam nec mattis. Etiam vitae diam vel est tempus aliquam eu et tellus. Phasellus lobortis porttitor mi, eu mollis augue tempus eu. Morbi a urna id nibh faucibus dictum. Sed hendrerit fringilla nunc vel elementum. Donec vel massa vitae nibh imperdiet vestibulum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum in velit lorem, eu posuere felis. Maecenas ornare posuere faucibus. Donec dignissim ante eu neque suscipit interdum. Pellentesque ultrices dictum quam, tempor tempus leo posuere eget. Vestibulum dictum interdum urna, at feugiat neque venenatis ac. Donec tempus dictum enim, nec tempor neque rhoncus vel.Sed mollis luctus leo sed mattis. Vestibulum tempor mattis vehicula. Duis id elementum libero. Integer condimentum tincidunt molestie. Aenean quam tortor, rutrum sit amet placerat sed, sollicitudin eget turpis. In hac habitasse platea dictumst. Mauris lacinia mollis rhoncus. Fusce nec tellus elementum magna congue ultricies. Nulla consequat, dui nec facilisis hendrerit, ligula sapien viverra velit, at tempor risus leo vestibulum risus. Cras volutpat molestie orci ullamcorper gravida. Nullam est nisi, tempus et tincidunt ut, dapibus vitae nibh. Nam scelerisque purus sit amet odio imperdiet mattis. Integer ut ultrices odio.Cras placerat turpis nisl. Quisque consectetur urna vel nunc faucibus dictum. Nunc ac varius mauris. In ut egestas purus. Sed arcu nibh, mollis vitae dapibus eget, consectetur sit amet eros. Curabitur tincidunt purus sagittis neque adipiscing pretium. Aliquam tempor ullamcorper lectus. Cras quis elit et sapien euismod dapibus vitae in urna. Aliquam adipiscing urna non elit suscipit hendrerit. Mauris euismod tincidunt tortor eu vestibulum. Praesent ac quam massa. Fusce vitae viverra justo. Phasellus vel posuere augue. Praesent sagittis auctor odio in cursus. Sed vel lacus velit, vitae eleifend leo. Donec dapibus ornare mauris ut imperdiet. Nullam a sem felis, in commodo ligula. Nunc sed justo id metus bibendum pretium. Fusce lacinia lorem at leo ultricies porta.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi non ipsum nisi, at porta ipsum. Nulla dolor lacus, auctor eget tincidunt et, tempor in velit. Cras vel diam facilisis dolor sagittis sodales. In hac habitasse platea dictumst. Donec dignissim vulputate tempor. Fusce tristique vestibulum vehicula. Integer nec erat a risus semper ultrices nec ac eros. Phasellus egestas, risus eget suscipit iaculis, mi magna posuere urna, in sollicitudin odio leo nec lorem. Ut at enim nunc, eget pellentesque ipsum. Nam at ipsum et magna tempor gravida vestibulum ut diam. Aenean aliquam scelerisque blandit. Cras sapien sem, consectetur a laoreet at, mattis vel lorem. Maecenas enim mauris, hendrerit ac imperdiet in, hendrerit a justo. Vestibulum justo metus, adipiscing at pulvinar at, scelerisque at velit. Aliquam sodales feugiat tortor ullamcorper cursus. Quisque tortor felis, sodales eu bibendum in, pellentesque eget urna.Nullam ultricies congue nisi nec blandit. Nulla nisl mi, aliquet vel dictum in, pellentesque fringilla arcu. Nam vulputate iaculis pellentesque. Morbi faucibus, augue vitae aliquam fringilla, ipsum tellus lacinia ligula, a luctus mauris orci id nulla. Vestibulum commodo, diam eget tincidunt iaculis, leo ante suscipit ligula, convallis scelerisque quam augue quis libero. Pellentesque vulputate ultricies eros a porta. In hac habitasse platea dictumst. Quisque at sem vel nisl pellentesque pellentesque at imperdiet turpis. Sed quis sem non nulla pellentesque placerat. Etiam sed ultricies nisl. Nunc vel leo augue, vitae fringilla urna. Suspendisse eget dolor enim, sed interdum lorem. Etiam imperdiet, nunc a tempor elementum, ipsum ante sodales tortor, id dignissim arcu diam vitae metus.Sed tincidunt fringilla mauris a lobortis. Morbi mollis elementum purus ac auctor. Etiam malesuada sapien vehicula magna fringilla sit amet porta sem scelerisque. Vestibulum malesuada ante nunc. Curabitur laoreet commodo mauris eu tempor. Sed hendrerit, lorem vel scelerisque aliquam, metus ligula ultricies ante, at luctus neque risus ut nisi. Suspendisse lectus sapien, tempor eget volutpat non, tempor at orci. Aenean eu est metus, vel convallis augue. Integer aliquam turpis id neque posuere tincidunt. Morbi at ante felis, ac semper diam. Etiam iaculis sapien a mauris tempus semper. Nunc ut leo nec massa tincidunt sodales id sed justo. Fusce sed blandit turpis. Pellentesque scelerisque laoreet luctus.Integer lobortis sollicitudin sapien, vel consequat augue hendrerit ut. Quisque pretium, enim condimentum ornare viverra, est nisl convallis lacus, vel varius turpis mi a eros. Curabitur eget enim non quam condimentum lobortis id sit amet dolor. Aliquam in ligula ut nisi accumsan consectetur. Pellentesque blandit ultrices magna, eget posuere dui eleifend ut. Quisque ornare, ante eget iaculis rutrum, nisi dolor tincidunt diam, eget volutpat nibh sapien vel massa. Sed viverra pulvinar lectus et commodo. Sed lacus mauris, aliquet ut tristique at, feugiat sit amet lectus. Duis lacinia purus a lacus accumsan tristique. Donec felis nunc, egestas ut porttitor ac, vulputate at purus. Quisque euismod nibh sit amet metus ullamcorper a consequat ipsum luctus. Mauris vitae sapien tristique lorem mollis porta auctor vitae leo.Donec mauris nibh, elementum a tincidunt nec, volutpat vitae enim. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque at purus quis massa vulputate mollis ut eu risus. Cras libero diam, pharetra quis ultrices facilisis, tincidunt id arcu. Praesent at volutpat quam. Phasellus quis malesuada sapien. Nullam eu leo quam, bibendum sagittis turpis. Vestibulum sagittis accumsan enim ut tristique. Donec eu enim nisi. Curabitur mauris orci, fringilla et suscipit placerat, ullamcorper vel turpis. Mauris est arcu, gravida ac accumsan ac, tincidunt vel nibh. Mauris pulvinar massa tempor dui hendrerit vel elementum diam pulvinar. Sed felis leo, laoreet at laoreet nec, venenatis eu risus. Nunc a massa lacus. Vestibulum ut pellentesque sem. Donec consectetur, turpis consequat aliquam consectetur, leo nunc lobortis elit, at sagittis ipsum risus sed turpis. Vivamus at sollicitudin purus. Nulla facilisi.Morbi congue dignissim nibh ut commodo. Integer sed urna fermentum neque hendrerit aliquam ac et tortor. Phasellus massa sem, egestas sed tincidunt id, malesuada vel odio. Nulla arcu nisl, elementum at pretium interdum, pharetra at nulla. Vestibulum lectus ante, ultricies ac lacinia euismod, adipiscing at metus. Aliquam velit orci, posuere a dapibus dapibus, consectetur vitae est. Pellentesque suscipit pulvinar varius. Morbi sagittis blandit nulla, eu posuere arcu blandit eu. Nulla cursus nunc volutpat orci commodo aliquet. Quisque condimentum dui a mi facilisis tincidunt.Quisque ac nisi vitae ipsum condimentum luctus non quis erat. Pellentesque eget nunc sit amet ipsum pharetra vulputate ac in mi. Etiam consectetur nulla vitae risus pharetra a ornare ligula sagittis. Proin euismod mauris id lectus tincidunt luctus at sed ligula. Aenean porttitor hendrerit quam quis interdum. Suspendisse eu metus turpis, ut venenatis ipsum. Nulla ipsum orci, lacinia ac vestibulum ut, mattis quis eros. Pellentesque a velit et erat sodales ornare. Pellentesque pellentesque tortor eget magna facilisis accumsan. Praesent tincidunt posuere lacus sed sollicitudin. Praesent consectetur diam vel turpis elementum vehicula. Integer rutrum dignissim justo, ac dapibus quam fringilla non. Suspendisse porta elementum bibendum. Praesent at lorem at quam dignissim commodo. Etiam placerat euismod ipsum eu interdum. Aliquam in mi molestie justo varius venenatis eu aliquam quam. Integer feugiat, neque hendrerit egestas hendrerit, lectus ligula placerat enim, a faucibus ante ligula vitae mi. Praesent urna nunc, volutpat vitae scelerisque non, porta vel dolor. Aenean quam sem, dignissim at faucibus non, auctor sodales libero.Morbi justo elit, tempus ac cursus porta, eleifend nec odio. Ut nec quam velit. Duis elit nulla, placerat et rutrum quis, tempor non nisi. Quisque massa erat, pretium ut elementum sit amet, sodales vel metus. Phasellus sollicitudin sapien vel nisl faucibus ornare. Duis ut dolor arcu, vel semper felis. In quis orci mauris, id porttitor diam. Fusce ornare, dolor in posuere blandit, neque est mollis lacus, eu venenatis nisi orci vel diam. Etiam ornare sapien eu sapien tristique vitae consequat arcu consequat. Fusce a felis at dui sollicitudin pellentesque sit amet vel mi. Curabitur congue porttitor orci, eu auctor nibh mollis at. Nulla facilisi. Nam aliquet ullamcorper metus ac vulputate. Aenean feugiat purus vitae dui congue egestas. Curabitur sollicitudin leo eget nibh facilisis fermentum fermentum non nisi. Ut at libero eget est bibendum laoreet non eu ante. Proin pellentesque quam ut augue condimentum id suscipit risus tristique. Nunc laoreet risus elit.Suspendisse vel ante elit, eu feugiat diam. Etiam ultrices condimentum tempor. Donec eget porta lacus. Nunc in velit lacus, ut ultricies felis. Nulla id cursus metus. Praesent suscipit, orci a facilisis imperdiet, eros lectus eleifend nibh, sit amet auctor magna arcu ac enim. In malesuada volutpat felis a posuere. Aliquam mattis ipsum ut quam semper aliquet. Maecenas convallis consequat magna, blandit viverra nulla consectetur sit amet. Pellentesque id velit nec risus iaculis imperdiet ac accumsan metus. Suspendisse et sem massa. Vestibulum ac enim hendrerit est tincidunt ullamcorper.Curabitur placerat, libero id molestie vehicula, neque tortor vulputate sapien, ut blandit orci metus et nibh. Cras convallis justo a nibh iaculis ut convallis neque vestibulum. Duis gravida purus metus, nec viverra leo. In tincidunt elit sit amet orci lacinia non eleifend orci tincidunt. Praesent est metus, molestie a ullamcorper ultricies, cursus imperdiet augue. Sed vitae quam eu dui pellentesque dignissim. Curabitur convallis volutpat accumsan. Donec egestas malesuada est, vitae faucibus sem fermentum id. Donec porttitor rutrum vehicula. Nulla placerat risus in est egestas nec ultrices ligula auctor. Quisque erat lorem, ullamcorper vitae interdum sit amet, laoreet vel elit. Proin eu porta neque. Pellentesque eleifend, ipsum a sollicitudin ultrices, ligula nisl aliquet dui, eget fermentum quam mi vel.";
+
+ public static String get(int len) {
+ return LOREM.substring(0, len);
+ }
+
+ public static String get() {
+ return LOREM;
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/util/Millionaire.java b/uitest/src/com/vaadin/tests/util/Millionaire.java
new file mode 100644
index 0000000000..44d4def416
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Millionaire.java
@@ -0,0 +1,22 @@
+package com.vaadin.tests.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Millionaire extends Person {
+ private List<Address> secondaryResidences = new ArrayList<Address>();
+
+ public Millionaire() {
+ }
+
+ public Millionaire(String firstName, String lastName, String email,
+ String phoneNumber, String streetAddress, int postalCode,
+ String city) {
+ super(firstName, lastName, email, phoneNumber, streetAddress,
+ postalCode, city);
+ }
+
+ public List<Address> getSecondaryResidences() {
+ return secondaryResidences;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/util/Person.java b/uitest/src/com/vaadin/tests/util/Person.java
new file mode 100644
index 0000000000..72f6b7d20d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Person.java
@@ -0,0 +1,96 @@
+package com.vaadin.tests.util;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class Person implements Serializable {
+ private String firstName = "";
+ private String lastName = "";
+ private String email = "";
+ private String phoneNumber = "";
+ private Address address = new Address();
+
+ public Person() {
+ address = new Address();
+ }
+
+ public Person(String firstName, String lastName, String email,
+ String phoneNumber, String streetAddress, int postalCode,
+ String city) {
+ setFirstName(firstName);
+ setLastName(lastName);
+ setEmail(email);
+ setPhoneNumber(phoneNumber);
+ address = new Address(streetAddress, postalCode, city);
+ }
+
+ /**
+ * @return the firstName
+ */
+ public String getFirstName() {
+ return firstName;
+ }
+
+ /**
+ * @param firstName
+ * the firstName to set
+ */
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ /**
+ * @return the lastName
+ */
+ public String getLastName() {
+ return lastName;
+ }
+
+ /**
+ * @param lastName
+ * the lastName to set
+ */
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ /**
+ * @return the email
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @param email
+ * the email to set
+ */
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ /**
+ * @return the phoneNumber
+ */
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ /**
+ * @param phoneNumber
+ * the phoneNumber to set
+ */
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ /**
+ * Returns the address where the person lives.
+ *
+ * @return address (not null)
+ */
+ public Address getAddress() {
+ return address;
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/util/PersonContainer.java b/uitest/src/com/vaadin/tests/util/PersonContainer.java
new file mode 100644
index 0000000000..a3cf28b083
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/PersonContainer.java
@@ -0,0 +1,98 @@
+package com.vaadin.tests.util;
+
+import java.io.Serializable;
+import java.util.Random;
+
+import com.vaadin.data.util.BeanItemContainer;
+
+@SuppressWarnings("serial")
+public class PersonContainer extends BeanItemContainer<Person> implements
+ Serializable {
+
+ /**
+ * Natural property order for Person bean. Used in tables and forms.
+ */
+ public static final Object[] NATURAL_COL_ORDER = new Object[] {
+ "firstName", "lastName", "email", "phoneNumber",
+ "address.streetAddress", "address.postalCode", "address.city" };
+
+ /**
+ * "Human readable" captions for properties in same order as in
+ * NATURAL_COL_ORDER.
+ */
+ public static final String[] COL_HEADERS_ENGLISH = new String[] {
+ "First name", "Last name", "Email", "Phone number",
+ "Street Address", "Postal Code", "City" };
+
+ public PersonContainer() throws InstantiationException,
+ IllegalAccessException {
+ super(Person.class);
+ addNestedContainerProperty("address.streetAddress");
+ addNestedContainerProperty("address.postalCode");
+ addNestedContainerProperty("address.city");
+ }
+
+ public static PersonContainer createWithTestData() {
+ final String[] fnames = { "Peter", "Alice", "Joshua", "Mike", "Olivia",
+ "Nina", "Alex", "Rita", "Dan", "Umberto", "Henrik", "Rene",
+ "Lisa", "Marge" };
+ final String[] lnames = { "Smith", "Gordon", "Simpson", "Brown",
+ "Clavel", "Simons", "Verne", "Scott", "Allison", "Gates",
+ "Rowling", "Barks", "Ross", "Schneider", "Tate" };
+ final String cities[] = { "Amsterdam", "Berlin", "Helsinki",
+ "Hong Kong", "London", "Luxemburg", "New York", "Oslo",
+ "Paris", "Rome", "Stockholm", "Tokyo", "Turku" };
+ final String streets[] = { "4215 Blandit Av.", "452-8121 Sem Ave",
+ "279-4475 Tellus Road", "4062 Libero. Av.", "7081 Pede. Ave",
+ "6800 Aliquet St.", "P.O. Box 298, 9401 Mauris St.",
+ "161-7279 Augue Ave", "P.O. Box 496, 1390 Sagittis. Rd.",
+ "448-8295 Mi Avenue", "6419 Non Av.",
+ "659-2538 Elementum Street", "2205 Quis St.",
+ "252-5213 Tincidunt St.", "P.O. Box 175, 4049 Adipiscing Rd.",
+ "3217 Nam Ave", "P.O. Box 859, 7661 Auctor St.",
+ "2873 Nonummy Av.", "7342 Mi, Avenue",
+ "539-3914 Dignissim. Rd.", "539-3675 Magna Avenue",
+ "Ap #357-5640 Pharetra Avenue", "416-2983 Posuere Rd.",
+ "141-1287 Adipiscing Avenue", "Ap #781-3145 Gravida St.",
+ "6897 Suscipit Rd.", "8336 Purus Avenue", "2603 Bibendum. Av.",
+ "2870 Vestibulum St.", "Ap #722 Aenean Avenue",
+ "446-968 Augue Ave", "1141 Ultricies Street",
+ "Ap #992-5769 Nunc Street", "6690 Porttitor Avenue",
+ "Ap #105-1700 Risus Street",
+ "P.O. Box 532, 3225 Lacus. Avenue", "736 Metus Street",
+ "414-1417 Fringilla Street", "Ap #183-928 Scelerisque Road",
+ "561-9262 Iaculis Avenue" };
+ PersonContainer c = null;
+ Random r = new Random(0);
+ try {
+ c = new PersonContainer();
+ for (int i = 0; i < 100; i++) {
+ Person p = new Person();
+ p.setFirstName(fnames[r.nextInt(fnames.length)]);
+ p.setLastName(lnames[r.nextInt(lnames.length)]);
+ p.getAddress().setCity(cities[r.nextInt(cities.length)]);
+ p.setEmail(p.getFirstName().toLowerCase() + "."
+ + p.getLastName().toLowerCase() + "@vaadin.com");
+ p.setPhoneNumber("+358 02 555 " + r.nextInt(10) + r.nextInt(10)
+ + r.nextInt(10) + r.nextInt(10));
+ int n = r.nextInt(100000);
+ if (n < 10000) {
+ n += 10000;
+ }
+ p.getAddress().setPostalCode(n);
+ p.getAddress().setStreetAddress(
+ streets[r.nextInt(streets.length)]);
+ c.addItem(p);
+ }
+ } catch (InstantiationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return c;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/PortableRandom.java b/uitest/src/com/vaadin/tests/util/PortableRandom.java
new file mode 100644
index 0000000000..b66bdfdcaf
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/PortableRandom.java
@@ -0,0 +1,52 @@
+package com.vaadin.tests.util;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class PortableRandom {
+ private final static long multiplier = 0x5DEECE66DL;
+ private final static long addend = 0xBL;
+ private final static long mask = (1L << 48) - 1;
+ private AtomicLong seed;
+
+ public PortableRandom(long seed) {
+ this.seed = new AtomicLong(0L);
+ setSeed(seed);
+ }
+
+ synchronized public void setSeed(long seed) {
+ seed = (seed ^ multiplier) & mask;
+ this.seed.set(seed);
+ }
+
+ public int nextInt(int n) {
+ if (n <= 0) {
+ throw new IllegalArgumentException("n must be positive");
+ }
+
+ if ((n & -n) == n) {
+ return (int) ((n * (long) next(31)) >> 31);
+ }
+
+ int bits, val;
+ do {
+ bits = next(31);
+ val = bits % n;
+ } while (bits - val + (n - 1) < 0);
+ return val;
+ }
+
+ protected int next(int bits) {
+ long oldseed, nextseed;
+ AtomicLong seed = this.seed;
+ do {
+ oldseed = seed.get();
+ nextseed = (oldseed * multiplier + addend) & mask;
+ } while (!seed.compareAndSet(oldseed, nextseed));
+ return (int) (nextseed >>> (48 - bits));
+ }
+
+ public boolean nextBoolean() {
+ return next(1) != 0;
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/util/Product.java b/uitest/src/com/vaadin/tests/util/Product.java
new file mode 100644
index 0000000000..46ec1935b0
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Product.java
@@ -0,0 +1,40 @@
+package com.vaadin.tests.util;
+
+public class Product {
+
+ private String name;
+ private float price;
+ private String description;
+
+ public Product(String name, float price, String description) {
+ super();
+ this.name = name;
+ this.price = price;
+ this.description = description;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/Role.java b/uitest/src/com/vaadin/tests/util/Role.java
new file mode 100644
index 0000000000..83f63db4ab
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/Role.java
@@ -0,0 +1,37 @@
+package com.vaadin.tests.util;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Role implements Serializable {
+ private String name = "";
+ private Set<User> users = new HashSet<User>();
+
+ public Role() {
+ }
+
+ public Role(String name) {
+ setName(name);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * In this direction, the users for a role can be queried and the returned
+ * collection modified, but the whole collection of users cannot be set
+ * directly.
+ *
+ * @return set of users having the role (not null)
+ */
+ public Set<User> getUsers() {
+ return users;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/SampleDirectory.java b/uitest/src/com/vaadin/tests/util/SampleDirectory.java
new file mode 100644
index 0000000000..ef20da788d
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/SampleDirectory.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2011 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.tests.util;
+
+import java.io.File;
+
+import com.vaadin.Application;
+import com.vaadin.server.SystemError;
+import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.UI;
+
+/**
+ * Provides sample directory based on application directory. If this fails then
+ * sampleDirectory property is read. If no sample directory is resolved, then a
+ * panel displaying error message is added to main window.
+ *
+ * @author Vaadin Ltd.
+ *
+ */
+public class SampleDirectory {
+
+ /**
+ * Get sample directory.
+ *
+ * @param application
+ * @return file pointing to sample directory
+ */
+ public static File getDirectory(Application application, UI uI) {
+ String errorMessage = "Access to application "
+ + "context base directory failed, "
+ + "possible security constraint with Application "
+ + "Server or Servlet Container.<br />";
+ File file = application.getContext().getBaseDirectory();
+ if ((file == null) || (!file.canRead())
+ || (file.getAbsolutePath() == null)) {
+ // cannot access example directory, possible security issue with
+ // Application Server or Servlet Container
+ // Try to read sample directory from web.xml parameter
+ if (application.getProperty("sampleDirectory") != null) {
+ file = new File(application.getProperty("sampleDirectory"));
+ if ((file != null) && (file.canRead())
+ && (file.getAbsolutePath() != null)) {
+ // Success using property
+ return file;
+ }
+ // Failure using property
+ errorMessage += "Failed also to access sample directory <b>["
+ + application.getProperty("sampleDirectory")
+ + "]</b> defined in <b>sampleDirectory property</b>.";
+ } else {
+ // Failure using application context base dir, no property set
+ errorMessage += "<b>Note: </b>You can set this manually in "
+ + "web.xml by defining " + "sampleDirectory property.";
+ }
+ } else {
+ // Success using application context base dir
+ return file;
+ }
+ // Add failure notification as an Panel to main window
+ final Panel errorPanel = new Panel("Demo application error");
+ errorPanel.setStyleName("strong");
+ errorPanel.setComponentError(new SystemError(
+ "Cannot provide sample directory"));
+ errorPanel.addComponent(new Label(errorMessage, ContentMode.XHTML));
+ // Remove all components from applications main window
+ uI.getContent().removeAllComponents();
+ // Add error panel
+ uI.getContent().addComponent(errorPanel);
+ return null;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/util/TestClickListener.java b/uitest/src/com/vaadin/tests/util/TestClickListener.java
new file mode 100644
index 0000000000..b9f6d66b3e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/TestClickListener.java
@@ -0,0 +1,38 @@
+package com.vaadin.tests.util;
+
+import java.util.HashMap;
+
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+
+public class TestClickListener implements Button.ClickListener {
+
+ private static final HashMap<String, Integer> buttonListeners = new HashMap<String, Integer>();
+
+ String name = "";
+ int count = 0;
+
+ public TestClickListener(String name) {
+ Integer count = null;
+ try {
+ count = buttonListeners.get(name);
+ count = new Integer(count.intValue() + 1);
+ buttonListeners.put(name, count);
+ } catch (Exception e) {
+ count = new Integer(1);
+ buttonListeners.put(name, count);
+ }
+
+ this.name = name;
+ this.count = count.intValue();
+
+ System.out.println("Created listener " + name + ", id=" + count);
+ }
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ System.out
+ .println("ClickEvent from listener " + name + ", id=" + count);
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/TestUtils.java b/uitest/src/com/vaadin/tests/util/TestUtils.java
new file mode 100644
index 0000000000..62f2cc0be3
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/TestUtils.java
@@ -0,0 +1,140 @@
+package com.vaadin.tests.util;
+
+import com.vaadin.data.Item;
+import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.ui.UI;
+
+public class TestUtils {
+
+ public static final Object iso3166_PROPERTY_NAME = "name";
+ public static final Object iso3166_PROPERTY_SHORT = "short";
+
+ private static final String[] iso3166 = new String[] { "AFGHANISTAN", "AF",
+ "ÅLAND ISLANDS", "AX", "ALBANIA", "AL", "ALGERIA", "DZ",
+ "AMERICAN SAMOA", "AS", "ANDORRA", "AD", "ANGOLA", "AO",
+ "ANGUILLA", "AI", "ANTARCTICA", "AQ", "ANTIGUA AND BARBUDA", "AG",
+ "ARGENTINA", "AR", "ARMENIA", "AM", "ARUBA", "AW", "AUSTRALIA",
+ "AU", "AUSTRIA", "AT", "AZERBAIJAN", "AZ", "BAHAMAS", "BS",
+ "BAHRAIN", "BH", "BANGLADESH", "BD", "BARBADOS", "BB", "BELARUS",
+ "BY", "BELGIUM", "BE", "BELIZE", "BZ", "BENIN", "BJ", "BERMUDA",
+ "BM", "BHUTAN", "BT", "BOLIVIA", "BO", "BOSNIA AND HERZEGOVINA",
+ "BA", "BOTSWANA", "BW", "BOUVET ISLAND", "BV", "BRAZIL", "BR",
+ "BRITISH INDIAN OCEAN TERRITORY", "IO", "BRUNEI DARUSSALAM", "BN",
+ "BULGARIA", "BG", "BURKINA FASO", "BF", "BURUNDI", "BI",
+ "CAMBODIA", "KH", "CAMEROON", "CM", "CANADA", "CA", "CAPE VERDE",
+ "CV", "CAYMAN ISLANDS", "KY", "CENTRAL AFRICAN REPUBLIC", "CF",
+ "CHAD", "TD", "CHILE", "CL", "CHINA", "CN", "CHRISTMAS ISLAND",
+ "CX", "COCOS (KEELING) ISLANDS", "CC", "COLOMBIA", "CO", "COMOROS",
+ "KM", "CONGO", "CG", "CONGO, THE DEMOCRATIC REPUBLIC OF THE", "CD",
+ "COOK ISLANDS", "CK", "COSTA RICA", "CR", "CÔTE D'IVOIRE", "CI",
+ "CROATIA", "HR", "CUBA", "CU", "CYPRUS", "CY", "CZECH REPUBLIC",
+ "CZ", "DENMARK", "DK", "DJIBOUTI", "DJ", "DOMINICA", "DM",
+ "DOMINICAN REPUBLIC", "DO", "ECUADOR", "EC", "EGYPT", "EG",
+ "EL SALVADOR", "SV", "EQUATORIAL GUINEA", "GQ", "ERITREA", "ER",
+ "ESTONIA", "EE", "ETHIOPIA", "ET", "FALKLAND ISLANDS (MALVINAS)",
+ "FK", "FAROE ISLANDS", "FO", "FIJI", "FJ", "FINLAND", "FI",
+ "FRANCE", "FR", "FRENCH GUIANA", "GF", "FRENCH POLYNESIA", "PF",
+ "FRENCH SOUTHERN TERRITORIES", "TF", "GABON", "GA", "GAMBIA", "GM",
+ "GEORGIA", "GE", "GERMANY", "DE", "GHANA", "GH", "GIBRALTAR", "GI",
+ "GREECE", "GR", "GREENLAND", "GL", "GRENADA", "GD", "GUADELOUPE",
+ "GP", "GUAM", "GU", "GUATEMALA", "GT", "GUERNSEY", "GG", "GUINEA",
+ "GN", "GUINEA-BISSAU", "GW", "GUYANA", "GY", "HAITI", "HT",
+ "HEARD ISLAND AND MCDONALD ISLANDS", "HM",
+ "HOLY SEE (VATICAN CITY STATE)", "VA", "HONDURAS", "HN",
+ "HONG KONG", "HK", "HUNGARY", "HU", "ICELAND", "IS", "INDIA", "IN",
+ "INDONESIA", "ID", "IRAN, ISLAMIC REPUBLIC OF", "IR", "IRAQ", "IQ",
+ "IRELAND", "IE", "ISLE OF MAN", "IM", "ISRAEL", "IL", "ITALY",
+ "IT", "JAMAICA", "JM", "JAPAN", "JP", "JERSEY", "JE", "JORDAN",
+ "JO", "KAZAKHSTAN", "KZ", "KENYA", "KE", "KIRIBATI", "KI",
+ "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", "KP",
+ "KOREA, REPUBLIC OF", "KR", "KUWAIT", "KW", "KYRGYZSTAN", "KG",
+ "LAO PEOPLE'S DEMOCRATIC REPUBLIC", "LA", "LATVIA", "LV",
+ "LEBANON", "LB", "LESOTHO", "LS", "LIBERIA", "LR",
+ "LIBYAN ARAB JAMAHIRIYA", "LY", "LIECHTENSTEIN", "LI", "LITHUANIA",
+ "LT", "LUXEMBOURG", "LU", "MACAO", "MO",
+ "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", "MK", "MADAGASCAR",
+ "MG", "MALAWI", "MW", "MALAYSIA", "MY", "MALDIVES", "MV", "MALI",
+ "ML", "MALTA", "MT", "MARSHALL ISLANDS", "MH", "MARTINIQUE", "MQ",
+ "MAURITANIA", "MR", "MAURITIUS", "MU", "MAYOTTE", "YT", "MEXICO",
+ "MX", "MICRONESIA, FEDERATED STATES OF", "FM",
+ "MOLDOVA, REPUBLIC OF", "MD", "MONACO", "MC", "MONGOLIA", "MN",
+ "MONTENEGRO", "ME", "MONTSERRAT", "MS", "MOROCCO", "MA",
+ "MOZAMBIQUE", "MZ", "MYANMAR", "MM", "NAMIBIA", "NA", "NAURU",
+ "NR", "NEPAL", "NP", "NETHERLANDS", "NL", "NETHERLANDS ANTILLES",
+ "AN", "NEW CALEDONIA", "NC", "NEW ZEALAND", "NZ", "NICARAGUA",
+ "NI", "NIGER", "NE", "NIGERIA", "NG", "NIUE", "NU",
+ "NORFOLK ISLAND", "NF", "NORTHERN MARIANA ISLANDS", "MP", "NORWAY",
+ "NO", "OMAN", "OM", "PAKISTAN", "PK", "PALAU", "PW",
+ "PALESTINIAN TERRITORY, OCCUPIED", "PS", "PANAMA", "PA",
+ "PAPUA NEW GUINEA", "PG", "PARAGUAY", "PY", "PERU", "PE",
+ "PHILIPPINES", "PH", "PITCAIRN", "PN", "POLAND", "PL", "PORTUGAL",
+ "PT", "PUERTO RICO", "PR", "QATAR", "QA", "REUNION", "RE",
+ "ROMANIA", "RO", "RUSSIAN FEDERATION", "RU", "RWANDA", "RW",
+ "SAINT BARTHÉLEMY", "BL", "SAINT HELENA", "SH",
+ "SAINT KITTS AND NEVIS", "KN", "SAINT LUCIA", "LC", "SAINT MARTIN",
+ "MF", "SAINT PIERRE AND MIQUELON", "PM",
+ "SAINT VINCENT AND THE GRENADINES", "VC", "SAMOA", "WS",
+ "SAN MARINO", "SM", "SAO TOME AND PRINCIPE", "ST", "SAUDI ARABIA",
+ "SA", "SENEGAL", "SN", "SERBIA", "RS", "SEYCHELLES", "SC",
+ "SIERRA LEONE", "SL", "SINGAPORE", "SG", "SLOVAKIA", "SK",
+ "SLOVENIA", "SI", "SOLOMON ISLANDS", "SB", "SOMALIA", "SO",
+ "SOUTH AFRICA", "ZA",
+ "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS", "GS", "SPAIN",
+ "ES", "SRI LANKA", "LK", "SUDAN", "SD", "SURINAME", "SR",
+ "SVALBARD AND JAN MAYEN", "SJ", "SWAZILAND", "SZ", "SWEDEN", "SE",
+ "SWITZERLAND", "CH", "SYRIAN ARAB REPUBLIC", "SY",
+ "TAIWAN, PROVINCE OF CHINA", "TW", "TAJIKISTAN", "TJ",
+ "TANZANIA, UNITED REPUBLIC OF", "TZ", "THAILAND", "TH",
+ "TIMOR-LESTE", "TL", "TOGO", "TG", "TOKELAU", "TK", "TONGA", "TO",
+ "TRINIDAD AND TOBAGO", "TT", "TUNISIA", "TN", "TURKEY", "TR",
+ "TURKMENISTAN", "TM", "TURKS AND CAICOS ISLANDS", "TC", "TUVALU",
+ "TV", "UGANDA", "UG", "UKRAINE", "UA", "UNITED ARAB EMIRATES",
+ "AE", "UNITED KINGDOM", "GB", "UNITED STATES", "US",
+ "UNITED STATES MINOR OUTLYING ISLANDS", "UM", "URUGUAY", "UY",
+ "UZBEKISTAN", "UZ", "VANUATU", "VU", "VENEZUELA", "VE", "VIET NAM",
+ "VN", "VIRGIN ISLANDS, BRITISH", "VG", "VIRGIN ISLANDS, U.S.",
+ "VI", "WALLIS AND FUTUNA", "WF", "WESTERN SAHARA", "EH", "YEMEN",
+ "YE", "ZAMBIA", "ZM", "ZIMBABWE", "ZW" };
+
+ /**
+ * Crossbrowser hack to dynamically add css current window. Can be used to
+ * keep tests css in source files.
+ *
+ * @param cssString
+ */
+ public static void injectCSS(UI w, String cssString) {
+ String script = "if ('\\v'=='v') /* ie only */ {\n"
+ + " document.createStyleSheet().cssText = '"
+ + cssString
+ + "';\n"
+ + " } else {var tag = document.createElement('style'); tag.type = 'text/css';"
+ + " document.getElementsByTagName('head')[0].appendChild(tag);tag[ (typeof "
+ + "document.body.style.WebkitAppearance=='string') /* webkit only */ ? 'innerText' "
+ + ": 'innerHTML'] = '" + cssString + "';}";
+
+ w.getPage().getJavaScript().execute(script);
+ }
+
+ public static IndexedContainer getISO3166Container() {
+ IndexedContainer c = new IndexedContainer();
+ fillIso3166Container(c);
+ return c;
+ }
+
+ private static void fillIso3166Container(IndexedContainer container) {
+ container.addContainerProperty(iso3166_PROPERTY_NAME, String.class,
+ null);
+ container.addContainerProperty(iso3166_PROPERTY_SHORT, String.class,
+ null);
+ for (int i = 0; i < iso3166.length; i++) {
+ String name = iso3166[i++];
+ String id = iso3166[i];
+ Item item = container.addItem(id);
+ item.getItemProperty(iso3166_PROPERTY_NAME).setValue(name);
+ item.getItemProperty(iso3166_PROPERTY_SHORT).setValue(id);
+ }
+ container.sort(new Object[] { iso3166_PROPERTY_NAME },
+ new boolean[] { true });
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/util/User.java b/uitest/src/com/vaadin/tests/util/User.java
new file mode 100644
index 0000000000..003f485017
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/util/User.java
@@ -0,0 +1,54 @@
+package com.vaadin.tests.util;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class User implements Serializable {
+ private String name = "";
+ private Set<Role> roles = new HashSet<Role>();
+
+ public User() {
+ }
+
+ public User(String name) {
+ setName(name);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Returns an unmodifiable set of roles. To modify the roles a user has,
+ * replace the whole set using {@link #setRoles(Set)}.
+ *
+ * @return set of roles (unmodifiable, not null)
+ */
+ public Set<Role> getRoles() {
+ return Collections.unmodifiableSet(roles);
+ }
+
+ /**
+ * Replaces the set of roles with another collection. User references in
+ * roles are automatically updated when setting the roles of a user.
+ *
+ * @param roles
+ * non-null set of roles
+ */
+ public void setRoles(Set<Role> roles) {
+ for (Role role : this.roles) {
+ role.getUsers().remove(this);
+ }
+ this.roles = roles;
+ for (Role role : this.roles) {
+ role.getUsers().add(this);
+ }
+ }
+
+}