001    /**
002     * Copyright (c) 2000-2013 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.rolesadmin.lar;
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.exception.SystemException;
023    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
024    import com.liferay.portal.kernel.lar.DataLevel;
025    import com.liferay.portal.kernel.lar.PortletDataContext;
026    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
027    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
028    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
029    import com.liferay.portal.kernel.lar.StagedModelType;
030    import com.liferay.portal.kernel.xml.Element;
031    import com.liferay.portal.model.Role;
032    import com.liferay.portal.model.Team;
033    import com.liferay.portal.service.RoleLocalServiceUtil;
034    import com.liferay.portal.service.UserLocalServiceUtil;
035    import com.liferay.portal.service.persistence.RoleExportActionableDynamicQuery;
036    import com.liferay.portal.util.PortalUtil;
037    
038    import java.util.List;
039    
040    import javax.portlet.PortletPreferences;
041    
042    /**
043     * @author Michael C. Han
044     * @author David Mendez Gonzalez
045     */
046    public class RolesAdminPortletDataHandler extends BasePortletDataHandler {
047    
048            public static final String NAMESPACE = "roles_admin";
049    
050            public RolesAdminPortletDataHandler() {
051                    setDataLevel(DataLevel.PORTAL);
052                    setDeletionSystemEventStagedModelTypes(new StagedModelType(Role.class));
053                    setExportControls(
054                            new PortletDataHandlerBoolean(
055                                    NAMESPACE, "roles", true, true,
056                                    new PortletDataHandlerControl[] {
057                                            new PortletDataHandlerBoolean(
058                                                    NAMESPACE, "system-roles", true, false)
059                                    },
060                                    Role.class.getName()
061                            ));
062                    setSupportsDataStrategyCopyAsNew(false);
063            }
064    
065            @Override
066            protected PortletPreferences doDeleteData(
067                            PortletDataContext portletDataContext, String portletId,
068                            PortletPreferences portletPreferences)
069                    throws Exception {
070    
071                    if (portletDataContext.addPrimaryKey(
072                                    RolesAdminPortletDataHandler.class, "deleteData")) {
073    
074                            return portletPreferences;
075                    }
076    
077                    List<Role> roles = RoleLocalServiceUtil.getRoles(
078                            portletDataContext.getCompanyId());
079    
080                    for (Role role : roles) {
081                            if (!PortalUtil.isSystemRole(role.getName()) && !role.isTeam()) {
082                                    RoleLocalServiceUtil.deleteRole(role);
083                            }
084                    }
085    
086                    return portletPreferences;
087            }
088    
089            @Override
090            protected String doExportData(
091                            final PortletDataContext portletDataContext, String portletId,
092                            PortletPreferences portletPreferences)
093                    throws Exception {
094    
095                    portletDataContext.addPortalPermissions();
096    
097                    Element rootElement = addExportDataRootElement(portletDataContext);
098    
099                    rootElement.addAttribute(
100                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
101    
102                    ActionableDynamicQuery actionableDynamicQuery =
103                            getRoleActionableDynamicQuery(portletDataContext, true);
104    
105                    actionableDynamicQuery.performActions();
106    
107                    return getExportDataRootElementString(rootElement);
108            }
109    
110            @Override
111            protected PortletPreferences doImportData(
112                            PortletDataContext portletDataContext, String portletId,
113                            PortletPreferences portletPreferences, String data)
114                    throws Exception {
115    
116                    portletDataContext.importPortalPermissions();
117    
118                    Element rolesElement = portletDataContext.getImportDataGroupElement(
119                            Role.class);
120    
121                    List<Element> roleElements = rolesElement.elements();
122    
123                    for (Element roleElement : roleElements) {
124                            StagedModelDataHandlerUtil.importStagedModel(
125                                    portletDataContext, roleElement);
126                    }
127    
128                    return null;
129            }
130    
131            @Override
132            protected void doPrepareManifestSummary(
133                            PortletDataContext portletDataContext,
134                            PortletPreferences portletPreferences)
135                    throws Exception {
136    
137                    ActionableDynamicQuery actionableDynamicQuery =
138                            getRoleActionableDynamicQuery(portletDataContext, false);
139    
140                    actionableDynamicQuery.performCount();
141            }
142    
143            protected ActionableDynamicQuery getRoleActionableDynamicQuery(
144                            final PortletDataContext portletDataContext, final boolean export)
145                    throws SystemException {
146    
147                    return new RoleExportActionableDynamicQuery(portletDataContext) {
148    
149                            @Override
150                            protected void addCriteria(DynamicQuery dynamicQuery) {
151                                    portletDataContext.addDateRangeCriteria(
152                                            dynamicQuery, "modifiedDate");
153    
154                                    long classNameId = PortalUtil.getClassNameId(Team.class);
155    
156                                    Property classNameIdProperty = PropertyFactoryUtil.forName(
157                                            "classNameId");
158    
159                                    dynamicQuery.add(classNameIdProperty.ne(classNameId));
160                            }
161    
162                            @Override
163                            protected void performAction(Object object)
164                                    throws PortalException, SystemException {
165    
166                                    if (!export) {
167                                            return;
168                                    }
169    
170                                    Role role = (Role)object;
171    
172                                    long defaultUserId = UserLocalServiceUtil.getDefaultUserId(
173                                            portletDataContext.getCompanyId());
174    
175                                    if (!portletDataContext.getBooleanParameter(
176                                                    NAMESPACE, "system-roles") &&
177                                            (role.getUserId() == defaultUserId)) {
178    
179                                            return;
180                                    }
181    
182                                    super.performAction(object);
183                            }
184                    };
185            }
186    
187    }