Skip to content

Commit 2e11d59

Browse files
committed
Improve error messages
1 parent 85d8600 commit 2e11d59

12 files changed

+112
-47
lines changed

maven-wrapper/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<dependency>
4747
<groupId>${project.groupId}</groupId>
4848
<artifactId>core</artifactId>
49-
<version>0.10.2-SNAPSHOT</version>
49+
<version>0.10.3-SNAPSHOT</version>
5050
</dependency>
5151
<dependency>
5252
<groupId>${project.groupId}</groupId>

tmc-plugin/src/fi/helsinki/cs/tmc/actions/CheckForNewExercisesOrUpdates.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ public void bgTaskCancelled() {
124124

125125
@Override
126126
public void bgTaskFailed(Throwable ex) {
127-
if (!beQuiet || ex instanceof ObsoleteClientException) {
128-
dialogs.displayError("Failed to check for new exercises.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
127+
if (!beQuiet) {
128+
dialogs.displayError("Failed to check for new exercises.\nPlease check your internet connection.");
129129
}
130130
}
131131
});

tmc-plugin/src/fi/helsinki/cs/tmc/actions/CheckForNewReviews.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@ public void bgTaskReady(List<Review> result) {
104104

105105
@Override
106106
public void bgTaskFailed(final Throwable ex) {
107-
final String msg = "Failed to check for code reviews";
107+
final String msg = "Failed to check for code reviews.\nPlease check your internet connection.";
108108
log.log(Level.INFO, msg, ex);
109109
if (!beQuiet) {
110-
dialogs.displayError(msg, ex);
110+
dialogs.displayError(msg);
111111
}
112112
}
113113

tmc-plugin/src/fi/helsinki/cs/tmc/actions/DownloadCompletedExercises.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public void bgTaskCancelled() {
7777

7878
@Override
7979
public void bgTaskFailed(Throwable ex) {
80-
dialogs.displayError("Failed to check for new exercises.\n" + ServerErrorHelper.getServerExceptionMsg(ex));
80+
dialogs.displayError("Failed to check for new exercises.\nPlease check your internet connection.");
8181
}
8282
});
8383
}

tmc-plugin/src/fi/helsinki/cs/tmc/actions/SaveSettingsAction.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515

1616
import java.awt.event.ActionEvent;
1717
import java.util.List;
18+
import java.util.logging.Level;
19+
import java.util.logging.Logger;
1820
import javax.swing.AbstractAction;
21+
import org.openide.util.Exceptions;
1922

