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.kernel.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<Portlet>(_dataPortlets);
130                    manifestSummary._layoutPortlets = new ArrayList<Portlet>(
131                            _layoutPortlets);
132    
133                    if (_exportDate != null) {
134                            manifestSummary.setExportDate(new Date(_exportDate.getTime()));
135                    }
136    
137                    manifestSummary._manifestSummaryKeys = new HashSet<String>(
138                            _manifestSummaryKeys);
139                    manifestSummary._modelAdditionCounters =
140                            new HashMap<String, LongWrapper>(_modelAdditionCounters);
141                    manifestSummary._modelDeletionCounters =
142                            new HashMap<String, LongWrapper>(_modelDeletionCounters);
143    
144                    return manifestSummary;
145            }
146    
147            public String[] getConfigurationPortletOptions(String rootPortletId) {
148                    return _configurationPortletOptions.get(rootPortletId);
149            }
150    
151            public List<Portlet> getDataPortlets() {
152                    return _dataPortlets;
153            }
154    
155            public Date getExportDate() {
156                    return _exportDate;
157            }
158    
159            public List<Portlet> getLayoutPortlets() {
160                    return _layoutPortlets;
161            }
162    
163            public Collection<String> getManifestSummaryKeys() {
164                    return _manifestSummaryKeys;
165            }
166    
167            public long getModelAdditionCount(Class<? extends ClassedModel> clazz) {
168                    return getModelAdditionCount(clazz, clazz);
169            }
170    
171            public long getModelAdditionCount(
172                    Class<? extends ClassedModel> clazz,
173                    Class<? extends ClassedModel> referrerClass) {
174    
175                    return getModelAdditionCount(clazz.getName(), referrerClass.getName());
176            }
177    
178            public long getModelAdditionCount(String manifestSummaryKey) {
179                    if (!_modelAdditionCounters.containsKey(manifestSummaryKey)) {
180                            return -1;
181                    }
182    
183                    LongWrapper modelAdditionCounter = _modelAdditionCounters.get(
184                            manifestSummaryKey);
185    
186                    return modelAdditionCounter.getValue();
187            }
188    
189            public long getModelAdditionCount(
190                    String className, String referrerClassName) {
191    
192                    if (Validator.isNull(referrerClassName) ||
193                            !referrerClassName.equals(
194                                    StagedModelType.REFERRER_CLASS_NAME_ALL)) {
195    
196                            String manifestSummaryKey = getManifestSummaryKey(
197                                    className, referrerClassName);
198    
199                            return getModelAdditionCount(manifestSummaryKey);
200                    }
201    
202                    long modelAdditionCount = 0;
203    
204                    for (String key : _modelAdditionCounters.keySet()) {
205                            if (!key.startsWith(className)) {
206                                    continue;
207                            }
208    
209                            long count = getModelAdditionCount(key);
210    
211                            if (count > 0) {
212                                    modelAdditionCount += count;
213                            }
214                    }
215    
216                    return modelAdditionCount;
217            }
218    
219            public Map<String, LongWrapper> getModelAdditionCounters() {
220                    return _modelAdditionCounters;
221            }
222    
223            public long getModelDeletionCount() {
224                    long modelDeletionCount = -1;
225    
226                    for (String manifestSummaryKey : _manifestSummaryKeys) {
227                            long manifestSummaryKeyModelDeletionCount = getModelDeletionCount(
228                                    manifestSummaryKey);
229    
230                            if (manifestSummaryKeyModelDeletionCount == -1) {
231                                    continue;
232                            }
233    
234                            if (modelDeletionCount == -1) {
235                                    modelDeletionCount = manifestSummaryKeyModelDeletionCount;
236                            }
237                            else {
238                                    modelDeletionCount += manifestSummaryKeyModelDeletionCount;
239                            }
240                    }
241    
242                    return modelDeletionCount;
243            }
244    
245            public long getModelDeletionCount(Class<? extends ClassedModel> clazz) {
246                    return getModelDeletionCount(clazz.getName());
247            }
248    
249            public long getModelDeletionCount(StagedModelType[] stagedModelTypes) {
250                    if (ArrayUtil.isEmpty(stagedModelTypes)) {
251                            return 0;
252                    }
253    
254                    long modelDeletionCount = -1;
255    
256                    for (StagedModelType stagedModelType : stagedModelTypes) {
257                            long stagedModelTypeModelDeletionCount = getModelDeletionCount(
258                                    stagedModelType.toString());
259    
260                            if (stagedModelTypeModelDeletionCount == -1) {
261                                    continue;
262                            }
263    
264                            if (modelDeletionCount == -1) {
265                                    modelDeletionCount = stagedModelTypeModelDeletionCount;
266                            }
267                            else {
268                                    modelDeletionCount += stagedModelTypeModelDeletionCount;
269                            }
270                    }
271    
272                    return modelDeletionCount;
273            }
274    
275            public long getModelDeletionCount(String modelName) {
276                    if (!_modelDeletionCounters.containsKey(modelName)) {
277                            return -1;
278                    }
279    
280                    LongWrapper modelDeletionCounter = _modelDeletionCounters.get(
281                            modelName);
282    
283                    return modelDeletionCounter.getValue();
284            }
285    
286            public Map<String, LongWrapper> getModelDeletionCounters() {
287                    return _modelDeletionCounters;
288            }
289    
290            public void incrementModelAdditionCount(StagedModelType stagedModelType) {
291                    String manifestSummaryKey = stagedModelType.toString();
292    
293                    if (!_modelAdditionCounters.containsKey(manifestSummaryKey)) {
294                            _modelAdditionCounters.put(manifestSummaryKey, new LongWrapper(1));
295    
296                            _manifestSummaryKeys.add(manifestSummaryKey);
297    
298                            return;
299                    }
300    
301                    LongWrapper modelAdditionCounter = _modelAdditionCounters.get(
302                            manifestSummaryKey);
303    
304                    modelAdditionCounter.increment();
305            }
306    
307            public void incrementModelDeletionCount(StagedModelType stagedModelType) {
308                    String manifestSummaryKey = stagedModelType.toString();
309    
310                    if (!_modelDeletionCounters.containsKey(manifestSummaryKey)) {
311                            _modelDeletionCounters.put(manifestSummaryKey, new LongWrapper(1));
312    
313                            _manifestSummaryKeys.add(manifestSummaryKey);
314    
315                            return;
316                    }
317    
318                    LongWrapper modelDeletionCounter = _modelDeletionCounters.get(
319                            manifestSummaryKey);
320    
321                    modelDeletionCounter.increment();
322            }
323    
324            public void resetCounters() {
325                    _modelAdditionCounters.clear();
326                    _modelDeletionCounters.clear();
327    
328                    _manifestSummaryKeys.clear();
329            }
330    
331            public void setExportDate(Date exportDate) {
332                    _exportDate = exportDate;
333            }
334    
335            @Override
336            public String toString() {
337                    StringBundler sb = new StringBundler(5);
338    
339                    sb.append("{modelAdditionCounters=");
340                    sb.append(MapUtil.toString(_modelAdditionCounters));
341                    sb.append(", modelDeletionCounters=");
342                    sb.append(MapUtil.toString(_modelDeletionCounters));
343                    sb.append("}");
344    
345                    return sb.toString();
346            }
347    
348            private Map<String, String[]> _configurationPortletOptions =
349                    new HashMap<String, String[]>();
350            private List<Portlet> _dataPortlets = new ArrayList<Portlet>();
351            private Date _exportDate;
352            private List<Portlet> _layoutPortlets = new ArrayList<Portlet>();
353            private Set<String> _manifestSummaryKeys = new HashSet<String>();
354            private Map<String, LongWrapper> _modelAdditionCounters =
355                    new HashMap<String, LongWrapper>();
356            private Map<String, LongWrapper> _modelDeletionCounters =
357                    new HashMap<String, LongWrapper>();
358    
359    }