package org.docear.plugin.services.features.user.action;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import org.docear.plugin.core.ui.wizard.Wizard;
import org.docear.plugin.core.ui.wizard.WizardSession;
import org.docear.plugin.core.ui.wizard.WizardPageDescriptor;
import org.docear.plugin.services.DocearServiceException;
import org.docear.plugin.services.DocearServiceException.DocearServiceExceptionType;
import org.docear.plugin.services.ServiceController;
import org.docear.plugin.services.features.setup.DocearServiceTestTask;
import org.docear.plugin.services.features.setup.view.VerifyServicePagePanel;
import org.docear.plugin.services.features.user.DocearLocalUser;
import org.docear.plugin.services.features.user.DocearUser;
import org.docear.plugin.services.features.user.DocearUserController;
import org.docear.plugin.services.features.user.view.LoginPagePanel;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.LogUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.actions.AWorkspaceAction;
public class DocearUserLoginAction extends AWorkspaceAction {
private static final long serialVersionUID = 1L;
public static final String KEY = "docear.action.user.login";
public DocearUserLoginAction() {
super(KEY);
}
public void actionPerformed(ActionEvent event) {
showLoginWizard();
}
public static void showLoginWizard() {
showLoginWizard(null);
}
public static void showLoginWizard(String message) {
final Wizard wiz = new Wizard(UITools.getFrame());
initWizard(wiz, message);
new Thread(new Runnable() {
public void run() {
int ret = wiz.show();
if(ret == Wizard.OK_OPTION) {
DocearUser user;
if(wiz.getSession().get(DocearLocalUser.class) != null) {
user = DocearUserController.LOCAL_USER;
}
else {
user = wiz.getSession().get(DocearUser.class);
}
if(!user.equals(DocearUserController.getActiveUser())) {
DocearUser clonedUser = user.clone();
user.activate();
DocearUserController.getActiveUser().setAccessToken(clonedUser.getAccessToken());
}
try {
WorkspaceController.getCurrentModeExtension().getView().refreshView();
}
catch (Exception e) {
LogUtils.warn(e);
}
}
}
}).start();
}
private static void initWizard(Wizard wizard, String message) {
//registration page
WizardPageDescriptor desc = new WizardPageDescriptor("page.login", new LoginPagePanel(message)) {
public WizardPageDescriptor getNextPageDescriptor(WizardSession context) {
return context.getModel().getPage("page.verify.login");
}
};
desc.getPage().setPreferredSize(new Dimension(640,320));
wizard.registerWizardPanel(desc);
wizard.setStartPage(desc.getIdentifier());
wizard.getSession().set(DocearUser.class, DocearUserController.getActiveUser());
//login verification
desc = new WizardPageDescriptor("page.verify.login", new VerifyServicePagePanel("Log-In", getLoginVerificationTask(), true)) {
public WizardPageDescriptor getNextPageDescriptor(WizardSession context) {
return Wizard.FINISH_PAGE;
}
};
desc.getPage().setSkipOnBack(true);
desc.getPage().setPreferredSize(new Dimension(640,480));
wizard.registerWizardPanel(desc);
}
public static DocearServiceTestTask getLoginVerificationTask() {
return new DocearServiceTestTask() {
private boolean success = false;
private DocearServiceException ex = null;
public boolean isSuccessful() {
return success;
}
public void run(final DocearUser user) throws DocearServiceException {
ex = null;
success = false;
if(!user.isValid()) {
Thread task = new Thread() {
public void run() {
try {
ServiceController.getFeature(DocearUserController.class).loginUser(user);
} catch (DocearServiceException e) {
if(DocearServiceExceptionType.NO_CONNECTION.equals(e.getType()) && user.getAccessToken() != null) {
user.setEnabled(true);
user.setAccessToken(user.getAccessToken());
}
else {
ex = e;
}
}
}
};
task.start();
try {
task.join();
} catch (InterruptedException e) {
LogUtils.warn(e);
}
if(ex != null) {
throw ex;
}
}
if(user.isValid()) {
success = true;
}
}
};
}
}