Package org.apache.jmeter.report.gui.tree

Source Code of org.apache.jmeter.report.gui.tree.ReportTreeModel

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.jmeter.report.gui.tree;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.swing.tree.DefaultTreeModel;

import org.apache.jmeter.config.gui.AbstractConfigGui;
import org.apache.jmeter.control.gui.ReportGui;
import org.apache.jmeter.exceptions.IllegalUserActionException;
import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.gui.JMeterGUIComponent;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.ReportPlan;
import org.apache.jmeter.testelement.property.NullProperty;
import org.apache.jmeter.util.NameUpdater;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.ListedHashTree;

public class ReportTreeModel extends DefaultTreeModel {

  public ReportTreeModel() {
    super(new ReportTreeNode(new ReportGui().createTestElement(), null));
    initTree();
  }

  /**
   * Returns a list of tree nodes that hold objects of the given class type.
   * If none are found, an empty list is returned.
   */
  public List getNodesOfType(Class type) {
    List nodeList = new LinkedList();
    traverseAndFind(type, (ReportTreeNode) this.getRoot(), nodeList);
    return nodeList;
  }

  /**
   * Get the node for a given TestElement object.
   */
  public ReportTreeNode getNodeOf(TestElement userObject) {
    return traverseAndFind(userObject, (ReportTreeNode) getRoot());
  }

  /**
   * Adds the sub tree at the given node. Returns a boolean indicating whether
   * the added sub tree was a full test plan.
   */
  public HashTree addSubTree(HashTree subTree, ReportTreeNode current)
      throws IllegalUserActionException {
    Iterator iter = subTree.list().iterator();
    while (iter.hasNext()) {
      TestElement item = (TestElement) iter.next();
      if (item instanceof ReportPlan) {
        current = (ReportTreeNode) ((ReportTreeNode) getRoot())
            .getChildAt(0);
        ((TestElement) current.getUserObject()).addTestElement(item);
        ((ReportPlan) current.getUserObject()).setName(item.getName());
        addSubTree(subTree.getTree(item), current);
      } else {
        if (subTree.getTree(item) != null) {
          addSubTree(subTree.getTree(item), addComponent(item, current));
        }
      }
    }
    return getCurrentSubTree(current);
  }

  public ReportTreeNode addComponent(TestElement component,
      ReportTreeNode node) throws IllegalUserActionException {
    if (node.getUserObject() instanceof AbstractConfigGui) {
      throw new IllegalUserActionException(
          "This node cannot hold sub-elements");
    }
    component.setProperty(TestElement.GUI_CLASS, NameUpdater
        .getCurrentName(component
            .getPropertyAsString(TestElement.GUI_CLASS)));
    ReportGuiPackage.getInstance().updateCurrentNode();
    JMeterGUIComponent guicomp = ReportGuiPackage.getInstance().getGui(component);
    guicomp.configure(component);
    guicomp.modifyTestElement(component);
    ReportGuiPackage.getInstance().getCurrentGui(); // put the gui object back
    // to the way it was.
    ReportTreeNode newNode = new ReportTreeNode(component, this);

    // This check the state of the TestElement and if returns false it
    // disable the loaded node
    try {
      if (component.getProperty(TestElement.ENABLED) instanceof NullProperty
          || component.getPropertyAsBoolean(TestElement.ENABLED)) {
        newNode.setEnabled(true);
      } else {
        newNode.setEnabled(false);
      }
    } catch (Exception e) {
      newNode.setEnabled(true);
    }

    this.insertNodeInto(newNode, node, node.getChildCount());
    return newNode;
  }

  public void removeNodeFromParent(ReportTreeNode node) {
    if (!(node.getUserObject() instanceof ReportPlan)) {
      super.removeNodeFromParent(node);
    }
  }

  private void traverseAndFind(Class type, ReportTreeNode node, List nodeList) {
    if (type.isInstance(node.getUserObject())) {
      nodeList.add(node);
    }
    Enumeration enumNode = node.children();
    while (enumNode.hasMoreElements()) {
      ReportTreeNode child = (ReportTreeNode) enumNode.nextElement();
      traverseAndFind(type, child, nodeList);
    }
  }

  private ReportTreeNode traverseAndFind(TestElement userObject,
      ReportTreeNode node) {
    if (userObject == node.getUserObject()) {
      return node;
    }
    Enumeration enumNode = node.children();
    while (enumNode.hasMoreElements()) {
      ReportTreeNode child = (ReportTreeNode) enumNode.nextElement();
      ReportTreeNode result = traverseAndFind(userObject, child);
      if (result != null) {
        return result;
      }
    }
    return null;
  }

  public HashTree getCurrentSubTree(ReportTreeNode node) {
    ListedHashTree hashTree = new ListedHashTree(node);
    Enumeration enumNode = node.children();
    while (enumNode.hasMoreElements()) {
      ReportTreeNode child = (ReportTreeNode) enumNode.nextElement();
      hashTree.add(node, getCurrentSubTree(child));
    }
    return hashTree;
  }

  public HashTree getReportPlan() {
    return getCurrentSubTree((ReportTreeNode) ((ReportTreeNode) this
        .getRoot()).getChildAt(0));
  }

  public void clearTestPlan() {
    super.removeNodeFromParent((ReportTreeNode) getChild(getRoot(), 0));
    initTree();
  }

  private void initTree() {
    TestElement rp = new ReportGui().createTestElement();
    this.insertNodeInto(new ReportTreeNode(rp, this),
        (ReportTreeNode) getRoot(), 0);
  }
}
TOP

Related Classes of org.apache.jmeter.report.gui.tree.ReportTreeModel

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.