/*
* 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);
}
}