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.backgroundtask.display;
016    
017    import com.liferay.portal.kernel.backgroundtask.BackgroundTask;
018    import com.liferay.portal.kernel.backgroundtask.BackgroundTaskStatus;
019    import com.liferay.portal.kernel.backgroundtask.BackgroundTaskStatusRegistryUtil;
020    import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
021    import com.liferay.portal.kernel.json.JSONArray;
022    import com.liferay.portal.kernel.json.JSONException;
023    import com.liferay.portal.kernel.json.JSONFactoryUtil;
024    import com.liferay.portal.kernel.json.JSONObject;
025    import com.liferay.portal.kernel.language.LanguageUtil;
026    import com.liferay.portal.kernel.log.Log;
027    import com.liferay.portal.kernel.log.LogFactoryUtil;
028    import com.liferay.portal.kernel.template.Template;
029    import com.liferay.portal.kernel.template.TemplateConstants;
030    import com.liferay.portal.kernel.template.TemplateException;
031    import com.liferay.portal.kernel.template.TemplateManager;
032    import com.liferay.portal.kernel.template.TemplateManagerUtil;
033    import com.liferay.portal.kernel.template.TemplateResource;
034    import com.liferay.portal.kernel.util.GetterUtil;
035    import com.liferay.portal.kernel.util.StringPool;
036    
037    import java.io.Writer;
038    
039    import java.util.Iterator;
040    import java.util.Locale;
041    import java.util.Map;
042    
043    /**
044     * @author Andrew Betts
045     */
046    public abstract class BaseBackgroundTaskDisplay
047            implements BackgroundTaskDisplay {
048    
049            public BaseBackgroundTaskDisplay(BackgroundTask backgroundTask) {
050                    this.backgroundTask = backgroundTask;
051    
052                    backgroundTaskStatus =
053                            BackgroundTaskStatusRegistryUtil.getBackgroundTaskStatus(
054                                    backgroundTask.getBackgroundTaskId());
055            }
056    
057            @Override
058            public abstract int getPercentage();
059    
060            @Override
061            public int getStatus() {
062                    return backgroundTask.getStatus();
063            }
064    
065            @Override
066            public String getStatusLabel() {
067                    return getStatusLabel(Locale.getDefault());
068            }
069    
070            @Override
071            public String getStatusLabel(Locale locale) {
072                    return LanguageUtil.get(locale, backgroundTask.getStatusLabel());
073            }
074    
075            @Override
076            public String getStatusMessage() {
077                    return getStatusMessage(Locale.getDefault());
078            }
079    
080            @Override
081            public String getStatusMessage(Locale locale) {
082                    TemplateResource templateResource = getTemplateResource();
083    
084                    if (templateResource == null) {
085                            return StringPool.BLANK;
086                    }
087    
088                    TemplateManager templateManager =
089                            TemplateManagerUtil.getTemplateManager(
090                                    TemplateConstants.LANG_TYPE_FTL);
091    
092                    Template template = templateManager.getTemplate(templateResource, true);
093    
094                    template.put("backgroundTask", backgroundTask);
095                    template.put("backgroundTaskDisplay", this);
096                    template.put("backgroundTaskStatus", backgroundTaskStatus);
097                    template.put(
098                            "statusMessageJSONObject", getStatusMessageJSONObject(locale));
099    
100                    template.putAll(getTemplateVars());
101    
102                    Writer writer = new UnsyncStringWriter();
103    
104                    try {
105                            template.processTemplate(writer);
106                    }
107                    catch (TemplateException te) {
108                            if (_log.isDebugEnabled()) {
109                                    _log.debug(te, te);
110                            }
111    
112                            return StringPool.BLANK;
113                    }
114    
115                    return writer.toString();
116            }
117    
118            @Override
119            public boolean hasPercentage() {
120                    if (getPercentage() >= PERCENTAGE_MIN) {
121                            return true;
122                    }
123    
124                    return false;
125            }
126    
127            protected long getBackgroundTaskStatusAttributeLong(String attributeKey) {
128                    return GetterUtil.getLong(
129                            backgroundTaskStatus.getAttribute(attributeKey));
130            }
131    
132            protected String getBackgroundTaskStatusAttributeString(
133                    String attributeKey) {
134    
135                    return GetterUtil.getString(
136                            backgroundTaskStatus.getAttribute(attributeKey));
137            }
138    
139            protected JSONObject getStatusMessageJSONObject(Locale locale) {
140                    JSONObject jsonObject = null;
141    
142                    try {
143                            jsonObject = JSONFactoryUtil.createJSONObject(
144                                    backgroundTask.getStatusMessage());
145                    }
146                    catch (JSONException e) {
147                            if (_log.isDebugEnabled()) {
148                                    _log.debug(e, e);
149                            }
150                    }
151    
152                    return translateJSON(jsonObject, locale);
153            }
154    
155            protected abstract String getStatusMessageKey();
156    
157            protected abstract TemplateResource getTemplateResource();
158    
159            protected abstract Map<String, Object> getTemplateVars();
160    
161            protected boolean hasBackgroundTaskStatus() {
162                    if (backgroundTaskStatus != null) {
163                            return true;
164                    }
165    
166                    return false;
167            }
168    
169            protected JSONArray translateJSON(JSONArray jsonArray, Locale locale) {
170                    JSONArray translatedJSON = JSONFactoryUtil.createJSONArray();
171    
172                    for (Object object : jsonArray) {
173                            if (object instanceof JSONObject) {
174                                    translatedJSON.put(translateJSON((JSONObject)object, locale));
175                            }
176                            else if (object instanceof JSONArray) {
177                                    translatedJSON.put(translateJSON((JSONArray)object, locale));
178                            }
179                            else if (object instanceof String) {
180                                    translatedJSON.put(LanguageUtil.get(locale, (String)object));
181                            }
182                            else {
183                                    translatedJSON.put(object);
184                            }
185                    }
186    
187                    return translatedJSON;
188            }
189    
190            protected JSONObject translateJSON(JSONObject jsonObject, Locale locale) {
191                    if (locale == null) {
192                            return jsonObject;
193                    }
194    
195                    JSONObject translatedJSON = JSONFactoryUtil.createJSONObject();
196    
197                    Iterator<String> iterator = jsonObject.keys();
198    
199                    while (iterator.hasNext()) {
200                            String key = iterator.next();
201    
202                            Object object = jsonObject.get(key);
203    
204                            if (object instanceof JSONObject) {
205                                    translatedJSON.put(
206                                            key, translateJSON((JSONObject)object, locale));
207                            }
208                            else if (object instanceof JSONArray) {
209                                    translatedJSON.put(
210                                            key, translateJSON((JSONArray)object, locale));
211                            }
212                            else if (object instanceof String) {
213                                    translatedJSON.put(
214                                            key, LanguageUtil.get(locale, (String)object));
215                            }
216                            else {
217                                    translatedJSON.put(key, object);
218                            }
219                    }
220    
221                    return translatedJSON;
222            }
223    
224            protected static final int PERCENTAGE_MAX = 100;
225    
226            protected static final int PERCENTAGE_MIN = 0;
227    
228            protected static final int PERCENTAGE_NONE = -1;
229    
230            protected final BackgroundTask backgroundTask;
231            protected final BackgroundTaskStatus backgroundTaskStatus;
232    
233            private static final Log _log = LogFactoryUtil.getLog(
234                    BaseBackgroundTaskDisplay.class);
235    
236    }