package org.docear.plugin.services.features.user.workspace;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import java.util.Properties;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.services.ADocearServiceFeature;
import org.docear.plugin.services.features.user.DocearUser;
import org.docear.plugin.services.features.user.DocearUserController;
import org.freeplane.core.user.IUserAccountChangeListener;
import org.freeplane.core.user.UserAccountChangeEvent;
import org.freeplane.core.user.UserAccountController;
import org.freeplane.core.util.FileUtils;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.mode.ModeController;
import org.freeplane.plugin.workspace.URIUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.features.IWorkspaceSettingsHandler;
import org.freeplane.plugin.workspace.mindmapmode.MModeWorkspaceController;
public class DocearWorkspaceSettings extends ADocearServiceFeature implements IWorkspaceSettingsHandler {
public static final String WORKSPACE_VIEW_WIDTH = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.width";
public static final String WORKSPACE_VIEW_ENABLED = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.enabled";
public static final String WORKSPACE_VIEW_COLLAPSED = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.collapsed";
public static final String WORKSPACE_MODEL_PROJECTS = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".model.projects";
public static final String WORKSPACE_MODEL_PROJECTS_SEPARATOR = ",";
public final static String DOCEAR_CONNECTION_TOKEN_PROPERTY = "docear.service.connect.token";
private static final String USER_SETTINGS_FILENAME = "user.settings";
private Properties properties = new Properties();
private IWorkspaceSettingsHandler wrappedHandler;
private PropertyChangeListener userPropertyListener;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
/***********************************************************************************
* METHODS
**********************************************************************************/
private void setupDefaultSettings() {
setProperty(WORKSPACE_VIEW_WIDTH, "150");
setProperty(WORKSPACE_VIEW_ENABLED, "true");
setProperty(WORKSPACE_VIEW_COLLAPSED, "false");
}
private IUserAccountChangeListener getUserChangeListener() {
return new IUserAccountChangeListener() {
public void activated(UserAccountChangeEvent event) {
if(event.getUser() instanceof DocearUser) {
// try {
// load((DocearUser) event.getUser());
// } catch (IOException e) {
// LogUtils.warn("Exception in org.docear.plugin.services.features.user.workspace.DocearWorkspaceSettings.getUserChangeListener().new IUserAccountChangeListener() {...}.activated(event): "+ e.getMessage());
// }
event.getUser().addPropertyChangeListener(getUserPropertyChangeListener());
}
}
public void aboutToDeactivate(UserAccountChangeEvent event) {
if(event.getUser() instanceof DocearUser) {
try {
store((DocearUser) event.getUser());
} catch (IOException e) {
LogUtils.warn("Exception in org.docear.plugin.services.features.user.workspace.DocearWorkspaceSettings.getUserChangeListener().new IUserAccountChangeListener() {...}.aboutToDeactivate(event): "+ e.getMessage());
}
event.getUser().removePropertyChangeListener(getUserPropertyChangeListener());
}
}
};
}
private PropertyChangeListener getUserPropertyChangeListener() {
if(userPropertyListener == null) {
userPropertyListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getSource() instanceof DocearUser) {
DocearUser user = ((DocearUser)evt.getSource());
if(DocearUser.USERNAME_PROPERTY.equals(evt.getPropertyName())) {
}
else if(DocearUser.IS_VALID_PROPERTY.equals(evt.getPropertyName())) {
if(user.isValid()) {
properties.setProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY, user.getAccessToken());
}
else {
properties.setProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY, "");
}
}
}
}
};
}
return userPropertyListener;
}
public IWorkspaceSettingsHandler getWrappedHandler() {
return wrappedHandler;
}
public static final String DOCEAR_INFORMATION_RETRIEVAL = "docear_information_retrieval";
public static final String DOCEAR_SAVE_BACKUP = "docear_save_backup";
private void storeUser(DocearUser user) {
if(user.isValid()) {
properties.setProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY, user.getAccessToken());
}
else {
properties.setProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY, "");
}
if(user.getEnabledServicesCode() > 0) {
properties.setProperty(DOCEAR_INFORMATION_RETRIEVAL, String.valueOf(user.getEnabledServicesCode()));
}
else {
properties.setProperty(DOCEAR_INFORMATION_RETRIEVAL, "0");
}
if(user.isBackupEnabled()) {
properties.setProperty(DOCEAR_SAVE_BACKUP, Boolean.toString(user.isBackupEnabled()));
}
}
private void loadUser(DocearUser user) {
String token = properties.getProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY);
if(token == null) {
token = DocearController.getPropertiesController().getProperty(DOCEAR_CONNECTION_TOKEN_PROPERTY);
}
user.setAccessToken(token);
String strRetrieval = properties.getProperty(DOCEAR_INFORMATION_RETRIEVAL);
if(strRetrieval == null) {
strRetrieval = DocearController.getPropertiesController().getProperty(DOCEAR_INFORMATION_RETRIEVAL);
}
if(strRetrieval != null) {
int ir = Integer.parseInt(strRetrieval);
user.setRecommendationsEnabled((DocearUser.RECOMMENDATIONS & ir) > 0);
user.setCollaborationEnabled(((DocearUser.COLLABORATION & ir) > 0));
user.setBackupEnabled(((DocearUser.BACKUP & ir) > 0));
user.setSynchronizationEnabled(((DocearUser.SYNCHRONIZATION & ir) > 0));
}
if(DocearController.getPropertiesController().getProperty(DOCEAR_SAVE_BACKUP) != null) {
user.setBackupEnabled(Boolean.parseBoolean(DocearController.getPropertiesController().getProperty(DOCEAR_SAVE_BACKUP)));
}
// WorkspaceController.load();
}
public void loadSettings(DocearUser user) throws IOException {
if(user == null) {
throw new IOException("user is NULL");
}
final File userPropertiesFolder = new File(getSettingsPath(user));
final File settingsFile = new File(userPropertiesFolder, USER_SETTINGS_FILENAME);
InputStream in = null;
try {
properties = new Properties();
in = new FileInputStream(settingsFile);
properties.load(in);
loadUser(user);
}
catch (final Exception ex) {
LogUtils.info("Workspace settings not found, creating new default settings");
setupDefaultSettings();
}
finally {
FileUtils.silentlyClose(in);
}
}
public void store(DocearUser user) throws IOException {
if(user == null) {
throw new IOException("user is NULL");
}
final File userPropertiesFolder = new File(getSettingsPath(user));
final File settingsFile = new File(userPropertiesFolder, USER_SETTINGS_FILENAME);
storeUser(user);
OutputStream os = null;
try {
if(!settingsFile.exists()) {
settingsFile.getParentFile().mkdirs();
settingsFile.createNewFile();
}
os = new FileOutputStream(settingsFile);
properties.store(os, "user settings for the workspace");
}
catch (final Exception ex) {
LogUtils.severe("could not store workspace settings.", ex);
}
finally {
FileUtils.silentlyClose(os);
}
}
public String getSettingsPath(DocearUser user) {
return URIUtils.getAbsoluteFile(WorkspaceController.getApplicationSettingsHome()).getPath() + File.separator + "users" + File.separator+user.getName();
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
@Override
protected void installDefaults(ModeController modeController) {
MModeWorkspaceController ctrl = ((MModeWorkspaceController)WorkspaceController.getModeExtension(modeController));
wrappedHandler = ctrl.getWorkspaceSettings();
ctrl.setWorkspaceSettings(this);
UserAccountController.getController().addUserAccountChangeListener(getUserChangeListener());
}
@Override
public void shutdown() {
try {
store();
} catch (IOException e) {
LogUtils.warn("Exception in org.docear.plugin.services.features.user.workspace.DocearWorkspaceSettings.shutdown(): "+ e.getMessage());
}
}
public String getProperty(String key, String defaultValue) {
String value = properties.getProperty(key);
// if(value == null && wrappedHandler != null) {
// value = wrappedHandler.getProperty(key, defaultValue);
// }
if(value == null) {
return defaultValue;
}
return value;
}
public String getProperty(String key) {
return getProperty(key, null);
}
public void setProperty(String key, String value) {
properties.setProperty(key, value);
}
public String removeProperty(String key) {
return (String) properties.remove(key);
}
public void load() throws IOException {
loadSettings(DocearUserController.getActiveUser());
}
public void store() throws IOException {
store(DocearUserController.getActiveUser());
}
public String getSettingsPath() {
return this.getSettingsPath(DocearUserController.getActiveUser());
}
}