diff options
| author | Jesse Morgan <jesse@jesterpm.net> | 2016-04-09 15:53:24 -0700 | 
|---|---|---|
| committer | Jesse Morgan <jesse@jesterpm.net> | 2016-04-09 15:53:24 -0700 | 
| commit | 371ccae3d1f31ec38f4af77fb7fcd175d49b3cd5 (patch) | |
| tree | 38c4f1e8828f9af9c4b77a173bee0d312b321698 /src/com/p4square/grow/ccb | |
| parent | bbf907e51dfcf157bdee24dead1d531122aa25db (diff) | |
| parent | 3102d8bce3426d9cf41aeaf201c360d342677770 (diff) | |
Merge pull request #10 from PuyallupFoursquare/maven
Switching from Ivy+Ant to Maven.
Diffstat (limited to 'src/com/p4square/grow/ccb')
| -rw-r--r-- | src/com/p4square/grow/ccb/CCBProgressReporter.java | 104 | ||||
| -rw-r--r-- | src/com/p4square/grow/ccb/CCBUser.java | 37 | ||||
| -rw-r--r-- | src/com/p4square/grow/ccb/CCBUserVerifier.java | 50 | ||||
| -rw-r--r-- | src/com/p4square/grow/ccb/ChurchCommunityBuilderIntegrationDriver.java | 61 | ||||
| -rw-r--r-- | src/com/p4square/grow/ccb/CustomFieldCache.java | 126 | ||||
| -rw-r--r-- | src/com/p4square/grow/ccb/MonitoredCCBAPI.java | 96 | 
6 files changed, 0 insertions, 474 deletions
| diff --git a/src/com/p4square/grow/ccb/CCBProgressReporter.java b/src/com/p4square/grow/ccb/CCBProgressReporter.java deleted file mode 100644 index d2826eb..0000000 --- a/src/com/p4square/grow/ccb/CCBProgressReporter.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.p4square.grow.ccb; - -import com.p4square.ccbapi.CCBAPI; -import com.p4square.ccbapi.model.*; -import com.p4square.grow.frontend.ProgressReporter; -import com.p4square.grow.model.Score; -import org.apache.log4j.Logger; -import org.restlet.security.User; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Date; - -/** - * A ProgressReporter which records progress in CCB. - * - * Except not really, because it's not implemented yet. - * This is just a placeholder until ccb-api-client-java has support for updating an individual. - */ -public class CCBProgressReporter implements ProgressReporter { - -    private static final Logger LOG = Logger.getLogger(CCBProgressReporter.class); - -    private static final String GROW_LEVEL = "GrowLevelTrain"; -    private static final String GROW_ASSESSMENT = "GrowLevelAsmnt"; - -    private final CCBAPI mAPI; -    private final CustomFieldCache mCache; - -    public CCBProgressReporter(final CCBAPI api, final CustomFieldCache cache) { -        mAPI = api; -        mCache = cache; -    } - -    @Override -    public void reportAssessmentComplete(final User user, final String level, final Date date, final String results) { -        if (!(user instanceof CCBUser)) { -            throw new IllegalArgumentException("Expected CCBUser but got " + user.getClass().getCanonicalName()); -        } -        final CCBUser ccbuser = (CCBUser) user; - -        updateLevelAndDate(ccbuser, GROW_ASSESSMENT, level, date); -    } - -    @Override -    public void reportChapterComplete(final User user, final String chapter, final Date date) { -        if (!(user instanceof CCBUser)) { -            throw new IllegalArgumentException("Expected CCBUser but got " + user.getClass().getCanonicalName()); -        } -        final CCBUser ccbuser = (CCBUser) user; - -        // Only update the level if it is increasing. -        final CustomPulldownFieldValue currentLevel = ccbuser.getProfile() -                .getCustomPulldownFields().getByLabel(GROW_LEVEL); - -        if (currentLevel != null) { -            if (Score.numericScore(chapter) <= Score.numericScore(currentLevel.getSelection().getLabel())) { -                LOG.info("Not updating level for " + user.getIdentifier() -                        + " because current level (" + currentLevel.getSelection().getLabel() -                        + ") is greater than new level (" + chapter + ")"); -                return; -            } -        } - -        updateLevelAndDate(ccbuser, GROW_LEVEL, chapter, date); -    } - -    private void updateLevelAndDate(final CCBUser user, final String field, final String level, final Date date) { -        boolean modified = false; - -        final UpdateIndividualProfileRequest req = new UpdateIndividualProfileRequest() -                .withIndividualId(user.getProfile().getId()); - -        final CustomField pulldownField = mCache.getIndividualPulldownByLabel(field); -        if (pulldownField != null) { -            final LookupTableType type = LookupTableType.valueOf(pulldownField.getName().toUpperCase()); -            final LookupTableItem item = mCache.getPulldownItemByName(type, level); -            if (item != null) { -                req.withCustomPulldownField(pulldownField.getName(), item.getId()); -                modified = true; -            } -        } - -        final CustomField dateField = mCache.getDateFieldByLabel(field); -        if (dateField != null) { -            req.withCustomDateField(dateField.getName(), date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); -            modified = true; -        } - -        try { -            // Only update if a field exists. -            if (modified) { -                mAPI.updateIndividualProfile(req); -            } - -        } catch (IOException e) { -            LOG.error("updateIndividual failed for " + user.getIdentifier() -                    + ", field " + field -                    + ", level " + level -                    + ", date " + date.toString()); -        } -    } -} diff --git a/src/com/p4square/grow/ccb/CCBUser.java b/src/com/p4square/grow/ccb/CCBUser.java deleted file mode 100644 index 7313172..0000000 --- a/src/com/p4square/grow/ccb/CCBUser.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.p4square.grow.ccb; - -import com.p4square.ccbapi.model.IndividualProfile; -import org.restlet.security.User; - -/** - * CCBUser is an adapter between a CCB IndividualProfile and a Restlet User. - * - * Note: CCBUser prefixes the user's identifier with "CCB-". This is done to - *       ensure the identifier does not collide with identifiers from other - *       systems. - */ -public class CCBUser extends User { - -    private final IndividualProfile mProfile; - -    /** -     * Wrap an IndividualProfile inside a User object. -     * -     * @param profile The CCB IndividualProfile for the user. -     */ -    public CCBUser(final IndividualProfile profile) { -        mProfile = profile; - -        setIdentifier("CCB-" + mProfile.getId()); -        setFirstName(mProfile.getFirstName()); -        setLastName(mProfile.getLastName()); -        setEmail(mProfile.getEmail()); -    } - -    /** -     * @return The IndividualProfile of the user. -     */ -    public IndividualProfile getProfile() { -        return mProfile; -    } -} diff --git a/src/com/p4square/grow/ccb/CCBUserVerifier.java b/src/com/p4square/grow/ccb/CCBUserVerifier.java deleted file mode 100644 index db10b75..0000000 --- a/src/com/p4square/grow/ccb/CCBUserVerifier.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.p4square.grow.ccb; - -import com.p4square.ccbapi.CCBAPI; -import com.p4square.ccbapi.model.GetIndividualProfilesRequest; -import com.p4square.ccbapi.model.GetIndividualProfilesResponse; -import org.apache.log4j.Logger; -import org.restlet.Request; -import org.restlet.Response; -import org.restlet.security.Verifier; - -/** - * CCBUserVerifier authenticates a user through the CCB individual_profile_from_login_password API. - */ -public class CCBUserVerifier implements Verifier { -    private static final Logger LOG = Logger.getLogger(CCBUserVerifier.class); - -    private final CCBAPI mAPI; - -    public CCBUserVerifier(final CCBAPI api) { -        mAPI = api; -    } - -    @Override -    public int verify(Request request, Response response) { -        if (request.getChallengeResponse() == null) { -            return RESULT_MISSING; // no credentials -        } - -        final String username = request.getChallengeResponse().getIdentifier(); -        final char[] password = request.getChallengeResponse().getSecret(); - -        try { -            GetIndividualProfilesResponse resp = mAPI.getIndividualProfiles( -                    new GetIndividualProfilesRequest().withLoginPassword(username, password)); - -            if (resp.getIndividuals().size() == 1) { -                // Wrap the IndividualProfile up in an User and update the user on the request. -                final CCBUser user = new CCBUser(resp.getIndividuals().get(0)); -                LOG.info("Successfully authenticated " + user.getIdentifier()); -                request.getClientInfo().setUser(user); -                return RESULT_VALID; -            } - -        } catch (Exception e) { -            LOG.error("CCB API Exception: " + e, e); -        } - -        return RESULT_INVALID; // Invalid credentials -    } -} diff --git a/src/com/p4square/grow/ccb/ChurchCommunityBuilderIntegrationDriver.java b/src/com/p4square/grow/ccb/ChurchCommunityBuilderIntegrationDriver.java deleted file mode 100644 index fc6148f..0000000 --- a/src/com/p4square/grow/ccb/ChurchCommunityBuilderIntegrationDriver.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.p4square.grow.ccb; - -import com.codahale.metrics.MetricRegistry; -import com.p4square.ccbapi.CCBAPI; -import com.p4square.ccbapi.CCBAPIClient; -import com.p4square.grow.config.Config; -import com.p4square.grow.frontend.IntegrationDriver; -import com.p4square.grow.frontend.ProgressReporter; -import org.restlet.Context; -import org.restlet.security.Verifier; - -import java.net.URI; -import java.net.URISyntaxException; - -/** - * The ChurchCommunityBuilderIntegrationDriver is used to integrate Grow with Church Community Builder. - */ -public class ChurchCommunityBuilderIntegrationDriver implements IntegrationDriver { - -    private final Context mContext; -    private final MetricRegistry mMetricRegistry; -    private final Config mConfig; - -    private final CCBAPI mAPI; - -    private final CCBProgressReporter mProgressReporter; - -    public ChurchCommunityBuilderIntegrationDriver(final Context context) { -        mContext = context; -        mConfig = (Config) context.getAttributes().get("com.p4square.grow.config"); -        mMetricRegistry = (MetricRegistry) context.getAttributes().get("com.p4square.grow.metrics"); - -        try { -            CCBAPI api = new CCBAPIClient(new URI(mConfig.getString("CCBAPIURL", "")), -                                          mConfig.getString("CCBAPIUser", ""), -                                          mConfig.getString("CCBAPIPassword", "")); - -            if (mMetricRegistry != null) { -                api = new MonitoredCCBAPI(api, mMetricRegistry); -            } - -            mAPI = api; - -            final CustomFieldCache cache = new CustomFieldCache(mAPI); -            mProgressReporter = new CCBProgressReporter(mAPI, cache); - -        } catch (URISyntaxException e) { -            throw new RuntimeException(e); -        } -    } - -    @Override -    public Verifier newUserAuthenticationVerifier() { -        return new CCBUserVerifier(mAPI); -    } - -    @Override -    public ProgressReporter getProgressReporter() { -        return mProgressReporter; -    } -} diff --git a/src/com/p4square/grow/ccb/CustomFieldCache.java b/src/com/p4square/grow/ccb/CustomFieldCache.java deleted file mode 100644 index d93e6d9..0000000 --- a/src/com/p4square/grow/ccb/CustomFieldCache.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.p4square.grow.ccb; - -import com.p4square.ccbapi.CCBAPI; -import com.p4square.ccbapi.model.*; -import org.apache.log4j.Logger; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * CustomFieldCache maintains an index from custom field labels to names. - */ -public class CustomFieldCache { - -    private static final Logger LOG = Logger.getLogger(CustomFieldCache.class); - -    private final CCBAPI mAPI; - -    private CustomFieldCollection<CustomField> mTextFields; -    private CustomFieldCollection<CustomField> mDateFields; -    private CustomFieldCollection<CustomField> mIndividualPulldownFields; -    private CustomFieldCollection<CustomField> mGroupPulldownFields; - -    private final Map<LookupTableType, Map<String, LookupTableItem>> mItemByNameTable; - -    public CustomFieldCache(final CCBAPI api) { -        mAPI = api; -        mTextFields = new CustomFieldCollection<>(); -        mDateFields = new CustomFieldCollection<>(); -        mIndividualPulldownFields = new CustomFieldCollection<>(); -        mGroupPulldownFields = new CustomFieldCollection<>(); -        mItemByNameTable = new HashMap<>(); -    } - -    public CustomField getTextFieldByLabel(final String label) { -        if (mTextFields.size() == 0) { -            refresh(); -        } -        return mTextFields.getByLabel(label); -    } - -    public CustomField getDateFieldByLabel(final String label) { -        if (mDateFields.size() == 0) { -            refresh(); -        } -        return mDateFields.getByLabel(label); -    } - -    public CustomField getIndividualPulldownByLabel(final String label) { -        if (mIndividualPulldownFields.size() == 0) { -            refresh(); -        } -        return mIndividualPulldownFields.getByLabel(label); -    } - -    public CustomField getGroupPulldownByLabel(final String label) { -        if (mGroupPulldownFields.size() == 0) { -            refresh(); -        } -        return mGroupPulldownFields.getByLabel(label); -    } - -    public LookupTableItem getPulldownItemByName(final LookupTableType type, final String name) { -        Map<String, LookupTableItem> items = mItemByNameTable.get(type); -        if (items == null) { -            if (!cacheLookupTable(type)) { -                return null; -            } -            items = mItemByNameTable.get(type); -        } - -        return items.get(name.toLowerCase()); -    } - -    private synchronized void refresh() { -        try { -            // Get all of the custom fields. -            final GetCustomFieldLabelsResponse resp = mAPI.getCustomFieldLabels(); - -            final CustomFieldCollection<CustomField> newTextFields = new CustomFieldCollection<>(); -            final CustomFieldCollection<CustomField> newDateFields = new CustomFieldCollection<>(); -            final CustomFieldCollection<CustomField> newIndPulldownFields = new CustomFieldCollection<>(); -            final CustomFieldCollection<CustomField> newGrpPulldownFields = new CustomFieldCollection<>(); - -            for (final CustomField field : resp.getCustomFields()) { -                if (field.getName().startsWith("udf_ind_text_")) { -                    newTextFields.add(field); -                } else if (field.getName().startsWith("udf_ind_date_")) { -                    newDateFields.add(field); -                } else if (field.getName().startsWith("udf_ind_pulldown_")) { -                    newIndPulldownFields.add(field); -                } else if (field.getName().startsWith("udf_grp_pulldown_")) { -                    newGrpPulldownFields.add(field); -                } else { -                    LOG.warn("Unknown custom field type " + field.getName()); -                } -            } - -            this.mTextFields = newTextFields; -            this.mDateFields = newDateFields; -            this.mIndividualPulldownFields = newIndPulldownFields; -            this.mGroupPulldownFields = newGrpPulldownFields; - -        } catch (IOException e) { -            // Error fetching labels. -            LOG.error("Error fetching custom fields: " + e.getMessage(), e); -        } -    } - -    private synchronized boolean cacheLookupTable(final LookupTableType type) { -        try { -            final GetLookupTableResponse resp = mAPI.getLookupTable(new GetLookupTableRequest().withType(type)); -            mItemByNameTable.put(type, resp.getItems().stream().collect( -                    Collectors.toMap(item -> item.getName().toLowerCase(), Function.identity()))); -            return true; - -        } catch (IOException e) { -            LOG.error("Exception caching lookup table of type " + type, e); -        } - -        return false; -    } -} diff --git a/src/com/p4square/grow/ccb/MonitoredCCBAPI.java b/src/com/p4square/grow/ccb/MonitoredCCBAPI.java deleted file mode 100644 index 43b6433..0000000 --- a/src/com/p4square/grow/ccb/MonitoredCCBAPI.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.p4square.grow.ccb; - -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.Timer; -import com.p4square.ccbapi.CCBAPI; -import com.p4square.ccbapi.model.*; - -import java.io.IOException; - -/** - * MonitoredCCBAPI is a CCBAPI decorator which records metrics for each API call. - */ -public class MonitoredCCBAPI implements CCBAPI { - -    private final CCBAPI mAPI; -    private final MetricRegistry mMetricRegistry; - -    public MonitoredCCBAPI(final CCBAPI api, final MetricRegistry metricRegistry) { -        if (api == null) { -            throw new IllegalArgumentException("api must not be null."); -        } -        mAPI = api; - -        if (metricRegistry == null) { -            throw new IllegalArgumentException("metricRegistry must not be null."); -        } -        mMetricRegistry = metricRegistry; -    } - -    @Override -    public GetCustomFieldLabelsResponse getCustomFieldLabels() throws IOException { -        final Timer.Context timer = mMetricRegistry.timer("CCBAPI.getCustomFieldLabels.time").time(); -        boolean success = false; -        try { -            final GetCustomFieldLabelsResponse resp = mAPI.getCustomFieldLabels(); -            success = true; -            return resp; -        } finally { -            timer.stop(); -            mMetricRegistry.counter("CCBAPI.getCustomFieldLabels.success").inc(success ? 1 : 0); -            mMetricRegistry.counter("CCBAPI.getCustomFieldLabels.failure").inc(!success ? 1 : 0); -        } -    } - -    @Override -    public GetLookupTableResponse getLookupTable(final GetLookupTableRequest request) throws IOException { -        final Timer.Context timer = mMetricRegistry.timer("CCBAPI.getLookupTable.time").time(); -        boolean success = false; -        try { -            final GetLookupTableResponse resp = mAPI.getLookupTable(request); -            success = true; -            return resp; -        } finally { -            timer.stop(); -            mMetricRegistry.counter("CCBAPI.getLookupTable.success").inc(success ? 1 : 0); -            mMetricRegistry.counter("CCBAPI.getLookupTable.failure").inc(!success ? 1 : 0); -        } -    } - -    @Override -    public GetIndividualProfilesResponse getIndividualProfiles(GetIndividualProfilesRequest request) -            throws IOException { -        final Timer.Context timer = mMetricRegistry.timer("CCBAPI.getIndividualProfiles").time(); -        boolean success = false; -        try { -            final GetIndividualProfilesResponse resp = mAPI.getIndividualProfiles(request); -            mMetricRegistry.counter("CCBAPI.getIndividualProfiles.count").inc(resp.getIndividuals().size()); -            success = true; -            return resp; -        } finally { -            timer.stop(); -            mMetricRegistry.counter("CCBAPI.getIndividualProfiles.success").inc(success ? 1 : 0); -            mMetricRegistry.counter("CCBAPI.getIndividualProfiles.failure").inc(!success ? 1 : 0); -        } -    } - -    @Override -    public UpdateIndividualProfileResponse updateIndividualProfile(UpdateIndividualProfileRequest request) throws IOException { -        final Timer.Context timer = mMetricRegistry.timer("CCBAPI.updateIndividualProfile").time(); -        boolean success = false; -        try { -            final UpdateIndividualProfileResponse resp = mAPI.updateIndividualProfile(request); -            success = true; -            return resp; -        } finally { -            timer.stop(); -            mMetricRegistry.counter("CCBAPI.updateIndividualProfile.success").inc(success ? 1 : 0); -            mMetricRegistry.counter("CCBAPI.updateIndividualProfile.failure").inc(!success ? 1 : 0); -        } -    } - -    @Override -    public void close() throws IOException { -        mAPI.close(); -    } -} | 
