001    package com.mockrunner.connector;
002    
003    import javax.resource.ResourceException;
004    import javax.resource.cci.InteractionSpec;
005    import javax.resource.cci.Record;
006    
007    /**
008     * This interaction implementor can be used to simulate failures. By default
009     * it simply accepts every request and throws a <code>ResourceException</code>
010     * for all <code>execute</code> calls. It can be disabled and it can be configured
011     * to return <code>false</code> for {@link #execute(InteractionSpec, Record, Record)}
012     * and <code>null</code> for {@link #execute(InteractionSpec, Record)} instead of
013     * throwing an exception.
014     */
015    public class GenericFailureInteraction implements InteractionImplementor
016    {
017        private boolean enabled;
018        private boolean throwException;
019        private ResourceException exception;
020        
021        /**
022         * Sets the default values, i.e. throwing a <code>ResourceException</code>.
023         */
024        public GenericFailureInteraction()
025        {
026            this(true);
027        }
028        
029        /**
030         * Sets if failure values should be returned instead of throwing a
031         * <code>ResourceException</code>.
032         * @param throwException <code>true</code> thrown an exception,
033         *                       <code>false</code> return failure values for <code>execute</code>
034         */
035        public GenericFailureInteraction(boolean throwException)
036        {
037            this(throwException, new ResourceException("Simulated test exception"));
038        }
039        
040        /**
041         * Sets if failure values should be returned instead of throwing a
042         * <code>ResourceException</code> and allows to set the exception
043         * that will be thrown if exceptions are enabled.
044         * @param throwException <code>true</code> thrown an exception,
045         *                       <code>false</code> return failure values for <code>execute</code>
046         * @param exception the exception to be thrown
047         */
048        public GenericFailureInteraction(boolean throwException, ResourceException exception)
049        {
050            this.enabled = true;
051            this.throwException = throwException;
052            this.exception = exception;
053        }
054    
055        /**
056         * Enables this implementor. {@link #canHandle(InteractionSpec, Record, Record)}
057         * returns <code>true</code>, if this implementor is enabled.
058         */
059        public void enable()
060        {
061            this.enabled = true;
062        }
063        
064        /**
065         * Disables this implementor. {@link #canHandle(InteractionSpec, Record, Record)}
066         * returns <code>false</code>, if this implementor is disabled.
067         */
068        public void disable()
069        {
070            this.enabled = false;
071        }
072        
073        /**
074         * Sets if failure values should be returned instead of throwing a
075         * <code>ResourceException</code>.
076         * @param throwException <code>true</code> thrown an exception,
077         *                       <code>false</code> return failure values for <code>execute</code>
078         */
079        public void setThrowException(boolean throwException)
080        {
081            this.throwException = throwException;
082        }
083        
084        /**
085         * Sets the exception that will be thrown if exceptions are enabled.
086         * @param exception the exception to be thrown
087         */
088        public void setException(ResourceException exception)
089        {
090            this.exception = exception;
091        }
092        
093        /**
094         * Returns <code>true</code> if this implementor is enabled and
095         * <code>false</code> otherwise.
096         */
097        public boolean canHandle(InteractionSpec interactionSpec, Record actualRequest, Record actualResponse)
098        {
099            return enabled;
100        }
101    
102        /**
103         * Throws a <code>ResourceException</code> or returns <code>false</code>.
104         * You can use {@link #setThrowException(boolean)} to configure this
105         * behaviour.
106         */
107        public boolean execute(InteractionSpec interactionSpec, Record actualRequest, Record actualResponse) throws ResourceException
108        {
109            if(throwException)
110            {
111                throw exception;
112            }
113            return false;
114        }
115    
116        /**
117         * Throws a <code>ResourceException</code> or returns <code>null</code>.
118         * You can use {@link #setThrowException(boolean)} to configure this
119         * behaviour.
120         */
121        public Record execute(InteractionSpec interactionSpec, Record actualRequest) throws ResourceException
122        {
123            if(throwException)
124            {
125                throw exception;
126            }
127            return null;
128        }
129    }