diff options
Diffstat (limited to 'src/com/p4square/grow/frontend')
6 files changed, 108 insertions, 62 deletions
diff --git a/src/com/p4square/grow/frontend/AssessmentResultsPage.java b/src/com/p4square/grow/frontend/AssessmentResultsPage.java index 2035ce8..f1c924b 100644 --- a/src/com/p4square/grow/frontend/AssessmentResultsPage.java +++ b/src/com/p4square/grow/frontend/AssessmentResultsPage.java @@ -7,6 +7,8 @@ package com.p4square.grow.frontend;  import java.util.Date;  import java.util.Map; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.p4square.f1oauth.FellowshipOneIntegrationDriver;  import freemarker.template.Template;  import org.restlet.data.MediaType; @@ -29,6 +31,7 @@ import com.p4square.f1oauth.F1User;  import com.p4square.grow.config.Config;  import com.p4square.grow.provider.JsonEncodedProvider; +import org.restlet.security.User;  /**   * This page fetches the user's final score and displays the transitional page between @@ -102,29 +105,18 @@ public class AssessmentResultsPage extends FreeMarkerPageResource {      }      private void publishScoreInF1(Map results) { -        if (!(getRequest().getClientInfo().getUser() instanceof F1User)) { -            // Only useful if the user is from F1. -            return; -        } +        final ProgressReporter reporter = mGrowFrontend.getThirdPartyIntegrationFactory().getProgressReporter(); -        F1User user = (F1User) getRequest().getClientInfo().getUser(); +        try { +            final User user = getRequest().getClientInfo().getUser(); +            final String level = results.get("result").toString(); +            final Date completionDate = new Date(); +            final String data = JsonEncodedProvider.MAPPER.writeValueAsString(results); -        // Update the attribute. -        String attributeName = "Assessment Complete - " + results.get("result"); +            reporter.reportAssessmentComplete(user, level, completionDate, data); -        try { -            Attribute attribute = new Attribute(attributeName); -            attribute.setStartDate(new Date()); -            attribute.setComment(JsonEncodedProvider.MAPPER.writeValueAsString(results)); - -            F1API f1 = mGrowFrontend.getF1Access().getAuthenticatedApi(user); -            if (!f1.addAttribute(user.getIdentifier(), attribute)) { -                LOG.error("addAttribute failed for " + user.getIdentifier()  -                        + " with attribute " + attributeName); -            } -        } catch (Exception e) { -            LOG.error("addAttribute failed for " + user.getIdentifier()  -                    + " with attribute " + attributeName, e); +        } catch (JsonProcessingException e) { +            LOG.error("Failed to generate json " + e.getMessage(), e);          }      } diff --git a/src/com/p4square/grow/frontend/ChapterCompletePage.java b/src/com/p4square/grow/frontend/ChapterCompletePage.java index f07a870..35abc43 100644 --- a/src/com/p4square/grow/frontend/ChapterCompletePage.java +++ b/src/com/p4square/grow/frontend/ChapterCompletePage.java @@ -7,6 +7,7 @@ package com.p4square.grow.frontend;  import java.util.Date;  import java.util.Map; +import com.p4square.f1oauth.FellowshipOneIntegrationDriver;  import freemarker.template.Template;  import org.restlet.data.MediaType; @@ -31,6 +32,7 @@ import com.p4square.grow.config.Config;  import com.p4square.grow.model.TrainingRecord;  import com.p4square.grow.provider.Provider;  import com.p4square.grow.provider.TrainingRecordProvider; +import org.restlet.security.User;  /**   * This resource displays the transitional page between chapters. @@ -158,29 +160,12 @@ public class ChapterCompletePage extends FreeMarkerPageResource {      }      private void assignAttribute() { -        if (!(getRequest().getClientInfo().getUser() instanceof F1User)) { -            // Only useful if the user is from F1. -            return; -        } - -        F1User user = (F1User) getRequest().getClientInfo().getUser(); +        final ProgressReporter reporter = mGrowFrontend.getThirdPartyIntegrationFactory().getProgressReporter(); -        // Update the attribute. -        String attributeName = "Training Complete - " + mChapter; - -        try { -            Attribute attribute = new Attribute(attributeName); -            attribute.setStartDate(new Date()); +        final User user = getRequest().getClientInfo().getUser(); +        final Date completionDate = new Date(); -            F1API f1 = mGrowFrontend.getF1Access().getAuthenticatedApi(user); -            if (!f1.addAttribute(user.getIdentifier(), attribute)) { -                LOG.error("addAttribute failed for " + user.getIdentifier()  -                        + " with attribute " + attributeName); -            } -        } catch (Exception e) { -            LOG.error("addAttribute failed for " + user.getIdentifier()  -                    + " with attribute " + attributeName, e); -        } +        reporter.reportChapterComplete(user, mChapter, completionDate);      }      /** diff --git a/src/com/p4square/grow/frontend/GrowFrontend.java b/src/com/p4square/grow/frontend/GrowFrontend.java index 1d221cc..b5f62fb 100644 --- a/src/com/p4square/grow/frontend/GrowFrontend.java +++ b/src/com/p4square/grow/frontend/GrowFrontend.java @@ -6,15 +6,12 @@ package com.p4square.grow.frontend;  import java.io.File;  import java.io.IOException; - -import java.util.Arrays; -import java.util.UUID; +import java.lang.reflect.Constructor;  import freemarker.template.Template;  import org.restlet.Application;  import org.restlet.Component; -import org.restlet.Client;  import org.restlet.Context;  import org.restlet.Restlet;  import org.restlet.data.Protocol; @@ -32,13 +29,11 @@ import com.p4square.fmfacade.FreeMarkerPageResource;  import com.p4square.grow.config.Config; -import com.p4square.f1oauth.F1Access; -import com.p4square.f1oauth.SecondPartyVerifier; -  import com.p4square.restlet.metrics.MetricRouter;  import com.p4square.session.SessionCheckingAuthenticator;  import com.p4square.session.SessionCreatingAuthenticator; +import org.restlet.security.Verifier;  /**   * This is the Restlet Application implementing the Grow project front-end. @@ -54,7 +49,7 @@ public class GrowFrontend extends FMFacade {      private final Config mConfig;      private final MetricRegistry mMetricRegistry; -    private F1Access mHelper; +    private IntegrationDriver mIntegrationFactory;      public GrowFrontend() {          this(new Config(), new MetricRegistry()); @@ -81,20 +76,26 @@ public class GrowFrontend extends FMFacade {                      FreeMarkerPageResource.baseRootObject(getContext(), this));          } +        getContext().getAttributes().put("com.p4square.grow.config", mConfig); +        getContext().getAttributes().put("com.p4square.grow.metrics", mMetricRegistry); +          super.start();      } -    synchronized F1Access getF1Access() { -        if (mHelper == null) { -            mHelper = new F1Access(getContext(), mConfig.getString("f1ConsumerKey", ""), -                    mConfig.getString("f1ConsumerSecret", ""), -                    mConfig.getString("f1BaseUrl", "staging.fellowshiponeapi.com"), -                    mConfig.getString("f1ChurchCode", "pfseawa"), -                    F1Access.UserType.WEBLINK); -            mHelper.setMetricRegistry(mMetricRegistry); +    public synchronized IntegrationDriver getThirdPartyIntegrationFactory() { +        if (mIntegrationFactory == null) { +            final String driverClassName = getConfig().getString("integrationDriver", +                                                                 "com.p4square.f1oauth.FellowshipOneIntegrationDriver"); +            try { +                Class<?> clazz = Class.forName(driverClassName); +                Constructor<?> constructor = clazz.getConstructor(Context.class); +                mIntegrationFactory = (IntegrationDriver) constructor.newInstance(getContext()); +            } catch (Exception e) { +                LOG.error("Failed to instantiate IntegrationDriver " + driverClassName); +            }          } -        return mHelper; +        return mIntegrationFactory;      }      @Override @@ -141,8 +142,8 @@ public class GrowFrontend extends FMFacade {          SessionCheckingAuthenticator sessionChk = new SessionCheckingAuthenticator(context, true);          // This is used to authenticate the user -        SecondPartyVerifier f1Verifier = new SecondPartyVerifier(context, getF1Access()); -        LoginFormAuthenticator loginAuth = new LoginFormAuthenticator(context, false, f1Verifier); +        Verifier verifier = getThirdPartyIntegrationFactory().newUserAuthenticationVerifier(); +        LoginFormAuthenticator loginAuth = new LoginFormAuthenticator(context, false, verifier);          loginAuth.setLoginFormUrl(loginPage);          loginAuth.setLoginPostUrl(loginPost);          loginAuth.setDefaultPage(defaultPage); diff --git a/src/com/p4square/grow/frontend/IntegrationDriver.java b/src/com/p4square/grow/frontend/IntegrationDriver.java new file mode 100644 index 0000000..b9c3508 --- /dev/null +++ b/src/com/p4square/grow/frontend/IntegrationDriver.java @@ -0,0 +1,26 @@ +package com.p4square.grow.frontend; + +import org.restlet.security.Verifier; + +/** + * An IntegrationDriver is used to create implementations of various objects + * used to integration Grow with a particular Church Management System. + */ +public interface IntegrationDriver { + +    /** +     * Create a new Restlet Verifier to authenticate users when they login to the site. +     * +     * @return A Verifier. +     */ +    Verifier newUserAuthenticationVerifier(); + +    /** +     * Return a ProgressReporter for this Church Management System. +     * +     * The ProgressReporter should be thread-safe. +     * +     * @return The ProgressReporter. +     */ +    ProgressReporter getProgressReporter(); +} diff --git a/src/com/p4square/grow/frontend/NewAccountResource.java b/src/com/p4square/grow/frontend/NewAccountResource.java index 54c1790..5c13017 100644 --- a/src/com/p4square/grow/frontend/NewAccountResource.java +++ b/src/com/p4square/grow/frontend/NewAccountResource.java @@ -6,12 +6,12 @@ package com.p4square.grow.frontend;  import java.util.Map; +import com.p4square.f1oauth.FellowshipOneIntegrationDriver;  import freemarker.template.Template;  import org.restlet.data.Form;  import org.restlet.data.MediaType;  import org.restlet.data.Status; -import org.restlet.resource.ServerResource;  import org.restlet.representation.Representation;  import org.restlet.representation.StringRepresentation;  import org.restlet.ext.freemarker.TemplateRepresentation; @@ -44,7 +44,14 @@ public class NewAccountResource extends FreeMarkerPageResource {          super.doInit();          mGrowFrontend = (GrowFrontend) getApplication(); -        mHelper = mGrowFrontend.getF1Access(); + +        final IntegrationDriver driver = mGrowFrontend.getThirdPartyIntegrationFactory(); +        if (driver instanceof FellowshipOneIntegrationDriver) { +            mHelper = ((FellowshipOneIntegrationDriver) driver).getF1Access(); +        } else { +            LOG.error("NewAccountResource only works with F1!"); +            mHelper = null; +        }          mErrorMessage = ""; @@ -83,6 +90,11 @@ public class NewAccountResource extends FreeMarkerPageResource {      @Override      protected Representation post(Representation rep) { +        if (mHelper == null) { +            mErrorMessage += "F1 support is not enabled! "; +            return get(); +        } +          Form form = new Form(rep);          String firstname = form.getFirstValue("firstname"); diff --git a/src/com/p4square/grow/frontend/ProgressReporter.java b/src/com/p4square/grow/frontend/ProgressReporter.java new file mode 100644 index 0000000..2f36832 --- /dev/null +++ b/src/com/p4square/grow/frontend/ProgressReporter.java @@ -0,0 +1,30 @@ +package com.p4square.grow.frontend; + +import org.restlet.security.User; + +import java.util.Date; + +/** + * A ProgressReporter is used to record a User's progress in a Church Management System. + */ +public interface ProgressReporter { + +    /** +     * Report that the User completed the assessment. +     * +     * @param user The user who completed the assessment. +     * @param level The assessment level. +     * @param date The completion date. +     * @param results Result information (e.g. json of the results). +     */ +    void reportAssessmentComplete(User user, String level, Date date, String results); + +    /** +     * Report that the User completed the chapter. +     * +     * @param user The user who completed the chapter. +     * @param chapter The chapter completed. +     * @param date The completion date. +     */ +    void reportChapterComplete(User user, String chapter, Date date); +}  | 
