001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.servlet.taglib.ui;
016    
017    import com.liferay.portal.kernel.util.ListUtil;
018    import com.liferay.portal.kernel.util.StringPool;
019    import com.liferay.portal.kernel.util.Validator;
020    import com.liferay.portal.model.User;
021    import com.liferay.registry.Registry;
022    import com.liferay.registry.RegistryUtil;
023    import com.liferay.registry.ServiceReference;
024    import com.liferay.registry.collections.ServiceReferenceMapper;
025    import com.liferay.registry.collections.ServiceTrackerCollections;
026    import com.liferay.registry.collections.ServiceTrackerMap;
027    
028    import java.util.ArrayList;
029    import java.util.List;
030    import java.util.Locale;
031    
032    /**
033     * @author Sergio Gonz??lez
034     */
035    public class FormNavigatorEntryUtil {
036    
037            public static <T> List<FormNavigatorEntry<T>> getFormNavigatorEntries(
038                    String formNavigatorId, String categoryKey, User user,
039                    T formModelBean) {
040    
041                    @SuppressWarnings("rawtypes")
042                    List<FormNavigatorEntry<T>> formNavigatorEntries =
043                            (List)_instance._formNavigatorEntries.getService(
044                                    _getKey(formNavigatorId, categoryKey));
045    
046                    return filterVisibleFormNavigatorEntries(
047                            formNavigatorEntries, user, formModelBean);
048            }
049    
050            public static <T> List<FormNavigatorEntry<T>> getFormNavigatorEntries(
051                    String formNavigatorId, User user, T formModelBean) {
052    
053                    List<FormNavigatorEntry<T>> formNavigatorEntries = new ArrayList<>();
054    
055                    String[] categoryKeys = FormNavigatorCategoryUtil.getKeys(
056                            formNavigatorId);
057    
058                    for (String categoryKey : categoryKeys) {
059    
060                            @SuppressWarnings("rawtypes")
061                            List<FormNavigatorEntry<T>> curFormNavigatorEntries =
062                                    (List)_instance._formNavigatorEntries.getService(
063                                            _getKey(formNavigatorId, categoryKey));
064    
065                            if (curFormNavigatorEntries != null) {
066                                    formNavigatorEntries.addAll(curFormNavigatorEntries);
067                            }
068                    }
069    
070                    return filterVisibleFormNavigatorEntries(
071                            formNavigatorEntries, user, formModelBean);
072            }
073    
074            public static <T> String[] getKeys(
075                    String formNavigatorId, String categoryKey, User user,
076                    T formModelBean) {
077    
078                    List<String> keys = new ArrayList<>();
079    
080                    List<FormNavigatorEntry<T>> formNavigatorEntries =
081                            getFormNavigatorEntries(
082                                    formNavigatorId, categoryKey, user, formModelBean);
083    
084                    for (FormNavigatorEntry<T> formNavigatorEntry : formNavigatorEntries) {
085                            String key = formNavigatorEntry.getKey();
086    
087                            if (Validator.isNotNull(key)) {
088                                    keys.add(key);
089                            }
090                    }
091    
092                    return keys.toArray(new String[keys.size()]);
093            }
094    
095            public static <T> String[] getLabels(
096                    String formNavigatorId, String categoryKey, User user, T formModelBean,
097                    Locale locale) {
098    
099                    List<String> labels = new ArrayList<>();
100    
101                    List<FormNavigatorEntry<T>> formNavigatorEntries =
102                            getFormNavigatorEntries(
103                                    formNavigatorId, categoryKey, user, formModelBean);
104    
105                    for (FormNavigatorEntry<T> formNavigatorEntry : formNavigatorEntries) {
106                            String label = formNavigatorEntry.getLabel(locale);
107    
108                            if (Validator.isNotNull(label)) {
109                                    labels.add(label);
110                            }
111                    }
112    
113                    return labels.toArray(new String[labels.size()]);
114            }
115    
116            protected static <T> List<FormNavigatorEntry<T>>
117                    filterVisibleFormNavigatorEntries(
118                            List<FormNavigatorEntry<T>> formNavigatorEntries, User user,
119                            T formModelBean) {
120    
121                    List<FormNavigatorEntry<T>> filterFormNavigatorEntries =
122                            new ArrayList<>();
123    
124                    if (ListUtil.isEmpty(formNavigatorEntries)) {
125                            return filterFormNavigatorEntries;
126                    }
127    
128                    for (FormNavigatorEntry<T> formNavigatorEntry : formNavigatorEntries) {
129                            if (formNavigatorEntry.isVisible(user, formModelBean)) {
130                                    filterFormNavigatorEntries.add(formNavigatorEntry);
131                            }
132                    }
133    
134                    return filterFormNavigatorEntries;
135            }
136    
137            private static String _getKey(String formNavigatorId, String categoryKey) {
138                    return formNavigatorId + StringPool.PERIOD + categoryKey;
139            }
140    
141            @SuppressWarnings("rawtypes")
142            private FormNavigatorEntryUtil() {
143                    _formNavigatorEntries = ServiceTrackerCollections.openMultiValueMap(
144                            FormNavigatorEntry.class, null,
145                            new ServiceReferenceMapper<String, FormNavigatorEntry>() {
146    
147                                    @Override
148                                    public void map(
149                                            ServiceReference<FormNavigatorEntry> serviceReference,
150                                            Emitter<String> emitter) {
151    
152                                            Registry registry = RegistryUtil.getRegistry();
153    
154                                            FormNavigatorEntry<?> formNavigatorEntry =
155                                                    registry.getService(serviceReference);
156    
157                                            emitter.emit(
158                                                    _getKey(
159                                                            formNavigatorEntry.getFormNavigatorId(),
160                                                            formNavigatorEntry.getCategoryKey()));
161    
162                                            registry.ungetService(serviceReference);
163                                    }
164    
165                            });
166            }
167    
168            private static final FormNavigatorEntryUtil _instance =
169                    new FormNavigatorEntryUtil();
170    
171            @SuppressWarnings("rawtypes")
172            private final ServiceTrackerMap<String, List<FormNavigatorEntry>>
173                    _formNavigatorEntries;
174    
175    }