package ilarkesto.webapp;
import ilarkesto.base.time.DateAndTime;
import ilarkesto.base.time.TimePeriod;
import ilarkesto.core.logging.Log;
import ilarkesto.di.Context;
import ilarkesto.gwt.server.AGwtConversation;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
public abstract class AWebSession {
private static final Log LOG = Log.get(AWebSession.class);
private static final TimePeriod DEFAULT_TIMEOUT = TimePeriod.minutes(30);
private Context context;
private String userAgent;
private boolean shitBrowser;
private String initialRemoteHost;
private boolean sessionInvalidated;
private DateAndTime lastTouched;
private Set<AGwtConversation> gwtConversations = new HashSet<AGwtConversation>();
private int lastGwtConversationNumber = 0;
public AWebSession(Context parentContext, HttpServletRequest initialRequest) {
this.initialRemoteHost = initialRequest == null ? "localhost" : initialRequest.getRemoteHost();
context = parentContext.createSubContext(toString());
context.addBeanProvider(this);
userAgent = initialRequest == null ? "unknown" : Servlet.getUserAgent(initialRequest);
shitBrowser = userAgent != null && userAgent.contains("MSIE 6");
touch();
}
public synchronized AGwtConversation getGwtConversation(int conversationNumber) {
if (conversationNumber == -1) {
AGwtConversation conversation = createGwtConversation();
gwtConversations.add(conversation);
return conversation;
}
for (AGwtConversation conversation : gwtConversations) {
if (conversation.getNumber() == conversationNumber) {
conversation.touch();
return conversation;
}
}
throw new RuntimeException("GwtConversation does not exist: " + conversationNumber);
}
public AGwtConversation createGwtConversation() {
return null;
}
public synchronized void destroyGwtConversation(AGwtConversation conversation) {
conversation.invalidate();
gwtConversations.remove(conversation);
}
public Set<AGwtConversation> getGwtConversations() {
return gwtConversations;
}
// --- ---
public int nextGwtConversationNumber() {
lastGwtConversationNumber++;
return lastGwtConversationNumber;
}
public final String getInitialRemoteHost() {
return initialRemoteHost;
}
final void touch() {
lastTouched = DateAndTime.now();
}
protected TimePeriod getTimeout() {
return DEFAULT_TIMEOUT;
}
final boolean isTimeouted() {
return lastTouched.getPeriodToNow().isGreaterThen(getTimeout());
}
public final DateAndTime getLastTouched() {
return lastTouched;
}
public final String getUserAgent() {
return userAgent;
}
public final boolean isShitBrowser() {
return shitBrowser;
}
public final void setShitBrowser(boolean value) {
this.shitBrowser = value;
}
public final Context getContext() {
return context;
}
public final boolean isSessionInvalidated() {
return sessionInvalidated;
}
protected void onInvalidate() {
for (AGwtConversation conversation : gwtConversations) {
conversation.invalidate();
}
gwtConversations = new HashSet<AGwtConversation>();
}
public final void invalidate() {
LOG.info("Invalidating session:", this);
sessionInvalidated = true;
onInvalidate();
}
final void destroy() {
if (!sessionInvalidated) {
invalidate();
}
if (context != null) {
context.destroy();
context = null;
}
}
@Override
public String toString() {
return "session:" + initialRemoteHost;
}
}