/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.collection; import java.util.Vector; import org.omg.CORBA.Any; import org.omg.CORBA.AnyHolder; import org.omg.CORBA.BooleanHolder; import org.omg.CosCollection.AnySequenceHolder; import org.omg.CosCollection.ElementInvalid; import org.omg.CosCollection.IteratorInBetween; import org.omg.CosCollection.IteratorInvalid; import org.omg.CosCollection.IteratorInvalidReason; import org.omg.CosCollection.OrderedIteratorOperations; import org.omg.CosCollection.PositionInvalid; class OrderedIteratorImpl extends PositionalIteratorImpl implements OrderedIteratorOperations { /* ========================================================================= */ protected boolean reverse; // reverse now not supperted /* ========================================================================= */ OrderedIteratorImpl( OrderedCollectionImpl collection ){ super( collection ); reverse = false; }; /* ------------------------------------------------------------------------- */ OrderedIteratorImpl( OrderedCollectionImpl collection, boolean read_only ){ super( collection, read_only ); reverse = false; }; /* ------------------------------------------------------------------------- */ OrderedIteratorImpl( OrderedCollectionImpl collection, boolean read_only, boolean reverse ){ super( collection, read_only ); if( reverse ){ throw new org.omg.CORBA.NO_IMPLEMENT(); } this.reverse = reverse; }; /* ========================================================================= */ public boolean set_to_last_element(){ synchronized( collection ){ set_pos( collection.data.size()-1 ); set_in_between( false ); return is_valid(); } }; /* ------------------------------------------------------------------------- */ public boolean set_to_previous_element() throws IteratorInvalid{ return set_to_nth_previous_element( 1 ); }; /* ------------------------------------------------------------------------- */ public boolean set_to_nth_previous_element(int n) throws IteratorInvalid{ synchronized( collection ) { check_invalid(); int new_pos = get_pos()-n; if( collection.number_of_elements() > new_pos && new_pos >= 0 ){ set_pos( new_pos ); } else { invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); } set_in_between( false ); return is_valid(); } }; /* ------------------------------------------------------------------------- */ public void set_to_position(int position) throws PositionInvalid{ synchronized( collection ){ if( position <0 || position >= collection.data.size() ){ throw new PositionInvalid(); } set_pos( position ); set_in_between( false ); }; }; /* ------------------------------------------------------------------------- */ public int position() throws IteratorInvalid{ synchronized( collection ){ check_invalid(); return get_pos(); } } /* ------------------------------------------------------------------------- */ public boolean retrieve_element_set_to_previous( AnyHolder element, BooleanHolder more) throws IteratorInvalid,IteratorInBetween{ synchronized( collection ){ check_iterator(); try { element.value = collection.element_retrieve( pos ); } catch ( PositionInvalid e ){ invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); }; more.value = (get_pos() > 0); return set_to_previous_element(); } }; /* ------------------------------------------------------------------------- */ public boolean retrieve_previous_n_elements(int n, AnySequenceHolder result, BooleanHolder more) throws IteratorInvalid,IteratorInBetween{ synchronized( collection ) { check_iterator(); Vector v = new Vector(n); AnyHolder a = new AnyHolder(); for( int i=0; ( i<n || n==0 ) && is_valid(); i++ ){ try { a.value = collection.element_retrieve( get_pos() ); set_pos( get_pos()-1 ); } catch ( PositionInvalid e ){ invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); }; v.addElement( a.value ); a.value = null; } more.value = (get_pos() > 0); if( v.size() > 0 ){ result.value = new Any[ v.size() ]; v.copyInto( (java.lang.Object []) result.value ); return true; } else { return false; } } }; /* ------------------------------------------------------------------------- */ public boolean not_equal_retrieve_element_set_to_previous(org.omg.CosCollection.Iterator test, AnyHolder element) throws IteratorInvalid,IteratorInBetween { synchronized( collection ) { check_iterator(); PositionalIteratorImpl iter = collection.check_iterator( test ); iter.check_iterator(); if( is_equal( test ) ){ retrieve_element( element ); return false; } else { retrieve_element_set_to_previous( element, new org.omg.CORBA.BooleanHolder() ); return true; } } }; /* ------------------------------------------------------------------------- */ public boolean remove_element_set_to_previous() throws IteratorInvalid,IteratorInBetween{ synchronized( collection ) { remove_element(); return set_to_previous_element(); } }; /* ------------------------------------------------------------------------- */ public boolean remove_previous_n_elements(int n, org.omg.CORBA.IntHolder actual_number) throws IteratorInvalid,IteratorInBetween{ synchronized( collection ) { actual_number.value = 0; for( int i = 0; ( i<n || n == 0 ) && is_valid(); i++, actual_number.value++ ){ remove_element_set_to_previous(); } return is_valid(); } }; /* ------------------------------------------------------------------------- */ public boolean not_equal_remove_element_set_to_previous(org.omg.CosCollection.Iterator test) throws IteratorInvalid,IteratorInBetween { synchronized( collection ) { check_iterator(); PositionalIteratorImpl iter = collection.check_iterator( test ); iter.check_iterator(); if( is_equal( test ) ){ remove_element(); return false; } else { remove_element_set_to_previous(); return true; } } }; /* ------------------------------------------------------------------------- */ public boolean replace_element_set_to_previous(org.omg.CORBA.Any element) throws IteratorInvalid,IteratorInBetween,ElementInvalid{ synchronized( collection ) { replace_element( element ); return set_to_previous_element(); } }; /* ------------------------------------------------------------------------- */ public boolean replace_previous_n_elements(org.omg.CORBA.Any[] elements, org.omg.CORBA.IntHolder actual_number) throws IteratorInvalid,IteratorInBetween,ElementInvalid{ synchronized( collection ) { actual_number.value = 0; for( int i=0; i<elements.length && is_valid(); i++,actual_number.value++ ){ replace_element_set_to_previous( elements[i] ); } return is_valid(); } }; /* ------------------------------------------------------------------------- */ public boolean not_equal_replace_element_set_to_previous(org.omg.CosCollection.Iterator test, Any element) throws IteratorInvalid,IteratorInBetween,ElementInvalid{ synchronized( collection ) { check_iterator(); PositionalIteratorImpl iter = collection.check_iterator( test ); iter.check_iterator(); if( is_equal( test ) ){ replace_element( element ); return false; } else { replace_element_set_to_previous( element ); return true; } } }; /* ------------------------------------------------------------------------- */ public boolean is_first(){ return get_pos() == 0; }; /* ------------------------------------------------------------------------- */ public boolean is_last(){ synchronized( collection ){ return collection.data.size()-1 == get_pos(); } }; /* ------------------------------------------------------------------------- */ public boolean is_for_same(org.omg.CosCollection.Iterator test){ synchronized( collection ){ try { collection.check_iterator( test ); return true; } catch ( IteratorInvalid e ){ return false; } } }; /* ------------------------------------------------------------------------- */ public synchronized boolean is_reverse(){ return reverse; }; /* ========================================================================= */ };