/*
 * Copyright 2010 JBoss Inc
 *
 * Licensed 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.drools.repository;

import java.util.Iterator;
import java.util.NoSuchElementException;

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

/**
 * This wraps a node iterator, and provides PackageItems when requested. This
 * supports lazy loading if needed.
 */
public class PackageIterator implements Iterator<PackageItem> {
    private final NodeIterator packageNodeIterator;
    private final RulesRepository repository;
    private boolean searchArchived = false;
    private Node current = null;
    private Node next = null;

    public PackageIterator() {
        this(null, null);
    }

    public PackageIterator(RulesRepository repository, NodeIterator packageNodes) {
        this.packageNodeIterator = packageNodes;
        this.repository = repository;
    }

    public boolean hasNext() {
        if (packageNodeIterator == null) {
            return false;
        }
        boolean hasnext = false;
        if (this.next == null) {
            while (this.packageNodeIterator.hasNext()) {
                Node element = (Node) this.packageNodeIterator.next();
                try {
                    //Do not return Global Area
                    if ((searchArchived || !element.getProperty(VersionableItem.CONTENT_PROPERTY_ARCHIVE_FLAG).getBoolean()) && !RulesRepository.RULE_GLOBAL_AREA.equals(element.getName())) {
                        hasnext = true;
                        this.next = element;
                        break;
                    }
                } catch (RepositoryException e) {
                    e.printStackTrace();
                }
            }
        } else {
            hasnext = true;
        }
        return hasnext;
    }

    public PackageItem next() {
        if (this.next == null) {
            this.hasNext();
        }

        this.current = this.next;
        this.next = null;

        if (this.current == null) {
            throw new NoSuchElementException("No more elements to return");
        }

        return new PackageItem(this.repository, (Node) this.current);

    }

    public void setArchivedIterator(boolean search) {
        this.searchArchived = search;
    }

    public boolean isSetArchivedSearch() {
        return this.searchArchived;
    }

    public void remove() {
        throw new UnsupportedOperationException(
                "You can not remove items this way.");
    }

}
