diff --git a/.classpath b/.classpath index 3e75f39..929323c 100644 --- a/.classpath +++ b/.classpath @@ -24,6 +24,7 @@ + diff --git a/pom.xml b/pom.xml index 189fdda..0339c1d 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.gcube.portlets.widgets session-checker - jar + war 0.1.0-SNAPSHOT gCube Session Checker Widget diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/CheckSession.java b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/CheckSession.java index 9e9068e..625eb77 100644 --- a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/CheckSession.java +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/CheckSession.java @@ -1,14 +1,28 @@ package org.gcube.portlets.widgets.sessionchecker.client; +import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; +import org.gcube.portlets.widgets.sessionchecker.client.bundle.CheckSessionBundle; +import org.gcube.portlets.widgets.sessionchecker.client.elements.Div; import org.gcube.portlets.widgets.sessionchecker.shared.SessionInfoBean; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasAlignment; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.VerticalPanel; public class CheckSession { - private final int MILLI_SECONDS = 60 * 1000; //60 seconds + private final int MILLI_SECONDS = 45 * 1000; //45 seconds + + //for css and images + private CheckSessionBundle images = GWT.create(CheckSessionBundle.class); + + static { + CheckSessionBundle.INSTANCE.css().ensureInjected(); + } /** * Create a remote service proxy to talk to the server-side Greeting service. */ @@ -18,15 +32,23 @@ public class CheckSession { private String scope; private Timer t; - private static CheckSession singleton; + //needed to mask the page when session id up! + private Div maskDiv = new Div(); + private static CheckSession singleton; + public static CheckSession getInstance() { if (singleton == null) singleton = new CheckSession(); return singleton; } - - private CheckSession() { + + private CheckSession() { + + addMaskDiv2DOM(); + maskDiv.setStyleName("div-mask"); + + //polling timer t = new Timer() { @Override public void run() { @@ -34,15 +56,22 @@ public class CheckSession { @Override public void onSuccess(SessionInfoBean result) { if (result != null) { + username = result.getUsername(); scope = result.getScope(); boolean userValid = ( username != null) ? true : false; boolean scopeValid = (scope != null) ? true : false; - + if (! (userValid && scopeValid) ) { - Window.alert("Session Expired"); + mask(true); + stopPolling(); + showLogoutDialog(); } - } + } + else { + GWT.log("result null"); + stopPolling(); + } } @Override public void onFailure(Throwable caught) { } @@ -50,7 +79,43 @@ public class CheckSession { } }; } + + private void addMaskDiv2DOM() { + RootPanel.get().insert(maskDiv, 0); + } + /** + * set visible the masking div setting/unsetting css display property + * @param mask + */ + private void mask(boolean mask) { + GWT.log("Masking"); + if (mask) + maskDiv.getElement().getStyle().setDisplay(Display.BLOCK); + else + maskDiv.getElement().getStyle().setDisplay(Display.NONE); + } + private void showLogoutDialog() { + GCubeDialog dlg = new GCubeDialog(); + dlg.setText("Your Session Expired!"); + + VerticalPanel topPanel = new VerticalPanel(); + topPanel.setPixelSize(420, 290); + + topPanel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); + + HTML toShow = new HTML("
" + + "" + + "
" + + "Please reload this page.
"); + + + topPanel.add(toShow); + dlg.add(topPanel); + dlg.center(); + dlg.show(); + } + public String getUsername() { return username; diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/SessionChecker.java b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/SessionChecker.java index 9394d3a..b818bbf 100644 --- a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/SessionChecker.java +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/SessionChecker.java @@ -8,5 +8,6 @@ import com.google.gwt.core.client.EntryPoint; public class SessionChecker implements EntryPoint { public void onModuleLoad() { + CheckSession.getInstance().startPolling(); } } diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSession.css b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSession.css new file mode 100644 index 0000000..998217f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSession.css @@ -0,0 +1,11 @@ +@external div-mask; + +.div-mask { + position: fixed; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,.15); + top: 0; + left: 0; + display: none; +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSessionBundle.java b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSessionBundle.java new file mode 100644 index 0000000..86603b8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/CheckSessionBundle.java @@ -0,0 +1,17 @@ +package org.gcube.portlets.widgets.sessionchecker.client.bundle; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; + +public interface CheckSessionBundle extends ClientBundle { + + public static final CheckSessionBundle INSTANCE = GWT.create(CheckSessionBundle.class); + + @Source("CheckSession.css") + public CssResource css(); + + @Source("session_expired.jpg") + ImageResource expired(); +} diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/session_expired.jpg b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/session_expired.jpg new file mode 100644 index 0000000..5b66306 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/bundle/session_expired.jpg differ diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/elements/Div.java b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/elements/Div.java new file mode 100644 index 0000000..04eab23 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/client/elements/Div.java @@ -0,0 +1,27 @@ +package org.gcube.portlets.widgets.sessionchecker.client.elements; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasText; + +/** + * + * @author Massimiliano Assante, ISTI-CNR + * @version 0.1 Sep 2012 + * + */ +public class Div extends HTML implements HasText { + + public Div() { + super(DOM.createElement("div")); + } + + public Div(String text) { + this(); + setText(text); + } + + public void setAttribute(String name, String value) { + super.getElement().setAttribute(name, value); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/sessionchecker/server/SessionCheckerServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/sessionchecker/server/SessionCheckerServiceImpl.java index 12e555b..37a787e 100644 --- a/src/main/java/org/gcube/portlets/widgets/sessionchecker/server/SessionCheckerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/sessionchecker/server/SessionCheckerServiceImpl.java @@ -24,11 +24,8 @@ public class SessionCheckerServiceImpl extends RemoteServiceServlet implements * @return . */ private ASLSession getASLSession() { - System.out.println("\n\n\n*****+ ASL checksession"); String sessionID = this.getThreadLocalRequest().getSession().getId(); String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); - - System.out.println("ASL checksession ID = " +sessionID); return SessionManager.getInstance().getASLSession(sessionID, user); }