package com.idega.event;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import com.idega.core.business.DefaultSpringBean;
import com.idega.servlet.filter.RequestResponseProvider;
import com.idega.util.CoreConstants;
import com.idega.util.ListUtil;
import com.idega.util.expression.ELUtil;
@Service
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class IWHttpSessionsManager extends DefaultSpringBean {
@Autowired
private ApplicationContext context;
private Map<String, HttpSession> sessions;
private IWHttpSessionsManager() {
sessions = new ConcurrentHashMap<String, HttpSession>();
}
private boolean isManagementOfSessionsTurnedOn() {
return getApplication().getSettings().getBoolean("manage_http_sessions", Boolean.TRUE);
}
void addSession(HttpSession session) {
if (!isManagementOfSessionsTurnedOn()) {
return;
}
String id = session.getId();
sessions.put(id, session);
if (getApplication().getSettings().getBoolean("log_session_creation", Boolean.FALSE)) {
String uri = "unknown";
try {
RequestResponseProvider requestProvider = ELUtil.getInstance().getBean(RequestResponseProvider.class);
uri = requestProvider.getRequest().getRequestURI();
} catch (Exception e) {}
getLogger().info("********************************* HttpSession '" + id + "' created for request: " + uri);
}
}
void removeSession(String id) {
if (!isManagementOfSessionsTurnedOn()) {
return;
}
HttpSession session = sessions.remove(id);
long lastAccessedTime = session == null ? 0 : session.getLastAccessedTime();
int maxInactiveInterval = session == null ? 0 : session.getMaxInactiveInterval();
getContext().publishEvent(new HttpSessionDestroyed(this, id, lastAccessedTime, maxInactiveInterval));
}
public boolean isSessionValid(String id) {
return sessions.containsKey(id);
}
@SuppressWarnings("deprecation")
String removeUselessSessions() {
if (!isManagementOfSessionsTurnedOn()) {
return CoreConstants.EMPTY;
}
if (sessions.isEmpty() || sessions.size() <= 0) {
return CoreConstants.EMPTY;
}
Set<String> keysSet = sessions.keySet();
if (ListUtil.isEmpty(keysSet)) {
return CoreConstants.EMPTY;
}
List<String> keys = new ArrayList<String>(keysSet);
List<String> sessionsToRemove = new ArrayList<String>();
long currentTime = System.currentTimeMillis();
for (String key: keys) {
HttpSession session = sessions.get(key);
if (session == null) {
continue;
}
long idleTime = currentTime - session.getLastAccessedTime();
if (idleTime >= 600000) {
// Session "was" idle for 10 minutes or more
Object chibaManager = session.getAttribute("chiba.session.manager");
if (chibaManager != null) {
continue;
}
Object principal = session.getValue("org.apache.slide.webdav.method.principal");
// Checking if session was created by Slide's root user
if (principal instanceof String && "root".equals(principal)) {
sessionsToRemove.add(session.getId());
}
}
}
for (String sessionId: sessionsToRemove) {
removeSession(sessionId);
}
return ListUtil.isEmpty(sessionsToRemove) ? CoreConstants.EMPTY : sessionsToRemove.toString();
}
public ApplicationContext getContext() {
return context;
}
public void setContext(ApplicationContext context) {
this.context = context;
}
}