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.exportimport.lar;
016    
017    import aQute.bnd.annotation.ProviderType;
018    
019    import com.liferay.portal.kernel.util.ArrayUtil;
020    import com.liferay.portal.kernel.util.LongWrapper;
021    import com.liferay.portal.kernel.util.MapUtil;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.model.ClassedModel;
026    import com.liferay.portal.model.Portlet;
027    
028    import java.io.Serializable;
029    
030    import java.util.ArrayList;
031    import java.util.Collection;
032    import java.util.Date;
033    import java.util.HashMap;
034    import java.util.HashSet;
035    import java.util.List;
036    import java.util.Map;
037    import java.util.Set;
038    
039    /**
040     * @author Mate Thurzo
041     * @author Zsolt Berentey
042     */
043    @ProviderType
044    public class ManifestSummary implements Serializable {
045    
046            public static String getManifestSummaryKey(
047                    String modelName, String referrerModelName) {
048    
049                    if (Validator.isNull(referrerModelName) ||
050                            modelName.equals(referrerModelName)) {
051    
052                            return modelName;
053                    }
054    
055                    return modelName.concat(StringPool.POUND).concat(referrerModelName);
056            }
057    
058            public void addDataPortlet(
059                    Portlet portlet, String[] configurationPortletOptions) {
060    
061                    String rootPortletId = portlet.getRootPortletId();
062    
063                    if (!_configurationPortletOptions.containsKey(rootPortletId)) {
064                            _dataPortlets.add(portlet);
065    
066                            _configurationPortletOptions.put(
067                                    rootPortletId, configurationPortletOptions);
068                    }
069            }
070    
071            public void addLayoutPortlet(
072                    Portlet portlet, String[] configurationPortletOptions) {
073    
074                    String rootPortletId = portlet.getRootPortletId();
075    
076                    if (!_configurationPortletOptions.containsKey(rootPortletId)) {
077                            _layoutPortlets.add(portlet);
078    
079                            _configurationPortletOptions.put(
080                                    rootPortletId, configurationPortletOptions);
081                    }
082            }
083    
084            public void addModelAdditionCount(
085                    StagedModelType stagedModelType, long count) {
086    
087                    addModelAdditionCount(stagedModelType.toString(), count);
088            }
089    
090            public void addModelAdditionCount(String manifestSummaryKey, long count) {
091                    LongWrapper modelAdditionCounter = _modelAdditionCounters.get(
092                            manifestSummaryKey);
093    
094                    if (modelAdditionCounter == null) {
095                            modelAdditionCounter = new LongWrapper();
096    
097                            _modelAdditionCounters.put(
098                                    manifestSummaryKey, modelAdditionCounter);
099                    }
100    
101                    modelAdditionCounter.setValue(count);
102    
103                    _manifestSummaryKeys.add(manifestSummaryKey);
104            }
105    
106            public void addModelDeletionCount(String manifestSummaryKey, long count) {
107                    LongWrapper modelDeletionCounter = _modelDeletionCounters.get(
108                            manifestSummaryKey);
109    
110                    if (modelDeletionCounter == null) {
111                            modelDeletionCounter = new LongWrapper();
112    
113                            _modelDeletionCounters.put(
114                                    manifestSummaryKey, modelDeletionCounter);
115                    }
116    
117                    modelDeletionCounter.setValue(count);
118    
119                    _manifestSummaryKeys.add(manifestSummaryKey);
120            }
121    
122            @Override
123            public Object clone() {
124                    ManifestSummary manifestSummary = new ManifestSummary();
125    
126                    manifestSummary._configurationPortletOptions =
127                            new HashMap<String, String[]> (
128                                    manifestSummary._configurationPortletOptions);
129                    manifestSummary._dataPortlets = new ArrayList<>(_dataPortlets);
130                    manifestSummary._layoutPortlets = new ArrayList<>(_layoutPortlets);
131    
132                    if (_exportDate != null) {
133                            manifestSummary.setExportDate(new Date(_exportDate.getTime()));
134                    }
135    
136                    manifestSummary._manifestSummaryKeys = new HashSet<>(
137                            _manifestSummaryKeys);
138                    manifestSummary._modelAdditionCounters = new HashMap<>(
139                            _modelAdditionCounters);
140                    manifestSummary._modelDeletionCounters = new HashMap<>(
141                            _modelDeletionCounters);
142    
143                    return manifestSummary;
144            }
145    
146            public String[] getConfigurationPortletOptions(String rootPortletId) {
147                    return _configurationPortletOptions.get(rootPortletId);
148            }
149    
150            public List<Portlet> getDataPortlets() {
151                    return _dataPortlets;
152            }
153    
154            public Date getExportDate() {
155                    return _exportDate;
156            }
157    
158            public List<Portlet> getLayoutPortlets() {
159                    return _layoutPortlets;
160            }
161    
162            public Collection<String> getManifestSummaryKeys() {
163                    return _manifestSummaryKeys;
164            }
165    
166            public long getModelAdditionCount(Class<? extends ClassedModel> clazz) {
167                    return getModelAdditionCount(clazz, clazz);
168            }
169    
170            public long getModelAdditionCount(
171                    Class<? extends ClassedModel> clazz,
172                    Class<? extends ClassedModel> referrerClass) {
173    
174                    return getModelAdditionCount(clazz.getName(), referrerClass.getName());
175            }
176    
177            public long getModelAdditionCount(String manifestSummaryKey) {
178                    if (!_modelAdditionCounters.containsKey(manifestSummaryKey)) {
179                            return -1;
180                    }
181    
182                    LongWrapper modelAdditionCounter = _modelAdditionCounters.get(
183                            manifestSummaryKey);
184    
185                    return modelAdditionCounter.getValue();
186            }
187    
188            public long getModelAdditionCount(
189                    String className, String referrerClassName) {
190    
191                    if (Validator.isNull(referrerClassName) ||
192                            !referrerClassName.equals(
193                                    StagedModelType.REFERRER_CLASS_NAME_ALL)) {
194    
195                            String manifestSummaryKey = getManifestSummaryKey(
196                                    className, referrerClassName);
197    
198                            return getModelAdditionCount(manifestSummaryKey);
199                    }
200    
201                    long modelAdditionCount = 0;
202    
203                    for (String key : _modelAdditionCounters.keySet()) {
204                            if (!key.startsWith(className)) {
205                                    continue;
206                            }
207    
208                            long count = getModelAdditionCount(key);
209    
210                            if (count > 0) {
211                                    modelAdditionCount += count;
212                            }
213                    }
214    
215                    return modelAdditionCount;
216            }
217    
218            public Map<String, LongWrapper> getModelAdditionCounters() {
219                    return _modelAdditionCounters;
220            }
221    
222            public long getModelDeletionCount() {
223                    long modelDeletionCount = -1;
224    
225                    for (String manifestSummaryKey : _manifestSummaryKeys) {
226                            long manifestSummaryKeyModelDeletionCount = getModelDeletionCount(
227                                    manifestSummaryKey);
228    
229                            if (manifestSummaryKeyModelDeletionCount == -1) {
230                                    continue;
231                            }
232    
233                            if (modelDeletionCount == -1) {
234                                    modelDeletionCount = manifestSummaryKeyModelDeletionCount;
235                            }
236                            else {
237                                    modelDeletionCount += manifestSummaryKeyModelDeletionCount;
238                            }
239                    }
240    
241                    return modelDeletionCount;
242            }
243    
244            public long getModelDeletionCount(Class<? extends ClassedModel> clazz) {
245                    return getModelDeletionCount(clazz.getName());
246            }
247    
248            public long getModelDeletionCount(StagedModelType[] stagedModelTypes) {
249                    if (ArrayUtil.isEmpty(stagedModelTypes)) {
250                            return 0;
251                    }
252    
253                    long modelDeletionCount = -1;
254    
255                    for (StagedModelType stagedModelType : stagedModelTypes) {
256                            long stagedModelTypeModelDeletionCount = getModelDeletionCount(
257                                    stagedModelType.toString());
258    
259                            if (stagedModelTypeModelDeletionCount == -1) {
260                                    continue;
261                            }
262    
263                            if (modelDeletionCount == -1) {
264                                    modelDeletionCount = stagedModelTypeModelDeletionCount;
265                            }
266                            else {
267                                    modelDeletionCount += stagedModelTypeModelDeletionCount;
268                            }
269                    }
270    
271                    return modelDeletionCount;
272            }
273    
274            public long getModelDeletionCount(String modelName) {
275                    if (!_modelDeletionCounters.containsKey(modelName)) {
276                            return -1;
277                    }
278    
279                    LongWrapper modelDeletionCounter = _modelDeletionCounters.get(
280                            modelName);
281    
282                    return modelDeletionCounter.getValue();
283            }
284    
285            public Map<String, LongWrapper> getModelDeletionCounters() {
286                    return _modelDeletionCounters;
287            }
288    
289            public void incrementModelAdditionCount(StagedModelType stagedModelType) {
290                    String manifestSummaryKey = stagedModelType.toString();
291    
292                    if (!_modelAdditionCounters.containsKey(manifestSummaryKey)) {
293                            _modelAdditionCounters.put(manifestSummaryKey, new LongWrapper(1));
294    
295                            _manifestSummaryKeys.add(manifestSummaryKey);
296    
297                            return;
298                    }
299    
300                    LongWrapper modelAdditionCounter = _modelAdditionCounters.get(
301                            manifestSummaryKey);
302    
303                    modelAdditionCounter.increment();
304            }
305    
306            public void incrementModelDeletionCount(StagedModelType stagedModelType) {
307                    String manifestSummaryKey = stagedModelType.toString();
308    
309                    if (!_modelDeletionCounters.containsKey(manifestSummaryKey)) {
310                            _modelDeletionCounters.put(manifestSummaryKey, new LongWrapper(1));
311    
312                            _manifestSummaryKeys.add(manifestSummaryKey);
313    
314                            return;
315                    }
316    
317                    LongWrapper modelDeletionCounter = _modelDeletionCounters.get(
318                            manifestSummaryKey);
319    
320                    modelDeletionCounter.increment();
321            }
322    
323            public void resetCounters() {
324                    _modelAdditionCounters.clear();
325                    _modelDeletionCounters.clear();
326    
327                    _manifestSummaryKeys.clear();
328            }
329    
330            public void setExportDate(Date exportDate) {
331                    _exportDate = exportDate;
332            }
333    
334            @Override
335            public String toString() {
336                    StringBundler sb = new StringBundler(5);
337    
338                    sb.append("{modelAdditionCounters=");
339                    sb.append(MapUtil.toString(_modelAdditionCounters));
340                    sb.append(", modelDeletionCounters=");
341                    sb.append(MapUtil.toString(_modelDeletionCounters));
342                    sb.append("}");
343    
344                    return sb.toString();
345            }
346    
347            private Map<String, String[]> _configurationPortletOptions =
348                    new HashMap<>();
349            private List<Portlet> _dataPortlets = new ArrayList<>();
350            private Date _exportDate;
351            private List<Portlet> _layoutPortlets = new ArrayList<>();
352            private Set<String> _manifestSummaryKeys = new HashSet<>();
353            private Map<String, LongWrapper> _modelAdditionCounters = new HashMap<>();
354            private Map<String, LongWrapper> _modelDeletionCounters = new HashMap<>();
355    
356    }