001    /*
002     * Copyright 1999-2002,2004 The Apache Software Foundation.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.commons.latka;
017    
018    import org.apache.commons.latka.event.LatkaEventInfo;
019    import org.apache.commons.latka.event.LatkaEventListener;
020    import org.apache.commons.latka.event.ReportMessageEvent;
021    import org.apache.commons.latka.event.RequestEvent;
022    import org.apache.commons.latka.event.SuiteEvent;
023    import org.apache.commons.latka.http.Request;
024    import org.apache.commons.latka.http.Session;
025    
026    import java.util.HashMap;
027    import java.util.LinkedList;
028    import java.util.List;
029    import java.util.Map;
030    
031    import org.apache.log4j.Category;
032    
033    /**
034     * The base class for several 'reporters'.
035     *
036     * A reporter is a class that will store or record information about events that
037     * occur during Latka processing
038     *
039     * @author Rodney Waldhoff
040     * @author Morgan Delagrange
041     * @version $Revision: 155424 $
042     */
043    public class DefaultLatkaEventInfo implements LatkaEventInfo {
044    
045        /**
046         * maps the request to it's success or failure as a Boolean
047         */
048        protected Map _requestSucceeded = new HashMap();
049    
050        /**
051         * maps the session to it's success or failure as a Boolean
052         */
053        protected Map _sessionSucceeded = new HashMap();
054    
055        /**
056         * Holds whether or not the entire suite has succeeded
057         * This is set to false when <strong>any</strong> request fails.
058         */
059        protected boolean _suiteSucceeded = true;
060    
061        /**
062         * Holds the failed responses received by this object.
063         * @see #requestFailed(RequestEvent)
064         */
065        protected List _failedResponses = new LinkedList();
066    
067        protected LatkaEventListener _listener = null;
068    
069        /**
070         * The log4J category used for processing log requests.
071         */
072        protected static final Category _log =
073                                    Category.getInstance(DefaultLatkaEventInfo.class);
074    
075        public DefaultLatkaEventInfo(LatkaEventListener listener) {
076            _listener = listener;
077        }
078    
079        /**
080         * Invoked if the request succeeds.
081         * Records the success
082         *
083         * @param event  a successful request event
084         */
085        public void requestSucceeded(RequestEvent event) {
086            recordSuccess(event, true);
087            _listener.requestSucceeded(event);
088        }
089    
090        /**
091         * Invoked if the request failed.
092         * Records the failure and adds the request's response to the list of
093         * failed responses
094         *
095         * @param event  a "failed" request event.
096         */
097        public void requestFailed(RequestEvent event) {
098            recordSuccess(event, false);
099            _failedResponses.add(event.getResponse());
100            _listener.requestFailed(event);
101        }
102    
103        /**
104         * A skipped request.
105         * Records the skip as a failure
106         *
107         * @param event  a "skipped" request.
108         */
109        public void requestSkipped(RequestEvent event) {
110            recordSuccess(event, false);
111            _listener.requestSkipped(event);
112        }
113    
114        /**
115         * Invoked if a request error occurs.
116         * Records the error as a failure
117         *
118         * @param event  a request "error" event.
119         */
120        public void requestError(RequestEvent event) {
121            recordSuccess(event, false);
122            _listener.requestError(event);
123        }
124    
125        /**
126         * Invoked if a Latka suite wants to send a message to the 
127         * report generated for the test.  Some implementations
128         * of the LatkaEventListener may not generate reports.
129         * 
130         * @param event  Event containing the report message
131         */
132        public void reportMessage(ReportMessageEvent event) {
133            _listener.reportMessage(event);
134        }
135    
136        /**
137         * Invoke when all requests completed.
138         *
139         * @param event suite event
140         */
141        public void suiteCompleted(SuiteEvent event) {
142            _listener.suiteCompleted(event);
143        }
144    
145        /**
146         * Record the "success status" of a request event.
147         * On a failed request, the current suite, request and session are
148         * marked as failed
149         *
150         * @param event  a request event.
151         * @param bool   the success (<code>true</code>) or failure
152         * (<code>false</code>) of the request.
153         */
154        protected void recordSuccess (RequestEvent event, boolean bool) {
155            if (bool == false) {
156                _suiteSucceeded = false;
157                _requestSucceeded.put(event.getRequest(), new Boolean(bool));
158                _sessionSucceeded.put(event.getSession(), new Boolean(bool));
159                _log.info("request failed");
160            }
161        }
162    
163        /**
164         * Check to see if a particular Request succeeded or failed.
165         *
166         * @param request the request to check for success or
167         * failure
168         * @return true if request succeeded
169         */
170        public boolean didRequestSucceed(Request request) {
171            Boolean bool = (Boolean) _requestSucceeded.get(request);
172    
173            if (bool == null || bool.booleanValue() == true) {
174                return true;
175            } else {
176                return false;
177            }
178    
179        }
180    
181        /**
182         * Check to see if a particular Session succeeded or failed.
183         * Once a request inside a session fails, the session itself
184         * is marked as a failure.
185         *
186         * @param session the session to check for success or
187         * failure
188         * @return true if all requests in the session succeeded
189         */
190        public boolean didSessionSucceed(Session session) {
191            Boolean bool = (Boolean) _sessionSucceeded.get(session);
192    
193            if (bool == null || bool.booleanValue() == true) {
194                return true;
195            } else {
196                return false;
197            }
198        }
199    
200        /**
201         * Returns true if all Requests in the suite succeed.
202         *
203         * @return true if all Requests have succeeded
204         */
205        public boolean didSuiteSucceed() {
206            return _suiteSucceeded;
207        }
208    
209        /**
210         * List failed responses
211         * @return a list of all responses of failed requests
212         */
213        public List getFailedResponses() {
214            return _failedResponses;
215        }
216    }