HomeDigital EditionSys-Con RadioSearch Web Services Cd
B2B Beginning WS Business Process Management Case Studies Content Management Distributing Computing e-Business Electronic Data Interchange Enterprise Industry Insight Integration Interviews Java & Web Services .NET Portal Product Reviews Scalability & Performance Security SOAP Source Code UDDI Wireless WS Standards WS Tips & Techniques WSDL WS Editorials XML

Web Services Infrastructure PART II, by Jim Webber
WSJ Vol 02 Issue 11 - pg.49

	


Listing 1

public interface Participant
{
     public Vote prepare (Uid id, Qualifier[] qualifiers)
         throws GeneralException, InvalidInferiorException,
             WrongStateException, HeuristicHazardException,
             HeuristicMixedException;


     public void confirm (Uid id, Qualifier[] qualifiers)
         throws GeneralException, InvalidInferiorException,
             WrongStateException, HeuristicHazardException,
             HeuristicMixedException, InferiorCancelledException;


     public void cancel (Uid id, Qualifier[] qualifiers)
         throws GeneralException, InvalidInferiorException,
         WrongStateException, HeuristicHazardException,
         HeuristicMixedException, InferiorConfirmedException;


     public void contradiction (Uid id, Qualifier[] qualifiers)
         throws GeneralException, InvalidInferiorException,
             WrongStateException;

     // Other methods...
}


Listing 2

// obtain a UserTransaction object (assume the factory is
// initialized)

UserTransaction userTransaction =
   UserTransactionFactory.getTransaction();

// Obtain references to the web services we are going to use:
RestaurantService restaurant = new RestaurantService();
TaxiService  taxi = new TaxiService();
TheatreService = new TheatreService():

// In a cohesion, we have to make an application-level mapping //of 
services to participants (outside of BTP scope). Our example // 
services support this.
String restaurantParticipantID = restaurant.getParticipantID();
String theatreParticipantID = theatre.getParticipantID();
String taxiParticipantID = taxi.getParticipantID();

// Start a new transaction, using a Cohesion
userTransaction.begin(com.hp.mw.xts.TxTypes.COHESION);

// Now invoke the business logic
restaurant.bookSeats(3);
theatre.bookSeats(3, 2);
taxi.bookTaxi();

// Prepare (all of) the participants (i.e. with null parameter)
StatusItem[] statusItems = userTransaction.prepare_inferiors(null);

// Iterate over the statuses, and make sure the taxi's pledged to 
honour the booking
boolean restuarantOK = false;
boolean taxiOK = false;
boolean theatreOK = false;
for(int i = 0; i < statusItems.length; i++)
{
     if(statusItems[i].inferiorName().equals(restaurantParticipantID))
     {
         if(statusItems[i].status() == TwoPhaseStatus.PREPARED)
         {
             restaurantOK = true;
         }
     }

     else if(statusItems[i].inferiorName().equals(taxiParticipantID))
     {
         if(statusItems[i].status() == TwoPhaseStatus.PREPARED)
         {
             taxiOK = true;
         }
     }

     else if(statusItems[i].inferiorName().equals(theatreParticipantID))
     {
         if(statusItems[i].status() == TwoPhaseStatus.PREPARED)
         {
             theatreOK = true;
         }
     }
}

// If we can't get a taxi, then we have to call the whole // // event off.
if(!taxiOK)
{
     ut.cancel(null); // Cancel everything
}
else if(restaurantOK || theatreOK)
{
     ut.confirm(); // Confirm whatever is available
}
else
{
     ut.cancel(null); // Can't get anywhere to go, cancel everything.
}