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.verify;
016    
017    import com.liferay.portal.kernel.cache.CacheRegistryUtil;
018    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
020    import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
021    import com.liferay.portal.kernel.dao.orm.Property;
022    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
023    import com.liferay.portal.kernel.exception.PortalException;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.util.ListUtil;
027    import com.liferay.portal.model.Layout;
028    import com.liferay.portal.model.LayoutRevision;
029    import com.liferay.portal.model.LayoutTypePortlet;
030    import com.liferay.portal.model.Portlet;
031    import com.liferay.portal.model.PortletPreferences;
032    import com.liferay.portal.service.LayoutLocalServiceUtil;
033    import com.liferay.portal.service.LayoutRevisionLocalServiceUtil;
034    import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
035    
036    import java.util.List;
037    
038    /**
039     * @author Andrew Betts
040     */
041    public class VerifyPortletPreferences extends VerifyProcess {
042    
043            public static void cleanUpLayoutRevisionPortletPreferences()
044                    throws Exception {
045    
046                    ActionableDynamicQuery actionableDynamicQuery =
047                            getPortletPreferencesActionableDynamicQuery();
048    
049                    actionableDynamicQuery.setParallel(true);
050    
051                    actionableDynamicQuery.performActions();
052            }
053    
054            protected static ActionableDynamicQuery
055                    getPortletPreferencesActionableDynamicQuery() {
056    
057                    ActionableDynamicQuery portletPreferencesActionableDynamicQuery =
058                            PortletPreferencesLocalServiceUtil.getActionableDynamicQuery();
059    
060                    portletPreferencesActionableDynamicQuery.setAddCriteriaMethod(
061                            new ActionableDynamicQuery.AddCriteriaMethod() {
062    
063                                    @Override
064                                    public void addCriteria(DynamicQuery dynamicQuery) {
065                                            Property plidProperty = PropertyFactoryUtil.forName("plid");
066    
067                                            DynamicQuery layoutRevisionDynamicQuery =
068                                                    LayoutRevisionLocalServiceUtil.dynamicQuery();
069    
070                                            layoutRevisionDynamicQuery.setProjection(
071                                                    ProjectionFactoryUtil.property("layoutRevisionId"));
072    
073                                            dynamicQuery.add(
074                                                    plidProperty.in(layoutRevisionDynamicQuery));
075                                    }
076    
077                            });
078                    portletPreferencesActionableDynamicQuery.setPerformActionMethod(
079                            new ActionableDynamicQuery.
080                                    PerformActionMethod<PortletPreferences>() {
081    
082                                    @Override
083                                    public void performAction(PortletPreferences portletPreferences)
084                                            throws PortalException {
085    
086                                            long layoutRevisionId = portletPreferences.getPlid();
087    
088                                            LayoutRevision layoutRevision =
089                                                    LayoutRevisionLocalServiceUtil.getLayoutRevision(
090                                                            layoutRevisionId);
091    
092                                            Layout layout = LayoutLocalServiceUtil.getLayout(
093                                                    layoutRevision.getPlid());
094    
095                                            if (!layout.isTypePortlet()) {
096                                                    return;
097                                            }
098    
099                                            LayoutTypePortlet layoutTypePortlet =
100                                                    (LayoutTypePortlet)layout.getLayoutType();
101    
102                                            List<Portlet> portlets = layoutTypePortlet.getAllPortlets();
103    
104                                            List<String> portletIds = ListUtil.toList(
105                                                    portlets, Portlet.PORTLET_ID_ACCESSOR);
106    
107                                            if (portletIds.contains(
108                                                            portletPreferences.getPortletId())) {
109    
110                                                    return;
111                                            }
112    
113                                            if (_log.isWarnEnabled()) {
114                                                    _log.warn(
115                                                            "Removing portlet preferences " +
116                                                                    portletPreferences.getPortletPreferencesId());
117                                            }
118    
119                                            PortletPreferencesLocalServiceUtil.deletePortletPreferences(
120                                                    portletPreferences);
121                                    }
122    
123                            });
124    
125                    return portletPreferencesActionableDynamicQuery;
126            }
127    
128            @Override
129            protected void doVerify() throws Exception {
130                    CacheRegistryUtil.setActive(true);
131    
132                    try {
133                            cleanUpLayoutRevisionPortletPreferences();
134                    }
135                    finally {
136                            CacheRegistryUtil.setActive(false);
137                    }
138            }
139    
140            private static final Log _log = LogFactoryUtil.getLog(
141                    VerifyPortletPreferences.class);
142    
143    }