/* * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * 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, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.forum.common.jcr; import org.exoplatform.container.xml.InitParams; import org.exoplatform.forum.common.conf.DataLocationPlugin; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; /** * This class is meant to be the starting for any data storage access in KS.<br> * Provides all JCR pathes usable in KS JCR data storage. <br> * A {@link JCRSessionManager} accessible by {@link #getSessionManager()} is configured on the appropriate repository and workspace.<br> * Relies on {@link NodeHierarchyCreator} to initialize the structure and provide pathes aliases. * * @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a> * @version $Revision$ */ public class KSDataLocation { private static final Log log = ExoLogger.getLogger(KSDataLocation.class); /** * Parameter name use to designate the name of the repository where the data is stored. Should be passed in constructor's {@link InitParams} */ // public static final String REPOSITORY_PARAM = "repository"; /** * Parameter name use to designate the name of the workspace in the repository where the data is stored. Should be passed in constructor's {@link InitParams} */ public static final String WORKSPACE_PARAM = "workspace"; /** * Default repository name used if none is specified */ public static final String DEFAULT_REPOSITORY_NAME = "repository"; /** * Default workspace name used if none is specified */ public static final String DEFAULT_WORKSPACE_NAME = "portal-system"; private String forumHomeLocation; private String forumDataLocation; private String forumSystemLocation; private String banIPLocation; private String statisticsLocation; private String administrationLocation; private String userProfilesLocation; private String forumCategoriesLocation; private String tagsLocation; private String avatarsLocation; private String forumBanIPLocation; private String bbcodesLocation; private String faqHomeLocation; private String forumStatisticsLocation; private String faqSettingsLocation; private String faqUserSettingsLocation; private String faqCategoriesLocation; private String faqTemplatesLocation; private NodeHierarchyCreator creator; private String workspace; private SessionManager sessionManager; private RepositoryService repositoryService; /** * Creates a new {@link KSDataLocation} and initializes pathes. * @param params {@link #WORKSPACE_PARAM} is expected as value-param * @param creator used to resolve path names. It is also declared here to ensure that the data structure has been initalized before. */ public KSDataLocation(InitParams params, NodeHierarchyCreator creator, RepositoryService repositoryService) { this.creator = creator; this.workspace = getParam(params, WORKSPACE_PARAM, DEFAULT_WORKSPACE_NAME); this.repositoryService = repositoryService; this.sessionManager = new JCRSessionManager(workspace); initPathes(); } /** * Mainly used for tests * @param workspace */ public KSDataLocation(String workspace, RepositoryService repositoryService) { this.workspace = workspace; this.repositoryService = repositoryService; this.sessionManager = new JCRSessionManager(workspace); initPathes(); } public KSDataLocation(String workspace) { this.workspace = workspace; this.sessionManager = new JCRSessionManager(workspace); initPathes(); } /** * Initializes all pathes with {@link #getPath(String)} */ private void initPathes() { forumHomeLocation = getPath(Locations.FORUM_SERVICE); avatarsLocation = getPath(Locations.KS_USER_AVATAR); forumSystemLocation = getPath(Locations.FORUM_SYSTEM); userProfilesLocation = getPath(Locations.USER_PROFILE_HOME); statisticsLocation = getPath(Locations.STATISTIC_HOME); forumStatisticsLocation = getPath(Locations.FORUM_STATISTIC); administrationLocation = getPath(Locations.ADMINISTRATION_HOME); banIPLocation = getPath(Locations.BANIP_HOME); forumBanIPLocation = getPath(Locations.FORUM_BAN_IP); forumDataLocation = getPath(Locations.FORUM_DATA); forumCategoriesLocation = getPath(Locations.FORUM_CATEGORIES_HOME); tagsLocation = getPath(Locations.TAG_HOME); bbcodesLocation = getPath(Locations.BBCODE_HOME); faqHomeLocation = getPath(Locations.FAQ_SERVICE); faqSettingsLocation = getPath(Locations.SETTING_HOME); faqUserSettingsLocation = getPath(Locations.USER_SETTING_HOME); faqCategoriesLocation = getPath(Locations.FAQ_CATEGORIES_HOME); faqTemplatesLocation = getPath(Locations.TEMPLATE_HOME); } /** * Change the storage location. Note that pathes are not reset * @param plugin plugin defining repository and workspace location for the data storage */ public void setLocation(DataLocationPlugin plugin) { this.workspace = plugin.getWorkspace(); this.sessionManager = new JCRSessionManager(workspace); } /** * Get a jcr path by location name. * @param locationName name of the location such a defined in {@link Locations} * @return jcr path corresponding the alias name in {@link NodeHierarchyCreator}. * If the creator was not set, returns the locationName. * The path returned is relative to root (no leading '/') */ protected String getPath(String locationName) { if (creator == null) { return locationName; } String path = creator.getJcrPath(locationName); if (path != null) { path = path.substring(1); } return path; } private String getParam(InitParams params, String name, String defaultValue) { String result = null; try { result = params.getValueParam(name).getValue(); } catch (Exception e) { log.warn("No '" + name + "' value-param. Using default value: " + defaultValue); } if (result == null) { result = defaultValue; } return result; } public String getRepository() { try { return repositoryService.getCurrentRepository().getConfiguration().getName(); } catch (Exception e) { return DEFAULT_REPOSITORY_NAME; } } public RepositoryService getRepositoryService() { return repositoryService; } public String getWorkspace() { return workspace; } public SessionManager getSessionManager() { return sessionManager; } public void setSessionManager(SessionManager manager) { this.sessionManager = manager; } /** * * @return root path for Forum data */ public String getForumHomeLocation() { return forumHomeLocation; } /** * * @return root path for forum user data */ public String getForumDataLocation() { return forumDataLocation; } /** * * @return root path for Forum internal data */ public String getForumSystemLocation() { return forumSystemLocation; } /** * * @return root path for global bans */ public String getBanIPLocation() { return banIPLocation; } /** * * @return root path for all statistics */ public String getStatisticsLocation() { return statisticsLocation; } /** * * @return root path for forum settings */ public String getAdministrationLocation() { return administrationLocation; } /** * * @return root path for forum user profiles */ public String getUserProfilesLocation() { return userProfilesLocation; } /** * * @return root path for forum categories */ public String getForumCategoriesLocation() { return forumCategoriesLocation; } /** * * @return root path for all tags */ public String getTagsLocation() { return tagsLocation; } /** * * @return root path for all user avatars */ public String getAvatarsLocation() { return avatarsLocation; } /** * * @return root path for forum bans */ public String getForumBanIPLocation() { return forumBanIPLocation; } /** * * @return root path for all BBCodes */ public String getBBCodesLocation() { return bbcodesLocation; } /** * * @return root path for FAQ */ public String getFaqHomeLocation() { return faqHomeLocation; } /** * * @return location for FAQ settings */ public String getFaqSettingsLocation() { return faqSettingsLocation; } /** * * @return root path for all user settings */ public String getFaqUserSettingsLocation() { return faqUserSettingsLocation; } /** * * @return root path for FAQ cateogries */ public String getFaqCategoriesLocation() { return faqCategoriesLocation; } /** * * @return path where FAQ templates are stored */ public String getFaqTemplatesLocation() { return faqTemplatesLocation; } /** * * @return path where forum statistics are stored */ public String getForumStatisticsLocation() { return forumStatisticsLocation; } public String toString() { return workspace; } /** * Return the location of forum subscriptions for a given user * @param userId user id * @return */ public String getUserSubscriptionLocation(String userId) { return getUserProfilesLocation() + "/" + userId + "/forumSubscription" + userId; } /** * Location names for KS data storage * @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a> * @version $Revision$ */ public interface Locations { public static final String FORUM_STATISTIC = "forumStatistic"; public static final String TEMPLATE_HOME = "templateHome"; public static final String USER_SETTING_HOME = "userSettingHome"; public static final String SETTING_HOME = "settingHome"; public static final String FAQ_SERVICE = "faqApp"; public static final String USER_PROFILE_HOME = "UserProfileHome"; public static final String ADMINISTRATION_HOME = "AdministrationHome"; public static final String STATISTIC_HOME = "StatisticHome"; public static final String BANIP_HOME = "BanIPHome"; public static final String FORUM_BAN_IP = "forumBanIP"; public static final String TOPIC_TYPE_HOME = "TopicTypeHome"; public static final String TAG_HOME = "TagHome"; public static final String FAQ_CATEGORIES_HOME = "categories"; public static final String FORUM_CATEGORIES_HOME = "CategoryHome"; public static final String KS_USER_AVATAR = "ksUserAvatar"; public static final String BBCODE_HOME = "forumBBCode"; public static final String FORUM_DATA = "ForumData"; public static final String FORUM_SYSTEM = "ForumSystem"; public static final String FORUM_SERVICE = "ForumService"; public static final String DEFAULT_APPS_LOCATION = "exo:applications"; } }