001/*
002 * (C) Copyright 2016 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Florent Guillaume
018 */
019package org.nuxeo.ecm.automation.features;
020
021import org.apache.commons.lang.StringUtils;
022import org.apache.commons.logging.Log;
023import org.apache.commons.logging.LogFactory;
024import org.nuxeo.ecm.core.schema.types.Schema;
025import org.nuxeo.ecm.platform.usermanager.UserConfig;
026import org.nuxeo.runtime.api.Framework;
027import org.nuxeo.runtime.services.config.ConfigurationService;
028
029import net.sf.json.JSONObject;
030
031/**
032 * Constants used to generate JSON for suggestion in operations.
033 */
034public class SuggestConstants {
035
036    private static final Log log = LogFactory.getLog(SuggestConstants.class);
037
038    public static final String LANG_TOKEN = "{lang}";
039
040    private static final String FORCE_DISPLAY_EMAIL_IN_SUGGESTION = "nuxeo.ui.displayEmailInUserSuggestion";
041
042    public static final String ID = "id";
043
044    public static final String LABEL = "displayLabel";
045
046    public static final String ICON = "icon";
047
048    public static final String DEFAULT_LANG = "en";
049
050    public static final String USER_TYPE = "USER_TYPE";
051
052    public static final String GROUP_TYPE = "GROUP_TYPE";
053
054    public static final String TYPE_KEY_NAME = "type";
055
056    public static final String PREFIXED_ID_KEY_NAME = "prefixed_id";
057
058    protected static Boolean forceDisplayEmailInSuggestion = null;
059
060    public static final String DISPLAY_ICON = "displayIcon";
061
062    public static final String PARENT_FIELD_ID = "parent";
063
064    public static final String OBSOLETE_FIELD_ID = "obsolete";
065
066    public static final String ABSOLUTE_LABEL = "absoluteLabel";
067
068    public static final String COMPUTED_ID = "computedId";
069
070    public static final String WARN_MESSAGE_LABEL = "warn_message";
071
072    public static final String DIRECTORY_ORDER_FIELD_NAME = "ordering";
073
074    public static final String DIRECTORY_DEFAULT_LABEL_COL_NAME = "label";
075
076    public static final String DEFAULT_KEY_SEPARATOR = "/";
077
078    public static void computeGroupLabel(final JSONObject obj, final String groupId, final String groupLabelField,
079            final boolean hideFirstLabel) {
080        String label = null;
081        if (hideFirstLabel) {
082            label = groupId;
083        } else {
084            String groupLabelValue = obj.optString(groupLabelField);
085            if (StringUtils.isNotBlank(groupLabelValue)) {
086                label = groupLabelValue;
087            } else {
088                label = groupId;
089            }
090        }
091        obj.put(LABEL, label);
092    }
093
094    public static void computeUserGroupIcon(final JSONObject obj, final boolean hideIcon) {
095        if (obj != null) {
096            if (!hideIcon) {
097                String userGroupType = obj.optString(TYPE_KEY_NAME);
098                obj.element(DISPLAY_ICON, StringUtils.isNotBlank(userGroupType)
099                        && (userGroupType.equals(USER_TYPE) || userGroupType.equals(GROUP_TYPE)));
100            }
101        }
102    }
103
104    public static void computeUserLabel(final JSONObject obj, final String firstLabelField,
105            final String secondLabelField, final String thirdLabelField, final boolean hideFirstLabel,
106            final boolean hideSecondLabel, final boolean hideThirdLabel, boolean displayEmailInSuggestion,
107            final String userId) {
108        String result = "";
109        if (obj != null) {
110
111            if (StringUtils.isNotBlank(firstLabelField) && !hideFirstLabel) {
112                // If firtLabelField given and first label not hidden
113                final String firstLabel = obj.optString(firstLabelField);
114                result += StringUtils.isNotBlank(firstLabel) ? firstLabel : "";
115            } else if (!hideFirstLabel) {
116                // Else we use firstname
117                final String firstname = obj.optString(UserConfig.FIRSTNAME_COLUMN);
118                result += StringUtils.isNotBlank(firstname) ? firstname : "";
119            }
120
121            if (StringUtils.isNotBlank(secondLabelField) && !hideSecondLabel) {
122                // If secondLabelField given and second label not hidden
123                final String secondLabel = obj.optString(firstLabelField);
124                if (StringUtils.isNotBlank(secondLabel)) {
125                    if (StringUtils.isNotBlank(result)) {
126                        result += " ";
127                    }
128                    result += secondLabel;
129                }
130            } else if (!hideSecondLabel) {
131                // Else we use lastname
132                final String lastname = obj.optString(UserConfig.LASTNAME_COLUMN);
133                if (StringUtils.isNotBlank(lastname)) {
134                    if (StringUtils.isNotBlank(result)) {
135                        result += " ";
136                    }
137                    result += lastname;
138                }
139            }
140            if (StringUtils.isBlank(result)) {
141                // At this point, if returned label is empty, we use user id
142                result += StringUtils.isNotBlank(userId) ? userId : "";
143            }
144
145            if (isForceDisplayEmailInSuggestion() || (displayEmailInSuggestion && !hideThirdLabel)) {
146                if (StringUtils.isNotBlank(thirdLabelField)) {
147                    final String thirdLabel = obj.optString(thirdLabelField);
148                    if (StringUtils.isNotBlank(thirdLabel)) {
149                        if (StringUtils.isNotBlank(result)) {
150                            result += " ";
151                        }
152                        result += thirdLabel;
153                    }
154                } else {
155                    // Else we use email
156                    String email = obj.optString(UserConfig.EMAIL_COLUMN);
157                    if (StringUtils.isNotBlank(email)) {
158                        if (StringUtils.isNotBlank(result)) {
159                            result += " ";
160                        }
161                        result += email;
162                    }
163                }
164            }
165
166            obj.put(LABEL, result);
167        }
168    }
169
170    /**
171     * Compute the field name of the directory that holds the value that we want to display.
172     *
173     * @param schema the directory schema
174     * @param dbl10n are translations carried by directory fields
175     * @param labelFieldName the name or pattern of the fields that held values
176     * @param lang the current language
177     * @throws IllegalArgumentException when cannot compute label field name
178     * @return the final field name where we pick up the value
179     * @since 5.7.3
180     */
181    public static String getLabelFieldName(final Schema schema, boolean dbl10n, String labelFieldName,
182            final String lang) {
183        if (labelFieldName == null || labelFieldName.isEmpty()) {
184            // No labelFieldName provided, we assume it is 'label'
185            labelFieldName = DIRECTORY_DEFAULT_LABEL_COL_NAME;
186        }
187        if (dbl10n) {
188            int i = labelFieldName.indexOf(LANG_TOKEN);
189            if (i >= 0) {
190                // a pattern is provided, let's compute the field name
191                // according
192                // to the current lang
193                StringBuffer buf = new StringBuffer();
194                buf.append(labelFieldName.substring(0, i));
195                buf.append(lang);
196                buf.append(labelFieldName.substring(i + LANG_TOKEN.length()));
197                String result = buf.toString();
198                if (schema.getField(result) != null) {
199                    return result;
200                } else {
201                    // there is no field for the current lang, let's pick
202                    // english by default
203                    buf = new StringBuffer();
204                    buf.append(labelFieldName.substring(0, i));
205                    buf.append(DEFAULT_LANG);
206                    buf.append(labelFieldName.substring(i + LANG_TOKEN.length()));
207                    return buf.toString();
208                }
209            } else {
210                // No pattern
211                String result = labelFieldName + "_" + lang;
212                if (schema.getField(result) != null) {
213                    // we assume that fields are named like 'xxx_en',
214                    // 'xxx_fr', etc.
215                    return result;
216                }
217
218                log.warn(String.format(
219                        "Unable to find field %s in directory schema %s. Trying to fallback on default one.",
220                        labelFieldName, schema.getName()));
221
222                result = DIRECTORY_DEFAULT_LABEL_COL_NAME + "_" + DEFAULT_LANG;
223                if (schema.getField(result) != null) {
224                    // no available locale, fallback to english by default
225                    return result;
226                }
227                result = DIRECTORY_DEFAULT_LABEL_COL_NAME;
228                if (schema.getField(result) != null) {
229                    // no available default locale, fallback to label
230                    return result;
231                }
232
233                if (schema.getField(labelFieldName) != null) {
234                    // let's pretend this is not dbl10n
235                    return labelFieldName;
236                }
237
238                throw new IllegalArgumentException(String.format("Unable to find field %s in directory schema %s",
239                        labelFieldName, schema.getName()));
240            }
241        } else {
242            if (schema.getField(labelFieldName) != null) {
243                return labelFieldName;
244            } else {
245                throw new IllegalArgumentException(String.format("Unable to find field %s in directory schema %s",
246                        labelFieldName, schema.getName()));
247            }
248        }
249    }
250
251    protected static boolean isForceDisplayEmailInSuggestion() {
252        if (forceDisplayEmailInSuggestion == null) {
253            ConfigurationService cs = Framework.getService(ConfigurationService.class);
254            forceDisplayEmailInSuggestion = cs.isBooleanPropertyTrue(FORCE_DISPLAY_EMAIL_IN_SUGGESTION);
255        }
256        return forceDisplayEmailInSuggestion;
257    }
258
259    // no instantiation
260    protected SuggestConstants() {
261    }
262
263}