/*
* Copyright (c) 2014 Magnet Systems, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.magnet.plugin.r2m.helpers;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.ui.Messages;
import com.magnet.plugin.r2m.generator.Generator;
import com.magnet.plugin.r2m.constants.GenerateActions;
import com.magnet.plugin.r2m.listeners.generator.PostGenerateCallback;
import com.magnet.plugin.r2m.listeners.generator.ProgressGenerateCallback;
import com.magnet.plugin.r2m.messages.R2MMessages;
import com.magnet.plugin.r2m.project.ProjectManager;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import static com.magnet.plugin.r2m.helpers.UIHelper.MESSAGE_GENERATING_SERVICE;
/**
* Trigger code generation
*/
public class AsyncHelper implements ProgressGenerateCallback {
private final Project project;
private final String packageName;
private final String controllerName;
private PostGenerateCallback callback;
private boolean result;
public AsyncHelper(Project project, String packageName, String controllerName, PostGenerateCallback callback) {
this.project = project;
this.packageName = packageName;
this.controllerName = controllerName;
this.callback = callback;
this.result = false;
}
public void runGenerateTask() {
this.result = false;
runGeneration();
}
private void runGeneration() {
ProgressManager.getInstance().run(new Task.Backgroundable(project, MESSAGE_GENERATING_SERVICE, false) {
public void run(@NotNull ProgressIndicator progressIndicator) {
try {
getGenerator().generate(progressIndicator);
} catch (Exception e) {
final String error = e.getMessage();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
onActionFailure(error);
}
});
return;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
onActionSuccess(GenerateActions.GENERATE_SUCCESS);
}
});
}
});
}
private void performFileOperation() {
project.save();
FileDocumentManager.getInstance().saveAllDocuments();
ProjectManagerEx.getInstanceEx().blockReloadingProjectOnExternalChanges();
ProgressManager.getInstance().run(new Task.Backgroundable(project, MESSAGE_GENERATING_SERVICE, false) {
public void run(@NotNull ProgressIndicator progressIndicator) {
getGenerator().makeFilePerformance(progressIndicator);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
onActionSuccess(GenerateActions.FILE_OPERATION_SUCCESS);
}
});
}
});
}
private void showOverrideConfirmationDialog(final List<String> list) {
this.result = false;
StringBuilder sb = new StringBuilder("\n");
for (String e : list) {
sb.append(e).append("\n");
}
int option = Messages.showOkCancelDialog(
R2MMessages.getMessage("CONFIRM_OVERRIDE_FILES", sb.toString()),
R2MMessages.getMessage("CONFIRM_OVERRIDE_FILES_TITLE"),
R2MMessages.getMessage("CONFIRM_OVERRIDE_FILES_BUTTON_TEXT"),
Messages.CANCEL_BUTTON,
Messages.getWarningIcon());
if (option == 0) {
onActionSuccess(GenerateActions.START_FILE_OPERATIONS);
} else {
this.result = true;
onActionSuccess(GenerateActions.FILE_OPERATION_SUCCESS);
}
}
private Generator getGenerator() {
return new Generator(project, packageName, controllerName);
}
@Override
public void onActionFailure(String error) {
UIHelper.showErrorMessage(error);
}
@Override
public void onActionSuccess(GenerateActions actions) {
switch (actions) {
case GENERATE_SUCCESS: {
List<String> list = FileHelper.getCommonFiles(project, controllerName, packageName);
if (list != null && !list.isEmpty()) {
showOverrideConfirmationDialog(list);
} else {
onActionSuccess(GenerateActions.START_FILE_OPERATIONS);
}
break;
}
case START_FILE_OPERATIONS: {
performFileOperation();
break;
}
case FILE_OPERATION_SUCCESS: {
callback.onGenerateFinished(this.result, ProjectManager.getClassFile(project, packageName, controllerName));
break;
}
default:
throw new IllegalArgumentException("Actions should be type of GenerateActions.class");
}
}
}