intellij/src/nl/tudelft/watchdog/intellij/WatchDogStartUp.java
package nl.tudelft.watchdog.intellij;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ViewToolWindowButtonsAction;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.ide.wizard.AbstractWizard;
import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.wm.WindowManager;
import nl.tudelft.watchdog.core.logic.network.JsonTransferer;
import nl.tudelft.watchdog.core.logic.network.ServerCommunicationException;
import nl.tudelft.watchdog.core.logic.ui.events.WatchDogEventType;
import nl.tudelft.watchdog.core.ui.preferences.ProjectPreferenceSetting;
import nl.tudelft.watchdog.core.ui.wizards.User;
import nl.tudelft.watchdog.core.util.WatchDogGlobals;
import nl.tudelft.watchdog.core.util.WatchDogLogger;
import nl.tudelft.watchdog.intellij.logic.InitializationManager;
import nl.tudelft.watchdog.intellij.ui.wizards.ProjectRegistrationWizard;
import nl.tudelft.watchdog.intellij.ui.wizards.RegistrationWorkflowWizard;
import nl.tudelft.watchdog.intellij.ui.preferences.Preferences;
import nl.tudelft.watchdog.intellij.util.WatchDogUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.io.File;
public class WatchDogStartUp implements ProjectComponent {
/**
* Current Project.
*/
private Project project;
/**
* The warning displayed when WatchDog is not registered. Note: JLabel requires html tags for a new line (and other formatting).
*/
public static final String WATCHDOG_UNREGISTERED_WARNING = "<html>Warning: You can only use WatchDog when you register it.<br><br>Would you like to create a user without providing additional information?";
/**
* Whether the user has cancelled the user project registration wizard.
*/
private boolean userProjectRegistrationCancelled = false;
private WindowFocusListener windowFocusListener;
public WatchDogStartUp(Project project) {
this.project = project;
}
public void initComponent() {
WatchDogUtils.setActiveProject(project);
WatchDogGlobals.setLogDirectory(PluginManager.getPlugin(PluginId.findId("nl.tudelft.watchdog")).getPath().toString() + File.separator + "logs" + File.separator);
WatchDogGlobals.setPreferences(Preferences.getInstance());
String platform = ApplicationInfo.getInstance().getVersionName();
if (platform.equals("Android Studio")) {
WatchDogGlobals.hostIDE = WatchDogGlobals.IDE.ANDROIDSTUDIO;
} else {
WatchDogGlobals.hostIDE = WatchDogGlobals.IDE.INTELLIJ;
}
}
public void disposeComponent() {
// intentionally left empty
}
@NotNull
public String getComponentName() {
return "WatchDog";
}
public void projectOpened() {
windowFocusListener = new WindowAdapter() {
@Override
public void windowGainedFocus(WindowEvent e) {
WatchDogUtils.setActiveProject(project);
}
};
WindowManager.getInstance().getFrame(project).addWindowFocusListener(windowFocusListener);
checkWhetherToDisplayUserProjectRegistrationWizard();
if (WatchDogUtils.isEmpty(WatchDogGlobals.getPreferences().getUserId())
|| userProjectRegistrationCancelled) {
return;
}
checkIsProjectAlreadyRegistered();
checkWhetherToDisplayProjectWizard();
checkWhetherToStartWatchDog();
}
public void projectClosed() {
if (!WatchDogUtils.isWatchDogActive(project)) {
return;
}
InitializationManager initializationManager = InitializationManager.getInstance(project);
WatchDogEventType.END_IDE.process(this);
initializationManager.getIntervalManager().closeAllIntervals();
initializationManager.getTransferManager().sendItemsImmediately();
initializationManager.shutdown(project.getName());
JFrame frame = WindowManager.getInstance().getFrame(project);
if (frame != null) {
frame.removeWindowFocusListener(windowFocusListener);
}
}
/**
* Checks whether there is a registered WatchDog user
*/
private void checkWhetherToDisplayUserProjectRegistrationWizard() {
Preferences preferences = Preferences.getInstance();
ProjectPreferenceSetting projectSetting = preferences.getOrCreateProjectSetting(project.getName());
if (!WatchDogUtils.isEmpty(WatchDogGlobals.getPreferences().getUserId())
|| (projectSetting.startupQuestionAsked && !projectSetting.enableWatchdog)) {
return;
}
AbstractWizard wizard = new RegistrationWorkflowWizard(project);
wizard.show();
if (wizard.getExitCode() == DialogWrapper.CANCEL_EXIT_CODE) {
userProjectRegistrationCancelled = true;
if (preferences.getUserId() == null || preferences.getOrCreateProjectSetting(project.getName()).projectId == null) {
if (Messages.YES == Messages.showYesNoDialog(WATCHDOG_UNREGISTERED_WARNING, "WatchDog is not registered!", Messages.getQuestionIcon())) {
makeSilentRegistration();
} else {
preferences.registerProjectUse(project.getName(), false);
}
}
}
}
private void makeSilentRegistration() {
String userId = "";
Preferences preferences = Preferences.getInstance();
if (preferences.getUserId() == null || preferences.getUserId().isEmpty()) {
User user = new User();
user.programmingExperience = "NA";
try {
userId = new JsonTransferer().registerNewUser(user);
} catch (ServerCommunicationException exception) {
WatchDogLogger.getInstance().logSevere(exception);
}
if (WatchDogUtils.isEmptyOrHasOnlyWhitespaces(userId)) {
return;
}
preferences.setUserId(userId);
preferences.registerProjectId(WatchDogUtils.getProjectName(), "");
}
registerAnonymousProject(preferences.getUserId());
}
private void registerAnonymousProject(String userId) {
String projectId = "";
Preferences preferences = Preferences.getInstance();
try {
projectId = new JsonTransferer().registerNewProject(new nl.tudelft.watchdog.core.ui.wizards.Project(userId));
} catch (ServerCommunicationException exception) {
WatchDogLogger.getInstance().logSevere(exception);
}
if (WatchDogUtils.isEmptyOrHasOnlyWhitespaces(projectId)) {
return;
}
preferences.registerProjectId(WatchDogUtils.getProjectName(), projectId);
preferences.registerProjectUse(WatchDogUtils.getProjectName(), true);
}
private void checkIsProjectAlreadyRegistered() {
if (!WatchDogGlobals.getPreferences().isProjectRegistered(project.getName())) {
boolean useWatchDogInThisWorkspace = Messages.YES ==
Messages.showYesNoDialog("Should WatchDog be active in this workspace?", "WatchDog Workspace Registration", AllIcons.General.QuestionDialog);
WatchDogLogger.getInstance().logInfo("Registering workspace...");
WatchDogGlobals.getPreferences().registerProjectUse(project.getName(), useWatchDogInThisWorkspace);
}
}
private void checkWhetherToDisplayProjectWizard() {
ProjectPreferenceSetting setting = WatchDogGlobals.getPreferences()
.getOrCreateProjectSetting(project.getName());
if (setting.enableWatchdog && WatchDogUtils.isEmpty(setting.projectId)) {
AbstractWizard wizard = new ProjectRegistrationWizard(project);
wizard.show();
if (wizard.getExitCode() == DialogWrapper.CANCEL_EXIT_CODE) {
registerAnonymousProject(WatchDogGlobals.getPreferences().getUserId());
}
}
}
private void checkWhetherToStartWatchDog() {
ProjectPreferenceSetting setting = WatchDogGlobals.getPreferences()
.getOrCreateProjectSetting(project.getName());
if (setting.enableWatchdog) {
WatchDogLogger.getInstance().logInfo("Starting WatchDog ...");
InitializationManager.getInstance(project);
WatchDogUtils.setWatchDogActiveForProject(project);
new ViewToolWindowButtonsAction().setSelected(null, true);
}
}
}