diff --git a/config/alfresco/messages/office-addin_it.properties b/config/alfresco/messages/office-addin_it.properties index 9b29687186..ef5c1828dc 100755 --- a/config/alfresco/messages/office-addin_it.properties +++ b/config/alfresco/messages/office-addin_it.properties @@ -87,7 +87,7 @@ office.message.results_max.after=elementi office.message.no_results=Nessun risultato trovato office.message.confirm_delete=Eliminare questo documento? office.message.enter_workflow_details=Immettere i dettagli del nuovo workflow di seguito -office.message.workflow_action_complete=L''azione del workflow''{0}'' \u00e8 stata completata. +office.message.workflow_action_complete=L''azione del workflow ''{0}'' \u00e8 stata completata. #Properties office.property.title=Titolo diff --git a/config/alfresco/messages/webclient_fr.properties b/config/alfresco/messages/webclient_fr.properties index 0bc022100b..af652af1b6 100755 --- a/config/alfresco/messages/webclient_fr.properties +++ b/config/alfresco/messages/webclient_fr.properties @@ -2127,5 +2127,24 @@ trx.fromRepositoryId=Transf\u00e9r\u00e9 de trx.repositoryId=Origine du transfert trx.invadedBy=Inclut des transferts +#output-path-pattern-help.jsp +guidelines_title=Consignes +variables_title=Variables +forexample_title=Par exemple +general_info_part1=Un chemin de destination est une expression +general_info_part2=FreeMarker +general_info_part3=utilis\u00e9e pour indiquer le chemin \u00e0 utiliser lors de l'enregistrement d'une ressource g\u00e9n\u00e9r\u00e9e \u00e0 l'aide d'une substitution variable lors de la cr\u00e9ation de contenu Web. +guidelines_message=Les chemins de destination commen\u00e7ant par une barre oblique (par exemple, /${webapp}/content/${name}.xml) produisent des chemins enracin\u00e9s dans le bac \u00e0 sable. Ceux qui ne commencent pas par une barre oblique produisent des chemins relatifs au r\u00e9pertoire en cours d''utilisation lors de l''ex\u00e9cution de l''assistant de cr\u00e9ation de contenu Web. +description_name_field=Le nom des donn\u00e9es d'instance de formulaire, tel qu'il a \u00e9t\u00e9 saisi par l'utilisateur dans l'assistant de cr\u00e9ation de contenu Web. +description_webapp_field=Le nom de l''application Web dans laquelle les donn\u00e9es d''instance de formulaire sont cr\u00e9\u00e9es. G\u00e9n\u00e9ralement, si vous indiquez un chemin de destination absolu, le chemin commencera par le dossier de l''application Web (c-\u00e0-d. /${webapp}/...) +description_cwd_field=Le chemin relatif de l'application Web dans laquelle le formulaire est cr\u00e9\u00e9. +description_extension_field=L'extension par d\u00e9faut associ\u00e9e au type MIME configur\u00e9 pour le mod\u00e8le de moteur de rendu. Cette variable est disponible uniquement pour les chemins de destination de rendu. +description_xml_field=Les donn\u00e9es d'instance xml collect\u00e9es par le formulaire. +description_node_field=Le noeud de donn\u00e9es de l'instance de formulaire. Cette variable est disponible uniquement pour les chemins de destination de rendu. +description_date_field_part1=La date \u00e0 laquelle les donn\u00e9es d'instance de formulaire sont enregistr\u00e9es. Reportez-vous \u00e0 la +description_date_field_part2=r\u00e9f\u00e9rence de date FreeMarker +description_date_field_part3=pour plus d'informations. +wiki_reference_part1=Pour des r\u00e9f\u00e9rences plus compl\u00e8tes, reportez-vous au +wiki_reference_part2=wiki. #Team properties team_login_warning=La page Alfresco Explorer requise n'est pas prise en charge. Acc\u00e9dez \u00e0 cette page uniquement lorsque le service de support Alfresco vous y invite. diff --git a/config/alfresco/messages/webclient_it.properties b/config/alfresco/messages/webclient_it.properties index 1a56097a97..c45170fed8 100755 --- a/config/alfresco/messages/webclient_it.properties +++ b/config/alfresco/messages/webclient_it.properties @@ -2127,5 +2127,24 @@ trx.fromRepositoryId=Trasferito da trx.repositoryId=Origine trasferita trx.invadedBy=Contiene trasferimenti +#output-path-pattern-help.jsp +guidelines_title=Linee guida +variables_title=Variabili +forexample_title=Ad esempio +general_info_part1=Uno schema percorso di output \u00e8 un'espressione +general_info_part2=FreeMarker +general_info_part3=utilizzata per specificare il percorso da utilizzare per salvare una risorsa generata attraverso la sostituzione di variabili quando si crea un contenuto Web. +guidelines_message=Gli schemi percorso di output che iniziano con una barra (ad esempio /${webapp}/content/${name}.xml) produrranno dei percorsi con radice nella sandbox. Quelli che non iniziano con una barra produrranno percorsi relativi alla directory di lavoro attuale, quando viene richiamato l''assistente Crea contenuto web. +description_name_field=Il nome dei dati dell\u2019istanza del modulo inseriti dall'utente nell'assistente Crea contenuto web. +description_webapp_field=Il nome della webapp in cui vengono creati i dati dell''istanza del modulo. In genere, se si specifica uno schema percorso di output assoluto, il percorso inizier\u00e0 con la cartella webapp (ossia /${webapp}/...) +description_cwd_field=Il percorso relativo della webapp in cui viene creato il modulo. +description_extension_field=L'estensione predefinita associata al tipo mime configurato per il modello motore di rendering. Questa variabile \u00e8 disponibile solo per la trasformazione di schemi percorso di output. +description_xml_field=I dati dell'istanza xml raccolti dal modulo. +description_node_field=Il nodo dei dati dell'istanza del modulo. Questa variabile \u00e8 disponibile solo per la trasformazione di schemi percorso di output. +description_date_field_part1=La data attuale in cui vengono salvati i dati dell'istanza del modulo. Fare riferimento alla +description_date_field_part2=data FreeMarker +description_date_field_part3=per ulteriori informazioni. +wiki_reference_part1=Per informazioni pi\u00f9 dettagliate, consultare il +wiki_reference_part2=wiki. #Team properties team_login_warning=La pagina Alfresco Explorer non \u00e8 supportata. Accedere a questa pagina solo seguendo le istruzioni del Supporto Alfresco. diff --git a/config/alfresco/subsystems/Authentication/external/external-filter-context.xml b/config/alfresco/subsystems/Authentication/external/external-filter-context.xml index 40e39cfef2..c367d355fc 100644 --- a/config/alfresco/subsystems/Authentication/external/external-filter-context.xml +++ b/config/alfresco/subsystems/Authentication/external/external-filter-context.xml @@ -21,4 +21,29 @@ + + + + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java index 92ca09f2f1..b3272c423c 100644 --- a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java +++ b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java @@ -436,7 +436,30 @@ public final class AuthenticationHelper } return null; } - + + /** + * Uses the remote user mapper, if one is configured, to extract a user ID from the request + * + * @param sc + * the servlet context + * @param httpRequest + * The HTTP request + * @return the user ID if a user has been externally authenticated or null otherwise. + */ + public static String getRemoteUser(final ServletContext sc, final HttpServletRequest httpRequest) + { + String userId = null; + + // If the remote user mapper is configured, we may be able to map in an externally authenticated user + final WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); + RemoteUserMapper remoteUserMapper = (RemoteUserMapper) wc.getBean(REMOTE_USER_MAPPER); + if (!(remoteUserMapper instanceof ActivateableBean) || ((ActivateableBean) remoteUserMapper).isActive()) + { + userId = remoteUserMapper.getRemoteUser(httpRequest); + } + return userId; + } + /** * Attempts to retrieve the User object stored in the current session. * @@ -450,16 +473,10 @@ public final class AuthenticationHelper */ public static User getUser(final ServletContext sc, final HttpServletRequest httpRequest, HttpServletResponse httpResponse) { - String userId = null; - // If the remote user mapper is configured, we may be able to map in an externally authenticated user - final WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); - RemoteUserMapper remoteUserMapper = (RemoteUserMapper) wc.getBean(REMOTE_USER_MAPPER); - if (!(remoteUserMapper instanceof ActivateableBean) || ((ActivateableBean) remoteUserMapper).isActive()) - { - userId = remoteUserMapper.getRemoteUser(httpRequest); - } + String userId = getRemoteUser(sc, httpRequest); + final WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(sc); HttpSession session = httpRequest.getSession(); User user = null; @@ -513,9 +530,21 @@ public final class AuthenticationHelper // If we have been authenticated by other means, just propagate through the user identity AuthenticationComponent authenticationComponent = (AuthenticationComponent) wc .getBean(AUTHENTICATION_COMPONENT); - authenticationComponent.setCurrentUser(userId); - AuthenticationService authenticationService = (AuthenticationService) wc.getBean(AUTHENTICATION_SERVICE); - user = setUser(sc, httpRequest, userId, authenticationService.getCurrentTicket(), true); + try + { + authenticationComponent.setCurrentUser(userId); + AuthenticationService authenticationService = (AuthenticationService) wc.getBean(AUTHENTICATION_SERVICE); + user = setUser(sc, httpRequest, userId, authenticationService.getCurrentTicket(), true); + } + catch (AuthenticationException authErr) + { + // Allow for an invalid external user ID to be indicated + session.removeAttribute(AUTHENTICATION_USER); + if (!Application.inPortalServer()) + { + session.invalidate(); + } + } } } return user; diff --git a/source/java/org/alfresco/web/app/servlet/BaseServlet.java b/source/java/org/alfresco/web/app/servlet/BaseServlet.java index 2d81d812ae..abe930bf0e 100644 --- a/source/java/org/alfresco/web/app/servlet/BaseServlet.java +++ b/source/java/org/alfresco/web/app/servlet/BaseServlet.java @@ -19,6 +19,7 @@ package org.alfresco.web.app.servlet; import java.io.IOException; +import java.io.PrintWriter; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashSet; @@ -264,7 +265,26 @@ public abstract class BaseServlet extends HttpServlet } redirectURL.append(URLEncoder.encode(url, "UTF-8")); } - res.sendRedirect(redirectURL.toString()); + + // If external authentication isn't in use (e.g. proxied share authentication), it's safe to return a redirect to the client + if (AuthenticationHelper.getRemoteUser(sc, req) == null) + { + res.sendRedirect(redirectURL.toString()); + } + // Otherwise, we must signal to the client with an unauthorized status code and rely on a browser refresh to do + // the redirect for failover login (as we do with NTLM, Kerberos) + else + { + res.setContentType("text/html; charset=UTF-8"); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + + final PrintWriter out = res.getWriter(); + out.println(""); + out.println(""); + out.println("

