001 package org.apache.myfaces.tobago.model;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one or more
005 * contributor license agreements. See the NOTICE file distributed with
006 * this work for additional information regarding copyright ownership.
007 * The ASF licenses this file to You under the Apache License, Version 2.0
008 * (the "License"); you may not use this file except in compliance with
009 * the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 import org.slf4j.Logger;
021 import org.slf4j.LoggerFactory;
022 import org.apache.myfaces.tobago.component.Attributes;
023 import org.apache.myfaces.tobago.internal.component.AbstractUITreeNode;
024
025 import java.util.ArrayList;
026 import java.util.List;
027 import java.util.Stack;
028
029 /**
030 * Date: 23.04.2007 16:10:22
031 */
032 public class MixedTreeModel {
033
034 private static final Logger LOG = LoggerFactory.getLogger(MixedTreeModel.class);
035
036 private Node root;
037 private Node current;
038 private Integer nextChildIndex;
039 private Stack<Boolean> junctions = new Stack<Boolean>();
040
041 public void beginBuildNode(AbstractUITreeNode node) {
042 if (LOG.isDebugEnabled()) {
043 LOG.debug("{}", node.getAttributes().get(Attributes.LABEL));
044 }
045 Node newNode = new Node();
046 newNode.setLabel((String) node.getAttributes().get(Attributes.LABEL));
047 if (root == null) {
048 root = newNode;
049 current = root;
050 } else {
051 current.add(newNode);
052 current = newNode;
053 }
054 }
055
056 public void endBuildNode(AbstractUITreeNode node) {
057 if (LOG.isDebugEnabled()) {
058 LOG.debug("{}", node.getAttributes().get(Attributes.LABEL));
059 }
060 current = current.getParent();
061 }
062
063 public void onEncodeBegin() {
064 if (LOG.isDebugEnabled()) {
065 LOG.debug("current=" + current);
066 }
067 if (current == null) {
068 current = root;
069 } else {
070 current = current.getChildAt(nextChildIndex);
071 }
072 nextChildIndex = 0;
073
074 junctions.push(hasCurrentNodeNextSibling());
075 }
076
077 public void onEncodeEnd() {
078 if (LOG.isDebugEnabled()) {
079 LOG.debug("current=" + current);
080 }
081 Node parent = current.getParent();
082 if (parent != null) {
083 nextChildIndex = parent.getIndex(current) + 1;
084 current = parent;
085 } else {
086 nextChildIndex = null;
087 current = null;
088 }
089
090 junctions.pop();
091 }
092
093 public boolean hasCurrentNodeNextSibling() {
094 return current.hasNextSibling();
095 }
096
097 public List<Boolean> getJunctions() {
098 Boolean top = junctions.pop();
099 List<Boolean> result = new ArrayList<Boolean>(junctions);
100 junctions.push(top);
101 return result;
102 }
103
104 public TreePath getPath() {
105 return current.getPath();
106 }
107 }