You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CoreErrorsDialogModel.java 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Copyright (c) 2006-2015 DMDirc Developers
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. package com.dmdirc.ui.core.errors;
  23. import com.dmdirc.events.NonFatalProgramErrorEvent;
  24. import com.dmdirc.events.ProgramErrorDeletedEvent;
  25. import com.dmdirc.events.ProgramErrorStatusEvent;
  26. import com.dmdirc.interfaces.EventBus;
  27. import com.dmdirc.interfaces.ui.ErrorsDialogModel;
  28. import com.dmdirc.interfaces.ui.ErrorsDialogModelListener;
  29. import com.dmdirc.logger.ErrorManager;
  30. import com.dmdirc.logger.ErrorReportStatus;
  31. import com.dmdirc.logger.ProgramError;
  32. import com.dmdirc.util.collections.ListenerList;
  33. import java.util.Collections;
  34. import java.util.Optional;
  35. import java.util.Set;
  36. import java.util.concurrent.CopyOnWriteArraySet;
  37. import javax.inject.Inject;
  38. import net.engio.mbassy.listener.Handler;
  39. import static com.google.common.base.Preconditions.checkNotNull;
  40. /**
  41. * Basic implementation for a {@link ErrorsDialogModel}.
  42. */
  43. public class CoreErrorsDialogModel implements ErrorsDialogModel {
  44. private final ListenerList listenerList;
  45. private final ErrorManager errorManager;
  46. private final EventBus eventBus;
  47. private Optional<DisplayableError> selectedError;
  48. private final Set<DisplayableError> errors;
  49. @Inject
  50. public CoreErrorsDialogModel(final ErrorManager errorManager,
  51. final EventBus eventBus) {
  52. this.listenerList = new ListenerList();
  53. this.errorManager = errorManager;
  54. this.eventBus = eventBus;
  55. errors = new CopyOnWriteArraySet<>();
  56. selectedError = Optional.empty();
  57. }
  58. @Override
  59. public void load() {
  60. eventBus.subscribe(this);
  61. errorManager.getErrors().forEach(e -> errors.add(getDisplayableError(e)));
  62. }
  63. @Override
  64. public void unload() {
  65. eventBus.unsubscribe(this);
  66. errors.clear();
  67. }
  68. @Override
  69. public Set<DisplayableError> getErrors() {
  70. return Collections.unmodifiableSet(errors);
  71. }
  72. @Override
  73. public Optional<DisplayableError> getSelectedError() {
  74. return selectedError;
  75. }
  76. @Override
  77. public void setSelectedError(final Optional<DisplayableError> selectedError) {
  78. checkNotNull(selectedError);
  79. this.selectedError = selectedError;
  80. listenerList.getCallable(ErrorsDialogModelListener.class).selectedErrorChanged(selectedError);
  81. }
  82. @Override
  83. public void deleteSelectedError() {
  84. selectedError.map(DisplayableError::getProgramError).ifPresent(errorManager::deleteError);
  85. }
  86. @Override
  87. public void deleteAllErrors() {
  88. errorManager.deleteAll();
  89. }
  90. @Override
  91. public void sendSelectedError() {
  92. selectedError.map(DisplayableError::getProgramError).ifPresent(errorManager::sendError);
  93. }
  94. @Override
  95. public boolean isDeletedAllowed() {
  96. return selectedError.isPresent();
  97. }
  98. @Override
  99. public boolean isDeleteAllAllowed() {
  100. return !errorManager.getErrors().isEmpty();
  101. }
  102. @Override
  103. public boolean isSendAllowed() {
  104. final ErrorReportStatus status = selectedError.map(DisplayableError::getReportStatus)
  105. .orElse(ErrorReportStatus.NOT_APPLICABLE);
  106. return status == ErrorReportStatus.WAITING || status == ErrorReportStatus.ERROR;
  107. }
  108. @Override
  109. public void addListener(final ErrorsDialogModelListener listener) {
  110. checkNotNull(listener);
  111. listenerList.add(ErrorsDialogModelListener.class, listener);
  112. }
  113. @Override
  114. public void removeListener(final ErrorsDialogModelListener listener) {
  115. checkNotNull(listener);
  116. listenerList.remove(ErrorsDialogModelListener.class, listener);
  117. }
  118. @Handler
  119. public void handleErrorStatusChanged(final ProgramErrorStatusEvent event) {
  120. errors.stream().filter(e -> e.getProgramError().equals(event.getError()))
  121. .findFirst().ifPresent(e -> {
  122. e.setReportStatus(event.getError().getReportStatus());
  123. listenerList.getCallable(ErrorsDialogModelListener.class).errorStatusChanged(e);
  124. });
  125. }
  126. @Handler
  127. public void handleErrorDeleted(final ProgramErrorDeletedEvent event) {
  128. errors.stream().filter(e -> e.getProgramError().equals(event.getError()))
  129. .findFirst().ifPresent(e -> {
  130. errorManager.deleteError(e.getProgramError());
  131. errors.remove(e);
  132. listenerList.getCallable(ErrorsDialogModelListener.class).errorDeleted(e);
  133. setSelectedError(Optional.empty());
  134. });
  135. }
  136. @Handler
  137. public void handleErrorAdded(final NonFatalProgramErrorEvent event) {
  138. final Optional<DisplayableError> de = errors.stream().filter(
  139. e -> e.getProgramError().equals(event.getError())).findFirst();
  140. if (!de.isPresent()) {
  141. final DisplayableError error = getDisplayableError(event.getError());
  142. errors.add(error);
  143. listenerList.getCallable(ErrorsDialogModelListener.class).errorAdded(error);
  144. }
  145. }
  146. private DisplayableError getDisplayableError(final ProgramError error) {
  147. final String details;
  148. if (error.getThrowableAsString().isPresent()) {
  149. details = error.getMessage() + '\n' + error.getThrowableAsString().get();
  150. } else {
  151. details = error.getMessage();
  152. }
  153. return new DisplayableError(error.getDate(), error.getMessage(), details,
  154. error.getLevel(), error.getReportStatus(), error);
  155. }
  156. }