2023
public class SaveSettingsAction extends AbstractAction {
2124

@@ -24,6 +27,8 @@ public class SaveSettingsAction extends AbstractAction {
2427
private final TmcCore tmcCore;
2528
private final FixUnoptimalSettings fixUnoptimalSettings;
2629
private final SendDiagnostics sendDiagnostics;
30+
31+
private Logger log = Logger.getLogger(SaveSettingsAction.class.getName());
2732

2833
public SaveSettingsAction() {
2934
this.courseDb = CourseDb.getInstance();
@@ -69,7 +74,11 @@ public void actionPerformed(ActionEvent e) {
6974
}
7075

7176
if (prefUi.getSelectedCourseName() != null) {
72-
courseDb.setAvailableCourses(prefUi.getAvailableCourses());
77+
try {
78+
courseDb.setAvailableCourses(prefUi.getAvailableCourses());
79+
} catch (Exception ex) {
80+
log.log(Level.SEVERE, "Communication with the server failed! Unable to fetch available courses.");
81+
}
7382
courseDb.setCurrentCourseName(prefUi.getSelectedCourseName());
7483

7584
RefreshCoursesAction refresh = new RefreshCoursesAction();

tmc-plugin/src/fi/helsinki/cs/tmc/ui/OrganizationListWindow.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.awt.event.MouseEvent;
1818
import java.awt.event.ComponentEvent;
1919
import java.awt.event.ComponentListener;
20+
import java.io.IOException;
2021
import java.util.Collections;
2122
import java.util.List;
2223

@@ -167,7 +168,11 @@ public void actionPerformed(ActionEvent e) {
167168
panel.setOrganization(organization);
168169
CourseListWindow.display();
169170
} catch (Exception ex) {
170-
Exceptions.printStackTrace(ex);
171+
if (ex instanceof IOException) {
172+
ConvenientDialogDisplayer.getDefault().displayError("Couldn't connect to the server! Please check your internet connection.");
173+
} else {
174+
Exceptions.printStackTrace(ex);
175+
}
171176
}
172177
}
173178
}

tmc-plugin/src/fi/helsinki/cs/tmc/ui/PreferencesPanel.java

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.base.Optional;
44
import fi.helsinki.cs.tmc.core.TmcCore;
5+
import fi.helsinki.cs.tmc.core.configuration.TmcSettings;
56
import fi.helsinki.cs.tmc.core.domain.Course;
67
import fi.helsinki.cs.tmc.core.domain.Organization;
78
import fi.helsinki.cs.tmc.core.domain.ProgressObserver;
@@ -12,11 +13,12 @@
1213
import fi.helsinki.cs.tmc.utilities.BgTask;
1314
import fi.helsinki.cs.tmc.utilities.DelayedRunner;
1415
import fi.helsinki.cs.tmc.utilities.LoginManager;
16+
import fi.helsinki.cs.tmc.utilities.ThrowingFunction;
1517

1618
import java.awt.event.ItemEvent;
1719
import java.awt.event.ItemListener;
1820
import java.io.File;
19-
import java.util.ArrayList;
21+
import java.io.IOException;
2022
import java.util.List;
2123
import java.util.Locale;
2224
import javax.swing.JButton;
@@ -37,6 +39,8 @@
3739
private ConvenientDialogDisplayer dialogs = ConvenientDialogDisplayer.getDefault();
3840

3941
private DelayedRunner refreshRunner = new DelayedRunner();
42+
43+
private final TmcSettings settings = TmcSettingsHolder.get();
4044

4145
/*package*/ PreferencesPanel() {
4246
initComponents();
@@ -45,46 +49,38 @@
4549
}
4650

4751
private void updateFields() {
48-
final Optional<String> usernamePresent = TmcSettingsHolder.get().getUsername();
49-
String username = "";
50-
if (usernamePresent.isPresent()) {
51-
username = usernamePresent.get();
52-
}
52+
final Optional<String> username = this.settings.getUsername();
5353
final JLabel login = this.loginLabel;
5454
final JButton logout = this.logoutButton;
55-
if (!username.isEmpty()) {
56-
login.setText("Logged in as " + username);
55+
if (username.isPresent()) {
56+
login.setText("Logged in as " + username.get());
5757
logout.setEnabled(true);
5858
} else {
5959
login.setText("Not logged in!");
6060
logout.setEnabled(false);
6161
}
6262

63-
Optional<Organization> org = TmcSettingsHolder.get().getOrganization();
63+
Optional<Organization> org = this.settings.getOrganization();
6464
final JLabel selectedOrg = this.selectedOrganizationLabel;
6565
if (org.isPresent()) {
6666
selectedOrg.setText(org.get().getName());
6767
} else {
6868
selectedOrg.setText("No organization selected");
6969
}
7070

71-
Optional<Course> course = TmcSettingsHolder.get().getCurrentCourse();
71+
Optional<Course> course = this.settings.getCurrentCourse();
7272
final JLabel selectedCourse = this.selectedCourseLabel;
7373
if (course.isPresent()) {
74-
selectedCourse.setText(course.get().getName());
74+
selectedCourse.setText(course.get().getTitle());
7575
} else {
7676
selectedCourse.setText("No course selected");
7777
}
7878
}
7979

8080
@Override
81-
public List<Course> getAvailableCourses() {
82-
try {
83-
List<Course> courses = TmcCore.get().listCourses(ProgressObserver.NULL_OBSERVER).call();
84-
return courses;
85-
} catch (Exception ex) {
86-
}
87-
return new ArrayList<>();
81+
public List<Course> getAvailableCourses() throws Exception {
82+
List<Course> courses = TmcCore.get().listCourses(ProgressObserver.NULL_OBSERVER).call();
83+
return courses;
8884
}
8985

9086
@Override
@@ -98,13 +94,17 @@ public void setProjectDir(String projectDir) {
9894
}
9995

10096
public void setSelectedCourse(Course course) {
101-
TmcSettingsHolder.get().setCourse(Optional.of(course));
102-
this.selectedCourseLabel.setText(course.getName());
97+
this.settings.setCourse(Optional.of(course));
98+
this.selectedCourseLabel.setText(course.getTitle());
10399
}
104100

105101
@Override
106102
public String getSelectedCourseName() {
107-
return this.selectedCourseLabel.getText();
103+
final Optional<Course> currentCourse = this.settings.getCurrentCourse();
104+
if (currentCourse.isPresent()) {
105+
return currentCourse.get().getName();
106+
}
107+
return null;
108108
}
109109

110110
@Override
@@ -173,8 +173,15 @@ public void setSendDiagnosticsEnabled(boolean value) {
173173
}
174174

175175
public void setOrganization(OrganizationCard organization) {
176-
TmcSettingsHolder.get().setOrganization(Optional.of(organization.getOrganization()));
177-
this.selectedOrganizationLabel.setText(organization.getOrganization().getName());
176+
Optional<Organization> oldOrganization = this.settings.getOrganization();
177+
Organization newOrganization = organization.getOrganization();
178+
179+
if (!oldOrganization.isPresent() || (oldOrganization.isPresent() && !oldOrganization.get().getSlug().equals(newOrganization.getSlug()))) {
180+
this.settings.setOrganization(Optional.of(newOrganization));
181+
this.settings.setCourse(Optional.<Course>absent());
182+
this.selectedOrganizationLabel.setText(newOrganization.getName());
183+
this.selectedCourseLabel.setText("No course selected");
184+
}
178185
}
179186

180187
private static class LocaleWrapper {
@@ -207,9 +214,9 @@ public int hashCode() {
207214
}
208215

209216
private void updateSettingsForRefresh() {
210-
TmcCoreSettingsImpl settings = (TmcCoreSettingsImpl)TmcSettingsHolder.get();
211-
settings.setProjectRootDir(getProjectDir());
212-
settings.save(); // TODO: is this wanted
217+
TmcCoreSettingsImpl tmcSettings = (TmcCoreSettingsImpl)this.settings;
218+
tmcSettings.setProjectRootDir(getProjectDir());
219+
tmcSettings.save(); // TODO: is this wanted
213220
}
214221

215222
private void setUpErrorMsgLocaleSelection() {
@@ -238,6 +245,16 @@ public void itemStateChanged(ItemEvent event) {
238245
}
239246
});
240247
}
248+
249+
private void wrapWithExceptionHandling(ThrowingFunction function) {
250+
try {
251+
function.apply();
252+
} catch (IOException ex) {
253+
dialogs.displayError("Couldn't connect to the server! Please check your internet connection.");
254+
} catch (Exception ex) {
255+
dialogs.displayError(ex.getMessage());
256+
}
257+
}
241258

242259
/** This method is called from within the constructor to
243260
* initialize the form.
@@ -480,10 +497,8 @@ private void folderChooserBtnActionPerformed(java.awt.event.ActionEvent evt) {//
480497
}//GEN-LAST:event_folderChooserBtnActionPerformed
481498

482499
private void changeCourseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeCourseButtonActionPerformed
483-
try {
484-
CourseListWindow.display();
485-
} catch (Exception ex) {
486-
}
500+
wrapWithExceptionHandling(CourseListWindow::display);
501+
487502
updateSettingsForRefresh();
488503
}//GEN-LAST:event_changeCourseButtonActionPerformed
489504

@@ -492,15 +507,20 @@ private void resolveDependenciesActionPerformed(java.awt.event.ActionEvent evt)
492507
}//GEN-LAST:event_resolveDependenciesActionPerformed
493508

494509
private void sendDiagnosticsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sendDiagnosticsActionPerformed
495-
TmcCoreSettingsImpl settings = (TmcCoreSettingsImpl) TmcSettingsHolder.get();
496-
settings.setSendDiagnostics(getSendDiagnosticsEnabled());
510+
TmcCoreSettingsImpl tmcSettings = (TmcCoreSettingsImpl) this.settings;
511+
tmcSettings.setSendDiagnostics(getSendDiagnosticsEnabled());
497512
}//GEN-LAST:event_sendDiagnosticsActionPerformed
498513

499514
private void changeOrganizationButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeOrganizationButtonActionPerformed
500-
try {
501-
OrganizationListWindow.display();
502-
} catch (Exception ex) {
515+
this.selectedCourseLabel.setText("No course selected");
516+
517+
wrapWithExceptionHandling(OrganizationListWindow::display);
518+
519+
final Optional<Course> currentCourse = this.settings.getCurrentCourse();
520+
if (currentCourse.isPresent()) {
521+
this.selectedCourseLabel.setText(currentCourse.get().getTitle());
503522
}
523+
504524
updateSettingsForRefresh();
505525
}//GEN-LAST:event_changeOrganizationButtonActionPerformed
506526

tmc-plugin/src/fi/helsinki/cs/tmc/ui/PreferencesUI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public interface PreferencesUI {
1010

1111
String getProjectDir();
1212

13-
List<Course> getAvailableCourses();
13+
List<Course> getAvailableCourses() throws Exception;
1414

1515
boolean getCheckForUpdatesInTheBackground();
1616

tmc-plugin/src/fi/helsinki/cs/tmc/ui/PreferencesUIFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ public void windowClosed(WindowEvent we) {
102102
SwingUtilities.invokeLater(new Runnable() {
103103
@Override
104104
public void run() {
105-
dialog.setVisible(true);
105+
if (dialog != null) {
106+
dialog.setVisible(true);
107+
}
106108
}
107109
});
108110
}

tmc-plugin/src/fi/helsinki/cs/tmc/utilities/BgTask.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
import fi.helsinki.cs.tmc.core.domain.ProgressObserver;
44
import fi.helsinki.cs.tmc.core.exceptions.AuthenticationFailedException;
55
import fi.helsinki.cs.tmc.core.exceptions.NotLoggedInException;
6+
import fi.helsinki.cs.tmc.core.exceptions.ObsoleteClientException;
7+
import fi.helsinki.cs.tmc.core.exceptions.ShowToUserException;
8+
import fi.helsinki.cs.tmc.core.exceptions.TmcCoreException;
69
import fi.helsinki.cs.tmc.coreimpl.BridgingProgressObserver;
10+
import fi.helsinki.cs.tmc.ui.ConvenientDialogDisplayer;
711
import java.io.IOException;
812

913
import java.util.concurrent.Callable;
@@ -141,14 +145,14 @@ public void run() {
141145
try {
142146
successful = true;
143147
resultTemp = callable.call();
144-
} catch (NotLoggedInException | OAuthProblemException | OAuthSystemException | AuthenticationFailedException | IOException ex) {
148+
} catch (NotLoggedInException | OAuthProblemException | OAuthSystemException | AuthenticationFailedException ex) {
145149
successful = false;
146150
boolean authenticationSuccessful;
147151
do {
148152
try {
149153
authenticationSuccessful = true;
150154
new LoginManager().login();
151-
} catch (AuthenticationFailedException | IOException | InterruptedException exception) {
155+
} catch (AuthenticationFailedException | InterruptedException exception) {
152156
authenticationSuccessful = false;
153157
}
154158
} while (!authenticationSuccessful);
@@ -163,6 +167,21 @@ public void run() {
163167
}
164168
});
165169
return result;
170+
} catch (TmcCoreException ex) {
171+
if (ex instanceof TmcCoreException && (ex.getCause() == null || !(ex.getCause() instanceof ObsoleteClientException))) {
172+
SwingUtilities.invokeLater(new Runnable() {
173+
@Override
174+
public void run() {
175+
listener.bgTaskFailed(ex);
176+
}
177+
});
178+
return null;
179+
}
180+
ConvenientDialogDisplayer.getDefault().displayError(ex.getCause().getMessage());
181+
return null;
182+
} catch (ObsoleteClientException | ShowToUserException ex) {
183+
ConvenientDialogDisplayer.getDefault().displayError(ex.getMessage());
184+
return null;
166185
} catch (InterruptedException e) {
167186
SwingUtilities.invokeLater(new Runnable() {
168187
@Override

0 commit comments

Comments
 (0)