Package org.richfaces.model

Source Code of org.richfaces.model.StackingTreeDataModelTest$StackingTreeDataModelTestVisitor2

/**
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*/
package org.richfaces.model;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
import org.richfaces.model.entity.Directory;
import org.richfaces.model.entity.File;
import org.richfaces.model.entity.Named;
import org.richfaces.model.entity.Project;


/**
* @author Nick Belaevski
*         mailto:nbelaevski@exadel.com
*         created 30.07.2007
*
*/
public class StackingTreeDataModelTest extends AbstractAjax4JsfTestCase {

  public StackingTreeDataModelTest(String name) {
    super(name);
  }

  private StackingTreeModel stackingTreeModel;
  private StackingTreeModel projectsModel;
  private StackingTreeModel directoriesModel;
  private StackingTreeModel filesModel;

  private Object projectRequestObject;
  private Object directoryRequestObject;
  private Object fileRequestObject;
 
  /* (non-Javadoc)
   * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
   */
  public void setUp() throws Exception {
    super.setUp();
    this.stackingTreeModel = new StackingTreeModel();
    projectsModel = new StackingTreeModel("project", "project", new StackingTreeModelDataProvider() {

      private Map data = null;

      public Object getData() {
        if (data == null) {
          data = new LinkedHashMap();
          Project projectA = new Project("projectA", 10);

          Directory adir1 = new Directory("ADir1", 50);

          adir1.addFile(new File("AFile1", 60));
          adir1.addFile(new File("AFile2", 61));

          Directory adir2 = new Directory("ADir2", 101);

          projectA.addDirectory(adir1);
          projectA.addDirectory(adir2);

          data.put(projectA.getName(), projectA);

          Project projectB = new Project("projectB", 501);

          Directory bdir1 = new Directory("BDir1", 600);
          Directory bdir2 = new Directory("BDir2", 700);
          Directory bdir3 = new Directory("BDir3", 801);

          projectB.addDirectory(bdir1);
          projectB.addDirectory(bdir2);
          projectB.addDirectory(bdir3);

          data.put(projectB.getName(), projectB);
        }
        return data;
      }
    });
    final ValueBinding dirVB = application.createValueBinding("#{project.directories}");
    directoriesModel = new StackingTreeModel("directory", "directory", new StackingTreeModelDataProvider() {
      public Object getData() {
        return dirVB.getValue(facesContext);
      }
    });
    final ValueBinding fileVB = application.createValueBinding("#{directory.files}");
    filesModel = new StackingTreeModel("file", "file", new StackingTreeModelDataProvider() {
      public Object getData() {
        return fileVB.getValue(facesContext);
      }
    });
    directoriesModel.addStackingModel(filesModel);
    projectsModel.addStackingModel(directoriesModel);
    this.stackingTreeModel.addStackingModel(projectsModel);
   
    projectRequestObject = new Object();
    directoryRequestObject = new Object();
    fileRequestObject = new Object();
   
    Map requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
    requestParameterMap.put("project", projectRequestObject);
    requestParameterMap.put("directory", directoryRequestObject);
    requestParameterMap.put("file", fileRequestObject);
  }

  /* (non-Javadoc)
   * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#tearDown()
   */
  public void tearDown() throws Exception {
    super.tearDown();
    this.stackingTreeModel = null;
    this.projectsModel = null;
    this.directoriesModel = null;
    this.filesModel = null;
   
    this.projectRequestObject = null;
    this.directoryRequestObject = null;
    this.fileRequestObject = null;
  }

  public void testWalk() throws Exception {
    StackingTreeDataModelTestVisitor1 visitor1 = new StackingTreeDataModelTestVisitor1();
    this.stackingTreeModel.walk(facesContext, visitor1, null, null);
    assertEquals(9, visitor1.getCounter());
    this.stackingTreeModel.setRowKey(null);
    assertFalse(this.stackingTreeModel.isRowAvailable());

    Map requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
    assertSame(this.projectRequestObject, requestParameterMap.get("project"));
    assertSame(this.directoryRequestObject, requestParameterMap.get("directory"));
    assertSame(this.fileRequestObject, requestParameterMap.get("file"));
  }

