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.portlet.assetpublisher.action;
016    
017    import com.liferay.portal.kernel.json.JSONFactoryUtil;
018    import com.liferay.portal.kernel.json.JSONObject;
019    import com.liferay.portal.kernel.portlet.DefaultConfigurationAction;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.servlet.SessionMessages;
022    import com.liferay.portal.kernel.staging.LayoutStagingUtil;
023    import com.liferay.portal.kernel.staging.StagingUtil;
024    import com.liferay.portal.kernel.util.ArrayUtil;
025    import com.liferay.portal.kernel.util.Constants;
026    import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
027    import com.liferay.portal.kernel.util.GetterUtil;
028    import com.liferay.portal.kernel.util.LocaleUtil;
029    import com.liferay.portal.kernel.util.ParamUtil;
030    import com.liferay.portal.kernel.util.StringPool;
031    import com.liferay.portal.kernel.util.StringUtil;
032    import com.liferay.portal.kernel.util.UnicodeProperties;
033    import com.liferay.portal.kernel.util.Validator;
034    import com.liferay.portal.model.GroupConstants;
035    import com.liferay.portal.model.Layout;
036    import com.liferay.portal.model.LayoutRevision;
037    import com.liferay.portal.model.LayoutSetBranch;
038    import com.liferay.portal.model.LayoutTypePortletConstants;
039    import com.liferay.portal.security.auth.PrincipalException;
040    import com.liferay.portal.service.LayoutLocalServiceUtil;
041    import com.liferay.portal.service.LayoutRevisionLocalServiceUtil;
042    import com.liferay.portal.service.ServiceContext;
043    import com.liferay.portal.service.ServiceContextFactory;
044    import com.liferay.portal.theme.ThemeDisplay;
045    import com.liferay.portal.util.PortalUtil;
046    import com.liferay.portal.util.PropsValues;
047    import com.liferay.portal.util.WebKeys;
048    import com.liferay.portlet.PortletPreferencesImpl;
049    import com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil;
050    import com.liferay.portlet.asset.AssetTagException;
051    import com.liferay.portlet.asset.DuplicateQueryRuleException;
052    import com.liferay.portlet.asset.model.AssetQueryRule;
053    import com.liferay.portlet.asset.model.AssetRendererFactory;
054    import com.liferay.portlet.asset.model.ClassType;
055    import com.liferay.portlet.asset.model.ClassTypeReader;
056    import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;
057    import com.liferay.portlet.assetpublisher.util.AssetPublisher;
058    import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
059    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
060    import com.liferay.portlet.dynamicdatamapping.storage.Field;
061    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
062    import com.liferay.portlet.dynamicdatamapping.util.DDMUtil;
063    import com.liferay.util.ContentUtil;
064    
065    import java.io.Serializable;
066    
067    import java.text.DateFormat;
068    
069    import java.util.ArrayList;
070    import java.util.Date;
071    import java.util.List;
072    
073    import javax.portlet.ActionRequest;
074    import javax.portlet.ActionResponse;
075    import javax.portlet.PortletConfig;
076    import javax.portlet.PortletPreferences;
077    import javax.portlet.PortletRequest;
078    import javax.portlet.ResourceRequest;
079    import javax.portlet.ResourceResponse;
080    
081    import javax.servlet.http.HttpServletRequest;
082    
083    /**
084     * @author Brian Wing Shun Chan
085     * @author Juan Fern??ndez
086     */
087    public class ConfigurationActionImpl extends DefaultConfigurationAction {
088    
089            @Override
090            public void postProcess(
091                    long companyId, PortletRequest portletRequest,
092                    PortletPreferences portletPreferences) {
093    
094                    String languageId = LocaleUtil.toLanguageId(
095                            LocaleUtil.getSiteDefault());
096    
097                    removeDefaultValue(
098                            portletRequest, portletPreferences,
099                            "emailAssetEntryAddedBody_" + languageId,
100                            ContentUtil.get(
101                                    PropsValues.ASSET_PUBLISHER_EMAIL_ASSET_ENTRY_ADDED_BODY));
102                    removeDefaultValue(
103                            portletRequest, portletPreferences,
104                            "emailAssetEntryAddedSubject_" + languageId,
105                            ContentUtil.get(
106                                    PropsValues.ASSET_PUBLISHER_EMAIL_ASSET_ENTRY_ADDED_SUBJECT));
107            }
108    
109            @Override
110            public void processAction(
111                            PortletConfig portletConfig, ActionRequest actionRequest,
112                            ActionResponse actionResponse)
113                    throws Exception {
114    
115                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
116    
117                    String portletResource = ParamUtil.getString(
118                            actionRequest, "portletResource");
119    
120                    PortletPreferences preferences = actionRequest.getPreferences();
121    
122                    if (cmd.equals(Constants.TRANSLATE)) {
123                            super.processAction(portletConfig, actionRequest, actionResponse);
124                    }
125                    else if (cmd.equals(Constants.UPDATE)) {
126                            try {
127                                    validateEmail(actionRequest, "emailAssetEntryAdded");
128                                    validateEmailFrom(actionRequest);
129    
130                                    updateDisplaySettings(actionRequest);
131    
132                                    String selectionStyle = getParameter(
133                                            actionRequest, "selectionStyle");
134    
135                                    if (selectionStyle.equals("dynamic")) {
136                                            updateQueryLogic(actionRequest, preferences);
137                                    }
138    
139                                    updateDefaultAssetPublisher(actionRequest);
140    
141                                    super.processAction(
142                                            portletConfig, actionRequest, actionResponse);
143                            }
144                            catch (Exception e) {
145                                    if (e instanceof AssetTagException ||
146                                            e instanceof DuplicateQueryRuleException) {
147    
148                                            SessionErrors.add(actionRequest, e.getClass(), e);
149                                    }
150                                    else {
151                                            throw e;
152                                    }
153                            }
154                    }
155                    else {
156                            if (cmd.equals("add-scope")) {
157                                    addScope(actionRequest, preferences);
158                            }
159                            else if (cmd.equals("add-selection")) {
160                                    AssetPublisherUtil.addSelection(
161                                            actionRequest, preferences, portletResource);
162                            }
163                            else if (cmd.equals("move-selection-down")) {
164                                    moveSelectionDown(actionRequest, preferences);
165                            }
166                            else if (cmd.equals("move-selection-up")) {
167                                    moveSelectionUp(actionRequest, preferences);
168                            }
169                            else if (cmd.equals("remove-selection")) {
170                                    removeSelection(actionRequest, preferences);
171                            }
172                            else if (cmd.equals("remove-scope")) {
173                                    removeScope(actionRequest, preferences);
174                            }
175                            else if (cmd.equals("select-scope")) {
176                                    setScopes(actionRequest, preferences);
177                            }
178                            else if (cmd.equals("selection-style")) {
179                                    setSelectionStyle(actionRequest, preferences);
180                            }
181    
182                            if (SessionErrors.isEmpty(actionRequest)) {
183                                    preferences.store();
184    
185                                    SessionMessages.add(
186                                            actionRequest,
187                                            PortalUtil.getPortletId(actionRequest) +
188                                                    SessionMessages.KEY_SUFFIX_REFRESH_PORTLET,
189                                            portletResource);
190    
191                                    SessionMessages.add(
192                                            actionRequest,
193                                            PortalUtil.getPortletId(actionRequest) +
194                                                    SessionMessages.KEY_SUFFIX_UPDATED_CONFIGURATION);
195                            }
196    
197                            String redirect = PortalUtil.escapeRedirect(
198                                    ParamUtil.getString(actionRequest, "redirect"));
199    
200                            if (Validator.isNotNull(redirect)) {
201                                    actionResponse.sendRedirect(redirect);
202                            }
203                    }
204            }
205    
206            @Override
207            public void serveResource(
208                            PortletConfig portletConfig, ResourceRequest resourceRequest,
209                            ResourceResponse resourceResponse)
210                    throws Exception {
211    
212                    ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute(
213                            WebKeys.THEME_DISPLAY);
214    
215                    String cmd = ParamUtil.getString(resourceRequest, Constants.CMD);
216    
217                    if (!cmd.equals("getFieldValue")) {
218                            return;
219                    }
220    
221                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
222                            resourceRequest);
223    
224                    long structureId = ParamUtil.getLong(resourceRequest, "structureId");
225    
226                    Fields fields = (Fields)serviceContext.getAttribute(
227                            Fields.class.getName() + structureId);
228    
229                    if (fields == null) {
230                            String fieldsNamespace = ParamUtil.getString(
231                                    resourceRequest, "fieldsNamespace");
232    
233                            fields = DDMUtil.getFields(
234                                    structureId, fieldsNamespace, serviceContext);
235                    }
236    
237                    String fieldName = ParamUtil.getString(resourceRequest, "name");
238    
239                    Field field = fields.get(fieldName);
240    
241                    Serializable fieldValue = field.getValue(themeDisplay.getLocale(), 0);
242    
243                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
244    
245                    if (fieldValue != null) {
246                            jsonObject.put("success", true);
247                    }
248                    else {
249                            jsonObject.put("success", false);
250    
251                            writeJSON(resourceRequest, resourceResponse, jsonObject);
252    
253                            return;
254                    }
255    
256                    DDMStructure ddmStructure = field.getDDMStructure();
257    
258                    String type = ddmStructure.getFieldType(fieldName);
259    
260                    Serializable displayValue = DDMUtil.getDisplayFieldValue(
261                            themeDisplay, fieldValue, type);
262    
263                    jsonObject.put("displayValue", String.valueOf(displayValue));
264    
265                    if (fieldValue instanceof Boolean) {
266                            jsonObject.put("value", (Boolean)fieldValue);
267                    }
268                    else if (fieldValue instanceof Date) {
269                            DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
270                                    "yyyyMMddHHmmss");
271    
272                            jsonObject.put("value", dateFormat.format(fieldValue));
273                    }
274                    else if (fieldValue instanceof Double) {
275                            jsonObject.put("value", (Double)fieldValue);
276                    }
277                    else if (fieldValue instanceof Float) {
278                            jsonObject.put("value", (Float)fieldValue);
279                    }
280                    else if (fieldValue instanceof Integer) {
281                            jsonObject.put("value", (Integer)fieldValue);
282                    }
283                    else if (fieldValue instanceof Number) {
284                            jsonObject.put("value", String.valueOf(fieldValue));
285                    }
286                    else {
287                            jsonObject.put("value", (String)fieldValue);
288                    }
289    
290                    writeJSON(resourceRequest, resourceResponse, jsonObject);
291            }
292    
293            protected void addScope(
294                            ActionRequest actionRequest, PortletPreferences preferences)
295                    throws Exception {
296    
297                    String[] scopeIds = preferences.getValues(
298                            "scopeIds",
299                            new String[] {
300                                    AssetPublisher.SCOPE_ID_GROUP_PREFIX + GroupConstants.DEFAULT
301                            });
302    
303                    String scopeId = ParamUtil.getString(actionRequest, "scopeId");
304    
305                    checkPermission(actionRequest, scopeId);
306    
307                    if (!ArrayUtil.contains(scopeIds, scopeId)) {
308                            scopeIds = ArrayUtil.append(scopeIds, scopeId);
309                    }
310    
311                    preferences.setValues("scopeIds", scopeIds);
312            }
313    
314            protected void checkPermission(ActionRequest actionRequest, String scopeId)
315                    throws Exception {
316    
317                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
318                            WebKeys.THEME_DISPLAY);
319    
320                    Layout layout = themeDisplay.getLayout();
321    
322                    if (!AssetPublisherUtil.isScopeIdSelectable(
323                                    themeDisplay.getPermissionChecker(), scopeId,
324                                    themeDisplay.getCompanyGroupId(), layout)) {
325    
326                            throw new PrincipalException();
327                    }
328            }
329    
330            protected String getAssetClassName(
331                            ActionRequest actionRequest, String[] classNameIds)
332                    throws Exception {
333    
334                    String anyAssetTypeString = getParameter(actionRequest, "anyAssetType");
335    
336                    boolean anyAssetType = GetterUtil.getBoolean(anyAssetTypeString);
337    
338                    if (anyAssetType) {
339                            return null;
340                    }
341    
342                    long defaultAssetTypeId = GetterUtil.getLong(anyAssetTypeString);
343    
344                    if ((defaultAssetTypeId == 0) && (classNameIds.length == 1)) {
345                            defaultAssetTypeId = GetterUtil.getLong(classNameIds[0]);
346                    }
347    
348                    if (defaultAssetTypeId <= 0 ) {
349                            return null;
350                    }
351    
352                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
353                            WebKeys.THEME_DISPLAY);
354    
355                    String className = PortalUtil.getClassName(defaultAssetTypeId);
356    
357                    AssetRendererFactory assetRendererFactory =
358                            AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
359                                    className);
360    
361                    ClassTypeReader classTypeReader =
362                            assetRendererFactory.getClassTypeReader();
363    
364                    List<ClassType> classTypes = classTypeReader.getAvailableClassTypes(
365                            PortalUtil.getCurrentAndAncestorSiteGroupIds(
366                                    themeDisplay.getSiteGroupId()),
367                            themeDisplay.getLocale());
368    
369                    if (classTypes.isEmpty()) {
370                            return null;
371                    }
372    
373                    String assetClassName = AssetPublisherUtil.getClassName(
374                            assetRendererFactory);
375    
376                    return assetClassName;
377            }
378    
379            protected String[] getClassTypeIds(
380                            ActionRequest actionRequest, String[] classNameIds)
381                    throws Exception {
382    
383                    String assetClassName = getAssetClassName(actionRequest, classNameIds);
384    
385                    if (assetClassName == null) {
386                            return null;
387                    }
388    
389                    String anyAssetClassTypeString = getParameter(
390                            actionRequest, "anyClassType" + assetClassName);
391    
392                    boolean anyAssetClassType = GetterUtil.getBoolean(
393                            anyAssetClassTypeString);
394    
395                    if (anyAssetClassType) {
396                            return null;
397                    }
398    
399                    long defaultAssetClassTypeId = GetterUtil.getLong(
400                            anyAssetClassTypeString);
401    
402                    if (defaultAssetClassTypeId > 0) {
403                            return new String[] {String.valueOf(defaultAssetClassTypeId)};
404                    }
405                    else {
406                            return StringUtil.split(
407                                    getParameter(actionRequest, "classTypeIds" + assetClassName));
408                    }
409            }
410    
411            protected AssetQueryRule getQueryRule(
412                    ActionRequest actionRequest, int index) {
413    
414                    boolean contains = ParamUtil.getBoolean(
415                            actionRequest, "queryContains" + index);
416                    boolean andOperator = ParamUtil.getBoolean(
417                            actionRequest, "queryAndOperator" + index);
418    
419                    String name = ParamUtil.getString(actionRequest, "queryName" + index);
420    
421                    String[] values = null;
422    
423                    if (name.equals("assetTags")) {
424                            values = StringUtil.split(
425                                    ParamUtil.getString(actionRequest, "queryTagNames" + index));
426                    }
427                    else {
428                            values = StringUtil.split(
429                                    ParamUtil.getString(actionRequest, "queryCategoryIds" + index));
430                    }
431    
432                    return new AssetQueryRule(contains, andOperator, name, values);
433            }
434    
435            protected boolean getSubtypesFieldsFilterEnabled(
436                            ActionRequest actionRequest, String[] classNameIds)
437                    throws Exception {
438    
439                    String assetClassName = getAssetClassName(actionRequest, classNameIds);
440    
441                    if (assetClassName == null) {
442                            return false;
443                    }
444    
445                    return GetterUtil.getBoolean(
446                            getParameter(
447                                    actionRequest, "subtypeFieldsFilterEnabled" + assetClassName));
448            }
449    
450            protected void moveSelectionDown(
451                            ActionRequest actionRequest, PortletPreferences preferences)
452                    throws Exception {
453    
454                    int assetEntryOrder = ParamUtil.getInteger(
455                            actionRequest, "assetEntryOrder");
456    
457                    String[] manualEntries = preferences.getValues(
458                            "assetEntryXml", new String[0]);
459    
460                    if ((assetEntryOrder >= (manualEntries.length - 1)) ||
461                            (assetEntryOrder < 0)) {
462    
463                            return;
464                    }
465    
466                    String temp = manualEntries[assetEntryOrder + 1];
467    
468                    manualEntries[assetEntryOrder + 1] = manualEntries[assetEntryOrder];
469                    manualEntries[assetEntryOrder] = temp;
470    
471                    preferences.setValues("assetEntryXml", manualEntries);
472            }
473    
474            protected void moveSelectionUp(
475                            ActionRequest actionRequest, PortletPreferences preferences)
476                    throws Exception {
477    
478                    int assetEntryOrder = ParamUtil.getInteger(
479                            actionRequest, "assetEntryOrder");
480    
481                    String[] manualEntries = preferences.getValues(
482                            "assetEntryXml", new String[0]);
483    
484                    if ((assetEntryOrder >= manualEntries.length) ||
485                            (assetEntryOrder <= 0)) {
486    
487                            return;
488                    }
489    
490                    String temp = manualEntries[assetEntryOrder - 1];
491    
492                    manualEntries[assetEntryOrder - 1] = manualEntries[assetEntryOrder];
493                    manualEntries[assetEntryOrder] = temp;
494    
495                    preferences.setValues("assetEntryXml", manualEntries);
496            }
497    
498            protected void removeScope(
499                            ActionRequest actionRequest, PortletPreferences preferences)
500                    throws Exception {
501    
502                    String[] scopeIds = preferences.getValues(
503                            "scopeIds",
504                            new String[] {
505                                    AssetPublisher.SCOPE_ID_GROUP_PREFIX + GroupConstants.DEFAULT
506                            });
507    
508                    String scopeId = ParamUtil.getString(actionRequest, "scopeId");
509    
510                    scopeIds = ArrayUtil.remove(scopeIds, scopeId);
511    
512                    if (scopeId.startsWith(AssetPublisher.SCOPE_ID_PARENT_GROUP_PREFIX)) {
513                            scopeId = scopeId.substring("Parent".length());
514    
515                            scopeIds = ArrayUtil.remove(scopeIds, scopeId);
516                    }
517    
518                    preferences.setValues("scopeIds", scopeIds);
519            }
520    
521            protected void removeSelection(
522                            ActionRequest actionRequest, PortletPreferences preferences)
523                    throws Exception {
524    
525                    int assetEntryOrder = ParamUtil.getInteger(
526                            actionRequest, "assetEntryOrder");
527    
528                    String[] manualEntries = preferences.getValues(
529                            "assetEntryXml", new String[0]);
530    
531                    if (assetEntryOrder >= manualEntries.length) {
532                            return;
533                    }
534    
535                    String[] newEntries = new String[manualEntries.length -1];
536    
537                    int i = 0;
538                    int j = 0;
539    
540                    for (; i < manualEntries.length; i++) {
541                            if (i != assetEntryOrder) {
542                                    newEntries[j++] = manualEntries[i];
543                            }
544                    }
545    
546                    preferences.setValues("assetEntryXml", newEntries);
547            }
548    
549            protected void setScopes(
550                            ActionRequest actionRequest, PortletPreferences preferences)
551                    throws Exception {
552    
553                    String[] scopeIds = StringUtil.split(
554                            getParameter(actionRequest, "scopeIds"));
555    
556                    preferences.setValues("scopeIds", scopeIds);
557            }
558    
559            protected void setSelectionStyle(
560                            ActionRequest actionRequest, PortletPreferences preferences)
561                    throws Exception {
562    
563                    String selectionStyle = getParameter(actionRequest, "selectionStyle");
564                    String displayStyle = getParameter(actionRequest, "displayStyle");
565    
566                    preferences.setValue("selectionStyle", selectionStyle);
567    
568                    if (selectionStyle.equals("manual") ||
569                            selectionStyle.equals("view-count")) {
570    
571                            preferences.setValue("enableRss", String.valueOf(false));
572                            preferences.setValue("showQueryLogic", Boolean.FALSE.toString());
573    
574                            preferences.reset("rssDelta");
575                            preferences.reset("rssDisplayStyle");
576                            preferences.reset("rssFormat");
577                            preferences.reset("rssName");
578                    }
579    
580                    if (!selectionStyle.equals("view-count") &&
581                            displayStyle.equals("view-count-details")) {
582    
583                            preferences.setValue("displayStyle", "full-content");
584                    }
585            }
586    
587            protected void updateDefaultAssetPublisher(ActionRequest actionRequest)
588                    throws Exception {
589    
590                    boolean defaultAssetPublisher = ParamUtil.getBoolean(
591                            actionRequest, "defaultAssetPublisher");
592    
593                    Layout layout = (Layout)actionRequest.getAttribute(WebKeys.LAYOUT);
594    
595                    String portletResource = ParamUtil.getString(
596                            actionRequest, "portletResource");
597    
598                    UnicodeProperties typeSettingsProperties =
599                            layout.getTypeSettingsProperties();
600    
601                    if (defaultAssetPublisher) {
602                            typeSettingsProperties.setProperty(
603                                    LayoutTypePortletConstants.DEFAULT_ASSET_PUBLISHER_PORTLET_ID,
604                                    portletResource);
605                    }
606                    else {
607                            String defaultAssetPublisherPortletId =
608                                    typeSettingsProperties.getProperty(
609                                            LayoutTypePortletConstants.
610                                                    DEFAULT_ASSET_PUBLISHER_PORTLET_ID);
611    
612                            if (Validator.isNotNull(defaultAssetPublisherPortletId) &&
613                                    defaultAssetPublisherPortletId.equals(portletResource)) {
614    
615                                    typeSettingsProperties.setProperty(
616                                            LayoutTypePortletConstants.
617                                                    DEFAULT_ASSET_PUBLISHER_PORTLET_ID,
618                                            StringPool.BLANK);
619                            }
620                    }
621    
622                    layout = LayoutLocalServiceUtil.updateLayout(
623                            layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
624                            layout.getTypeSettings());
625    
626                    if (LayoutStagingUtil.isBranchingLayout(layout)) {
627                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
628                                    actionRequest);
629    
630                            LayoutSetBranch layoutSetBranch =
631                                    LayoutStagingUtil.getLayoutSetBranch(layout.getLayoutSet());
632    
633                            long layoutSetBranchId = layoutSetBranch.getLayoutSetBranchId();
634    
635                            long layoutRevisionId = StagingUtil.getRecentLayoutRevisionId(
636                                    request, layoutSetBranchId, layout.getPlid());
637    
638                            LayoutRevision layoutRevision =
639                                    LayoutRevisionLocalServiceUtil.getLayoutRevision(
640                                            layoutRevisionId);
641    
642                            PortletPreferencesImpl portletPreferences =
643                                    (PortletPreferencesImpl)actionRequest.getPreferences();
644    
645                            if (layoutRevision != null) {
646                                    portletPreferences.setPlid(
647                                            layoutRevision.getLayoutRevisionId());
648                            }
649                    }
650            }
651    
652            protected void updateDisplaySettings(ActionRequest actionRequest)
653                    throws Exception {
654    
655                    String[] classNameIds = StringUtil.split(
656                            getParameter(actionRequest, "classNameIds"));
657                    String[] classTypeIds = getClassTypeIds(actionRequest, classNameIds);
658                    String[] extensions = actionRequest.getParameterValues("extensions");
659                    boolean subtypeFieldsFilterEnabled = getSubtypesFieldsFilterEnabled(
660                            actionRequest, classNameIds);
661    
662                    setPreference(actionRequest, "classNameIds", classNameIds);
663                    setPreference(actionRequest, "classTypeIds", classTypeIds);
664                    setPreference(actionRequest, "extensions", extensions);
665                    setPreference(
666                            actionRequest, "subtypeFieldsFilterEnabled",
667                            String.valueOf(subtypeFieldsFilterEnabled));
668            }
669    
670            protected void updateQueryLogic(
671                            ActionRequest actionRequest, PortletPreferences preferences)
672                    throws Exception {
673    
674                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
675                            WebKeys.THEME_DISPLAY);
676    
677                    long userId = themeDisplay.getUserId();
678                    long groupId = themeDisplay.getSiteGroupId();
679    
680                    int[] queryRulesIndexes = StringUtil.split(
681                            ParamUtil.getString(actionRequest, "queryLogicIndexes"), 0);
682    
683                    int i = 0;
684    
685                    List<AssetQueryRule> queryRules = new ArrayList<AssetQueryRule>();
686    
687                    for (int queryRulesIndex : queryRulesIndexes) {
688                            AssetQueryRule queryRule = getQueryRule(
689                                    actionRequest, queryRulesIndex);
690    
691                            validateQueryRule(userId, groupId, queryRules, queryRule);
692    
693                            queryRules.add(queryRule);
694    
695                            setPreference(
696                                    actionRequest, "queryContains" + i,
697                                    String.valueOf(queryRule.isContains()));
698                            setPreference(
699                                    actionRequest, "queryAndOperator" + i,
700                                    String.valueOf(queryRule.isAndOperator()));
701                            setPreference(actionRequest, "queryName" + i, queryRule.getName());
702                            setPreference(
703                                    actionRequest, "queryValues" + i, queryRule.getValues());
704    
705                            i++;
706                    }
707    
708                    // Clear previous preferences that are now blank
709    
710                    String[] values = preferences.getValues(
711                            "queryValues" + i, new String[0]);
712    
713                    while (values.length > 0) {
714                            setPreference(actionRequest, "queryContains" + i, StringPool.BLANK);
715                            setPreference(
716                                    actionRequest, "queryAndOperator" + i, StringPool.BLANK);
717                            setPreference(actionRequest, "queryName" + i, StringPool.BLANK);
718                            setPreference(actionRequest, "queryValues" + i, new String[0]);
719    
720                            i++;
721    
722                            values = preferences.getValues("queryValues" + i, new String[0]);
723                    }
724            }
725    
726            protected void validateQueryRule(
727                            long userId, long groupId, List<AssetQueryRule> queryRules,
728                            AssetQueryRule queryRule)
729                    throws Exception {
730    
731                    String name = queryRule.getName();
732    
733                    if (name.equals("assetTags")) {
734                            AssetTagLocalServiceUtil.checkTags(
735                                    userId, groupId, queryRule.getValues());
736                    }
737    
738                    if (queryRules.contains(queryRule)) {
739                            throw new DuplicateQueryRuleException(
740                                    queryRule.isContains(), queryRule.isAndOperator(),
741                                    queryRule.getName());
742                    }
743            }
744    
745    }