package org.docear.plugin.services;
import java.net.URL;
import java.util.Collection;
import javax.swing.SwingUtilities;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.core.logging.DocearLogger;
import org.docear.plugin.services.actions.DocearAllowUploadChooserAction;
import org.docear.plugin.services.actions.DocearCheckForUpdatesAction;
import org.docear.plugin.services.actions.DocearClearUserDataAction;
import org.docear.plugin.services.communications.CommunicationsController;
import org.docear.plugin.services.features.UpdateCheck;
import org.docear.plugin.services.features.elements.Application;
import org.docear.plugin.services.listeners.DocearEventListener;
import org.docear.plugin.services.listeners.MapLifeCycleListener;
import org.docear.plugin.services.listeners.ServiceWindowListener;
import org.docear.plugin.services.recommendations.RecommendationEntry;
import org.docear.plugin.services.recommendations.actions.ShowRecommendationsAction;
import org.docear.plugin.services.recommendations.mode.DocearRecommendationsMapController;
import org.docear.plugin.services.recommendations.mode.DocearRecommendationsModeController;
import org.docear.plugin.services.recommendations.workspace.ShowRecommendationsCreator;
import org.docear.plugin.services.recommendations.workspace.ShowRecommendationsNode;
import org.docear.plugin.services.upload.UploadController;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.map.IMapLifeCycleListener;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.plugin.workspace.WorkspaceConfiguration;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.WorkspaceUtils;
import org.freeplane.plugin.workspace.event.IWorkspaceEventListener;
import org.freeplane.plugin.workspace.event.WorkspaceEvent;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.nodes.WorkspaceRoot;
public class ServiceController extends UploadController {
public static final String DOCEAR_INFORMATION_RETRIEVAL = "docear_information_retrieval";
public static final String DOCEAR_SAVE_BACKUP = "docear_save_backup";
public static final long RECOMMENDATIONS_AUTOSHOW_INTERVAL = 1000*60*60*24*7; // every 7 days in milliseconds
private static ServiceController serviceController;
private final IMapLifeCycleListener mapLifeCycleListener = new MapLifeCycleListener();
public static final int ALLOW_RECOMMENDATIONS = 8;
public static final int ALLOW_USAGE_MINING = 4;
public static final int ALLOW_INFORMATION_RETRIEVAL = 2;
public static final int ALLOW_RESEARCH = 1;
private Application application;
private DocearRecommendationsModeController modeController;
private Collection<RecommendationEntry> autoRecommendations;
private Boolean AUTO_RECOMMENDATIONS_LOCK = false;
private ServiceController(ModeController modeController) {
LogUtils.info("starting DocearBackupStarter()");
initListeners(modeController);
new ServiceConfiguration(modeController);
new ServicePreferences(modeController);
addPluginDefaults();
addMenuEntries(modeController);
Controller.getCurrentController().addAction(new DocearClearUserDataAction());
Controller.getCurrentController().addAction(new DocearAllowUploadChooserAction());
Controller.getCurrentController().addAction(new DocearCheckForUpdatesAction());
Controller.getCurrentController().addAction(new ShowRecommendationsAction());
startRecommendationsMode();
}
protected static void initialize(ModeController modeController) {
if (serviceController == null) {
serviceController = new ServiceController(modeController);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
serviceController.getUploader().start();
serviceController.getPacker().start();
}
});
new Thread() {
public void run() {
new UpdateCheck();
}
}.start();
}
}
private void initListeners(ModeController modeController) {
DocearController.getController().addDocearEventListener(new DocearEventListener());
modeController.getMapController().addMapLifeCycleListener(mapLifeCycleListener);
}
public static ServiceController getController() {
return serviceController;
}
// public ServiceRunner getBackupRunner() {
// return backupRunner;
// }
private void addPluginDefaults() {
final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
if (defaults == null) throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE);
Controller.getCurrentController().getResourceController().addDefaults(defaults);
this.modeController = (DocearRecommendationsModeController) Controller.getCurrentController().getModeController(
DocearRecommendationsModeController.MODENAME);
WorkspaceController.getController().addWorkspaceListener(new IWorkspaceEventListener() {
private boolean workspacePrepared;
public void workspaceReady(WorkspaceEvent event) {}
public void workspaceChanged(WorkspaceEvent event) {}
public void toolBarChanged(WorkspaceEvent event) {}
public void openWorkspace(WorkspaceEvent event) {}
public void configurationLoaded(WorkspaceEvent event) {
AWorkspaceTreeNode parent = (AWorkspaceTreeNode) WorkspaceUtils.getModel().getRoot();
AWorkspaceTreeNode node = WorkspaceUtils.getNodeForPath(((WorkspaceRoot) parent).getName()+"/"+TextUtils.getText("recommendations.workspace.node"));
if(node == null) {
node = new ShowRecommendationsNode();
WorkspaceUtils.getModel().insertNodeTo(node, parent, 0, false);
}
else {
int index = parent.getChildIndex(node);
if(index != 0) {
if(index > 0) {
WorkspaceUtils.getModel().removeNodeFromParent(node);
}
WorkspaceUtils.getModel().insertNodeTo(node, parent, 0, false);
parent.refresh();
}
}
}
public void closeWorkspace(WorkspaceEvent event) {}
public void configurationBeforeLoading(WorkspaceEvent event) {
if (!workspacePrepared) {
WorkspaceController controller = WorkspaceController.getController();
controller.getConfiguration().registerTypeCreator(WorkspaceConfiguration.WSNODE_ACTION, ShowRecommendationsCreator.NODE_TYPE,
new ShowRecommendationsCreator());
// modifyContextMenus();
}
workspacePrepared = true;
}
});
}
public DocearRecommendationsModeController getRecommenationMode() {
return this.modeController;
}
public boolean isBackupEnabled() {
return ResourceController.getResourceController().getBooleanProperty(DOCEAR_SAVE_BACKUP);
}
public void setBackupEnabled(boolean b) {
ResourceController.getResourceController().setProperty(DOCEAR_SAVE_BACKUP, b);
}
public int getInformationRetrievalCode() {
return Integer.parseInt(ResourceController.getResourceController().getProperty(DOCEAR_INFORMATION_RETRIEVAL, "0"));
}
public boolean isResearchAllowed() {
return (getInformationRetrievalCode() & ALLOW_RESEARCH) > 0;
}
public boolean isInformationRetrievalSelected() {
return (getInformationRetrievalCode() & ALLOW_INFORMATION_RETRIEVAL) > 0;
}
public boolean isUsageMiningAllowed() {
return (getInformationRetrievalCode() & ALLOW_USAGE_MINING) > 0;
}
public boolean isRecommendationsAllowed() {
return (getInformationRetrievalCode() & ALLOW_RECOMMENDATIONS) > 0;
}
public void setInformationRetrievalCode(int code) {
ResourceController.getResourceController().setProperty(DOCEAR_INFORMATION_RETRIEVAL, "" + code);
}
public boolean isBackupAllowed() {
CommunicationsController commCtrl = CommunicationsController.getController();
return isBackupEnabled() && commCtrl.allowTransmission() && !isEmpty(commCtrl.getRegisteredAccessToken()) && !isEmpty(commCtrl.getRegisteredUserName());
}
public boolean isInformationRetrievalAllowed() {
CommunicationsController commCtrl = CommunicationsController.getController();
boolean needUser = getInformationRetrievalCode() > 0 && commCtrl.allowTransmission();
return needUser && (!isEmpty(commCtrl.getAccessToken()) || !isEmpty(commCtrl.getUserName()));
}
private boolean isEmpty(String s) {
return s == null || s.trim().length() == 0;
}
public Application getApplication() {
return application;
}
public void setApplication(Application application) {
this.application = application;
}
private void addMenuEntries(ModeController modeController) {
// modeController.addMenuContributor(new IMenuContributor() {
// public void updateMenus(ModeController modeController, MenuBuilder
// builder) { // /EditDetailsInDialogAction
// builder.addMenuItem("/menu_bar/extras",new
// JMenu(TextUtils.getText("docear.recommendations.menu")),
// "/menu_bar/recommendations", MenuBuilder.BEFORE);
// builder.addAction("/menu_bar/recommendations", new
// ShowRecommendationsAction(), MenuBuilder.AS_CHILD);
// builder.addMenuItem("/node_popup",new
// JMenu(TextUtils.getText("docear.recommendations.menu")),
// "/node_popup/recommendations", MenuBuilder.PREPEND);
// builder.addAction("/node_popup/recommendations", new
// ShowRecommendationsAction(), MenuBuilder.AS_CHILD);
// }
// });
}
@Override
public int getUploadInterval() {
final ResourceController resourceCtrl = Controller.getCurrentController().getResourceController();
int backupMinutes = resourceCtrl.getIntProperty("save_backup_automcatically", 0);
if (backupMinutes <= 0) {
backupMinutes = 30;
}
return backupMinutes;
}
private void startRecommendationsMode() {
long lastShowTime = Controller.getCurrentController().getResourceController().getLongProperty("docear.recommendations.last_auto_show", 0);
if(((System.currentTimeMillis()-lastShowTime) > RECOMMENDATIONS_AUTOSHOW_INTERVAL)
&& isRecommendationsAllowed()
&& !isEmpty(CommunicationsController.getController().getUserName())) {
LogUtils.info("automatically requesting recommendations");
UITools.getFrame().addWindowListener(new ServiceWindowListener());
synchronized (AUTO_RECOMMENDATIONS_LOCK) {
AUTO_RECOMMENDATIONS_LOCK = true;
}
new Thread() {
public void run() {
try {
Collection<RecommendationEntry> recommendations = DocearRecommendationsMapController.getNewRecommendations(false);
if(recommendations.isEmpty()) {
setAutoRecommendations(null);
}
else {
setAutoRecommendations(recommendations);
}
Controller.getCurrentController().getResourceController().setProperty("docear.recommendations.last_auto_show", Long.toString(System.currentTimeMillis()));
}
catch (Exception e) {
DocearLogger.warn("org.docear.plugin.services.ServiceController.startRecommendationsMode(): " + e.getMessage());
setAutoRecommendations(null);
}
synchronized (AUTO_RECOMMENDATIONS_LOCK) {
AUTO_RECOMMENDATIONS_LOCK = false;
}
}
}.start();
}
else {
setAutoRecommendations(null);
}
}
public void setAutoRecommendations(Collection<RecommendationEntry> autoRecommendations) {
this.autoRecommendations = autoRecommendations;
}
public Collection<RecommendationEntry> getAutoRecommendations() {
while(isLocked()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
return autoRecommendations;
}
private boolean isLocked() {
synchronized (AUTO_RECOMMENDATIONS_LOCK ) {
return AUTO_RECOMMENDATIONS_LOCK;
}
}
public boolean isAutoRecommending() {
synchronized (AUTO_RECOMMENDATIONS_LOCK ) {
return AUTO_RECOMMENDATIONS_LOCK;
}
}
}