package org.orienteer.core.module;
import com.google.inject.Singleton;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.query.OQuery;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import org.apache.wicket.ISessionListener;
import org.apache.wicket.Session;
import org.orienteer.core.OrienteerWebApplication;
import org.orienteer.core.util.OSchemaHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.ydn.wicket.wicketorientdb.utils.DBClosure;
/**
* Module to support user's online/offline lifecycle
*/
@Singleton
public class UserOnlineModule extends AbstractOrienteerModule {
public static final String NAME = "user-online";
public static final String OCLASS_USER = "OUser";
public static final String ONLINE_FIELD = "online";
public static final String LAST_SESSION_FIELD = "lastSessionId";
public UserOnlineModule() {
super(NAME, 1);
}
@Override
public ODocument onInstall(OrienteerWebApplication app, ODatabaseDocument db) {
super.onInstall(app, db);
OSchemaHelper helper = OSchemaHelper.bind(db);
helper.oClass(OCLASS_USER)
.oProperty(ONLINE_FIELD, OType.BOOLEAN)
.oProperty(LAST_SESSION_FIELD, OType.STRING)
.switchDisplayable(true, ONLINE_FIELD, LAST_SESSION_FIELD);
return null;
}
@Override
public void onInitialize(OrienteerWebApplication app, ODatabaseDocument db) {
super.onInitialize(app, db);
app.getSessionListeners().add(new ISessionListener() {
@Override
public void onCreated(Session session) { }
@Override
public void onUnbound(final String sessionId) {
new DBClosure<Void>() {
@Override
protected Void execute(ODatabaseDocument db) {
db.command(new OCommandSQL("UPDATE " + OCLASS_USER + " set " +
ONLINE_FIELD + "=false where " + LAST_SESSION_FIELD + "= ?")).execute(sessionId);
return null;
}
}.execute();
}
});
}
public ODocument updateOnlineUser(final OUser user, final boolean online) {
return new DBClosure<ODocument>() {
@Override
protected ODocument execute(ODatabaseDocument oDatabaseDocument) {
final ODocument document = user.reload().getDocument();
document.field(ONLINE_FIELD, online);
document.save();
return document;
}
}.execute();
}
public void updateSessionUser(final OUser user, final String sessionId) {
if(user!=null) {
new DBClosure<ODocument>() {
@Override
protected ODocument execute(ODatabaseDocument oDatabaseDocument) {
final ODocument document = user.reload().getDocument();
document.field(LAST_SESSION_FIELD, sessionId);
document.save();
return document;
}
}.execute();
}
}
}