  public void testBadKey() throws Exception {
    StackingTreeDataModelTestVisitor1 visitor1 = new StackingTreeDataModelTestVisitor1();
    this.stackingTreeModel.walk(facesContext, visitor1, null, null);
    this.stackingTreeModel.setRowKey(new ListRowKey(null, new StackingTreeModelKey("project", "projectA")));
    assertTrue(this.stackingTreeModel.isRowAvailable());
    assertNotNull(this.stackingTreeModel.getRowData());
   
    assertNull(this.stackingTreeModel.getTreeNode());
    assertFalse(this.stackingTreeModel.isLeaf());
   
    this.stackingTreeModel.setRowKey(new ListRowKey(null, new StackingTreeModelKey("project", "projectAAAAA")));
    assertFalse(this.stackingTreeModel.isRowAvailable());
    try {
      Object rowData = this.stackingTreeModel.getRowData();
      assertNull(rowData);
      //FIXME: Maksim - bad keys happen for a reason
      //fail();
    } catch (Exception e) {

    }
   
    try {
      boolean leaf = this.stackingTreeModel.isLeaf();
      assertTrue(leaf);
      //FIXME: Maksim - bad keys happen for a reason
      //fail();
    } catch (Exception e) {

    }

    try {
      TreeNode node = this.stackingTreeModel.getTreeNode();
      assertNull(node);
      //FIXME: Maksim - bad keys happen for a reason
      //fail();
    } catch (Exception e) {

    }
  }
 
  public void testActiveData() throws Exception {
    final ValueBinding fileVB = application.createValueBinding("#{directory.files}");
    StackingTreeModel localFilesModel = new StackingTreeModel("file", "file", new StackingTreeModelDataProvider() {
      public Object getData() {
        return fileVB.getValue(facesContext);
      }
     
    }) {
      protected boolean isActiveData() {
        Map requestMap = externalContext.getRequestMap();
        Object object = requestMap.get("file");
        assertNotNull(object);
        File file = (File) object;
        if (file.getTag() == 61) {
          return false;
        }
       
        return super.isActiveData();
      }
    };
    directoriesModel.removeStackingModel(filesModel);
    directoriesModel.addStackingModel(localFilesModel);
   
    stackingTreeModel.walk(facesContext, new StackingTreeDataModelTestVisitor3(), null, null);
  }
 
