summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/com/p4square/grow/frontend/AssessmentResultsPage.java116
-rw-r--r--src/com/p4square/grow/frontend/GrowFrontend.java5
-rw-r--r--src/com/p4square/grow/frontend/SurveyPageResource.java10
-rw-r--r--src/com/p4square/grow/frontend/session/Session.java55
-rw-r--r--src/com/p4square/grow/frontend/session/SessionAuthenticator.java36
-rw-r--r--src/com/p4square/grow/frontend/session/SessionCheckingAuthenticator.java39
-rw-r--r--src/com/p4square/grow/frontend/session/SessionCookieAuthenticator.java59
-rw-r--r--src/com/p4square/grow/frontend/session/SessionCreatingAuthenticator.java46
-rw-r--r--src/com/p4square/grow/frontend/session/Sessions.java84
9 files changed, 120 insertions, 330 deletions
diff --git a/src/com/p4square/grow/frontend/AssessmentResultsPage.java b/src/com/p4square/grow/frontend/AssessmentResultsPage.java
new file mode 100644
index 0000000..9c69c69
--- /dev/null
+++ b/src/com/p4square/grow/frontend/AssessmentResultsPage.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.grow.frontend;
+
+import java.util.Map;
+
+import freemarker.template.Template;
+
+import org.restlet.data.MediaType;
+import org.restlet.data.Status;
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.restlet.ext.freemarker.TemplateRepresentation;
+
+import org.apache.log4j.Logger;
+
+import com.p4square.fmfacade.FreeMarkerPageResource;
+
+import com.p4square.fmfacade.json.JsonRequestClient;
+import com.p4square.fmfacade.json.JsonResponse;
+import com.p4square.fmfacade.json.ClientException;
+
+import com.p4square.grow.config.Config;
+
+/**
+ * This page fetches the user's final score and displays the transitional page between
+ * the assessment and the videos.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class AssessmentResultsPage extends FreeMarkerPageResource {
+ private static final Logger LOG = Logger.getLogger(AssessmentResultsPage.class);
+
+ private GrowFrontend mGrowFrontend;
+ private Config mConfig;
+ private JsonRequestClient mJsonClient;
+
+ private String mUserId;
+
+ @Override
+ public void doInit() {
+ super.doInit();
+
+ mGrowFrontend = (GrowFrontend) getApplication();
+ mConfig = mGrowFrontend.getConfig();
+
+ mJsonClient = new JsonRequestClient(getContext().getClientDispatcher());
+
+ mUserId = getRequest().getClientInfo().getUser().getIdentifier();
+ }
+
+ /**
+ * Return the login page.
+ */
+ @Override
+ protected Representation get() {
+ Template t = mGrowFrontend.getTemplate("templates/assessment-results.ftl");
+
+ try {
+ if (t == null) {
+ setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ return ErrorPage.TEMPLATE_NOT_FOUND;
+ }
+
+ Map<String, Object> root = getRootObject();
+
+ // Get the assessment results
+ JsonResponse response = backendGet("/accounts/" + mUserId + "/assessment");
+ if (!response.getStatus().isSuccess()) {
+ setStatus(Status.SERVER_ERROR_INTERNAL);
+ return ErrorPage.BACKEND_ERROR;
+ }
+
+ final String score = (String) response.getMap().get("result");
+ if (score == null) {
+ // Odd... send them to the first questions
+ String nextPage = mConfig.getString("dynamicRoot", "")
+ + "/account/assessment/question/first";
+ getResponse().redirectSeeOther(nextPage);
+ return new StringRepresentation("Redirecting to " + nextPage);
+ }
+
+ root.put("stage", score);
+ return new TemplateRepresentation(t, root, MediaType.TEXT_HTML);
+
+ } catch (Exception e) {
+ LOG.fatal("Could not render page: " + e.getMessage(), e);
+ setStatus(Status.SERVER_ERROR_INTERNAL);
+ return ErrorPage.RENDER_ERROR;
+ }
+ }
+
+ /**
+ * @return The backend endpoint URI
+ */
+ private String getBackendEndpoint() {
+ return mConfig.getString("backendUri", "riap://component/backend");
+ }
+
+ /**
+ * Helper method to send a GET to the backend.
+ */
+ private JsonResponse backendGet(final String uri) {
+ LOG.debug("Sending backend GET " + uri);
+
+ final JsonResponse response = mJsonClient.get(getBackendEndpoint() + uri);
+ final Status status = response.getStatus();
+ if (!status.isSuccess() && !Status.CLIENT_ERROR_NOT_FOUND.equals(status)) {
+ LOG.warn("Error making backend request for '" + uri + "'. status = " + response.getStatus().toString());
+ }
+
+ return response;
+ }
+}
diff --git a/src/com/p4square/grow/frontend/GrowFrontend.java b/src/com/p4square/grow/frontend/GrowFrontend.java
index 7556c20..af44ff9 100644
--- a/src/com/p4square/grow/frontend/GrowFrontend.java
+++ b/src/com/p4square/grow/frontend/GrowFrontend.java
@@ -32,8 +32,8 @@ import com.p4square.grow.config.Config;
import com.p4square.f1oauth.F1OAuthHelper;
import com.p4square.f1oauth.SecondPartyVerifier;
-import com.p4square.grow.frontend.session.SessionCheckingAuthenticator;
-import com.p4square.grow.frontend.session.SessionCreatingAuthenticator;
+import com.p4square.session.SessionCheckingAuthenticator;
+import com.p4square.session.SessionCreatingAuthenticator;
/**
* This is the Restlet Application implementing the Grow project front-end.
@@ -110,6 +110,7 @@ public class GrowFrontend extends FMFacade {
accountRouter.attach("/authenticate", AuthenticatedResource.class);
accountRouter.attach("/assessment/question/{questionId}", SurveyPageResource.class);
+ accountRouter.attach("/assessment/results", AssessmentResultsPage.class);
accountRouter.attach("/assessment", SurveyPageResource.class);
accountRouter.attach("/training/{chapter}/videos/{videoId}.json", VideosResource.class);
accountRouter.attach("/training/{chapter}", TrainingPageResource.class);
diff --git a/src/com/p4square/grow/frontend/SurveyPageResource.java b/src/com/p4square/grow/frontend/SurveyPageResource.java
index fa37440..ad6b909 100644
--- a/src/com/p4square/grow/frontend/SurveyPageResource.java
+++ b/src/com/p4square/grow/frontend/SurveyPageResource.java
@@ -203,15 +203,7 @@ public class SurveyPageResource extends FreeMarkerPageResource {
if (nextQuestionId == null) {
String nextPage = mConfig.getString("dynamicRoot", "");
- JsonResponse response = backendGet("/accounts/" + mUserId + "/assessment");
- if (!response.getStatus().isSuccess()) {
- nextPage += "/account/assessment/results";
- } else {
- final String score = (String) response.getMap().get("result");
- if (score != null) {
- nextPage += "/account/training/" + score;
- }
- }
+ nextPage += "/account/assessment/results";
getResponse().redirectSeeOther(nextPage);
return new StringRepresentation("Redirecting to " + nextPage);
}
diff --git a/src/com/p4square/grow/frontend/session/Session.java b/src/com/p4square/grow/frontend/session/Session.java
deleted file mode 100644
index 3377962..0000000
--- a/src/com/p4square/grow/frontend/session/Session.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-import org.restlet.security.User;
-
-/**
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class Session {
- private static final long LIFETIME = 86400000;
-
- private final String mSessionId;
- private final User mUser;
- private final Map<String, String> mData;
- private long mExpires;
-
- Session(User user) {
- mUser = user;
- mSessionId = UUID.randomUUID().toString();
- mExpires = System.currentTimeMillis() + LIFETIME;
- mData = new HashMap<String, String>();
- }
-
- void touch() {
- mExpires = System.currentTimeMillis() + LIFETIME;
- }
-
- boolean isExpired() {
- return System.currentTimeMillis() > mExpires;
- }
-
- public String getId() {
- return mSessionId;
- }
-
- public String get(String key) {
- return mData.get(key);
- }
-
- public void put(String key, String value) {
- mData.put(key, value);
- }
-
- public User getUser() {
- return mUser;
- }
-}
diff --git a/src/com/p4square/grow/frontend/session/SessionAuthenticator.java b/src/com/p4square/grow/frontend/session/SessionAuthenticator.java
deleted file mode 100644
index ac194af..0000000
--- a/src/com/p4square/grow/frontend/session/SessionAuthenticator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import org.restlet.Context;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.security.Authenticator;
-import org.restlet.security.User;
-
-/**
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class SessionAuthenticator /*extends Authenticator*/ {
- /*
- @Override
- protected boolean authenticate(Request request, Response response) {
- // Check for authentication cookie
- final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
- if (cookie != null) {
- cLog.debug("Got cookie: " + cookie);
- // TODO Decrypt user info
- User user = new User(cookie);
- request.getClientInfo().setUser(user);
- return true;
- }
-
- // Challenge the user if not authenticated
- response.redirectSeeOther(mLoginPage);
- return false;
- }
- */
-}
diff --git a/src/com/p4square/grow/frontend/session/SessionCheckingAuthenticator.java b/src/com/p4square/grow/frontend/session/SessionCheckingAuthenticator.java
deleted file mode 100644
index 745484d..0000000
--- a/src/com/p4square/grow/frontend/session/SessionCheckingAuthenticator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import org.apache.log4j.Logger;
-
-import org.restlet.Context;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.security.Authenticator;
-
-/**
- * Authenticator which succeeds if a valid Session exists.
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class SessionCheckingAuthenticator extends Authenticator {
- private static final Logger LOG = Logger.getLogger(SessionCheckingAuthenticator.class);
-
- public SessionCheckingAuthenticator(Context context, boolean optional) {
- super(context, optional);
- }
-
- protected boolean authenticate(Request request, Response response) {
- Session s = Sessions.getInstance().get(request);
-
- if (s != null) {
- LOG.debug("Found session for user " + s.getUser());
- request.getClientInfo().setUser(s.getUser());
- return true;
-
- } else {
- return false;
- }
- }
-
-}
diff --git a/src/com/p4square/grow/frontend/session/SessionCookieAuthenticator.java b/src/com/p4square/grow/frontend/session/SessionCookieAuthenticator.java
deleted file mode 100644
index 789f58e..0000000
--- a/src/com/p4square/grow/frontend/session/SessionCookieAuthenticator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import org.apache.log4j.Logger;
-
-import org.restlet.Context;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.security.Authenticator;
-
-/**
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class SessionCookieAuthenticator extends Authenticator {
- private static final Logger LOG = Logger.getLogger(SessionCookieAuthenticator.class);
-
- private static final String COOKIE_NAME = "S";
-
- private final Sessions mSessions;
-
- public SessionCookieAuthenticator(Context context, boolean optional, Sessions sessions) {
- super(context, optional);
-
- mSessions = sessions;
- }
-
- protected boolean authenticate(Request request, Response response) {
- final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
-
- if (request.getClientInfo().isAuthenticated()) {
- // Request is already authenticated... create session if it doesn't exist.
- if (cookie == null) {
- Session s = mSessions.create(request.getClientInfo().getUser());
- response.getCookieSettings().add(COOKIE_NAME, s.getId());
- }
-
- return true;
-
- } else {
- // Check for authentication cookie
- if (cookie != null) {
- LOG.debug("Got cookie: " + cookie);
-
- Session s = mSessions.get(cookie);
- if (s != null) {
- request.getClientInfo().setUser(s.getUser());
- return true;
- }
- }
-
- return false;
- }
- }
-
-}
diff --git a/src/com/p4square/grow/frontend/session/SessionCreatingAuthenticator.java b/src/com/p4square/grow/frontend/session/SessionCreatingAuthenticator.java
deleted file mode 100644
index c569bb9..0000000
--- a/src/com/p4square/grow/frontend/session/SessionCreatingAuthenticator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import org.apache.log4j.Logger;
-
-import org.restlet.Context;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.security.Authenticator;
-import org.restlet.security.User;
-
-/**
- * Authenticator which creates a Session for the request and adds a cookie
- * to the response.
- *
- * The Request MUST be Authenticated and MUST have a User object associated.
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class SessionCreatingAuthenticator extends Authenticator {
- private static final Logger LOG = Logger.getLogger(SessionCreatingAuthenticator.class);
-
- public SessionCreatingAuthenticator(Context context) {
- super(context, true);
- }
-
- protected boolean authenticate(Request request, Response response) {
- if (Sessions.getInstance().get(request) != null) {
- return true;
- }
-
- User user = request.getClientInfo().getUser();
-
- if (request.getClientInfo().isAuthenticated() && user != null) {
- Sessions.getInstance().create(request, response);
- LOG.debug(response);
- return true;
- }
-
- return false;
- }
-
-}
diff --git a/src/com/p4square/grow/frontend/session/Sessions.java b/src/com/p4square/grow/frontend/session/Sessions.java
deleted file mode 100644
index 58bb5f6..0000000
--- a/src/com/p4square/grow/frontend/session/Sessions.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.frontend.session;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.Map;
-
-import org.restlet.Response;
-import org.restlet.Request;
-import org.restlet.data.CookieSetting;
-import org.restlet.security.User;
-
-/**
- * Singleton Session Manager.
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class Sessions {
- private static final String COOKIE_NAME = "S";
-
- private static final Sessions THE = new Sessions();
- public static Sessions getInstance() {
- return THE;
- }
-
- private final Map<String, Session> mSessions;
-
- private Sessions() {
- mSessions = new ConcurrentHashMap<String, Session>();
- }
-
- public Session get(String sessionid) {
- Session s = mSessions.get(sessionid);
-
- if (s != null && !s.isExpired()) {
- s.touch();
- return s;
- }
-
- return null;
- }
-
- /**
- * Get the Session associated with the Request.
- * @return A session or null if no session is found.
- */
- public Session get(Request request) {
- final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
-
- if (cookie != null) {
- return get(cookie);
- }
-
- return null;
- }
-
- public Session create(User user) {
- if (user == null) {
- throw new IllegalArgumentException("Can not create session for null user.");
- }
-
- Session s = new Session(user);
- mSessions.put(s.getId(), s);
-
- return s;
- }
-
- /**
- * Create a new Session and add the Session cookie to the response.
- */
- public Session create(Request request, Response response) {
- Session s = create(request.getClientInfo().getUser());
-
- CookieSetting cookie = new CookieSetting(COOKIE_NAME, s.getId());
- cookie.setPath("/");
-
- request.getCookies().add(cookie);
- response.getCookieSettings().add(cookie);
-
- return s;
- }
-}