package org.docear.plugin.services.features.user.action; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.docear.plugin.core.DocearController; 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.ServiceController; import org.docear.plugin.services.features.setup.DocearServiceTestTask; import org.docear.plugin.services.features.setup.view.RegistrationPagePanel; 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.KeepWorkspaceSettingsPagePanel; import org.docear.plugin.services.features.user.workspace.DocearWorkspaceSettings; import org.freeplane.core.ui.components.UITools; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.actions.AWorkspaceAction; public class DocearUserRegistrationAction extends AWorkspaceAction { private static final long serialVersionUID = 1L; public static final String KEY = "docear.action.user.register"; public DocearUserRegistrationAction() { super(KEY); } public void actionPerformed(ActionEvent event) { showRegistrationWizard(); } public static Object addRegistrationPages(Wizard wizard) { Object startId; //registration page WizardPageDescriptor desc = new WizardPageDescriptor("page.registration", new RegistrationPagePanel()) { public WizardPageDescriptor getNextPageDescriptor(WizardSession context) { ((RegistrationPagePanel)getPage()).getUser(); return context.getModel().getPage("page.verify.registration"); } @Override public void aboutToDisplayPage(WizardSession context) { super.aboutToDisplayPage(context); context.getBackButton().setVisible(false); } }; desc.getPage().setPreferredSize(new Dimension(640,380)); wizard.registerWizardPanel(desc); wizard.setStartPage(desc.getIdentifier()); startId = desc.getIdentifier(); //registration verification final DocearServiceTestTask task = getRegistrationVerificationTask(); desc = new WizardPageDescriptor("page.verify.registration", new VerifyServicePagePanel("Registration", task, false)) { public WizardPageDescriptor getNextPageDescriptor(WizardSession context) { context.getTraversalLog().getPreviousPage(context); if(DocearUserController.getActiveUser() instanceof DocearLocalUser) { return context.getModel().getPage("page.registration.keep_workspace"); } else { return Wizard.FINISH_PAGE; } } @Override public void aboutToDisplayPage(WizardSession context) { super.aboutToDisplayPage(context); if(DocearUserController.getActiveUser() instanceof DocearLocalUser) { context.getNextButton().setText(TextUtils.getText("docear.setup.wizard.controls.next")); } else { context.getNextButton().setText(TextUtils.getText("docear.setup.wizard.controls.finish")); } if(task.isSuccessful()) { context.getBackButton().setEnabled(false); } } }; desc.getPage().setSkipOnBack(true); wizard.registerWizardPanel(desc); desc = new WizardPageDescriptor("page.registration.keep_workspace", new KeepWorkspaceSettingsPagePanel()) { public WizardPageDescriptor getNextPageDescriptor(WizardSession context) { WorkspaceController.save(); if(((KeepWorkspaceSettingsPagePanel) getPage()).isKeepSettingsEnabled()) { try { moveUserSettings(DocearUserController.getActiveUser(), context.get(DocearUser.class)); } catch (Exception e) { LogUtils.warn("org.docear.plugin.services.features.user.action.DocearUserRegistrationAction.initWizard(wizard): "+ e.getMessage()); } } return Wizard.FINISH_PAGE; } }; desc.getPage().setSkipOnBack(true); wizard.registerWizardPanel(desc); return startId; } public static DocearServiceTestTask getRegistrationVerificationTask() { 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).createUserAccount(user); } catch (DocearServiceException e) { ex = e; } } }; task.start(); try { task.join(); } catch (InterruptedException e) { LogUtils.warn(e); } if(ex != null) { throw ex; } success = true; } } }; } public static void moveUserSettings(DocearUser srcUser, DocearUser destUser) throws IOException { if(srcUser == null || destUser == null) { return; } DocearWorkspaceSettings settings = ServiceController.getFeature(DocearWorkspaceSettings.class); File srcDir = new File(settings.getSettingsPath(srcUser)); File destDir = new File(settings.getSettingsPath(destUser)); if(srcDir.exists()) { FileUtils.moveDirectory(srcDir, destDir); } } public static void useRegisteredUser(final Wizard wizard) { DocearUser user = wizard.getSession().get(DocearUser.class); DocearUser clone = user.clone(); user.activate(); user.setBackupEnabled(clone.isBackupEnabled()); user.setCollaborationEnabled(clone.isCollaborationEnabled()); user.setSynchronizationEnabled(clone.isSynchronizationEnabled()); user.setRecommendationsEnabled(clone.isRecommendationsEnabled()); DocearController.getController().getEventQueue().invoke(new Runnable() { public void run() { WorkspaceController.save(); } }); } public static void showRegistrationWizard() { final Wizard wiz = new Wizard(UITools.getFrame()); addRegistrationPages(wiz); new Thread(new Runnable() { public void run() { int ret = wiz.show(); if(ret == Wizard.OK_OPTION) { useRegisteredUser(wiz); } } }).start(); } }