Please log in.

"); + out.println(""); + out.close(); + } } /** diff --git a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java index 27a3a664ae..086c151764 100644 --- a/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java +++ b/source/java/org/alfresco/web/app/servlet/WebScriptSSOAuthenticationFilter.java @@ -60,6 +60,11 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i private boolean isActive = true; + public WebScriptSSOAuthenticationFilter() + { + setUserAttributeName(AuthenticationHelper.AUTHENTICATION_USER); + } + /** * @param container the container to set */ @@ -95,8 +100,6 @@ public class WebScriptSSOAuthenticationFilter extends BaseAuthenticationFilter i public void doFilter(ServletContext context, ServletRequest sreq, ServletResponse sresp, FilterChain chain) throws IOException, ServletException { - setUserAttributeName(AuthenticationHelper.AUTHENTICATION_USER); - // Get the HTTP request/response HttpServletRequest req = (HttpServletRequest)sreq; HttpServletResponse res = (HttpServletResponse)sresp; diff --git a/source/java/org/alfresco/web/bean/users/CreateUserWizard.java b/source/java/org/alfresco/web/bean/users/CreateUserWizard.java index e2b3ad476f..edfe58cca5 100644 --- a/source/java/org/alfresco/web/bean/users/CreateUserWizard.java +++ b/source/java/org/alfresco/web/bean/users/CreateUserWizard.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -799,39 +799,7 @@ public class CreateUserWizard extends BaseWizardBean { // create properties for Person type from submitted Form data Map props = new HashMap(7, 1.0f); - props.put(ContentModel.PROP_USERNAME, this.userName); - props.put(ContentModel.PROP_FIRSTNAME, this.firstName); - props.put(ContentModel.PROP_LASTNAME, this.lastName); - NodeRef homeSpaceNodeRef; - if (this.homeSpaceLocation != null && this.homeSpaceName.length() != 0) - { - // create new - homeSpaceNodeRef = createHomeSpace(this.homeSpaceLocation.getId(), this.homeSpaceName, true); - } - else if (this.homeSpaceLocation != null) - { - // set to existing - first ensure it is NOT "User Homes" space! - if (this.defaultHomeSpaceRef.equals(this.homeSpaceLocation)) - { - throw new AlfrescoRuntimeException(Application.getMessage(context, MSG_ERROR_NEWUSER_HOME_SPACE)); - } - homeSpaceNodeRef = this.homeSpaceLocation; - setupHomeSpacePermissions(homeSpaceNodeRef); - } - else - { - // default to Company Home - homeSpaceNodeRef = getCompanyHomeSpace(); - } - - props.put(ContentModel.PROP_HOMEFOLDER, homeSpaceNodeRef); - props.put(ContentModel.PROP_EMAIL, this.email); - props.put(ContentModel.PROP_ORGID, this.companyId); - props.put(ContentModel.PROP_ORGANIZATION, this.organisation); - props.put(ContentModel.PROP_JOBTITLE, this.jobtitle); - props.put(ContentModel.PROP_LOCATION, this.location); - props.put(ContentModel.PROP_PRESENCEPROVIDER, this.presenceProvider); - props.put(ContentModel.PROP_PRESENCEUSERNAME, this.presenceUsername); + setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, context); // create the node to represent the Person getPersonService().createPerson(props); @@ -877,6 +845,47 @@ public class CreateUserWizard extends BaseWizardBean return outcome; } + protected void setPersonPropertiesAndCreateHomeSpaceIfNeeded( + Map props, FacesContext context) + { + props.put(ContentModel.PROP_USERNAME, this.userName); + props.put(ContentModel.PROP_FIRSTNAME, this.firstName); + props.put(ContentModel.PROP_LASTNAME, this.lastName); + NodeRef homeSpaceNodeRef; + if (this.homeSpaceLocation != null && this.homeSpaceName.length() != 0) + { + // create new + props.put(ContentModel.PROP_HOME_FOLDER_PROVIDER, "userHomesHomeFolderProvider"); + homeSpaceNodeRef = createHomeSpace(this.homeSpaceLocation.getId(), this.homeSpaceName, true); + } + else if (this.homeSpaceLocation != null) + { + // set to existing - first ensure it is NOT "User Homes" space! + if (this.defaultHomeSpaceRef.equals(this.homeSpaceLocation)) + { + throw new AlfrescoRuntimeException(Application.getMessage(context, MSG_ERROR_NEWUSER_HOME_SPACE)); + } + props.put(ContentModel.PROP_HOME_FOLDER_PROVIDER, "companyHomeFolderProvider"); // shared folder + homeSpaceNodeRef = this.homeSpaceLocation; + setupHomeSpacePermissions(homeSpaceNodeRef); + } + else + { + // default to Company Home + props.put(ContentModel.PROP_HOME_FOLDER_PROVIDER, "companyHomeFolderProvider"); // shared folder + homeSpaceNodeRef = getCompanyHomeSpace(); + } + + props.put(ContentModel.PROP_HOMEFOLDER, homeSpaceNodeRef); + props.put(ContentModel.PROP_EMAIL, this.email); + props.put(ContentModel.PROP_ORGID, this.companyId); + props.put(ContentModel.PROP_ORGANIZATION, this.organisation); + props.put(ContentModel.PROP_JOBTITLE, this.jobtitle); + props.put(ContentModel.PROP_LOCATION, this.location); + props.put(ContentModel.PROP_PRESENCEPROVIDER, this.presenceProvider); + props.put(ContentModel.PROP_PRESENCEUSERNAME, this.presenceUsername); + } + @Override public boolean getFinishButtonDisabled() { diff --git a/source/java/org/alfresco/web/bean/users/EditUserWizard.java b/source/java/org/alfresco/web/bean/users/EditUserWizard.java index 7ec8ec3585..603041526f 100644 --- a/source/java/org/alfresco/web/bean/users/EditUserWizard.java +++ b/source/java/org/alfresco/web/bean/users/EditUserWizard.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -24,7 +24,6 @@ import java.util.Map; import javax.faces.context.FacesContext; -import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -118,86 +117,16 @@ public class EditUserWizard extends CreateUserWizard // update the existing node in the repository NodeRef nodeRef = properties.getPerson().getNodeRef(); + // Note: The previous approach was to try a move the home folder if changed, + // but this was problematic as other users that shared the same folder + // moved too. We cannot tell if it is shared. Decided it is better to just + // create a new folder or reuse the folder pointed to just like the initial + // creation in CreateUserWizard. It is always possible to move the contents + // of the old home folder by hand later. Map props = this.getNodeService().getProperties(nodeRef); - props.put(ContentModel.PROP_USERNAME, this.userName); - props.put(ContentModel.PROP_FIRSTNAME, this.firstName); - props.put(ContentModel.PROP_LASTNAME, this.lastName); + setPersonPropertiesAndCreateHomeSpaceIfNeeded(props, context); - // calculate whether we need to move the old home space or create new - NodeRef newHomeFolderRef; - NodeRef oldHomeFolderRef = (NodeRef) this.getNodeService().getProperty(nodeRef, ContentModel.PROP_HOMEFOLDER); - boolean moveHomeSpace = false; - boolean renameHomeSpace = false; - if (oldHomeFolderRef != null && this.getNodeService().exists(oldHomeFolderRef) == true) - { - // the original home folder ref exists so may need moving if it has been changed - ChildAssociationRef childAssocRef = this.getNodeService().getPrimaryParent(oldHomeFolderRef); - NodeRef currentHomeSpaceLocation = childAssocRef.getParentRef(); - if (this.homeSpaceName.length() != 0) - { - if (currentHomeSpaceLocation.equals(this.homeSpaceLocation) == false && oldHomeFolderRef.equals(this.homeSpaceLocation) == false - && currentHomeSpaceLocation.equals(getCompanyHomeSpace()) == false && currentHomeSpaceLocation.equals(getDefaultHomeSpace()) == false) - { - moveHomeSpace = true; - } - - String oldHomeSpaceName = Repository.getNameForNode(getNodeService(), oldHomeFolderRef); - if (oldHomeSpaceName.equals(this.homeSpaceName) == false && oldHomeFolderRef.equals(this.homeSpaceLocation) == false) - { - renameHomeSpace = true; - } - } - } - - if (logger.isDebugEnabled()) - logger.debug("Moving space: " + moveHomeSpace + " and renaming space: " + renameHomeSpace); - - if (moveHomeSpace == false && renameHomeSpace == false) - { - if (this.homeSpaceLocation != null && this.homeSpaceName.length() != 0) - { - newHomeFolderRef = createHomeSpace(this.homeSpaceLocation.getId(), this.homeSpaceName, false); - } - else if (this.homeSpaceLocation != null) - { - // location selected but no home space name entered, - // so the home ref should be set to the newly selected space - newHomeFolderRef = this.homeSpaceLocation; - - // set the permissions for this space so the user can access it - - } - else - { - // nothing selected - use Company Home by default - newHomeFolderRef = getCompanyHomeSpace(); - } - } - else - { - // either move, rename or both required - if (moveHomeSpace == true) - { - this.getNodeService() - .moveNode(oldHomeFolderRef, this.homeSpaceLocation, ContentModel.ASSOC_CONTAINS, this.getNodeService().getPrimaryParent(oldHomeFolderRef).getQName()); - } - newHomeFolderRef = oldHomeFolderRef; // ref ID doesn't change - - if (renameHomeSpace == true) - { - // change HomeSpace node name - this.getNodeService().setProperty(newHomeFolderRef, ContentModel.PROP_NAME, this.homeSpaceName); - } - } - - props.put(ContentModel.PROP_HOMEFOLDER, newHomeFolderRef); - props.put(ContentModel.PROP_EMAIL, this.email); - props.put(ContentModel.PROP_ORGID, this.companyId); - props.put(ContentModel.PROP_ORGANIZATION, this.organisation); - props.put(ContentModel.PROP_JOBTITLE, this.jobtitle); - props.put(ContentModel.PROP_LOCATION, this.location); - props.put(ContentModel.PROP_PRESENCEPROVIDER, this.presenceProvider); - props.put(ContentModel.PROP_PRESENCEUSERNAME, this.presenceUsername); + // update the node that represents the Person this.getNodeService().setProperties(nodeRef, props); // TODO: RESET HomeSpace Ref found in top-level navigation bar! diff --git a/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java b/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java index 3181d0ff83..5c91c8e986 100644 --- a/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java +++ b/source/java/org/alfresco/web/bean/wizard/NewUserWizard.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -60,6 +60,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.EmailValidator; /** + * @deprecated Replaced by CreateUserWizard. * @author Kevin Roast */ public class NewUserWizard extends AbstractWizardBean diff --git a/source/java/org/alfresco/web/ui/repo/component/UIActions.java b/source/java/org/alfresco/web/ui/repo/component/UIActions.java index 0dfd366e71..d58e718c3d 100644 --- a/source/java/org/alfresco/web/ui/repo/component/UIActions.java +++ b/source/java/org/alfresco/web/ui/repo/component/UIActions.java @@ -21,7 +21,6 @@ package org.alfresco.web.ui.repo.component; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigInteger; -import java.nio.charset.Charset; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -650,20 +649,14 @@ public class UIActions extends SelfRenderingComponent */ private static String createUniqueId() { - String guidString = GUID.generate(); - byte[] guidBytes = null; try { - guidBytes = guidString.getBytes("ISO8859_1"); + return "id_" + new BigInteger(GUID.generate().getBytes("8859_1")).toString(Character.MAX_RADIX); } catch (UnsupportedEncodingException e) { - //probably unreachable block, so just in case - Charset defaultCharset = Charset.defaultCharset(); - logger.warn("Can't get GUID bytes for encoding ISO8859_1, use default " + defaultCharset); - guidBytes = guidString.getBytes(defaultCharset); + throw new RuntimeException(e); } - return "id_" + new BigInteger(guidBytes).toString(Character.MAX_RADIX); } // ------------------------------------------------------------------------------ @@ -680,6 +673,4 @@ public class UIActions extends SelfRenderingComponent /** Vertical layout spacing */ private Integer verticalSpacing = null; - - private static short id = 0; }