/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.jackrabbit.taglib.traverser;

import javax.jcr.Node;
import javax.jcr.RepositoryException;

/**
 * This Traverser collect the parent nodes.<br>
 * It may be useful for building the breadcrumb.
 * 
 * @author <a href="mailto:edgarpoce@gmail.com">Edgar Poce </a>
 */
public class AncestorsTraverser extends AbstractTraverser
{
    /**
     * Visit the ancestors recursively
     * 
     * @param myNode
     * @throws RepositoryException
     */
    private void ancestor(Node myNode) throws RepositoryException
    {
        if (myNode.getDepth() > this.node.getDepth() - this.depth
                && myNode.getDepth() > 0)
        {
            this.ancestor(myNode.getParent());
        }
        this.nodes.add(myNode);
    }

    protected void internalTraverse() throws RepositoryException
    {
        this.ancestor(super.node);
    }

    /** Parameters are ignored */
    public void setParameter(Object parameter)
    {
        // Any parameter is ignored.
    }
}