252 lines
8.1 KiB
Java
252 lines
8.1 KiB
Java
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF 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
|
|
*
|
|
* 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.apache.catalina.manager;
|
|
|
|
import java.text.DateFormat;
|
|
import java.text.NumberFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
import java.util.Locale;
|
|
|
|
import org.apache.catalina.Session;
|
|
import org.apache.catalina.manager.util.SessionUtils;
|
|
|
|
|
|
/**
|
|
* Helper JavaBean for JSPs, because JSTL 1.1/EL 2.0 is too dumb to
|
|
* to what I need (call methods with parameters), or I am too dumb to use it correctly. :)
|
|
* @author Cédrik LIME
|
|
*/
|
|
public class JspHelper {
|
|
|
|
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
|
|
|
/**
|
|
* Public constructor, so that this class can be considered a JavaBean
|
|
*/
|
|
private JspHelper() {
|
|
super();
|
|
}
|
|
|
|
/**
|
|
* Try to get user locale from the session, if possible.
|
|
* IMPLEMENTATION NOTE: this method has explicit support for Tapestry 3 and
|
|
* Struts 1.x
|
|
*
|
|
* @param in_session Session from which the locale should be guessed
|
|
*
|
|
* @return String
|
|
*/
|
|
public static String guessDisplayLocaleFromSession(Session in_session) {
|
|
return localeToString(SessionUtils.guessLocaleFromSession(in_session));
|
|
}
|
|
private static String localeToString(Locale locale) {
|
|
if (locale != null) {
|
|
return escapeXml(locale.toString());//locale.getDisplayName();
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Try to get user name from the session, if possible.
|
|
* @param in_session The Servlet session
|
|
* @return the user name
|
|
*/
|
|
public static String guessDisplayUserFromSession(Session in_session) {
|
|
Object user = SessionUtils.guessUserFromSession(in_session);
|
|
return escapeXml(user);
|
|
}
|
|
|
|
|
|
public static String getDisplayCreationTimeForSession(Session in_session) {
|
|
try {
|
|
if (in_session.getCreationTime() == 0) {
|
|
return "";
|
|
}
|
|
DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT);
|
|
return formatter.format(new Date(in_session.getCreationTime()));
|
|
} catch (IllegalStateException ise) {
|
|
//ignore: invalidated session
|
|
return "";
|
|
}
|
|
}
|
|
|
|
public static String getDisplayLastAccessedTimeForSession(Session in_session) {
|
|
try {
|
|
if (in_session.getLastAccessedTime() == 0) {
|
|
return "";
|
|
}
|
|
DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT);
|
|
return formatter.format(new Date(in_session.getLastAccessedTime()));
|
|
} catch (IllegalStateException ise) {
|
|
//ignore: invalidated session
|
|
return "";
|
|
}
|
|
}
|
|
|
|
public static String getDisplayUsedTimeForSession(Session in_session) {
|
|
try {
|
|
if (in_session.getCreationTime() == 0) {
|
|
return "";
|
|
}
|
|
} catch (IllegalStateException ise) {
|
|
//ignore: invalidated session
|
|
return "";
|
|
}
|
|
return secondsToTimeString(SessionUtils.getUsedTimeForSession(in_session)/1000);
|
|
}
|
|
|
|
public static String getDisplayTTLForSession(Session in_session) {
|
|
try {
|
|
if (in_session.getCreationTime() == 0) {
|
|
return "";
|
|
}
|
|
} catch (IllegalStateException ise) {
|
|
//ignore: invalidated session
|
|
return "";
|
|
}
|
|
return secondsToTimeString(SessionUtils.getTTLForSession(in_session)/1000);
|
|
}
|
|
|
|
public static String getDisplayInactiveTimeForSession(Session in_session) {
|
|
try {
|
|
if (in_session.getCreationTime() == 0) {
|
|
return "";
|
|
}
|
|
} catch (IllegalStateException ise) {
|
|
//ignore: invalidated session
|
|
return "";
|
|
}
|
|
return secondsToTimeString(SessionUtils.getInactiveTimeForSession(in_session)/1000);
|
|
}
|
|
|
|
public static String secondsToTimeString(long in_seconds) {
|
|
StringBuilder buff = new StringBuilder(9);
|
|
if (in_seconds < 0) {
|
|
buff.append('-');
|
|
in_seconds = -in_seconds;
|
|
}
|
|
long rest = in_seconds;
|
|
long hour = rest / 3600;
|
|
rest = rest % 3600;
|
|
long minute = rest / 60;
|
|
rest = rest % 60;
|
|
long second = rest;
|
|
if (hour < 10) {
|
|
buff.append('0');
|
|
}
|
|
buff.append(hour);
|
|
buff.append(':');
|
|
if (minute < 10) {
|
|
buff.append('0');
|
|
}
|
|
buff.append(minute);
|
|
buff.append(':');
|
|
if (second < 10) {
|
|
buff.append('0');
|
|
}
|
|
buff.append(second);
|
|
return buff.toString();
|
|
}
|
|
|
|
|
|
/*
|
|
* Following copied from org.apache.taglibs.standard.tag.common.core.Util v1.1.2
|
|
*/
|
|
|
|
private static final int HIGHEST_SPECIAL = '>';
|
|
private static final char[][] specialCharactersRepresentation =
|
|
new char[HIGHEST_SPECIAL + 1][];
|
|
static {
|
|
specialCharactersRepresentation['&'] = "&".toCharArray();
|
|
specialCharactersRepresentation['<'] = "<".toCharArray();
|
|
specialCharactersRepresentation['>'] = ">".toCharArray();
|
|
specialCharactersRepresentation['"'] = """.toCharArray();
|
|
specialCharactersRepresentation['\''] = "'".toCharArray();
|
|
}
|
|
|
|
public static String escapeXml(Object obj) {
|
|
String value = null;
|
|
try {
|
|
value = (obj == null) ? null : obj.toString();
|
|
} catch (Exception e) {
|
|
// Ignore
|
|
}
|
|
return escapeXml(value);
|
|
}
|
|
|
|
/**
|
|
* Performs the following substring replacements
|
|
* (to facilitate output to XML/HTML pages):
|
|
*
|
|
* & -> &amp;
|
|
* < -> &lt;
|
|
* > -> &gt;
|
|
* " -> &#034;
|
|
* ' -> &#039;
|
|
*
|
|
* See also OutSupport.writeEscapedXml().
|
|
* @param buffer The XML to escape
|
|
* @return the escaped XML
|
|
*/
|
|
@SuppressWarnings("null") // escapedBuffer cannot be null
|
|
public static String escapeXml(String buffer) {
|
|
if (buffer == null) {
|
|
return "";
|
|
}
|
|
int start = 0;
|
|
int length = buffer.length();
|
|
char[] arrayBuffer = buffer.toCharArray();
|
|
StringBuilder escapedBuffer = null;
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
char c = arrayBuffer[i];
|
|
if (c <= HIGHEST_SPECIAL) {
|
|
char[] escaped = specialCharactersRepresentation[c];
|
|
if (escaped != null) {
|
|
// create StringBuilder to hold escaped xml string
|
|
if (start == 0) {
|
|
escapedBuffer = new StringBuilder(length + 5);
|
|
}
|
|
// add unescaped portion
|
|
if (start < i) {
|
|
escapedBuffer.append(arrayBuffer,start,i-start);
|
|
}
|
|
start = i + 1;
|
|
// add escaped xml
|
|
escapedBuffer.append(escaped);
|
|
}
|
|
}
|
|
}
|
|
// no xml escaping was necessary
|
|
if (start == 0) {
|
|
return buffer;
|
|
}
|
|
// add rest of unescaped portion
|
|
if (start < length) {
|
|
escapedBuffer.append(arrayBuffer,start,length-start);
|
|
}
|
|
return escapedBuffer.toString();
|
|
}
|
|
|
|
public static String formatNumber(long number) {
|
|
return NumberFormat.getNumberInstance().format(number);
|
|
}
|
|
}
|