  public void testKey() throws Exception {
    StackingTreeModelKey key = new StackingTreeModelKey("aaa", new Integer(10));
    StackingTreeModelKey key2 = new StackingTreeModelKey("aaa", new Integer(11));
    StackingTreeModelKey key3 = new StackingTreeModelKey("aaa", new Integer(10));
    StackingTreeModelKey key4 = new StackingTreeModelKey("bbb", new Integer(10));
   
    assertFalse(key.equals(new StackingTreeModelKey("aaa", new Integer(0)) {} ));
   
    assertTrue(key.equals(key3));
    assertTrue(key3.equals(key));
    assertTrue(key2.equals(key2));
    assertTrue(key4.equals(key4));

    assertTrue(key.hashCode() == key3.hashCode());
    assertTrue(key3.hashCode() == key.hashCode());
    assertTrue(key2.hashCode() == key2.hashCode());
    assertTrue(key4.hashCode() == key4.hashCode());
   
    assertFalse(key.equals(key2));
    assertFalse(key3.equals(key2));
    assertFalse(key2.equals(key));
    assertFalse(key2.equals(key3));

    assertFalse(key.hashCode() == key2.hashCode());
    assertFalse(key3.hashCode() == key2.hashCode());
    assertFalse(key2.hashCode() == key.hashCode());
    assertFalse(key2.hashCode() == key3.hashCode());
   
    assertFalse(key4.equals(key));
    assertFalse(key4.equals(key2));
    assertFalse(key4.equals(key3));

    assertFalse(key4.hashCode() == key.hashCode());
    assertFalse(key4.hashCode() == key2.hashCode());
    assertFalse(key4.hashCode() == key3.hashCode());

    assertFalse(key.equals(key4));
    assertFalse(key2.equals(key4));
    assertFalse(key3.equals(key4));
   
    assertFalse(new StackingTreeModelKey("aaa", new Integer(10)).equals(null));
    assertFalse(new StackingTreeModelKey("aaa", null).equals(null));
    assertFalse(new StackingTreeModelKey(null, new Integer(10)).equals(null));
    assertFalse(new StackingTreeModelKey(null, null).equals(null));

    assertFalse(key.hashCode() == key4.hashCode());
    assertFalse(key2.hashCode() == key4.hashCode());
    assertFalse(key3.hashCode() == key4.hashCode());

    assertFalse(key.hashCode() == 0);
    assertFalse(key2.hashCode() == 0);
    assertFalse(key3.hashCode() == 0);
    assertFalse(key4.hashCode() == 0);
   
    assertTrue(new StackingTreeModelKey(null, new Integer(11)).equals(new StackingTreeModelKey(null, new Integer(11))));
    assertFalse(new StackingTreeModelKey(null, new Integer(10)).equals(new StackingTreeModelKey(null, new Integer(11))));
    assertFalse(new StackingTreeModelKey(null, new Integer(10)).equals(new StackingTreeModelKey("aaa", new Integer(10))));

    assertTrue(new StackingTreeModelKey(null, new Integer(11)).hashCode()  == new StackingTreeModelKey(null, new Integer(11)).hashCode());
    assertFalse(new StackingTreeModelKey(null, new Integer(10)).hashCode() == new StackingTreeModelKey(null, new Integer(11)).hashCode());
    assertFalse(new StackingTreeModelKey(null, new Integer(10)).hashCode() == new StackingTreeModelKey("aaa", new Integer(10)).hashCode());

    assertTrue(new StackingTreeModelKey("aaa", null).equals(new StackingTreeModelKey("aaa", null)));
    assertFalse(new StackingTreeModelKey("aaa", null).equals(new StackingTreeModelKey("bbb", null)));
    assertFalse(new StackingTreeModelKey("aaa", null).equals(new StackingTreeModelKey("aaa", new Integer(10))));

    assertTrue(new StackingTreeModelKey("aaa", null).hashCode() == new StackingTreeModelKey("aaa", null).hashCode());
    assertFalse(new StackingTreeModelKey("aaa", null).hashCode() == new StackingTreeModelKey("bbb", null).hashCode());
    assertFalse(new StackingTreeModelKey("aaa", null).hashCode() == new StackingTreeModelKey("aaa", new Integer(10)).hashCode());
  }
 
  class StackingTreeDataModelTestVisitor1 implements DataVisitor, LastElementAware {

    private boolean last;
    private int tag = 0;
    private int counter = 0;

