/* * Licensed to Jasig under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Jasig licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a * copy of the License at the following location: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jasig.cas.web; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.LinkedList; import java.util.Queue; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.Ticket; import org.jasig.cas.ticket.registry.TicketRegistry; import org.perf4j.log4j.GraphingStatisticsAppender; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author Scott Battaglia * @since 3.3.5 */ public final class StatisticsController extends AbstractController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final int NUMBER_OF_MILLISECONDS_IN_A_DAY = 86400000; private static final int NUMBER_OF_MILLISECONDS_IN_AN_HOUR = 3600000; private static final int NUMBER_OF_MILLISECONDS_IN_A_MINUTE = 60000; private static final int NUMBER_OF_MILLISECONDS_IN_A_SECOND = 1000; private final TicketRegistry ticketRegistry; private final Date upTimeStartDate = new Date(); private String casTicketSuffix; public StatisticsController(final TicketRegistry ticketRegistry) { this.ticketRegistry = ticketRegistry; } public void setCasTicketSuffix(final String casTicketSuffix) { this.casTicketSuffix = casTicketSuffix; } @Override protected ModelAndView handleRequestInternal(final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse) throws Exception { final ModelAndView modelAndView = new ModelAndView("viewStatisticsView"); modelAndView.addObject("startTime", this.upTimeStartDate); final double difference = System.currentTimeMillis() - this.upTimeStartDate.getTime(); modelAndView.addObject("upTime", calculateUptime(difference, new LinkedList<Integer>( Arrays.asList(NUMBER_OF_MILLISECONDS_IN_A_DAY, NUMBER_OF_MILLISECONDS_IN_AN_HOUR, NUMBER_OF_MILLISECONDS_IN_A_MINUTE, NUMBER_OF_MILLISECONDS_IN_A_SECOND, 1)), new LinkedList<String>(Arrays.asList("day", "hour", "minute", "second", "millisecond")))); modelAndView.addObject("totalMemory", Runtime.getRuntime().totalMemory() / 1024 / 1024); modelAndView.addObject("maxMemory", Runtime.getRuntime().maxMemory() / 1024 / 1024); modelAndView.addObject("freeMemory", Runtime.getRuntime().freeMemory() / 1024 / 1024); modelAndView.addObject("availableProcessors", Runtime.getRuntime().availableProcessors()); modelAndView.addObject("serverHostName", httpServletRequest.getServerName()); modelAndView.addObject("serverIpAddress", httpServletRequest.getLocalAddr()); modelAndView.addObject("casTicketSuffix", this.casTicketSuffix); int unexpiredTgts = 0; int unexpiredSts = 0; int expiredTgts = 0; int expiredSts = 0; try { final Collection<Ticket> tickets = this.ticketRegistry.getTickets(); for (final Ticket ticket : tickets) { if (ticket instanceof ServiceTicket) { if (ticket.isExpired()) { expiredSts++; } else { unexpiredSts++; } } else { if (ticket.isExpired()) { expiredTgts++; } else { unexpiredTgts++; } } } } catch (final UnsupportedOperationException e) { logger.trace("The ticket registry doesn't support this information."); } final Collection<GraphingStatisticsAppender> appenders = GraphingStatisticsAppender.getAllGraphingStatisticsAppenders(); modelAndView.addObject("unexpiredTgts", unexpiredTgts); modelAndView.addObject("unexpiredSts", unexpiredSts); modelAndView.addObject("expiredTgts", expiredTgts); modelAndView.addObject("expiredSts", expiredSts); modelAndView.addObject("pageTitle", modelAndView.getViewName()); modelAndView.addObject("graphingStatisticAppenders", appenders); return modelAndView; } protected String calculateUptime(final double difference, final Queue<Integer> calculations, final Queue<String> labels) { if (calculations.isEmpty()) { return ""; } final int value = calculations.remove(); final double time = Math.floor(difference / value); final double newDifference = difference - time * value; final String currentLabel = labels.remove(); final String label = time == 0 || time > 1 ? currentLabel + "s" : currentLabel; return Integer.toString(new Double(time).intValue()) + " "+ label + " " + calculateUptime(newDifference, calculations, labels); } }