summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/ccb/CustomFieldCache.java
blob: d93e6d91ef6eaf48270c7cd8018f260132e40457 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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;
    }
}