001package org.javasimon.javaee.reqreporter;
002
003import java.util.List;
004
005import javax.servlet.http.HttpServletRequest;
006
007import org.javasimon.Split;
008import org.javasimon.javaee.SimonServletFilter;
009import org.javasimon.utils.SimonUtils;
010
011/**
012 * Reports the request with split lenght and list of all splits.
013 * Report is sent through {@link org.javasimon.Manager#message(String)}. Following aspects of the class can be overridden:
014 * <ul>
015 * <li>Where the report goes - override {@link #reportMessage(String)},</li>
016 * <li>whether split should be included - override {@link #shouldBeAddedSplit(org.javasimon.Split)}.</li>
017 * </ul>
018 *
019 * @author <a href="mailto:virgo47@gmail.com">Richard "Virgo" Richter</a>
020 */
021@SuppressWarnings("UnusedDeclaration")
022public class PlainRequestReporter implements RequestReporter {
023        private SimonServletFilter simonServletFilter;
024
025        public PlainRequestReporter() {
026        }
027
028        @Override
029        public void reportRequest(HttpServletRequest request, Split requestSplit, List<Split> splits) {
030                StringBuilder messageBuilder = new StringBuilder(
031                        "Web request is too long (" + SimonUtils.presentNanoTime(requestSplit.runningFor()) +
032                                ") [" + requestSplit.getStopwatch().getNote() + "]");
033
034                for (Split split : splits) {
035                        if (shouldBeAddedSplit(split)) {
036                                messageBuilder.append("\n\t").append(split.getStopwatch().getName()).append(": ").
037                                        append(SimonUtils.presentNanoTime(split.runningFor()));
038                        }
039                }
040
041                reportMessage(messageBuilder.toString());
042        }
043
044        /**
045         * Reports the prepared message through the method {@link org.javasimon.Manager#message(String)} - can be overridden
046         * to emit the message to log/console/etc.
047         *
048         * @param message prepared message with report
049         */
050        protected void reportMessage(String message) {
051                simonServletFilter.getManager().message(message);
052        }
053
054        /**
055         * Decides whether split should be included in the report - by default all are included.
056         *
057         * @param split tested Split
058         * @return true, if the split should be reported in the list
059         */
060        @SuppressWarnings("UnusedParameters")
061        protected boolean shouldBeAddedSplit(Split split) {
062                return true;
063        }
064
065        @Override
066        public void setSimonServletFilter(SimonServletFilter simonServletFilter) {
067                this.simonServletFilter = simonServletFilter;
068        }
069}