zktest/src/main/java/org/zkoss/zktest/zats/zuti/vm/ForEachListModelVM.java

Summary

Maintainability
D
1 day
Test Coverage
/** ForEachListModelVM.java.

    Purpose:
        
    Description:
        
    History:
        02:15:14 PM Jan 26, 2015, Created by jameschu

Copyright (C) 2015 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zktest.zats.zuti.vm;

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.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.zul.Label;
import org.zkoss.zul.ListModelArray;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.ListModelMap;
import org.zkoss.zul.ListModelSet;
import org.zkoss.zul.Window;
import org.zkoss.zktest.zats.zuti.bean.Person;

/**
 * @author JamesChu
 *
 */
public class ForEachListModelVM implements Serializable{
    private static final long serialVersionUID = -1757483024000975324L;
    
    private List<Person> dataList_l;
    private String[] dataList_a1D = new String[] {
            "Apple", "Orange", "Mango"};
    private String[][] dataList_a2D = new String[][] {
            {"Apple", "10kg"},
            {"Orange", "20kg"},
            {"Mango", "12kg"}
        };
    private Map<String, Person> dataList_m;
    private Set<Object> dataList_s;
    private ListModelList<Person> model_l;
    private ListModelArray<Object> model_a1D;
    private ListModelArray<Object> model_a2D;
    private ListModelMap<String, Person> model_m;
    private ListModelSet<Object> model_s;
    
    
    public ListModelList<Person> getModel_l() {
        return model_l;
    }

    public void setModel_l(ListModelList<Person> model_l) {
        this.model_l = model_l;
    }

    public ListModelArray<Object> getModel_a1D() {
        return model_a1D;
    }

    public void setModel_a1D(ListModelArray<Object> model_a1D) {
        this.model_a1D = model_a1D;
    }

    public ListModelArray<Object> getModel_a2D() {
        return model_a2D;
    }

    public void setModel_a2D(ListModelArray<Object> model_a2D) {
        this.model_a2D = model_a2D;
    }

    public ListModelMap<String, Person> getModel_m() {
        return model_m;
    }

    public void setModel_m(ListModelMap<String, Person> model_m) {
        this.model_m = model_m;
    }

    public ListModelSet<Object> getModel_s() {
        return model_s;
    }

    public void setModel_s(ListModelSet<Object> model_s) {
        this.model_s = model_s;
    }

    @Init
    public void init() {
        dataList_l = new ArrayList<Person>();
        for (int i = 0; i < 5; i++) {
            dataList_l.add(new Person("Person#" + i, "Addr#" + i));
        }
        model_l = new ListModelList<Person>(dataList_l, true);
        model_a1D = new ListModelArray<Object>(dataList_a1D);
        model_a2D = new ListModelArray<Object>(dataList_a2D);
        dataList_m = new HashMap<String, Person>();
        for (int i = 0; i < 5; i++) {
            dataList_m.put("Person#" + i, new Person("Person#" + i, "Addr#" + i));
        }
        model_m = new ListModelMap<String, Person>(dataList_m, true);
        dataList_s = new HashSet<Object>();
        for (int i = 0; i < 5; i++) {
            dataList_s.add(new Person("Person#" + i, "Addr#" + i));
        }
        model_s = new ListModelSet<Object>(dataList_s, true);
    }
    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();
        oos.close();
        oaos.close();
        replaceComponent(win, newwin);
        //for load component back.
        ((ComponentCtrl)newwin).sessionDidActivate(newwin.getPage());//simulate
        msg.setValue("done deserialize: "+_bytes.length);    
    }
    
    private void replaceComponent(Component oc, Component nc) {
        Component parent = oc.getParent();
        Component ref = oc.getNextSibling();
        oc.detach();
        parent.insertBefore(nc, ref);
    }
    
    @Command
    @NotifyChange({"model_l","model_a1D","model_a2D","model_m","model_s"})
    public void change_model() {
        dataList_l = new ArrayList<Person>();
        for (int i = 0; i < 3; i++) {
            dataList_l.add(new Person("New Person#" + i, "Addr#" + i));
        }
        model_l = new ListModelList<Person>(dataList_l, true);
        String[] dataList_a1D_new = new String[] {
                "New Apple", "New Orange", "New Mango", "New Banana"};
        String[][] dataList_a2D_new = new String[][] {
                {"New Apple", "10.1kg"},
                {"New Orange", "20.1kg"},
                {"New Mango", "12.1kg"},
                {"New Banana", "11.1kg"}
        };
        model_a1D = new ListModelArray<Object>(dataList_a1D_new);
        model_a2D = new ListModelArray<Object>(dataList_a2D_new);
        Map<String,Person> dataList_m_new = new HashMap<String, Person>();
        for (int i = 0; i < 3; i++) {
            dataList_m_new.put("New Person#" + i, new Person("Person#" + i, "Addr#" + i));
        }
        model_m = new ListModelMap<String, Person>(dataList_m_new, true);
        Set<Object> dataList_s_new = new HashSet<Object>();
        for (int i = 0; i < 5; i++) {
            dataList_s_new.add(new Person("Person#" + i, "Addr#" + i));
        }
        model_s = new ListModelSet<Object>(dataList_s_new, true);
    }
    
    @Command
    public void add() {
        dataList_l.add(new Person("Person#5", "Addr#5 - person")); //Because of live model
        model_l.add(new Person("Person#6", "Addr#6 - model"));
        dataList_m.put("New Person#5", new Person("Person#5", "Addr#5 - person"));
        model_m.put("New Person#6", new Person("Person#6", "Addr#6 - model"));
        dataList_s.add(new Person("Person#5", "Addr#5 - person"));
        model_s.add(new Person("Person#6", "Addr#6 - model"));
    }
    
    @Command
    public void update() {
        Person p = dataList_l.get(0);
        p.setName("<model person change>");
        model_l.set(0, p);
        dataList_a1D[0] += "<model person change>";
        model_a1D.set(0, dataList_a1D[0]);
        dataList_a2D[0][0] += "<model person change>";
        dataList_a2D[0][1] += "<model person change>";
        model_a2D.set(0, dataList_a2D[0]);
        p = (Person) model_m.getElementAt(0).getValue();
        model_m.put(model_m.getElementAt(0).getKey(), new Person(p.getName(), "Addr#<model person change>"));
    }
    
    @Command
    public void remove() {
        model_l.remove(model_l.getSize() - 1);
        model_m.remove(model_m.getElementAt(model_m.getSize() - 1).getKey());
        model_s.remove(model_s.getElementAt(model_s.getSize() - 1));
    }
}