/* * Copyright (C) 2005-2007 Alfresco Software Limited. * * 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. * As a special exception to the terms and conditions of version 2.0 of * the GPL, you may redistribute this Program in connection with Free/Libre * and Open Source Software ("FLOSS") applications as described in Alfresco's * FLOSS exception. You should have recieved a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ package org.alfresco.web.config; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import org.alfresco.config.ConfigElement; import org.alfresco.config.JNDIConstants; import org.alfresco.config.element.ConfigElementAdapter; import org.alfresco.mbeans.VirtServerRegistry; import org.alfresco.service.namespace.QName; import org.alfresco.util.ExpiringValueCache; import org.alfresco.web.bean.repository.Repository; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Custom config element that represents config values for the client * * @author Kevin Roast */ public class ClientConfigElement extends ConfigElementAdapter { private static final long serialVersionUID = 825650925215057110L; private static Log logger = LogFactory.getLog(ClientConfigElement.class); public static final String CONFIG_ELEMENT_ID = "client"; public static final String BREADCRUMB_PATH = "path"; public static final String BREADCRUMB_LOCATION = "location"; private static final String DEFAULT_FROM_ADDRESS = "alfresco@alfresco.org"; private String fromEmailAddress = DEFAULT_FROM_ADDRESS; private String errorPage = null; private String loginPage = null; private int recentSpacesItems = 6; private boolean shelfVisible = true; private int searchMinimum = 3; private boolean forceAndTerms = false; private int searchMaxResults = -1; private int selectorsSearchMaxResults = 500; private int inviteUsersMaxResults = 500; private String helpUrl = null; private String editLinkType = "http"; private String homeSpacePermission = null; private boolean nodeSummaryEnabled = true; private String initialLocation = "myalfresco"; private ExpiringValueCache wcmDomain = new ExpiringValueCache(1000*10L); private ExpiringValueCache wcmPort = new ExpiringValueCache(1000*10L); private String defaultHomeSpacePath = "/app:company_home/app:user_homes"; private boolean clipboardStatusVisible = true; private boolean pasteAllAndClear = true; private boolean allowGuestConfig = false; private List simpleSearchAdditionalAttributes = null; private int minUsernameLength = 2; private int minPasswordLength = 3; private int minGroupNameLength = 3; private String breadcrumbMode = BREADCRUMB_PATH; private String cifsURLSuffix = null; private boolean languageSelect = true; private boolean zeroByteFileUploads = true; private boolean userGroupAdmin = true; private boolean allowUserConfig = true; private int pickerSearchMinimum = 2; private boolean checkContextAgainstPath = false; /** * Default Constructor */ public ClientConfigElement() { super(CONFIG_ELEMENT_ID); } /** * Constructor * * @param name Name of the element this config element represents */ public ClientConfigElement(String name) { super(name); } /** * @see org.alfresco.config.element.ConfigElementAdapter#combine(org.alfresco.config.ConfigElement) */ public ConfigElement combine(ConfigElement configElement) { ClientConfigElement newElement = (ClientConfigElement)configElement; ClientConfigElement combinedElement = new ClientConfigElement(); // set those values that have changed if (newElement.getEditLinkType() == null) { combinedElement.setEditLinkType(this.editLinkType); } else { combinedElement.setEditLinkType(newElement.getEditLinkType()); } if (newElement.getErrorPage() == null) { combinedElement.setErrorPage(this.errorPage); } else { combinedElement.setErrorPage(newElement.getErrorPage()); } if (newElement.getLoginPage() == null) { combinedElement.setLoginPage(this.loginPage); } else { combinedElement.setLoginPage(newElement.getLoginPage()); } if (newElement.getHelpUrl() == null ) { combinedElement.setHelpUrl(this.helpUrl); } else { combinedElement.setHelpUrl(newElement.getHelpUrl()); } if (newElement.getHomeSpacePermission() == null) { combinedElement.setHomeSpacePermission(this.homeSpacePermission); } else { combinedElement.setHomeSpacePermission(newElement.getHomeSpacePermission()); } if (newElement.getCifsURLSuffix() == null) { combinedElement.setCifsURLSuffix(this.cifsURLSuffix); } else { combinedElement.setCifsURLSuffix(newElement.getCifsURLSuffix()); } if (newElement.getSimpleSearchAdditionalAttributes() == null) { combinedElement.setSimpleSearchAdditionalAttributes(this.simpleSearchAdditionalAttributes); } else { if (this.simpleSearchAdditionalAttributes == null) { // there aren't any existing attributes so just use the new set combinedElement.setSimpleSearchAdditionalAttributes(newElement.getSimpleSearchAdditionalAttributes()); } else { // get the current list and add the additional attributes to it List newAttrs = newElement.getSimpleSearchAdditionalAttributes(); List combinedAttrs = new ArrayList( this.simpleSearchAdditionalAttributes.size() + newAttrs.size()); combinedAttrs.addAll(this.simpleSearchAdditionalAttributes); combinedAttrs.addAll(newAttrs); combinedElement.setSimpleSearchAdditionalAttributes(combinedAttrs); } } // override default values if they have changed if (newElement.getDefaultHomeSpacePath() != null && newElement.getDefaultHomeSpacePath().equals(combinedElement.getDefaultHomeSpacePath()) == false) { combinedElement.setDefaultHomeSpacePath(newElement.getDefaultHomeSpacePath()); } if (newElement.getRecentSpacesItems() != combinedElement.getRecentSpacesItems()) { combinedElement.setRecentSpacesItems(newElement.getRecentSpacesItems()); } if (newElement.getSearchMinimum() != combinedElement.getSearchMinimum()) { combinedElement.setSearchMinimum(newElement.getSearchMinimum()); } if (newElement.getForceAndTerms() != combinedElement.getForceAndTerms()) { combinedElement.setForceAndTerms(newElement.getForceAndTerms()); } if (newElement.getSearchMaxResults() != combinedElement.getSearchMaxResults()) { combinedElement.setSearchMaxResults(newElement.getSearchMaxResults()); } if (newElement.getSelectorsSearchMaxResults() != combinedElement.getSelectorsSearchMaxResults()) { combinedElement.setSelectorsSearchMaxResults(newElement.getSelectorsSearchMaxResults()); } if (newElement.getInviteUsersMaxResults() != combinedElement.getInviteUsersMaxResults()) { combinedElement.setInviteUsersMaxResults(newElement.getInviteUsersMaxResults()); } if (newElement.isShelfVisible() != combinedElement.isShelfVisible()) { combinedElement.setShelfVisible(newElement.isShelfVisible()); } if (newElement.isClipboardStatusVisible() != combinedElement.isClipboardStatusVisible()) { combinedElement.setClipboardStatusVisible(newElement.isClipboardStatusVisible()); } if (newElement.isPasteAllAndClearEnabled() != combinedElement.isPasteAllAndClearEnabled()) { combinedElement.setPasteAllAndClearEnabled(newElement.isPasteAllAndClearEnabled()); } if (newElement.getFromEmailAddress() != null && (newElement.getFromEmailAddress().equals(combinedElement.getFromEmailAddress()) == false)) { combinedElement.setFromEmailAddress(newElement.getFromEmailAddress()); } if (newElement.isNodeSummaryEnabled() != combinedElement.isNodeSummaryEnabled()) { combinedElement.setNodeSummaryEnabled(newElement.isNodeSummaryEnabled()); } if (newElement.getInitialLocation() != null && newElement.getInitialLocation().equals(combinedElement.getInitialLocation()) == false) { combinedElement.setInitialLocation(newElement.getInitialLocation()); } if (newElement.getAllowGuestConfig() != combinedElement.getAllowGuestConfig()) { combinedElement.setAllowGuestConfig(newElement.getAllowGuestConfig()); } if (newElement.getMinUsernameLength() != combinedElement.getMinUsernameLength()) { combinedElement.setMinUsernameLength(newElement.getMinUsernameLength()); } if (newElement.getMinPasswordLength() != combinedElement.getMinPasswordLength()) { combinedElement.setMinPasswordLength(newElement.getMinPasswordLength()); } if (newElement.getMinGroupNameLength() != combinedElement.getMinGroupNameLength()) { combinedElement.setMinGroupNameLength(newElement.getMinGroupNameLength()); } if (newElement.getBreadcrumbMode() != null && newElement.getBreadcrumbMode().equals(combinedElement.getBreadcrumbMode()) == false) { combinedElement.setBreadcrumbMode(newElement.getBreadcrumbMode()); } if (newElement.isLanguageSelect() != combinedElement.isLanguageSelect()) { combinedElement.setLanguageSelect(newElement.isLanguageSelect()); } if (newElement.isZeroByteFileUploads() != combinedElement.isZeroByteFileUploads()) { combinedElement.setZeroByteFileUploads(newElement.isZeroByteFileUploads()); } if (newElement.getAllowUserConfig() != combinedElement.getAllowUserConfig()) { combinedElement.setAllowUserConfig(newElement.getAllowUserConfig()); } if (newElement.isUserGroupAdmin() != combinedElement.isUserGroupAdmin()) { combinedElement.setUserGroupAdmin(newElement.isUserGroupAdmin()); } if (newElement.getPickerSearchMinimum() != combinedElement.getPickerSearchMinimum()) { combinedElement.setPickerSearchMinimum(newElement.getPickerSearchMinimum()); } if (newElement.getCheckContextAgainstPath() != combinedElement.getCheckContextAgainstPath()) { combinedElement.setCheckContextAgainstPath(newElement.getCheckContextAgainstPath()); } return combinedElement; } /** * @return Returns the recentSpacesItems. */ public int getRecentSpacesItems() { return this.recentSpacesItems; } /** * @param recentSpacesItems The recentSpacesItems to set. */ /*package*/ void setRecentSpacesItems(int recentSpacesItems) { this.recentSpacesItems = recentSpacesItems; } /** * @return Returns if the shelf component is visible by default. */ public boolean isShelfVisible() { return this.shelfVisible; } /** * @param shelfVisible True if the shelf component is visible by default. */ /*package*/ void setShelfVisible(boolean shelfVisible) { this.shelfVisible = shelfVisible; } /** * @return Returns if the clipboard status messages are visible by default. */ public boolean isClipboardStatusVisible() { return this.clipboardStatusVisible; } /** * @param clipboardStatusVisible True if the clipboard status messages should be visible. */ /*package*/ void setClipboardStatusVisible(boolean clipboardStatusVisible) { this.clipboardStatusVisible = clipboardStatusVisible; } /** * @return Returns if the clipboard paste all action should clear the clipboard. */ public boolean isPasteAllAndClearEnabled() { return this.pasteAllAndClear; } /** * @param pasteAllAndClear Sets whether the paste all action should clear all items * from the clipboard. */ /*package*/ void setPasteAllAndClearEnabled(boolean pasteAllAndClear) { this.pasteAllAndClear = pasteAllAndClear; } /** * @return The error page the application should use */ public String getErrorPage() { return this.errorPage; } /** * @param errorPage Sets the error page */ /*package*/ void setErrorPage(String errorPage) { this.errorPage = errorPage; } /** * @return Returns the login Page. */ public String getLoginPage() { return this.loginPage; } /** * @param loginPage The login Page to set. */ /*package*/ void setLoginPage(String loginPage) { this.loginPage = loginPage; } /** * @return Returns the help Url. */ public String getHelpUrl() { return this.helpUrl; } /** * @param helpUrl The help Url to set. */ /*package*/ void setHelpUrl(String helpUrl) { this.helpUrl = helpUrl; } /** * @return Returns the from email address, if one has not been set * alfresco@alfresco.org will be returned */ public String getFromEmailAddress() { return this.fromEmailAddress; } /** * @param fromEmailAddress The from email address to set */ /*package*/ void setFromEmailAddress(String fromEmailAddress) { this.fromEmailAddress = fromEmailAddress; } /** * @return Returns the edit link type. */ public String getEditLinkType() { return this.editLinkType; } /** * @param editLinkType The edit link type to set. */ /*package*/ void setEditLinkType(String editLinkType) { this.editLinkType = editLinkType; } /** * @return Returns the search minimum number of characters. */ public int getSearchMinimum() { return this.searchMinimum; } /** * @param searchMinimum The searchMinimum to set. */ /*package*/ void setSearchMinimum(int searchMinimum) { this.searchMinimum = searchMinimum; } /** * @return If true enables AND text terms for simple/advanced search by default. */ public boolean getForceAndTerms() { return this.forceAndTerms; } /** * @param forceAndTerms True to enable AND text terms for simple/advanced search by default. */ /*package*/ void setForceAndTerms(boolean forceAndTerms) { this.forceAndTerms = forceAndTerms; } /** * If positive, this will limit the size of the result set from the search. * * @return The maximum number of results to show */ public int getSearchMaxResults() { return this.searchMaxResults; } /** * Set if the the result set from a search will be of limited size. * If negative it is unlimited, by convention, this is set to -1. * * @param searchMaxResults */ /*package*/ void setSearchMaxResults(int searchMaxResults) { this.searchMaxResults = searchMaxResults; } /** * If positive, this will limit the size of the result set from the search * used in selector components. * * @return The maximum number of results to display */ public int getSelectorsSearchMaxResults() { return this.selectorsSearchMaxResults; } /** * Set if the the result set from a search for the selector components * will be of limited size. If negative it is unlimited, by default, * this is set to 500. * * @param selectorsSearchMaxResults */ /*package*/ void setSelectorsSearchMaxResults(int selectorsSearchMaxResults) { this.selectorsSearchMaxResults = selectorsSearchMaxResults; } /** * If positive, this will limit the size of the result set from the * invite users wizard. * * @return The maximum number of results to display */ public int getInviteUsersMaxResults() { return this.inviteUsersMaxResults; } /** * Set if the the result set from a search for the invite users wizard * will be of limited size. If negative it is unlimited, by default, * this is set to 500. * * @param inviteUsersMaxResults */ /*package*/ void setInviteUsersMaxResults(int inviteUsersMaxResults) { this.inviteUsersMaxResults = inviteUsersMaxResults; } /** * @return Returns the default Home Space permissions. */ public String getHomeSpacePermission() { return this.homeSpacePermission; } /** * @param homeSpacePermission The default Home Space permission to set. */ /*package*/ void setHomeSpacePermission(String homeSpacePermission) { this.homeSpacePermission = homeSpacePermission; } /** * @return Returns the default Home Space path. */ public String getDefaultHomeSpacePath() { return this.defaultHomeSpacePath; } /** * @param defaultHomeSpacePath The default Home Space path to set. */ /*package*/ void setDefaultHomeSpacePath(String defaultHomeSpacePath) { this.defaultHomeSpacePath = defaultHomeSpacePath; } /** * @return Returns whether AJAX support is enabled in the client */ public boolean isNodeSummaryEnabled() { return this.nodeSummaryEnabled; } /** * Sets whether AJAX support is enabled in the client * * @param nodeSummaryEnabled */ /*package*/ void setNodeSummaryEnabled(boolean ajaxEnabled) { this.nodeSummaryEnabled = ajaxEnabled; } /** * @return Returns the default initial location for the user. */ public String getInitialLocation() { return this.initialLocation; } /** * @param initialLocation The initial location to set. */ /*package*/ void setInitialLocation(String initialLocation) { this.initialLocation = initialLocation; } /** * @return Returns the WCM Domain obtained from the Virtualisation Server registry. */ public String getWCMDomain() { String value = this.wcmDomain.get(); if (value == null) { VirtServerRegistry vServerRegistry = Repository.getServiceRegistry( FacesContext.getCurrentInstance()).getVirtServerRegistry(); value = vServerRegistry.getVirtServerFQDN(); if (value == null) { value = JNDIConstants.DEFAULT_VSERVER_IP; if (logger.isDebugEnabled()) { logger.debug("Virtualisation Server not started - reverting to default IP: " + value); } } this.wcmDomain.put(value); } return value; } /** * @return Returns the WCM Port obtained from the Virtualisation Server registry. */ public String getWCMPort() { String value = this.wcmPort.get(); if (value == null) { VirtServerRegistry vServerRegistry = Repository.getServiceRegistry( FacesContext.getCurrentInstance()).getVirtServerRegistry(); Integer iValue = vServerRegistry.getVirtServerHttpPort(); if (iValue == null) { iValue = JNDIConstants.DEFAULT_VSERVER_PORT; if (logger.isDebugEnabled()) { logger.debug("Virtualisation Server not started - reverting to default port: " + iValue); } } value = iValue.toString(); this.wcmPort.put(value); } return value; } /*package*/ void setAllowGuestConfig(boolean allow) { this.allowGuestConfig = allow; } public boolean getAllowGuestConfig() { return this.allowGuestConfig; } /** * @return Returns the additional attributes to search on a simple search */ public List getSimpleSearchAdditionalAttributes() { return this.simpleSearchAdditionalAttributes; } /** * @param simpleSearchAdditionalAttributes The additional simple search attributes */ /*package*/ void setSimpleSearchAdditionalAttributes(List simpleSearchAdditionalAttributes) { this.simpleSearchAdditionalAttributes = simpleSearchAdditionalAttributes; } /** * @return Returns the minimum length for a username. */ public int getMinUsernameLength() { return this.minUsernameLength; } /** * @param minUsernameLength The minimum length of a username */ /*package*/ void setMinUsernameLength(int minUsernameLength) { this.minUsernameLength = minUsernameLength; } /** * @return Returns the minimum length for a password. */ public int getMinPasswordLength() { return this.minPasswordLength; } /** * @param minPasswordLength The minimum length of a password */ /*package*/ void setMinPasswordLength(int minPasswordLength) { this.minPasswordLength = minPasswordLength; } /** * @return Returns the minimum length for a group name. */ public int getMinGroupNameLength() { return this.minGroupNameLength; } /** * @param minGroupNameLength The minimum length of a group name */ /*package*/ void setMinGroupNameLength(int minGroupNameLength) { this.minGroupNameLength = minGroupNameLength; } /** * Get the breadcrumb mode * * @return String */ public final String getBreadcrumbMode() { return breadcrumbMode; } /** * Set the breadcrumb mode * * @param mode String */ void setBreadcrumbMode(String mode) { // make sure it's being set to a valid option if (BREADCRUMB_PATH.equals(mode) || BREADCRUMB_LOCATION.equals(mode)) { breadcrumbMode = mode; } } /** * Get the CIFs URL suffix * * @return String */ public final String getCifsURLSuffix() { return cifsURLSuffix; } /** * Set the CIFS URL suffix * * @param suffix String */ void setCifsURLSuffix(String suffix) { cifsURLSuffix = suffix; } /** * @return the language select flag - true to display language selection, false to * get the language from the client browser locale instead */ public final boolean isLanguageSelect() { return this.languageSelect; } /** * @param value the language select flag */ /*package*/ void setLanguageSelect(boolean value) { this.languageSelect = value; } /** * @return true if zero byte file uploads are allowed, false otherwise */ public boolean isZeroByteFileUploads() { return this.zeroByteFileUploads; } /** * @param zeroByteFileUploads true if zero byte file uploads are allowed, false otherwise */ /*package*/ void setZeroByteFileUploads(boolean zeroByteFileUploads) { this.zeroByteFileUploads = zeroByteFileUploads; } /** * @return true if allowing User Group administration by an admin user */ public boolean isUserGroupAdmin() { return this.userGroupAdmin; } /** * @param userGroupAdmin true to allow User Group administration by an admin user */ /*package*/ void setUserGroupAdmin(boolean userGroupAdmin) { this.userGroupAdmin = userGroupAdmin; } /** * @return true to allow users to modify their personal settings in the User Console screen */ public boolean getAllowUserConfig() { return this.allowUserConfig; } /** * @param allowUserConfig true to allow users to modify their personal settings in the User Console screen */ /*package*/ void setAllowUserConfig(boolean allowUserConfig) { this.allowUserConfig = allowUserConfig; } /** * @return Returns the minimum number of characters for a picker search. */ public int getPickerSearchMinimum() { return this.pickerSearchMinimum; } /** * @param searchMinimum The minimum number of characters for a picker search. */ /*package*/ void setPickerSearchMinimum(int searchMinimum) { this.pickerSearchMinimum = searchMinimum; } /** * @return true if the context path should be checked against the path in the current URL */ public boolean getCheckContextAgainstPath() { return this.checkContextAgainstPath; } /** * @param checkContextAgainstPath true to check the context path against the path in the current URL */ /*package*/ void setCheckContextAgainstPath(boolean checkContextAgainstPath) { this.checkContextAgainstPath = checkContextAgainstPath; } }