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