diff options
Diffstat (limited to 'src/com/p4square/grow/frontend')
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; -    } -} | 
