001
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
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 }