package org.jacorb.concurrency;
/*
* JacORB concurrency control service - a free CCS for JacORB
*
* 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 java.util.Hashtable;
import org.omg.CosConcurrencyControl.LockSet;
import org.omg.CosConcurrencyControl.LockSetFactoryPOA;
import org.omg.CosConcurrencyControl.TransactionalLockSet;
import org.omg.CosConcurrencyControl.TransactionalLockSetHelper;
import org.omg.CosTransactions.Coordinator;
import org.omg.CosTransactions.Resource;
import org.omg.CosTransactions.ResourceHelper;
import org.omg.PortableServer.POA;
public class LockSetFactoryImpl extends LockSetFactoryPOA {
public static final int REQUEST = 1;
public static final int SATISFIED = 2;
public static final int COMMIT = 3;
public static final int ROLLBACK = 4;
public static final int NO_TRANS = 5;
public static final int REJECT = 6;
/* -------------------------------------------------------------------------- */
private Hashtable coordinators = new Hashtable();
private POA poa;
/* -------------------------------------------------------------------------- */
public LockSetFactoryImpl( POA poa ){
this.poa = poa;
};
/* -------------------------------------------------------------------------- */
public LockSet create(){
throw new org.omg.CORBA.NO_IMPLEMENT();
};
/* -------------------------------------------------------------------------- */
public LockSet create_related(LockSet which){
throw new org.omg.CORBA.NO_IMPLEMENT();
};
/* -------------------------------------------------------------------------- */
public TransactionalLockSet create_transactional(){
TransactionalLockSetImpl ls = new TransactionalLockSetImpl( this );
try {
return TransactionalLockSetHelper.narrow( poa.servant_to_reference( ls ) );
} catch ( Exception e ){
e.printStackTrace( System.out );
throw new org.omg.CORBA.INTERNAL();
}
};
/* -------------------------------------------------------------------------- */
public TransactionalLockSet create_transactional_related(TransactionalLockSet which){
TransactionalLockSetImpl ls = new TransactionalLockSetImpl( this );
ls.add_related( which );
try {
return TransactionalLockSetHelper.narrow( poa.servant_to_reference( ls ) );
} catch ( Exception e ){
e.printStackTrace( System.out );
throw new org.omg.CORBA.INTERNAL();
}
};
/* -------------------------------------------------------------------------- */
synchronized TransactionCoordinator get_transaction_coordinator( Coordinator current )
{
if( coordinators.containsKey( current.get_transaction_name() ) )
{
return (TransactionCoordinator)coordinators.get( current.get_transaction_name() );
}
TransactionCoordinator coordinator = new TransactionCoordinator( this, current, poa );
try
{
Resource res = ResourceHelper.narrow( poa.servant_to_reference( coordinator ) );
current.register_resource( res );
}
catch ( Exception e )
{
e.printStackTrace( System.out );
}
coordinators.put( current.get_transaction_name(), coordinator );
return coordinator;
};
/* -------------------------------------------------------------------------- */
synchronized void remove_me( TransactionCoordinator i_am ){
coordinators.remove( i_am.get_coordinator() );
try {
byte [] ObjId = poa.servant_to_id( i_am );
poa.deactivate_object( ObjId );
} catch ( Exception e ){
e.printStackTrace( System.out );
throw new org.omg.CORBA.INTERNAL();
}
}
/* -------------------------------------------------------------------------- */
synchronized void remove_me( TransactionalLockSetImpl i_am ){
Enumeration enumeration = coordinators.elements();
while( enumeration.hasMoreElements() ){
TransactionCoordinator tc = (TransactionCoordinator)enumeration.nextElement();
tc.remove_coordinator( i_am );
}
try {
byte [] ObjId = poa.servant_to_id( i_am );
poa.deactivate_object( ObjId );
} catch ( Exception e ){
e.printStackTrace( System.out );
throw new org.omg.CORBA.INTERNAL();
}
};
};