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.ratings.transformer;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.Property;
020    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
021    import com.liferay.portal.kernel.exception.PortalException;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.UnicodeProperties;
024    import com.liferay.portlet.ratings.RatingsType;
025    import com.liferay.portlet.ratings.definition.PortletRatingsDefinitionUtil;
026    import com.liferay.portlet.ratings.definition.PortletRatingsDefinitionValues;
027    import com.liferay.portlet.ratings.model.RatingsEntry;
028    import com.liferay.portlet.ratings.service.RatingsEntryLocalServiceUtil;
029    import com.liferay.registry.Registry;
030    import com.liferay.registry.RegistryUtil;
031    import com.liferay.registry.ServiceTracker;
032    
033    import java.util.Map;
034    
035    import javax.portlet.PortletPreferences;
036    
037    /**
038     * @author Roberto D??az
039     * @author Sergio Gonz??lez
040     */
041    public class RatingsDataTransformerUtil {
042    
043            public static String getPropertyKey(String className) {
044                    return className + StringPool.UNDERLINE + "RatingsType";
045            }
046    
047            public static void transformCompanyRatingsData(
048                            final long companyId, PortletPreferences oldPortletPreferences,
049                            UnicodeProperties unicodeProperties)
050                    throws PortalException {
051    
052                    _instance._transformCompanyRatingsData(
053                            companyId, oldPortletPreferences, unicodeProperties);
054            }
055    
056            public static void transformGroupRatingsData(
057                            final long groupId, UnicodeProperties oldUnicodeProperties,
058                            UnicodeProperties unicodeProperties)
059                    throws PortalException {
060    
061                    _instance._transformGroupRatingsData(
062                            groupId, oldUnicodeProperties, unicodeProperties);
063            }
064    
065            private RatingsDataTransformerUtil() {
066                    Registry registry = RegistryUtil.getRegistry();
067    
068                    _serviceTracker = registry.trackServices(RatingsDataTransformer.class);
069    
070                    _serviceTracker.open();
071            }
072    
073            private void _transformCompanyRatingsData(
074                            final long companyId, PortletPreferences oldPortletPreferences,
075                            UnicodeProperties unicodeProperties)
076                    throws PortalException {
077    
078                    RatingsDataTransformer ratingsDataTransformer =
079                            _serviceTracker.getService();
080    
081                    if (ratingsDataTransformer == null) {
082                            return;
083                    }
084    
085                    Map<String, PortletRatingsDefinitionValues>
086                            portletRatingsDefinitionValuesMap =
087                                    PortletRatingsDefinitionUtil.
088                                            getPortletRatingsDefinitionValuesMap();
089    
090                    for (String className : portletRatingsDefinitionValuesMap.keySet()) {
091                            String propertyKey = getPropertyKey(className);
092    
093                            RatingsType fromRatingsType = RatingsType.parse(
094                                    oldPortletPreferences.getValue(propertyKey, StringPool.BLANK));
095    
096                            if (fromRatingsType == null) {
097                                    PortletRatingsDefinitionValues portletRatingsDefinitionValues =
098                                            portletRatingsDefinitionValuesMap.get(className);
099    
100                                    fromRatingsType =
101                                            portletRatingsDefinitionValues.getDefaultRatingsType();
102                            }
103    
104                            RatingsType toRatingsType = RatingsType.parse(
105                                    unicodeProperties.getProperty(propertyKey));
106    
107                            _transformRatingsData(
108                                    "companyId", companyId, className, fromRatingsType,
109                                    toRatingsType);
110                    }
111            }
112    
113            private void _transformGroupRatingsData(
114                            final long groupId, UnicodeProperties oldUnicodeProperties,
115                            UnicodeProperties unicodeProperties)
116                    throws PortalException {
117    
118                    RatingsDataTransformer ratingsDataTransformer =
119                            _serviceTracker.getService();
120    
121                    if (ratingsDataTransformer == null) {
122                            return;
123                    }
124    
125                    Map<String, PortletRatingsDefinitionValues>
126                            portletRatingsDefinitionValuesMap =
127                                    PortletRatingsDefinitionUtil.
128                                            getPortletRatingsDefinitionValuesMap();
129    
130                    for (String className : portletRatingsDefinitionValuesMap.keySet()) {
131                            String propertyKey = getPropertyKey(className);
132    
133                            RatingsType fromRatingsType = RatingsType.parse(
134                                    oldUnicodeProperties.getProperty(propertyKey));
135    
136                            if (fromRatingsType == null) {
137                                    PortletRatingsDefinitionValues portletRatingsDefinitionValues =
138                                            portletRatingsDefinitionValuesMap.get(className);
139    
140                                    fromRatingsType =
141                                            portletRatingsDefinitionValues.getDefaultRatingsType();
142                            }
143    
144                            RatingsType toRatingsType = RatingsType.parse(
145                                    unicodeProperties.getProperty(propertyKey));
146    
147                            _transformRatingsData(
148                                    "groupId", groupId, className, fromRatingsType, toRatingsType);
149                    }
150            }
151    
152            private void _transformRatingsData(
153                            final String classPKFieldName, final long classPKFieldValue,
154                            final String className, RatingsType fromRatingsType,
155                            RatingsType toRatingsType)
156                    throws PortalException {
157    
158                    if ((toRatingsType == null) || fromRatingsType.equals(toRatingsType)) {
159                            return;
160                    }
161    
162                    RatingsDataTransformer ratingsDataTransformer =
163                            _serviceTracker.getService();
164    
165                    ActionableDynamicQuery.PerformActionMethod<RatingsEntry>
166                            performActionMethod = ratingsDataTransformer.transformRatingsData(
167                                    fromRatingsType, toRatingsType);
168    
169                    if (performActionMethod == null) {
170                            return;
171                    }
172    
173                    ActionableDynamicQuery ratingsEntryActionableDynamicQuery =
174                            RatingsEntryLocalServiceUtil.getActionableDynamicQuery();
175    
176                    ratingsEntryActionableDynamicQuery.setAddCriteriaMethod(
177                            new ActionableDynamicQuery.AddCriteriaMethod() {
178    
179                                    @Override
180                                    public void addCriteria(DynamicQuery dynamicQuery) {
181                                            Property property = PropertyFactoryUtil.forName(
182                                                    classPKFieldName);
183    
184                                            dynamicQuery.add(property.eq(classPKFieldValue));
185    
186                                            property = PropertyFactoryUtil.forName("className");
187    
188                                            dynamicQuery.add(property.eq(className));
189                                    }
190    
191                            });
192    
193                    ratingsEntryActionableDynamicQuery.setPerformActionMethod(
194                            performActionMethod);
195    
196                    ratingsEntryActionableDynamicQuery.performActions();
197            }
198    
199            private static final RatingsDataTransformerUtil _instance =
200                    new RatingsDataTransformerUtil();
201    
202            private final ServiceTracker<RatingsDataTransformer, RatingsDataTransformer>
203                    _serviceTracker;
204    
205    }