    public void process(FacesContext context, Object rowKey, Object argument)
    throws IOException {

      StackingTreeDataModelTestVisitor2 visitor2 = new StackingTreeDataModelTestVisitor2();
     
      stackingTreeModel.walk(context, visitor2, null, new ListRowKey(null, new StackingTreeModelKey("project", "projectA")),
          argument, false);

      assertEquals(5, visitor2.getCounter());

      StackingTreeDataModelTestVisitor2 visitor20 = new StackingTreeDataModelTestVisitor2();
     
      stackingTreeModel.walk(context, visitor20, new TreeRange() {

        public boolean processChildren(TreeRowKey rowKey) {
          return false;
        }

        public boolean processNode(TreeRowKey rowKey) {
          return false;
        }
       
      }, new ListRowKey(null, new StackingTreeModelKey("project", "projectA")),
          argument, false);

      assertEquals(0, visitor20.getCounter());

      StackingTreeDataModelTestVisitor2 visitor21 = new StackingTreeDataModelTestVisitor2();
     
      stackingTreeModel.walk(context, visitor21, new TreeRange() {

        public boolean processChildren(TreeRowKey rowKey) {
          return false;
        }

        public boolean processNode(TreeRowKey rowKey) {
          return true;
        }
       
      }, new ListRowKey(null, new StackingTreeModelKey("project", "projectA")),
          argument, false);

      assertEquals(1, visitor21.getCounter());

      StackingTreeDataModelTestVisitor2 visitor22 = new StackingTreeDataModelTestVisitor2();
     
      stackingTreeModel.walk(context, visitor22, null, new ListRowKey(null, new StackingTreeModelKey("project", "projectB")),
          argument, false);

      assertEquals(4, visitor22.getCounter());
     
      StackingTreeDataModelTestVisitor2 visitor23 = new StackingTreeDataModelTestVisitor2();
     
      stackingTreeModel.walk(context, visitor23, new TreeRange() {

        private boolean rootProcessed = false;
       
        public boolean processChildren(TreeRowKey rowKey) {
          boolean result = rootProcessed;
          rootProcessed = true;
          return !result;
        }

        public boolean processNode(TreeRowKey rowKey) {
          return true;
        }
       
      }, new ListRowKey(null, new StackingTreeModelKey("project", "projectB")),
          argument, false);

      assertEquals(4, visitor23.getCounter());

      stackingTreeModel.setRowKey(rowKey);

      assertSame(rowKey, stackingTreeModel.getRowKey());

      assertNull(stackingTreeModel.getTreeNode());
      Object rowData = stackingTreeModel.getRowData();
      assertNotNull(rowData);
      assertTrue(rowData instanceof Named);

      Named named = (Named) rowData;

      int currentTag = named.getTag();
      assertTrue(currentTag > tag);
      this.tag = currentTag;

      if (this.tag % 10 == 1) {
        assertTrue(last);
      } else {
        assertFalse(last);
      }

      if (named instanceof Directory) {
        if ("ADir1".equals(named.getName())) {
          assertFalse(stackingTreeModel.isLeaf());
        } else {
          assertTrue(stackingTreeModel.isLeaf());
        }
      } else if (named instanceof Project) {
        assertFalse(stackingTreeModel.isLeaf());
      } else if (named instanceof File) {
        assertTrue(stackingTreeModel.isLeaf());
      } else {
        fail();
      }

      counter++;
    }

    public void resetLastElement() {
      this.last = false;
    }

    public void setLastElement() {
      this.last = true;
    }

    public int getCounter() {
      return counter;
    }
  }

  class StackingTreeDataModelTestVisitor2 implements DataVisitor {
    private int counter = 0;
    private int tag = 0;

    public void process(FacesContext context, Object rowKey, Object argument)
    throws IOException {

      stackingTreeModel.setRowKey(rowKey);
      Object rowData = stackingTreeModel.getRowData();
      assertNotNull(rowData);
      Named named = (Named) rowData;

      int currentTag = named.getTag();
      assertTrue(currentTag > tag);
      tag = currentTag;
      counter++;
    }

    public int getCounter() {
      return counter;
    }
  }
 
  class StackingTreeDataModelTestVisitor3 implements DataVisitor, LastElementAware {

    private boolean last;
   
    public void process(FacesContext context, Object rowKey, Object argument)
        throws IOException {

      stackingTreeModel.setRowKey(rowKey);
      Named named = (Named) stackingTreeModel.getRowData();
      int tag = named.getTag();
     
      if (tag == 60) {
        assertTrue(last);
      }
      assertFalse(tag == 61);
    }

    public void resetLastElement() {
      this.last = false;
    }

    public void setLastElement() {
      this.last = true;
    }
  }
}

TOP

Related Classes of org.richfaces.model.StackingTreeDataModelTest$StackingTreeDataModelTestVisitor2

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.