/** FormWithSet.java. Purpose: Description: History: 4:13:01 PM Dec 31, 2014, Created by jumperchen Copyright (C) 2014 Potix Corporation. All Rights Reserved. */ package org.zkoss.zktest.bind.viewmodel.form; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.zkoss.bind.BindUtils; import org.zkoss.bind.annotation.BindingParam; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.Init; import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Page; import org.zkoss.zk.ui.sys.ComponentCtrl; import org.zkoss.zktest.bind.viewmodel.form.FormWithMap.Tag; import org.zkoss.zul.Label; import org.zkoss.zul.Window; /** * @author jumperchen */ public class FormWithList implements Serializable{ private String dbItemName = "screw"; private String dbMainTagValue = "tool"; private List<String> dbTagValues = new ArrayList<String>(Arrays.asList( "metal", "construction", "small")); private Item currentItem; private List<Tag> bunchTags; @Init public void init() { loadCurrentItem(); bunchTags = new ArrayList<Tag>(3); bunchTags.add(new Tag("addAll1")); bunchTags.add(new Tag("addAll2")); bunchTags.add(new Tag("addAll3")); } @Command("save") @NotifyChange("currentItem") public void onSave() { saveCurrentItem(); } @Command("cancel") @NotifyChange("currentItem") public void onCancel() { this.getCurrentItem().newTagValue = ""; } @Command("reload") @NotifyChange("currentItem") public void onReload() { loadCurrentItem(); } @Command("addTag") public void onAddTag(@BindingParam("form") Item form, @BindingParam("tagValue") String tagValue) { List<Tag> tags = form.getTags(); tags.add(new Tag(tagValue)); BindUtils.postNotifyChange(null, null, form, "tags"); } @Command("removeTag") public void onRemoveTag(@BindingParam("form") Item form, @BindingParam("tag") Tag tag) { List<Tag> tags = form.getTags(); tags.remove(tag); BindUtils.postNotifyChange(null, null, form, "tags"); } @Command("addAll") public void onAddAll(@BindingParam("form") Item form) { List<Tag> tags = form.getTags(); tags.addAll(bunchTags); BindUtils.postNotifyChange(null, null, form, "tags"); } @Command("retainAll") public void onRetainAll(@BindingParam("form") Item form) { List<Tag> tags = form.getTags(); tags.retainAll(bunchTags); BindUtils.postNotifyChange(null, null, form, "tags"); } private void loadCurrentItem() { currentItem = new Item(); currentItem.setName(dbItemName); currentItem.setMainTag(new Tag(dbMainTagValue)); currentItem.setTags(new ArrayList<Tag>()); for (String tagValue : dbTagValues) { currentItem.getTags().add(new Tag(tagValue)); } } private void saveCurrentItem() { dbItemName = currentItem.getName(); dbMainTagValue = currentItem.getMainTag().getValue(); dbTagValues.clear(); for (Tag tag : currentItem.getTags()) { dbTagValues.add(tag.getValue()); } } public Item getCurrentItem() { return currentItem; } public void setCurrentItem(Item currentItem) { this.currentItem = currentItem; } byte[] _bytes; public void doSerialize(Window win,Label msg){ try{ doSerialize0(win, msg); doDeserialize0(win, msg); }catch(Exception x){ x.printStackTrace(); msg.setValue("error :"+x.getClass()+","+x.getMessage()); } } public void doSerialize0(Window win,Label msg) throws Exception{ Page pg = win.getPage(); ((ComponentCtrl)win).sessionWillPassivate(pg);//simulate ByteArrayOutputStream oaos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(oaos); oos.writeObject(win); oos.close(); oaos.close(); _bytes = oaos.toByteArray(); } public void doDeserialize0(Window win, Label msg) throws Exception{ ByteArrayInputStream oaos = new ByteArrayInputStream(_bytes); ObjectInputStream oos = new ObjectInputStream(oaos); Window newwin = (Window) oos.readObject(); Page pg = win.getPage(); Component parent = win.getParent(); Component ref = win.getNextSibling(); win.detach(); oos.close(); oaos.close(); parent.insertBefore(newwin, ref); //for load component back. ((ComponentCtrl)newwin).sessionDidActivate(newwin.getPage());//simulate ((Label)newwin.getFellow("msg")).setValue("done deserialize: "+_bytes.length); } public static class Item implements Serializable { private String name; private Tag mainTag; private List<Tag> tags; private String newTagValue; public Item() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Tag getMainTag() { return mainTag; } public void setMainTag(Tag mainTag) { this.mainTag = mainTag; } public List<Tag> getTags() { return tags; } public void setTags(List<Tag> tags) { this.tags = tags; } public void setNewTagValue(String v) { newTagValue = v; } public String getNewTagValue() { return newTagValue; } } public static class Tag implements Serializable{ private String value; public Tag() { } public Tag(String value) { super(); this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public int hashCode() { final int prime = 31; int result = 1; final String value = getValue(); result = prime * result + ((value == null) ? 0 : value.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Tag other = (Tag) obj; String value1 = getValue(); String value2 = other.getValue(); if (value1 == null) { if (value2 != null) return false; } else if (!value1.equals(value2)) return false; return true; } @Override public String toString() { return value; } } }