View Javadoc
1   /**
2    * This file Copyright (c) 2014-2017 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.ui.admincentral.shellapp.pulse.task;
35  
36  import info.magnolia.context.Context;
37  import info.magnolia.event.EventBus;
38  import info.magnolia.i18nsystem.I18nizer;
39  import info.magnolia.i18nsystem.SimpleTranslator;
40  import info.magnolia.objectfactory.ComponentProvider;
41  import info.magnolia.registry.RegistrationException;
42  import info.magnolia.task.Task;
43  import info.magnolia.task.Task.Status;
44  import info.magnolia.task.TasksManager;
45  import info.magnolia.task.definition.TaskDefinition;
46  import info.magnolia.task.definition.registry.TaskDefinitionRegistry;
47  import info.magnolia.task.event.TaskEvent;
48  import info.magnolia.task.event.TaskEventHandler;
49  import info.magnolia.ui.admincentral.shellapp.pulse.item.ConfiguredPulseListDefinition;
50  import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseDetailPresenter;
51  import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseItemCategory;
52  import info.magnolia.ui.admincentral.shellapp.pulse.item.list.AbstractPulseListPresenter;
53  import info.magnolia.ui.admincentral.shellapp.pulse.item.list.PulseListActionExecutor;
54  import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterPresenter;
55  import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterView;
56  import info.magnolia.ui.admincentral.shellapp.pulse.task.definition.TaskUiDefinition;
57  import info.magnolia.ui.api.availability.AvailabilityChecker;
58  import info.magnolia.ui.api.event.AdmincentralEventBus;
59  import info.magnolia.ui.api.view.View;
60  import info.magnolia.ui.framework.shell.ShellImpl;
61  import info.magnolia.ui.vaadin.overlay.MessageStyleTypeEnum;
62  
63  import java.util.Arrays;
64  import java.util.List;
65  import java.util.Set;
66  
67  import javax.inject.Inject;
68  import javax.inject.Named;
69  
70  import org.slf4j.Logger;
71  import org.slf4j.LoggerFactory;
72  
73  /**
74   * Presenter of {@link TasksListView}.
75   */
76  public final class TasksListPresenter extends AbstractPulseListPresenter implements TasksListView.Listener, PulseDetailPresenter.Listener, TaskEventHandler {
77  
78      private static final Logger log = LoggerFactory.getLogger(TasksListPresenter.class);
79  
80      private final TasksListView view;
81      private final TasksManager tasksManager;
82      private final ShellImpl shell;
83      private final TaskDefinitionRegistry taskDefinitionRegistry;
84      private final ComponentProvider componentProvider;
85      private final SimpleTranslator i18n;
86      private final String userId;
87  
88      /**
89       * @deprecated since 5.5, use {@link TasksListPresenter#TasksListPresenter(TasksContainer, TasksListView, ShellImpl, TasksManager, TaskDefinitionRegistry,
90       * ComponentProvider, SimpleTranslator, Context, EventBus, ConfiguredPulseListDefinition, AvailabilityChecker, PulseListActionExecutor, PulseListFooterPresenter, I18nizer)} instead.
91       */
92      @Deprecated
93      public TasksListPresenter(final TasksContainer container, final TasksListView view, final ShellImpl shellImpl, final TasksManager tasksManager,
94              final TaskDefinitionRegistry taskDefinitionRegistry, final ComponentProvider componentProvider, final SimpleTranslator i18n, Context context,
95              @Named(AdmincentralEventBus.NAME) final EventBus admincentralEventBus, ConfiguredPulseListDefinition definition) {
96          this(container, view, shellImpl, tasksManager, taskDefinitionRegistry, componentProvider, i18n, context, admincentralEventBus, definition,
97                  componentProvider.getComponent(AvailabilityChecker.class), componentProvider.getComponent(PulseListActionExecutor.class),
98                  componentProvider.getComponent(PulseListFooterPresenter.class), componentProvider.getComponent(I18nizer.class));
99      }
100 
101     @Inject
102     public TasksListPresenter(final TasksContainer container, final TasksListView view, final ShellImpl shellImpl, final TasksManager tasksManager,
103             final TaskDefinitionRegistry taskDefinitionRegistry, final ComponentProvider componentProvider, final SimpleTranslator i18n, Context context,
104             @Named(AdmincentralEventBus.NAME) final EventBus admincentralEventBus, ConfiguredPulseListDefinition definition,
105             AvailabilityChecker availabilityChecker, PulseListActionExecutor pulseListActionExecutor, PulseListFooterPresenter pulseListFooterPresenter, I18nizer i18nizer) {
106         super(container, i18nizer.decorate(definition), availabilityChecker, pulseListActionExecutor, pulseListFooterPresenter);
107         this.view = view;
108         this.shell = shellImpl;
109         this.tasksManager = tasksManager;
110         this.taskDefinitionRegistry = taskDefinitionRegistry;
111         this.componentProvider = componentProvider;
112         this.i18n = i18n;
113         this.userId = context.getUser().getName();
114 
115         admincentralEventBus.addHandler(TaskEvent.class, this);
116     }
117 
118     @Override
119     public View start() {
120         view.setListener(this);
121         view.setDataSource(container.getVaadinContainer());
122         PulseListFooterView footer = pulseListFooterPresenter.start(definition.getBulkActions(), getTotalEntriesAmount());
123         view.setFooter(footer);
124 
125         updateView();
126         filterByItemCategory(PulseItemCategory.UNCLAIMED);
127 
128         return view;
129     }
130 
131     @Override
132     public View openItem(String itemId) throws RegistrationException {
133         Task task = tasksManager.getTaskById(itemId);
134         TaskDefinition definition = taskDefinitionRegistry.get(task.getName());
135 
136         TaskDetailPresenter taskPresenter;
137         if (definition instanceof TaskUiDefinition) {
138             taskPresenter = componentProvider.newInstance(((TaskUiDefinition) definition).getPresenterClass(), task, definition);
139         } else {
140             log.debug("Task definition is not an instance of TaskUiDefinition, the presenter can not be configured.");
141             taskPresenter = componentProvider.newInstance(DefaultTaskDetailPresenter.class, task, definition);
142         }
143         taskPresenter.setListener(this);
144         return taskPresenter.start();
145 
146     }
147 
148     @Override
149     public long getTotalEntriesAmount() {
150         return container.size();
151     }
152 
153     @Override
154     public void onItemClicked(String itemId) {
155         listener.openItem(definition.getName(), itemId);
156     }
157 
158     @Override
159     public void updateDetailView(String itemId) {
160         listener.openItem(definition.getName(), itemId);
161     }
162 
163     @Override
164     @Deprecated
165     public void deleteItems(final Set<String> itemIds) {
166         if (itemIds == null || itemIds.isEmpty()) {
167             return;
168         }
169 
170         for (String taskId : itemIds) {
171             Task task = tasksManager.getTaskById(taskId);
172             if (task.getStatus() != Status.Resolved) {
173                 // log warn/info?
174                 shell.openNotification(MessageStyleTypeEnum.WARNING, true, i18n.translate("pulse.tasks.cantRemove", task.getName()));
175                 return;
176             }
177             tasksManager.archiveTask(taskId);
178         }
179 
180         refresh();
181     }
182 
183     @Override
184     @Deprecated
185     public void claimTask(final Set<String> itemIds) {
186         if (itemIds == null || itemIds.isEmpty()) {
187             return;
188         }
189         for (String taskId : itemIds) {
190             Task task = tasksManager.getTaskById(taskId);
191             if (task.getStatus() != Status.Created) {
192                 // log warn/info?
193                 shell.openNotification(MessageStyleTypeEnum.WARNING, true, i18n.translate("pulse.tasks.cantAssign", task.getName(), task.getStatus()));
194                 return;
195             }
196             tasksManager.claim(taskId, userId);
197         }
198         refresh();
199     }
200 
201     @Override
202     public PulseItemCategory getCategory() {
203         return PulseItemCategory.TASKS;
204     }
205 
206     @Override
207     public void taskClaimed(TaskEvent taskEvent) {
208         refresh();
209     }
210 
211     @Override
212     public void taskAdded(TaskEvent taskEvent) {
213         refresh();
214         listener.updateView(PulseItemCategory.TASKS);
215         view.setTabActive(PulseItemCategory.UNCLAIMED);
216     }
217 
218     @Override
219     public void taskResolved(TaskEvent taskEvent) {
220         refresh();
221         listener.updateView(PulseItemCategory.TASKS);
222         view.setTabActive(PulseItemCategory.UNCLAIMED);
223     }
224 
225     @Override
226     public void taskFailed(TaskEvent taskEvent) {
227         refresh();
228         listener.updateView(PulseItemCategory.TASKS);
229         view.setTabActive(PulseItemCategory.FAILED);
230     }
231 
232     @Override
233     public void taskArchived(TaskEvent taskEvent) {
234         refresh();
235     }
236 
237     @Override
238     public void taskRemoved(TaskEvent taskEvent) {
239     }
240 
241     @Override
242     public void taskScheduled(TaskEvent taskEvent) {
243         refresh();
244         listener.updateView(PulseItemCategory.TASKS);
245         view.setTabActive(PulseItemCategory.SCHEDULED);
246     }
247 
248     private void refresh() {
249         listener.updatePulseCounter();
250         container.refresh();
251         updateView();
252     }
253 
254     @Override
255     public int getPendingItemCount() {
256         return tasksManager.findPendingTasksByUser(userId).size();
257     }
258 
259     private void updateView() {
260         for (Status status : Status.values()) {
261             doTasksStatusUpdate(status);
262         }
263     }
264 
265     private void doTasksStatusUpdate(final Task.Status status) {
266 
267         int count;
268 
269         switch (status) {
270 
271         case Created:
272             count = tasksManager.findTasksByUserAndStatus(userId, Arrays.asList(Status.Created)).size();
273             view.updateCategoryBadgeCount(PulseItemCategory.UNCLAIMED, count);
274             break;
275         case InProgress:
276             count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.InProgress)).size();
277             view.updateCategoryBadgeCount(PulseItemCategory.ONGOING, count);
278             break;
279         case Failed:
280             count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Failed)).size();
281             view.updateCategoryBadgeCount(PulseItemCategory.FAILED, count);
282             break;
283         case Scheduled:
284             count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Scheduled)).size();
285             view.updateCategoryBadgeCount(PulseItemCategory.SCHEDULED, count);
286             break;
287         default:
288             break;
289         }
290     }
291 
292     @Override
293     protected List<Object> getSelectedItemIds() {
294         return view.getSelectedItemIds();
295     }
296 
297 }