/* * 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.jackrabbit.core.security.principal; import org.apache.jackrabbit.api.security.principal.PrincipalIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.security.Principal; import java.util.NoSuchElementException; /** * Lazy implementation of the <code>PrincipalIterator</code> that allows to * avoid retrieving all elements beforehand. * NOTE: Subclasses must call {#link seekNext()} * upon object construction and assign the value to the 'next' field. */ abstract class AbstractPrincipalIterator implements PrincipalIterator { private static Logger log = LoggerFactory.getLogger(AbstractPrincipalIterator.class); long size; long position; Principal next; AbstractPrincipalIterator() { size = -1; position = 0; } /** * Subclasses must call {#link seekNext()} upon object construction and * assign the value to the 'next' field. * * @return The principal to be return upon the subsequent {@link #next()} * or {@link #nextPrincipal()} call or <code>null</code> if no next principal * exists. */ abstract Principal seekNext(); //--------------------------------------------------< PrincipalIterator >--- public Principal nextPrincipal() { Principal p = next; if (p == null) { throw new NoSuchElementException(); } next = seekNext(); position++; return p; } //------------------------------------------------------< RangeIterator >--- public void skip(long skipNum) { while (skipNum-- > 0) { next(); } } public long getSize() { return size; } public long getPosition() { return position; } //-----------------------------------------------------------< Iterator >--- public boolean hasNext() { return next != null; } public Object next() { return nextPrincipal(); } public void remove() { throw new UnsupportedOperationException(); } }