001    /**
002     * Copyright (c) 2000-2010 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.portlet.assetpublisher.util;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.util.ArrayUtil;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.ListUtil;
022    import com.liferay.portal.kernel.util.ParamUtil;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.util.StringUtil;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.kernel.xml.Document;
027    import com.liferay.portal.kernel.xml.Element;
028    import com.liferay.portal.kernel.xml.SAXReaderUtil;
029    import com.liferay.portal.model.Group;
030    import com.liferay.portal.model.Layout;
031    import com.liferay.portal.service.LayoutLocalServiceUtil;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.WebKeys;
035    import com.liferay.portlet.PortletPreferencesFactoryUtil;
036    import com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil;
037    import com.liferay.portlet.asset.model.AssetEntry;
038    import com.liferay.portlet.asset.model.AssetRenderer;
039    import com.liferay.portlet.asset.model.AssetRendererFactory;
040    import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
041    import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;
042    import com.liferay.portlet.asset.service.persistence.AssetEntryQuery;
043    
044    import java.io.IOException;
045    
046    import java.util.HashMap;
047    import java.util.Iterator;
048    import java.util.List;
049    import java.util.Map;
050    
051    import javax.portlet.ActionRequest;
052    import javax.portlet.PortletPreferences;
053    import javax.portlet.PortletRequest;
054    
055    import javax.servlet.http.HttpServletRequest;
056    import javax.servlet.http.HttpSession;
057    
058    /**
059     * @author Raymond Augé
060     */
061    public class AssetPublisherUtil {
062    
063            public static void addAndStoreSelection(
064                            ActionRequest actionRequest, String className, long classPK,
065                            int assetEntryOrder)
066                    throws Exception {
067    
068                    String referringPortletResource =
069                            ParamUtil.getString(actionRequest, "referringPortletResource");
070    
071                    if (Validator.isNull(referringPortletResource)) {
072                            return;
073                    }
074    
075                    PortletPreferences preferences =
076                            PortletPreferencesFactoryUtil.getPortletSetup(
077                                    actionRequest, referringPortletResource);
078    
079                    String selectionStyle = preferences.getValue(
080                            "selection-style", "dynamic");
081    
082                    if (selectionStyle.equals("dynamic")) {
083                            return;
084                    }
085    
086                    AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(
087                            className, classPK);
088    
089                    addSelection(
090                            className, assetEntry.getEntryId(), assetEntryOrder, preferences);
091    
092                    preferences.store();
093            }
094    
095            public static void addRecentFolderId(
096                    PortletRequest portletRequest, String className, long classPK) {
097    
098                    _getRecentFolderIds(portletRequest).put(className, classPK);
099            }
100    
101            public static void addSelection(
102                            ActionRequest actionRequest, PortletPreferences preferences)
103                    throws Exception {
104    
105                    String assetEntryType = ParamUtil.getString(
106                            actionRequest, "assetEntryType");
107                    long assetEntryId = ParamUtil.getLong(actionRequest, "assetEntryId");
108                    int assetEntryOrder = ParamUtil.getInteger(
109                            actionRequest, "assetEntryOrder");
110    
111                    addSelection(
112                            assetEntryType, assetEntryId, assetEntryOrder, preferences);
113            }
114    
115            public static void addSelection(
116                            String assetEntryType, long assetEntryId, int assetEntryOrder,
117                            PortletPreferences preferences)
118                    throws Exception {
119    
120                    AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(
121                            assetEntryId);
122    
123                    AssetRendererFactory assetRendererFactory =
124                            AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
125                                    assetEntry.getClassName());
126    
127                    AssetRenderer assetRenderer = assetRendererFactory.getAssetRenderer(
128                            assetEntry.getClassPK(), AssetRendererFactory.TYPE_LATEST);
129    
130                    String[] assetEntryXmls = preferences.getValues(
131                            "asset-entry-xml", new String[0]);
132    
133                    String assetEntryXml = _getAssetEntryXml(
134                            assetEntryType, assetRenderer.getUuid());
135    
136                    if (assetEntryOrder > -1) {
137                            assetEntryXmls[assetEntryOrder] = assetEntryXml;
138                    }
139                    else {
140                            assetEntryXmls = ArrayUtil.append(assetEntryXmls, assetEntryXml);
141                    }
142    
143                    preferences.setValues("asset-entry-xml", assetEntryXmls);
144            }
145    
146            public static AssetEntryQuery getAssetEntryQuery(
147                            PortletPreferences preferences, long scopeGroupId)
148                    throws Exception {
149    
150                    AssetEntryQuery assetEntryQuery = new AssetEntryQuery();
151    
152                    long[] allAssetCategoryIds = new long[0];
153                    long[] anyAssetCategoryIds = new long[0];
154                    long[] notAllAssetCategoryIds = new long[0];
155                    long[] notAnyAssetCategoryIds = new long[0];
156    
157                    String[] allAssetTagNames = new String[0];
158                    String[] anyAssetTagNames = new String[0];
159                    String[] notAllAssetTagNames = new String[0];
160                    String[] notAnyAssetTagNames = new String[0];
161    
162                    for (int i = 0; true; i++) {
163                            String[] queryValues = preferences.getValues(
164                                    "queryValues" + i, null);
165    
166                            if ((queryValues == null) || (queryValues.length == 0)) {
167                                    break;
168                            }
169    
170                            boolean queryContains = GetterUtil.getBoolean(
171                                    preferences.getValue("queryContains" + i, StringPool.BLANK));
172                            boolean queryAndOperator = GetterUtil.getBoolean(
173                                    preferences.getValue("queryAndOperator" + i, StringPool.BLANK));
174                            String queryName = preferences.getValue(
175                                    "queryName" + i, StringPool.BLANK);
176    
177                            if (Validator.equals(queryName, "assetCategories")) {
178                                    long[] assetCategoryIds = GetterUtil.getLongValues(queryValues);
179    
180                                    if (queryContains && queryAndOperator) {
181                                            allAssetCategoryIds = assetCategoryIds;
182                                    }
183                                    else if (queryContains && !queryAndOperator) {
184                                            anyAssetCategoryIds = assetCategoryIds;
185                                    }
186                                    else if (!queryContains && queryAndOperator) {
187                                            notAllAssetCategoryIds = assetCategoryIds;
188                                    }
189                                    else {
190                                            notAnyAssetCategoryIds = assetCategoryIds;
191                                    }
192                            }
193                            else {
194                                    if (queryContains && queryAndOperator) {
195                                            allAssetTagNames = queryValues;
196                                    }
197                                    else if (queryContains && !queryAndOperator) {
198                                            anyAssetTagNames = queryValues;
199                                    }
200                                    else if (!queryContains && queryAndOperator) {
201                                            notAllAssetTagNames = queryValues;
202                                    }
203                                    else {
204                                            notAnyAssetTagNames = queryValues;
205                                    }
206                            }
207                    }
208    
209                    long[] allAssetTagIds = AssetTagLocalServiceUtil.getTagIds(
210                            scopeGroupId, allAssetTagNames);
211                    long[] anyAssetTagIds = AssetTagLocalServiceUtil.getTagIds(
212                            scopeGroupId, anyAssetTagNames);
213                    long[] notAllAssetTagIds = AssetTagLocalServiceUtil.getTagIds(
214                            scopeGroupId, notAllAssetTagNames);
215                    long[] notAnyAssetTagIds = AssetTagLocalServiceUtil.getTagIds(
216                            scopeGroupId, notAnyAssetTagNames);
217    
218                    assetEntryQuery.setAllCategoryIds(allAssetCategoryIds);
219                    assetEntryQuery.setAllTagIds(allAssetTagIds);
220                    assetEntryQuery.setAnyCategoryIds(anyAssetCategoryIds);
221                    assetEntryQuery.setAnyTagIds(anyAssetTagIds);
222                    assetEntryQuery.setNotAllCategoryIds(notAllAssetCategoryIds);
223                    assetEntryQuery.setNotAllTagIds(notAllAssetTagIds);
224                    assetEntryQuery.setNotAnyCategoryIds(notAnyAssetCategoryIds);
225                    assetEntryQuery.setNotAnyTagIds(notAnyAssetTagIds);
226    
227                    return assetEntryQuery;
228            }
229    
230            public static String[] getAssetTagNames(
231                            PortletPreferences preferences, long scopeGroupId)
232                    throws Exception {
233    
234                    String[] allAssetTagNames = new String[0];
235    
236                    for (int i = 0; true; i++) {
237                            String[] queryValues = preferences.getValues(
238                                    "queryValues" + i, null);
239    
240                            if ((queryValues == null) || (queryValues.length == 0)) {
241                                    break;
242                            }
243    
244                            boolean queryContains = GetterUtil.getBoolean(
245                                    preferences.getValue("queryContains" + i, StringPool.BLANK));
246                            boolean queryAndOperator = GetterUtil.getBoolean(
247                                    preferences.getValue("queryAndOperator" + i, StringPool.BLANK));
248                            String queryName = preferences.getValue(
249                                    "queryName" + i, StringPool.BLANK);
250    
251                            if (!Validator.equals(queryName, "assetCategories") &&
252                                    queryContains && queryAndOperator) {
253    
254                                    allAssetTagNames = queryValues;
255                            }
256                    }
257    
258                    return allAssetTagNames;
259            }
260    
261            public static long[] getClassNameIds(
262                    PortletPreferences preferences, long[] availableClassNameIds) {
263    
264                    boolean anyAssetType = GetterUtil.getBoolean(
265                            preferences.getValue("any-asset-type", Boolean.TRUE.toString()));
266    
267                    long[] classNameIds = null;
268    
269                    if (!anyAssetType &&
270                            (preferences.getValues("class-name-ids", null) != null)) {
271    
272                            classNameIds = GetterUtil.getLongValues(
273                                    preferences.getValues("class-name-ids", null));
274                    }
275                    else {
276                            classNameIds = availableClassNameIds;
277                    }
278    
279                    return classNameIds;
280            }
281    
282            public static long[] getGroupIds(
283                    PortletPreferences preferences, long scopeGroupId, Layout layout) {
284    
285                    long[] groupIds = new long[] {scopeGroupId};
286    
287                    boolean defaultScope = GetterUtil.getBoolean(
288                            preferences.getValue("default-scope", null), true);
289    
290                    if (!defaultScope) {
291                            String[] scopeIds = preferences.getValues(
292                                    "scope-ids",
293                                    new String[] {"group" + StringPool.UNDERLINE + scopeGroupId});
294    
295                            groupIds = new long[scopeIds.length];
296    
297                            for (int i = 0; i < scopeIds.length; i++) {
298                                    try {
299                                            String[] scopeIdFragments = StringUtil.split(
300                                                    scopeIds[i], StringPool.UNDERLINE);
301    
302                                            if (scopeIdFragments[0].equals("Layout")) {
303                                                    long scopeIdLayoutId = GetterUtil.getLong(
304                                                            scopeIdFragments[1]);
305    
306                                                    Layout scopeIdLayout =
307                                                            LayoutLocalServiceUtil.getLayout(
308                                                                    scopeGroupId, layout.isPrivateLayout(),
309                                                                    scopeIdLayoutId);
310    
311                                                    Group scopeIdGroup = scopeIdLayout.getScopeGroup();
312    
313                                                    groupIds[i] = scopeIdGroup.getGroupId();
314                                            }
315                                            else {
316                                                    long scopeIdGroupId = GetterUtil.getLong(
317                                                            scopeIdFragments[1]);
318    
319                                                    groupIds[i] = scopeIdGroupId;
320                                            }
321                                    }
322                                    catch (Exception e) {
323                                            continue;
324                                    }
325                            }
326                    }
327    
328                    return groupIds;
329            }
330    
331            public static long getRecentFolderId(
332                    PortletRequest portletRequest, String className) {
333    
334                    Long classPK = _getRecentFolderIds(portletRequest).get(className);
335    
336                    if (classPK == null) {
337                            return 0;
338                    }
339                    else {
340                            return classPK.longValue();
341                    }
342            }
343    
344            public static void removeAndStoreSelection(
345                            List<String> assetEntryUuids, PortletPreferences preferences)
346                    throws Exception {
347    
348                    if (assetEntryUuids.size() == 0) {
349                            return;
350                    }
351    
352                    String[] assetEntryXmls = preferences.getValues(
353                            "asset-entry-xml", new String[0]);
354    
355                    List<String> assetEntryXmlsList = ListUtil.fromArray(assetEntryXmls);
356    
357                    Iterator<String> itr = assetEntryXmlsList.iterator();
358    
359                    while (itr.hasNext()) {
360                            String assetEntryXml = itr.next();
361    
362                            Document document = SAXReaderUtil.read(assetEntryXml);
363    
364                            Element rootElement = document.getRootElement();
365    
366                            String assetEntryUuid = rootElement.elementText("asset-entry-uuid");
367    
368                            if (assetEntryUuids.contains(assetEntryUuid)) {
369                                    itr.remove();
370                            }
371                    }
372    
373                    preferences.setValues(
374                            "asset-entry-xml",
375                            assetEntryXmlsList.toArray(new String[assetEntryXmlsList.size()]));
376    
377                    preferences.store();
378            }
379    
380            public static void removeRecentFolderId(
381                    PortletRequest portletRequest, String className, long classPK) {
382    
383                    if (getRecentFolderId(portletRequest, className) == classPK) {
384                            _getRecentFolderIds(portletRequest).remove(className);
385                    }
386            }
387    
388            private static String _getAssetEntryXml(
389                    String assetEntryType, String assetEntryUuid) {
390    
391                    String xml = null;
392    
393                    try {
394                            Document document = SAXReaderUtil.createDocument(StringPool.UTF8);
395    
396                            Element assetEntryElement = document.addElement("asset-entry");
397    
398                            Element assetEntryTypeElement = assetEntryElement.addElement(
399                                    "asset-entry-type");
400    
401                            assetEntryTypeElement.addText(assetEntryType);
402    
403                            Element assetEntryUuidElement = assetEntryElement.addElement(
404                                    "asset-entry-uuid");
405    
406                            assetEntryUuidElement.addText(assetEntryUuid);
407    
408                            xml = document.formattedString(StringPool.BLANK);
409                    }
410                    catch (IOException ioe) {
411                            if (_log.isWarnEnabled()) {
412                                    _log.warn(ioe);
413                            }
414                    }
415    
416                    return xml;
417            }
418    
419            private static Map<String, Long> _getRecentFolderIds(
420                    PortletRequest portletRequest) {
421    
422                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
423                            portletRequest);
424                    HttpSession session = request.getSession();
425    
426                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
427                            WebKeys.THEME_DISPLAY);
428    
429                    String key =
430                            AssetPublisherUtil.class + StringPool.UNDERLINE +
431                                    themeDisplay.getScopeGroupId();
432    
433                    Map<String, Long> recentFolderIds =
434                            (Map<String, Long>)session.getAttribute(key);
435    
436                    if (recentFolderIds == null) {
437                            recentFolderIds = new HashMap<String, Long>();
438                    }
439    
440                    session.setAttribute(key, recentFolderIds);
441    
442                    return recentFolderIds;
443            }
444    
445            private static Log _log = LogFactoryUtil.getLog(AssetPublisherUtil.class);
446    
447    }