001 package com.mockrunner.connector; 002 003 import java.util.Iterator; 004 import java.util.Vector; 005 006 import javax.resource.ResourceException; 007 import javax.resource.cci.InteractionSpec; 008 import javax.resource.cci.Record; 009 010 /** 011 * This class can be used to add implementations of {@link InteractionImplementor}. 012 * The {@link com.mockrunner.mock.connector.cci.MockInteraction} delegates the 013 * <code>execute</code> calls to this class to find a suitable 014 * {@link InteractionImplementor} that can handle the request. 015 * The <code>execute</code> method of the first {@link InteractionImplementor} 016 * that returns <code>true</code> for {@link InteractionImplementor#canHandle} will 017 * be called. 018 */ 019 public class InteractionHandler 020 { 021 private Vector implementors = null; 022 023 public InteractionHandler() 024 { 025 implementors = new Vector(); 026 } 027 028 /** 029 * Add an implementation of {@link InteractionImplementor}, e.g. 030 * {@link StreamableRecordByteArrayInteraction} or {@link WSIFInteraction}. 031 * You can add more than one {@link InteractionImplementor}, the first 032 * one that can handle the request will be called. 033 * @param implementor the {@link InteractionImplementor} 034 */ 035 public void addImplementor(InteractionImplementor implementor) 036 { 037 implementors.add(implementor); 038 } 039 040 /** 041 * Clears the list of current {@link InteractionImplementor} objects. 042 */ 043 public void clearImplementors() 044 { 045 implementors.clear(); 046 } 047 048 /** 049 * Delegator for {@link com.mockrunner.mock.connector.cci.MockInteraction}. 050 * Dispatches the call to the {@link InteractionImplementor} that 051 * returns <code>true</code> for {@link InteractionImplementor#canHandle}. 052 */ 053 public Record execute(InteractionSpec is, Record request) throws ResourceException 054 { 055 Iterator iter = implementors.iterator(); 056 while (iter.hasNext()) 057 { 058 InteractionImplementor ii = (InteractionImplementor) iter.next(); 059 if (ii.canHandle(is, request, null)) 060 { 061 return ii.execute(is, request); 062 } 063 } 064 return null; 065 } 066 067 /** 068 * Delegator for {@link com.mockrunner.mock.connector.cci.MockInteraction}. 069 * Dispatches the call to the {@link InteractionImplementor} that 070 * returns <code>true</code> for {@link InteractionImplementor#canHandle}. 071 */ 072 public boolean execute(InteractionSpec is, Record request, Record response) throws ResourceException 073 { 074 Iterator iter = implementors.iterator(); 075 while (iter.hasNext()) 076 { 077 InteractionImplementor ii = (InteractionImplementor) iter.next(); 078 if (ii.canHandle(is, request, response)) 079 { 080 return ii.execute(is, request, response); 081 } 082 } 083 // do I need to throw here? 084 return false; 085 } 086 }