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