diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2013-09-05 21:18:04 -0700 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2013-09-05 21:18:04 -0700 |
commit | b453fb265c4ca44e00a91558651fd81e3cc2ac6b (patch) | |
tree | 263646288bdb8c2e82e70a67cdc813e5fc94023f | |
parent | 2fefbf0904d9a8529ec06732af6beec53aacc336 (diff) |
Moving Sessions to FMFacade. Adding transition from Assessment to Training.
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..6e395e1 --- /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 net.jesterpm.fmfacade.FreeMarkerPageResource; + +import net.jesterpm.fmfacade.json.JsonRequestClient; +import net.jesterpm.fmfacade.json.JsonResponse; +import net.jesterpm.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 dd83491..a548435 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 net.jesterpm.session.SessionCheckingAuthenticator; +import net.jesterpm.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 3e88f7a..787314a 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; - } -} |