/**
* OpenKM, Open Document Management System (http://www.openkm.com)
* Copyright (c) 2006-2011 Paco Avila & Josep Llort
*
* No bytes were intentionally harmed during the development of this application.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.openkm.servlet.frontend;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.jcr.LoginException;
import javax.jcr.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.openkm.api.OKMAuth;
import com.openkm.api.OKMDashboard;
import com.openkm.api.OKMPropertyGroup;
import com.openkm.bean.PropertyGroup;
import com.openkm.core.Config;
import com.openkm.core.DatabaseException;
import com.openkm.core.ParseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.RepositoryException;
import com.openkm.dao.AuthDAO;
import com.openkm.dao.LanguageDAO;
import com.openkm.dao.MailAccountDAO;
import com.openkm.dao.ReportDAO;
import com.openkm.dao.UserConfigDAO;
import com.openkm.dao.bean.Language;
import com.openkm.dao.bean.MailAccount;
import com.openkm.dao.bean.Profile;
import com.openkm.dao.bean.Report;
import com.openkm.dao.bean.User;
import com.openkm.dao.bean.UserConfig;
import com.openkm.frontend.client.OKMException;
import com.openkm.frontend.client.bean.GWTAvailableOption;
import com.openkm.frontend.client.bean.GWTLanguage;
import com.openkm.frontend.client.bean.GWTPropertyGroup;
import com.openkm.frontend.client.bean.GWTWorkspace;
import com.openkm.frontend.client.contants.service.ErrorCode;
import com.openkm.frontend.client.service.OKMWorkspaceService;
import com.openkm.jcr.JCRUtils;
import com.openkm.principal.DatabasePrincipalAdapter;
import com.openkm.principal.PrincipalAdapterException;
import com.openkm.util.GWTUtil;
import com.openkm.util.ReportUtils;
import com.openkm.util.WarUtils;
import com.openkm.validator.ValidatorException;
import com.openkm.validator.ValidatorFactory;
import com.openkm.validator.password.PasswordValidator;
/**
* WorkspaceServlet
*
* @author jllort
*
*/
public class WorkspaceServlet extends OKMRemoteServiceServlet implements OKMWorkspaceService {
private static Logger log = LoggerFactory.getLogger(WorkspaceServlet.class);
private static final long serialVersionUID = 8673521252684830906L;
@Override
public GWTWorkspace getUserWorkspace() throws OKMException {
GWTWorkspace workspace = new GWTWorkspace();
updateSessionManager();
workspace.setApplicationURL(Config.APPLICATION_URL);
workspace.setUser(getThreadLocalRequest().getRemoteUser());
workspace.setAppVersion(WarUtils.getAppVersion().toString());
workspace.setWorkflowRunConfigForm(Config.WORKFLOW_RUN_CONFIG_FORM);
workspace.setWorkflowProcessIntanceVariableUUID(Config.WORKFLOW_PROCESS_INSTANCE_VARIABLE_UUID);
workspace.setWorkflowProcessIntanceVariablePath(Config.WORKFLOW_PROCESS_INSTANCE_VARIABLE_PATH);
workspace.setToken(getThreadLocalRequest().getSession().getId());
// Schedule time
workspace.setKeepAliveSchedule(Config.SCHEDULE_SESSION_KEEPALIVE);
workspace.setDashboardSchedule(Config.SCHEDULE_DASHBOARD_REFRESH);
List<GWTPropertyGroup> wizardPropGrpLst = new ArrayList<GWTPropertyGroup>();
List<Double> wizardWorkflowLst = new ArrayList<Double>();
Profile up = new Profile();
Session session = null;
try {
session = JCRUtils.getSession();
UserConfig uc = UserConfigDAO.findByPk(session, session.getUserID());
up = uc.getProfile();
for (String pgroup: up.getWizard().getPropertyGroups()) {
for (PropertyGroup pg : OKMPropertyGroup.getInstance().getAllGroups(null)) {
if (pg.getName().equals(pgroup) && pg.isVisible()) {
wizardPropGrpLst.add(GWTUtil.copy(pg));
break;
}
}
}
for (String workflow : up.getWizard().getWorkflows()) {
wizardWorkflowLst.add(new Double(workflow));
}
// Previewer
workspace.setPreviewer(Config.SYSTEM_PREVIEWER);
// Advanced filters ( used when there a lot of users and groups )
workspace.setAdvancedFilters(up.getMisc().isAdvancedFilters());
// Is a wizard to uploading documents
workspace.setWizardPropertyGroups(!up.getWizard().getPropertyGroups().isEmpty());
workspace.setWizardPropertyGroupsList(wizardPropGrpLst);
workspace.setWizardWorkflows(!up.getWizard().getWorkflows().isEmpty());
workspace.setWizardWorkflowsList(wizardWorkflowLst);
workspace.setWizardCategories(up.getWizard().isCategoriesEnabled());
workspace.setWizardKeywords(up.getWizard().isKeywordsEnabled());
// Is chat enabled and autologin
workspace.setChatEnabled(up.getChat().isChatEnabled());
workspace.setChatAutoLogin(up.getChat().isAutoLoginEnabled());
// Is admin
workspace.setAdminRole(getThreadLocalRequest().isUserInRole(Config.DEFAULT_ADMIN_ROLE));
// Setting web skin
workspace.setWebSkin(up.getMisc().getWebSkin());
// Only thesaurus keywords are allowed
workspace.setKeywordEnabled(up.getMisc().isKeywordsEnabled());
// User quota ( limit user repository size )
workspace.setUserQuotaEnabled(up.getMisc().getUserQuota() > 0);
workspace.setUserQuotaLimit(up.getMisc().getUserQuota());
workspace.setPrintPreview(up.getMisc().isPrintPreview());
workspace.setWebdavFix(Config.SYSTEM_WEBDAV_FIX);
// Stack visibility
workspace.setStackTaxonomy(up.getStack().isTaxonomyVisible());
workspace.setStackCategoriesVisible(up.getStack().isCategoriesVisible());
workspace.setStackThesaurusVisible(up.getStack().isThesaurusVisible());
workspace.setStackTemplatesVisible(up.getStack().isTemplatesVisible());
workspace.setStackPersonalVisible(up.getStack().isPersonalVisible());
workspace.setStackMailVisible(up.getStack().isMailVisible());
workspace.setStackTrashVisible(up.getStack().isTrashVisible());
// Menus visibility
workspace.setMenuFileVisible(up.getMenu().isFileVisible());
workspace.setMenuEditVisible(up.getMenu().isEditVisible());
workspace.setMenuBookmarksVisible(up.getMenu().isBookmarksVisible());
workspace.setMenuToolsVisible(up.getMenu().isToolsVisible());
workspace.setMenuHelpVisible(up.getMenu().isHelpVisible());
// Tab visibility
workspace.setTabDesktopVisible(up.getTab().isDesktopVisible());
workspace.setTabSearchVisible(up.getTab().isSearchVisible());
workspace.setTabDashboardVisible(up.getTab().isDashboardVisible());
workspace.setTabAdminVisible(getThreadLocalRequest().isUserInRole(Config.DEFAULT_ADMIN_ROLE) && up.getTab().isAdministrationVisible());
// Tab document visibility
workspace.setTabDocumentPropertiesVisible(up.getTab().getDocument().isPropertiesVisible());
workspace.setTabDocumentSecurityVisible(up.getTab().getDocument().isSecurityVisible());
workspace.setTabDocumentNotesVisible(up.getTab().getDocument().isNotesVisible());
workspace.setTabDocumentVersionVisible(up.getTab().getDocument().isVersionsVisible());
workspace.setTabDocumentPreviewVisible(up.getTab().getDocument().isPreviewVisible());
workspace.setTabDocumentPropertyGroupsVisible(up.getTab().getDocument().isPropertyGroupsVisible());
// Tab folder visibility
workspace.setTabFolderPropertiesVisible(up.getTab().getFolder().isPropertiesVisible());
workspace.setTabFolderSecurityVisible(up.getTab().getFolder().isSecurityVisible());
workspace.setTabFolderNotesVisible(up.getTab().getFolder().isNotesVisible());
// Tab mail visibility
workspace.setTabMailPropertiesVisible(up.getTab().getMail().isPropertiesVisible());
workspace.setTabMailSecurityVisible(up.getTab().getMail().isSecurityVisible());
// Dashboard visibility
workspace.setDashboardUserVisible(up.getDashboard().isUserVisible());
workspace.setDashboardMailVisible(up.getDashboard().isMailVisible());
workspace.setDashboardNewsVisible(up.getDashboard().isNewsVisible());
workspace.setDashboardGeneralVisible(up.getDashboard().isGeneralVisible());
workspace.setDashboardWorkflowVisible(up.getDashboard().isWorkflowVisible());
workspace.setDashboardKeywordsVisible(up.getDashboard().isKeywordsVisible());
// Available options
GWTAvailableOption availableOption = new GWTAvailableOption();
// Menu File
availableOption.setCreateFolderOption(up.getMenu().getFile().isCreateFolderVisible());
availableOption.setFindFolderOption(up.getMenu().getFile().isFindFolderVisible());
availableOption.setGotoFolderOption(up.getMenu().getFile().isGoFolderVisible());
availableOption.setDownloadOption(up.getMenu().getFile().isDownloadVisible());
availableOption.setDownloadPdfOption(up.getMenu().getFile().isDownloadPdfVisible());
availableOption.setAddDocumentOption(up.getMenu().getFile().isAddDocumentVisible());
availableOption.setWorkflowOption(up.getMenu().getFile().isStartWorkflowVisible());
availableOption.setRefreshOption(up.getMenu().getFile().isRefreshVisible());
availableOption.setScannerOption(up.getMenu().getFile().isScannerVisible());
availableOption.setUploaderOption(up.getMenu().getFile().isUploaderVisible());
availableOption.setExportOption(up.getMenu().getFile().isExportVisible());
availableOption.setCreateFromTemplateOption(up.getMenu().getFile().isCreateFromTemplateVisible());
availableOption.setPurgeOption(up.getMenu().getFile().isPurgeVisible());
availableOption.setRestoreOption(up.getMenu().getFile().isRestoreVisible());
availableOption.setPurgeTrashOption(up.getMenu().getFile().isPurgeTrashVisible());
availableOption.setSendDocumentLinkOption(up.getMenu().getFile().isSendDocumentLinkVisible());
availableOption.setSendDocumentAttachmentOption(up.getMenu().getFile().isSendDocumentAttachmentVisible());
// Menu Edit
availableOption.setLockOption(up.getMenu().getEdit().isLockVisible());
availableOption.setUnLockOption(up.getMenu().getEdit().isUnlockVisible());
availableOption.setRenameOption(up.getMenu().getEdit().isRenameVisible());
availableOption.setCopyOption(up.getMenu().getEdit().isCopyVisible());
availableOption.setMoveOption(up.getMenu().getEdit().isMoveVisible());
availableOption.setCheckinOption(up.getMenu().getEdit().isCheckInVisible());
availableOption.setCheckoutOption(up.getMenu().getEdit().isCheckOutVisible());
availableOption.setCancelCheckoutOption(up.getMenu().getEdit().isCancelCheckOutVisible());
availableOption.setDeleteOption(up.getMenu().getEdit().isDeleteVisible());
availableOption.setAddPropertyGroupOption(up.getMenu().getEdit().isAddPropertyGroupVisible());
availableOption.setRemovePropertyGroupOption(up.getMenu().getEdit().isRemovePropertyGroupVisible());
availableOption.setAddSubscription(up.getMenu().getEdit().isAddSubscriptionVisible());
availableOption.setRemoveSubscription(up.getMenu().getEdit().isRemoveSubscriptionVisible());
// Menu Bookmark
availableOption.setManageBookmarkOption(up.getMenu().getBookmark().isManageBookmarksVisible());
availableOption.setAddBookmarkOption(up.getMenu().getBookmark().isAddBookmarkVisible());
availableOption.setHomeOption(up.getMenu().getBookmark().isGoHomeVisible());
availableOption.setSetHomeOption(up.getMenu().getBookmark().isSetHomeVisible());
// Menu Tool
availableOption.setLanguagesOption(up.getMenu().getTool().isLanguagesVisible());
availableOption.setSkinOption(up.getMenu().getTool().isSkinVisible());
availableOption.setDebugOption(up.getMenu().getTool().isDebugVisible());
//modified by vissu on 24oct
availableOption.setAdministrationOption(up.getMenu().getTool().isAdministrationVisible() && (getThreadLocalRequest().isUserInRole(Config.DEFAULT_ADMIN_ROLE)||getThreadLocalRequest().isUserInRole(Config.DEFAULT_GROUP_ADMIN_ROLE)));
availableOption.setPreferencesOption(up.getMenu().getTool().isPreferencesVisible());
// Menu Help
availableOption.setHelpOption(up.getMenu().getHelp().isHelpVisible());
availableOption.setDocumentationOption(up.getMenu().getHelp().isDocumentationVisible());
availableOption.setBugReportOption(up.getMenu().getHelp().isBugTrackingVisible());
availableOption.setSupportRequestOption(up.getMenu().getHelp().isSupportVisible());
availableOption.setPublicForumOption(up.getMenu().getHelp().isForumVisible());
availableOption.setVersionChangesOption(up.getMenu().getHelp().isChangelogVisible());
availableOption.setProjectWebOption(up.getMenu().getHelp().isWebSiteVisible());
availableOption.setAboutOption(up.getMenu().getHelp().isAboutVisible());
availableOption.setMediaPlayerOption(true);
availableOption.setImageViewerOption(true);
workspace.setAvailableOption(availableOption);
// Reports
for (Integer rpId : up.getMisc().getReports()) {
Report report = ReportDAO.findByPk(rpId);
if (report.isActive()) {
workspace.getReports().add(GWTUtil.copy(report, ReportUtils.getReportParameters(rpId)));
}
}
// Setting available UI languages
List<GWTLanguage> langs = new ArrayList<GWTLanguage>();
for (Language lang : LanguageDAO.findAll()) {
langs.add(GWTUtil.copy(lang));
}
workspace.setLangs(langs);
User user = new User();
if (Config.PRINCIPAL_ADAPTER.equals(DatabasePrincipalAdapter.class.getCanonicalName())) {
user = AuthDAO.findUserByPk(getThreadLocalRequest().getRemoteUser());
if (user != null) {
workspace.setEmail(user.getEmail());
}
} else {
user.setId(getThreadLocalRequest().getRemoteUser());
user.setName("");
user.setEmail("");
user.setActive(true);
user.setPassword("");
}
for (Iterator<MailAccount> it = MailAccountDAO.findByUser(getThreadLocalRequest().getRemoteUser(), true).iterator(); it.hasNext();) {
MailAccount mailAccount = it.next();
workspace.setImapHost(mailAccount.getMailHost());
workspace.setImapUser(mailAccount.getMailUser());
workspace.setImapFolder(mailAccount.getMailFolder());
workspace.setImapID(mailAccount.getId());
}
if (user != null) {
workspace.setRoleList(OKMAuth.getInstance().getRolesByUser(null, user.getId()));
} else {
log.warn("User is null!!!");
log.warn("Please, check configuration principal.adapter={}", Config.PRINCIPAL_ADAPTER);
}
if (Config.PRINCIPAL_ADAPTER.equals(DatabasePrincipalAdapter.class.getCanonicalName())) {
workspace.setChangePassword(true);
} else {
workspace.setChangePassword(false);
}
} catch (LoginException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Repository), e.getMessage());
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Repository), e.getMessage());
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Database), e.getMessage());
} catch (IOException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_IO), e.getMessage());
} catch (ParseException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Parse), e.getMessage());
} catch (RepositoryException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Repository), e.getMessage());
} catch (PrincipalAdapterException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_PrincipalAdapter), e.getMessage());
} catch (PathNotFoundException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_PathNotFound), e.getMessage());
} finally {
JCRUtils.logout(session);
}
return workspace;
}
@Override
public Double getUserDocumentsSize() throws OKMException {
Double docSize = new Double(0);
updateSessionManager();
try {
docSize = new Double(OKMDashboard.getInstance().getUserDocumentsSize(null));
} catch (RepositoryException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Repository), e.getMessage());
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Database), e.getMessage());
}
return docSize;
}
@Override
public void updateUserWorkspace(GWTWorkspace workspace) throws OKMException {
updateSessionManager();
// For updating user
User user = new User();
user.setId(workspace.getUser());
user.setPassword(workspace.getPassword());
user.setEmail(workspace.getEmail());
// For updating imap mail
MailAccount mailAccount = new MailAccount();
mailAccount.setActive(true);
mailAccount.setMailFolder(workspace.getImapFolder());
mailAccount.setMailHost(workspace.getImapHost());
mailAccount.setMailPassword(workspace.getImapPassword());
mailAccount.setMailUser(workspace.getImapUser());
mailAccount.setUser(workspace.getUser());
mailAccount.setId(workspace.getImapID());
// Disable user configuration modification in demo
if (!Config.SYSTEM_DEMO) {
try {
// Can change password
if (Config.PRINCIPAL_ADAPTER.equals(DatabasePrincipalAdapter.class.getCanonicalName())) {
AuthDAO.updateUserPassword(workspace.getUser(), workspace.getPassword());
if (!user.getEmail().equals("")) {
AuthDAO.updateUserEmail(workspace.getUser(), workspace.getEmail());
}
}
if (MailAccountDAO.findByUser(workspace.getUser(), false).size() > 0) {
MailAccountDAO.update(mailAccount);
if (!mailAccount.getMailPassword().equals("")) {
MailAccountDAO.updatePassword(mailAccount.getId(), mailAccount.getMailPassword());
}
} else if (mailAccount.getMailHost().length()>0 && mailAccount.getMailFolder().length()>0 && mailAccount.getMailUser().length()>0 &&
!mailAccount.getMailPassword().equals("")) {
MailAccountDAO.create(mailAccount);
}
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_SQL), e.getMessage());
}
}
}
@Override
public void deleteMailAccount(int id) throws OKMException {
updateSessionManager();
// Disable user configuration modification in demo
if (!Config.SYSTEM_DEMO) {
try {
MailAccountDAO.delete(id);
} catch (DatabaseException e) {
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_SQL), e.getMessage());
}
}
}
@Override
public String isValidPassword(String password) throws OKMException {
String msg = "";
updateSessionManager();
try {
PasswordValidator passwordValidator = ValidatorFactory.getPasswordValidator();
try {
passwordValidator.Validate(password);
} catch (ValidatorException e) {
msg = e.getMessage();
}
} catch (RepositoryException e) {
log.error(e.getMessage(), e);
throw new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMWorkspaceService, ErrorCode.CAUSE_Repository), e.getMessage());
}
return msg;
}
}