package org.jacorb.collection; /* * JacORB collection service * * Copyright (C) 1999-2004 LogicLand group, Viacheslav Tararin. * * 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. */ import java.util.Enumeration; import org.jacorb.collection.util.DynArray; import org.jacorb.collection.util.ObjectInvalid; import org.jacorb.collection.util.SortedVector; import org.omg.CORBA.Any; import org.omg.CORBA.AnyHolder; import org.omg.CosCollection.Command; import org.omg.CosCollection.ElementInvalid; import org.omg.CosCollection.ElementInvalidReason; import org.omg.CosCollection.EmptyCollection; import org.omg.CosCollection.IteratorHelper; import org.omg.CosCollection.IteratorInBetween; import org.omg.CosCollection.IteratorInvalid; import org.omg.CosCollection.IteratorInvalidReason; import org.omg.CosCollection.IteratorPOATie; import org.omg.CosCollection.OperationsOperations; import org.omg.CosCollection.PositionInvalid; import org.omg.PortableServer.POA; import org.omg.PortableServer.Servant; class CollectionImpl { protected DynArray iterators = new DynArray(); protected POA poa; protected OperationsOperations ops; protected IteratorFactory iterator_factory; protected SortedVector data; private Servant srvnt = null; /* ========================================================================= */ CollectionImpl( OperationsOperations ops, POA poa, IteratorFactory iterator_factory ){ this.poa = poa; this.ops = ops; this.iterator_factory = iterator_factory; }; /* ------------------------------------------------------------------------- */ public synchronized org.omg.CORBA.TypeCode element_type() { return ops.element_type(); }; /* ------------------------------------------------------------------------- */ public synchronized boolean add_element(Any element) throws ElementInvalid { element_add( element ); return true; }; /* ------------------------------------------------------------------------- */ public synchronized boolean add_element_set_iterator(Any element, org.omg.CosCollection.Iterator where) throws IteratorInvalid,ElementInvalid { PositionalIteratorImpl i = check_iterator( where ); int pos = element_add( element ); i.set_pos( pos ); i.set_in_between( false ); return true; }; /* ------------------------------------------------------------------------- */ public synchronized void add_all_from(org.omg.CosCollection.Collection collector) throws ElementInvalid { throw new org.omg.CORBA.NO_IMPLEMENT(); }; /* ------------------------------------------------------------------------- */ public synchronized void remove_element_at(org.omg.CosCollection.Iterator where) throws IteratorInvalid,IteratorInBetween { PositionalIteratorImpl i = check_iterator( where ); if( i.is_in_between() ){ throw new IteratorInBetween(); } int pos = i.get_pos(); try { element_remove( pos ); } catch ( PositionInvalid e ){ i.invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); } catch ( EmptyCollection e ){ i.invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); } }; /* ------------------------------------------------------------------------- */ public synchronized int remove_all() { Enumeration enumeration = iterators.elements(); while( enumeration.hasMoreElements() ){ PositionalIteratorImpl i = (PositionalIteratorImpl)enumeration.nextElement(); i.invalidate(); } int count = data.size(); data.removeAllElements(); return count; }; /* ------------------------------------------------------------------------- */ public synchronized void replace_element_at(org.omg.CosCollection.Iterator where, Any element) throws IteratorInvalid,IteratorInBetween,ElementInvalid { PositionalIteratorImpl i = check_iterator( where ); if( i.is_in_between() ){ throw new IteratorInBetween(); } int pos = i.get_pos(); try { element_replace( pos, element ); } catch ( PositionInvalid e ){ i.invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); } }; /* ------------------------------------------------------------------------- */ public synchronized boolean retrieve_element_at(org.omg.CosCollection.Iterator where, AnyHolder element) throws IteratorInvalid,IteratorInBetween { PositionalIteratorImpl i = check_iterator( where ); if( i.is_in_between() ){ throw new IteratorInBetween(); } int pos = i.get_pos(); try{ element.value = element_retrieve( pos ); return true; } catch ( PositionInvalid e ){ i.invalidate(); throw new IteratorInvalid( IteratorInvalidReason.is_invalid ); } }; /* ------------------------------------------------------------------------- */ public synchronized boolean all_elements_do(Command what) { throw new org.omg.CORBA.NO_IMPLEMENT(); }; /* ------------------------------------------------------------------------- */ public synchronized int number_of_elements() { return data.size(); }; /* ------------------------------------------------------------------------- */ public synchronized boolean is_empty() { return data.size() == 0; }; /* ------------------------------------------------------------------------- */ public synchronized void destroy() { Enumeration enumeration = iterators.elements(); while( enumeration.hasMoreElements() ){ PositionalIteratorImpl i = (PositionalIteratorImpl)enumeration.nextElement(); i.destroy(); }; try { byte[] ObjID = poa.servant_to_id( srvnt ); poa.deactivate_object( ObjID ); } catch ( Exception e ) { System.out.println( "Internal error: Can not deactivate object" ); e.printStackTrace( System.out ); throw new org.omg.CORBA.INTERNAL(); } }; /* ------------------------------------------------------------------------- */ public synchronized org.omg.CosCollection.Iterator create_iterator(boolean read_only) { PositionalIteratorImpl iter = iterator_factory.create_iterator( this, read_only ); IteratorPOATie servant = new IteratorPOATie( iter ); try { org.omg.CosCollection.Iterator i = IteratorHelper.narrow( poa.servant_to_reference( servant )); iter.set_servant( servant ); return i; } catch ( Exception e ){ e.printStackTrace( System.out ); throw new org.omg.CORBA.INTERNAL(); } }; /* ========================================================================= */ public synchronized int element_add( Any element ) throws ElementInvalid { check_element( element ); try { int pos = data.addElement( element ); element_inserted( pos ); return pos; } catch ( ObjectInvalid e ){ e.printStackTrace( System.out ); throw new org.omg.CORBA.INTERNAL(); } }; /* ------------------------------------------------------------------------- */ public synchronized void element_remove( int pos ) throws PositionInvalid, EmptyCollection { if( data.size() == 0 ){ throw new EmptyCollection(); } if( pos < 0 || pos >= data.size() ){ throw new PositionInvalid(); } Any old = (Any)data.elementAt( pos ); data.removeElementAt( pos ); element_removed( pos, old ); }; /* ------------------------------------------------------------------------- */ public synchronized int element_replace( int pos, Any element ) throws PositionInvalid, ElementInvalid { if( pos < 0 || pos >= data.size() ){ throw new PositionInvalid(); } check_element( element ); try { Any old = (Any)data.elementAt( pos ); data.setElementAt( element, pos ); element_replaced( pos, old ); } catch ( ObjectInvalid e ) { throw new ElementInvalid( ElementInvalidReason.positioning_property_invalid ); } return pos; }; /* ------------------------------------------------------------------------- */ public synchronized Any element_retrieve( int pos ) throws PositionInvalid { if( pos < 0 || pos >= data.size() ){ throw new PositionInvalid(); } return (Any)data.elementAt( pos ); }; /* ------------------------------------------------------------------------- */ public synchronized PositionalIteratorImpl check_iterator( org.omg.CosCollection.Iterator iter ) throws IteratorInvalid { PositionalIteratorImpl i = null; Enumeration enumeration=iterators.elements(); while( enumeration.hasMoreElements() ){ i=(PositionalIteratorImpl)enumeration.nextElement(); try { if( i.get_servant() == ( poa.reference_to_servant( iter ) ) ){ return (PositionalIteratorImpl)i; } } catch ( Exception e ){ System.out.println( "Internal error: Invalid POA policy or POA internal error" ); e.printStackTrace(); throw new org.omg.CORBA.INTERNAL(); } } throw new IteratorInvalid( IteratorInvalidReason.is_not_for_collection ); }; /* ------------------------------------------------------------------------- */ public synchronized boolean is_this_you( org.omg.CosCollection.Collection col ) { try { return srvnt == poa.reference_to_servant( col ); } catch ( Exception e ){ System.out.println("InternalError: Can not test Object equality"); e.printStackTrace( System.out ); throw new org.omg.CORBA.INTERNAL(); } }; /* ------------------------------------------------------------------------- */ public synchronized void destroy_me( PositionalIteratorImpl i ) { if( iterators.removeElement( i ) ){ try { byte [] ObjID = poa.servant_to_id( i.get_servant() ); poa.deactivate_object( ObjID ); } catch ( Exception e ){ System.out.println("Internal error: Attempt destroy not my Iterator"); e.printStackTrace( System.out ); throw new org.omg.CORBA.INTERNAL(); } } else { System.out.println("Internal error: Attempt destroy not my Iterator"); throw new org.omg.CORBA.INTERNAL(); }; }; /* ------------------------------------------------------------------------- */ public void check_element( Any element ) throws ElementInvalid { if( !ops.check_element_type(element) ){ throw new ElementInvalid( ElementInvalidReason.element_type_invalid ); } }; /* ========================================================================= */ synchronized void set_servant( Servant srvnt ){ this.srvnt = srvnt; }; /* ------------------------------------------------------------------------- */ protected void element_inserted( int pos ) { Enumeration enumeration = iterators.elements(); while( enumeration.hasMoreElements() ){ PositionalIteratorImpl i = (PositionalIteratorImpl)enumeration.nextElement(); if( i.is_valid() ){ int p = i.get_pos(); if( p >= pos ) { i.set_pos( pos+1 ); }; }; } }; /* ------------------------------------------------------------------------- */ protected void element_removed( int pos, Any old ){ Enumeration enumeration = iterators.elements(); while( enumeration.hasMoreElements() ){ PositionalIteratorImpl i = (PositionalIteratorImpl)enumeration.nextElement(); if( i.is_valid() ){ int p = i.get_pos(); if( p == pos ){ i.set_in_between( true ); } else if ( p > pos ){ i.set_pos( p-1 ); } } } }; /* ------------------------------------------------------------------------- */ protected void element_replaced( int pos, Any old ){ }; };