Merged V3.0 to HEAD

11509: ETHREEOH-394: Incorrect message in activity feed when user accepts an invitation to a site
   11510: Fix to set position
   11511: Fix for ETHREEOH-533: Dialogs access via ExternalAccessServlet return to blank empty container.jsp page when Close button is clicked
   11512: Fix DM ACL deletion after merge forward for shared and defining ACLs.
   11513: Merged V2.2 to V3.0
      11501: Expose if set permissions are inherited or not and fix relatd behaviour for import/copy
   11514: Fix for ETHREEOH-476 (Impossible to create Site Invite Workflow) & ETHREEOH-254 (Default value at 'Start Advanced Workflow Wizard' page)
   11515: Fix for ETHREEOH-446 and ETHREEOH-447
   11517: Fix for ETHREEOH-225: Web Forms with repeating elements don't work
   11518: Merged V2.2 to V3.0
      11343: ACL upgrades may require a COW - it now warns when this happens.
      11369: Always lock against staging - ETWOTWO-763
   11519: Merged V2.2 to V3.0
      11467: Fixed ETWOTWO-774: CreateVersionTxnListener.afterCommit() throws NPE
      11468: More defensive coding on AVM txn listeners (avoid NPEs)
      11475: More defensive checks to avoid NPE
   11520: Merged V2.2 to V3.0
      11478: Keep creator and owner as orihinally set in AVM - Fix for ETWOTWO-604
   11521: RuntimeExec: Added optional directive SPLIT: to force argument tokenization
   11522: Limited tests to just check the command format not execute it for "dir . .."
   11523: Undid revision 11520 (Merged V2.2 11478)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12449 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2008-12-17 14:24:08 +00:00
parent 992adcfec7
commit 9b736530c7
10 changed files with 227 additions and 146 deletions

View File

@@ -26,6 +26,7 @@ package org.alfresco.web.app.servlet;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Stack;
import java.util.StringTokenizer;
import javax.faces.application.NavigationHandler;
@@ -132,6 +133,16 @@ public class ExternalAccessServlet extends BaseServlet
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
PermissionService permissionService = serviceRegistry.getPermissionService();
// as we are potentially coming in from an external app reset the view stack
Stack viewStack = (Stack)fc.getExternalContext().getSessionMap().get("_alfViewStack");
if (viewStack != null)
{
viewStack.clear();
if (logger.isDebugEnabled())
logger.debug("Cleared view stack");
}
// setup is required for certain outcome requests
if (OUTCOME_DOCDETAILS.equals(outcome))
{

View File

@@ -24,8 +24,6 @@
*/
package org.alfresco.web.app.servlet;
import java.util.regex.Pattern;
import javax.faces.FactoryFinder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
@@ -142,8 +140,9 @@ public final class FacesHelper
// set a new viewRoot, otherwise context.getViewRoot returns null
if (viewRoot == null)
{
viewRoot = "/jsp/close.jsp";
viewRoot = "/jsp/browse/browse.jsp";
}
UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, viewRoot);
facesContext.setViewRoot(view);

View File

@@ -63,7 +63,7 @@ public class EditContentPropertiesCommand extends BaseUIActionCommand
ServletContext sc = (ServletContext)properties.get(PROP_SERVLETCONTEXT);
ServletRequest req = (ServletRequest)properties.get(PROP_REQUEST);
ServletResponse res = (ServletResponse)properties.get(PROP_RESPONSE);
FacesContext fc = FacesHelper.getFacesContext(req, res, sc, "/jsp/return.jsp");
FacesContext fc = FacesHelper.getFacesContext(req, res, sc, "/jsp/close.jsp");
BrowseBean browseBean = (BrowseBean)FacesHelper.getManagedBean(fc, BrowseBean.BEAN_NAME);
// setup context from url args in properties map

View File

@@ -61,7 +61,7 @@ public class UserProfileDialogCommand extends BaseUIActionCommand
ServletContext sc = (ServletContext)properties.get(PROP_SERVLETCONTEXT);
ServletRequest req = (ServletRequest)properties.get(PROP_REQUEST);
ServletResponse res = (ServletResponse)properties.get(PROP_RESPONSE);
FacesContext fc = FacesHelper.getFacesContext(req, res, sc, "/jsp/return.jsp");
FacesContext fc = FacesHelper.getFacesContext(req, res, sc, "/jsp/close.jsp");
UsersDialog dialog = (UsersDialog)FacesHelper.getManagedBean(fc, UsersDialog.BEAN_NAME);
// setup dialog context from url args in properties map

View File

@@ -60,18 +60,23 @@ import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.BrowseBean;
import org.alfresco.web.bean.NavigationBean;
import org.alfresco.web.bean.dialog.BaseDialogBean;
import org.alfresco.web.bean.dialog.FilterViewSupport;
import org.alfresco.web.bean.repository.MapNode;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.ui.common.Utils;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.alfresco.web.ui.common.component.UIListItem;
import org.alfresco.web.ui.common.component.UIModeList;
import org.alfresco.web.ui.common.component.data.UIRichList;
import org.alfresco.web.ui.repo.WebResources;
/**
* Bean backing the Manage Space/Content Permission pages.
*
* @author Kevin Roast
*/
public abstract class UserMembersBean extends BaseDialogBean implements IContextListener
public abstract class UserMembersBean extends BaseDialogBean implements IContextListener, FilterViewSupport
{
private static final String MSG_SUCCESS_INHERIT_NOT = "success_not_inherit_permissions";
private static final String MSG_SUCCESS_INHERIT = "success_inherit_permissions";
@@ -80,6 +85,13 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
private static final String OUTCOME_FINISH = "finish";
private static final String LOCAL = "local";
private static final String INHERITED = "inherited";
private final static String MSG_CLOSE = "close";
private String filterMode = LOCAL;
/** NodeService bean reference */
transient private NodeService nodeService;
@@ -337,6 +349,8 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
{
FacesContext context = FacesContext.getCurrentInstance();
boolean includeInherited = (this.filterMode.equals(INHERITED));
List<Map> personNodes = null;
UserTransaction tx = null;
@@ -358,6 +372,8 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
permission.getAuthorityType() == AuthorityType.GROUP ||
permission.getAuthorityType() == AuthorityType.GUEST ||
permission.getAuthorityType() == AuthorityType.EVERYONE))
{
if (includeInherited || permission.isSetDirectly())
{
String authority = permission.getAuthority();
@@ -372,6 +388,7 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
userPermissions.add(permission.getPermission());
}
}
}
// for each authentication (username/group key) found we get the Person
// node represented by it and use that for our list databinding object
@@ -396,6 +413,7 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
props.put("roles", roleListToString(context, permissionMap.get(authority)));
props.put("icon", WebResources.IMAGE_PERSON);
props.put("isGroup", Boolean.FALSE);
props.put("inherited", includeInherited);
personNodes.add(node);
}
@@ -403,7 +421,7 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
else
{
// need a map (dummy node) to represent props for this Group Authority
Map<String, Object> node = new HashMap<String, Object>(5, 1.0f);
Map<String, Object> node = new HashMap<String, Object>(8, 1.0f);
if (authority.startsWith(PermissionService.GROUP_PREFIX) == true)
{
node.put("fullName", authority.substring(PermissionService.GROUP_PREFIX.length()));
@@ -417,6 +435,8 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
node.put("roles", roleListToString(context, permissionMap.get(authority)));
node.put("icon", WebResources.IMAGE_GROUP);
node.put("isGroup", Boolean.TRUE);
node.put("inherited", includeInherited);
personNodes.add(node);
}
}
@@ -501,6 +521,65 @@ public abstract class UserMembersBean extends BaseDialogBean implements IContext
// nothing to do
}
// ------------------------------------------------------------------------------
// FilterViewSupport implementation
/**
* @see org.alfresco.web.bean.dialog.FilterViewSupport#filterModeChanged(javax.faces.event.ActionEvent)
*/
public void filterModeChanged(ActionEvent event)
{
UIModeList viewList = (UIModeList) event.getComponent();
setFilterMode(viewList.getValue().toString());
// force the list to be re-queried when the page is refreshed
if (this.usersRichList != null)
{
this.usersRichList.setValue(null);
}
}
/**
* @see org.alfresco.web.bean.dialog.FilterViewSupport#getFilterItems()
*/
public List<UIListItem> getFilterItems()
{
FacesContext context = FacesContext.getCurrentInstance();
List<UIListItem> items = new ArrayList<UIListItem>(2);
UIListItem item1 = new UIListItem();
item1.setValue(INHERITED);
item1.setLabel(Application.getMessage(context, INHERITED));
items.add(item1);
UIListItem item2 = new UIListItem();
item2.setValue(LOCAL);
item2.setLabel(Application.getMessage(context, LOCAL));
items.add(item2);
return items;
}
/**
* @see org.alfresco.web.bean.dialog.FilterViewSupport#getFilterMode()
*/
public String getFilterMode()
{
return filterMode;
}
/**
* @see org.alfresco.web.bean.dialog.FilterViewSupport#setFilterMode(java.lang.String)
*/
public void setFilterMode(final String filterMode)
{
this.filterMode = filterMode;
// clear datalist cache ready to change results based on filter setting
contextUpdated();
}
// ------------------------------------------------------------------------------
// Action event handlers

View File

@@ -51,14 +51,12 @@ import org.alfresco.web.ui.repo.WebResources;
*/
public class ManagePermissionsDialog extends BasePermissionsDialog implements IContextListener, FilterViewSupport
{
private static final long serialVersionUID = -6980134441634707541L;
private static final String MSG_MANAGE_PERMS_FOR = "manage_permissions_title";
private static final String MSG_VIEW_PERMS_FOR = "view_permissions_title";
private static final String LOCAL = "local";
private static final String INHERITED = "inherited";
private final static String MSG_CLOSE = "close";
@@ -73,6 +71,7 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
private boolean inheritParenSpacePermissions;
/**
* @param personService The personService to set.
*/
@@ -122,7 +121,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
*/
public List<Map> getUsers()
{
boolean includeInherited = true;
if (this.filterMode.equals(LOCAL))
@@ -146,7 +144,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
// found.
NodeRef actionNode = getAvmBrowseBean().getAvmActionNode().getNodeRef();
// getPermissionService().setInheritParentPermissions(actionNode, inheritParenSpacePermissions);
Map<String, List<String>> permissionMap;
Map<String, List<String>> parentPermissionMap;
@@ -156,13 +153,10 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
permissionMap = getPerson(permissions, permsToDisplay);
NodeRef parentRef = getNodeService().getPrimaryParent(actionNode).getParentRef();
// getPermissionService().getAllSetPermissions(parentRef);
parentPermissionMap = getPerson(getPermissionService().getAllSetPermissions(parentRef), permsToDisplay);
// for each authentication (username/group key) found we get the
// Person
// node represented by it and use that for our list databinding
// object
// for each authentication (username/group key) found we get the Person
// node represented by it and use that for our list databinding object
personNodes = new ArrayList<Map>(permissionMap.size());
List<String> local = new ArrayList<String>();
List<String> inh = new ArrayList<String>();
@@ -392,7 +386,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
public void areaChanged()
{
// nothing to do
}
/*
@@ -406,7 +399,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
{
this.usersRichList.setValue(null);
}
}
/*
@@ -417,7 +409,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
public void spaceChanged()
{
// nothing to do
}
/*
@@ -428,14 +419,12 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
public void filterModeChanged(ActionEvent event)
{
UIModeList viewList = (UIModeList) event.getComponent();
// this.filterModeMode = viewList.getValue().toString();
setFilterMode(viewList.getValue().toString());
// force the list to be re-queried when the page is refreshed
if (this.usersRichList != null)
{
this.usersRichList.setValue(null);
}
}
/*
@@ -506,7 +495,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
}
/*
* (non-Javadoc)
*
@@ -538,7 +526,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
@Override
public boolean getFinishButtonDisabled()
{
return false;
}
@@ -559,7 +546,6 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
FacesContext fc = FacesContext.getCurrentInstance();
String pattern = Application.getMessage(fc, isRendered() ? MSG_MANAGE_PERMS_FOR : MSG_VIEW_PERMS_FOR);
// avmBrowseBean.getAvmActionNode().getNodePath().toDisplayPath(getNodeService(), getPermissionService());
return MessageFormat.format(pattern, getAvmBrowseBean().getAvmActionNode().getName());
}
@@ -605,5 +591,4 @@ public class ManagePermissionsDialog extends BasePermissionsDialog implements IC
boolean inheritPermissions = (Boolean)event.getNewValue();
setInheritParenSpacePermissions(inheritPermissions);
}
}

View File

@@ -567,7 +567,8 @@ public class StartWorkflowWizard extends BaseWizardBean
for (WorkflowDefinition workflowDef : workflowDefs)
{
String name = workflowDef.name;
if (configuredWcmWorkflows.containsKey(name) == false)
if (configuredWcmWorkflows.containsKey(name) == false &&
"jbpm$wf:invite".equals(name) == false)
{
// add the workflow if it is not a WCM specific workflow
String label = workflowDef.title;
@@ -580,13 +581,8 @@ public class StartWorkflowWizard extends BaseWizardBean
}
}
// set the initial selected workflow to the first in the list, unless there are no
// workflows, in which disable the next button
if (this.availableWorkflows.size() > 0)
{
this.selectedWorkflow = (String)this.availableWorkflows.get(0).getValue();
}
else
// disable the next button if there are no workflows
if (this.availableWorkflows.size() == 0)
{
this.nextButtonDisabled = true;
}
@@ -610,6 +606,12 @@ public class StartWorkflowWizard extends BaseWizardBean
QuickSort sorter = new QuickSort(availableWorkflows, "label", true, IDataContainer.SORT_CASEINSENSITIVE);
sorter.sort();
// select the first workflow in the list
if (this.availableWorkflows.size() > 0)
{
this.selectedWorkflow = (String)this.availableWorkflows.get(0).getValue();
}
return availableWorkflows;
}

View File

@@ -81,12 +81,14 @@
<f:facet name="header">
<h:outputText value="#{msg.actions}"/>
</f:facet>
<a:booleanEvaluator value="#{!r.inherited}">
<a:actionLink value="#{msg.change_roles}" image="/images/icons/edituser.gif" showLink="false" action="dialog:editContentUserRoles" actionListener="#{EditContentUserRolesDialog.setupUserAction}">
<f:param name="userName" value="#{r.userName}" />
</a:actionLink>
<a:actionLink value="#{msg.remove}" image="/images/icons/delete_person.gif" showLink="false" action="dialog:removeContentUser" actionListener="#{RemoveContentUserDialog.setupUserAction}">
<f:param name="userName" value="#{r.userName}" />
</a:actionLink>
</a:booleanEvaluator>
</a:column>
<a:dataPager styleClass="pager" />

View File

@@ -83,12 +83,14 @@
<f:facet name="header">
<h:outputText value="#{msg.actions}"/>
</f:facet>
<a:booleanEvaluator value="#{!r.inherited}">
<a:actionLink value="#{msg.change_roles}" image="/images/icons/edituser.gif" showLink="false" action="dialog:editUserRoles" actionListener="#{EditUserRolesDialog.setupUserAction}">
<f:param name="userName" value="#{r.userName}" />
</a:actionLink>
<a:actionLink value="#{msg.remove}" image="/images/icons/delete_person.gif" showLink="false" action="dialog:removeInvitedUser" actionListener="#{RemoveInvitedUserDialog.setupUserAction}">
<f:param name="userName" value="#{r.userName}" />
</a:actionLink>
</a:booleanEvaluator>
</a:column>
<a:dataPager styleClass="pager" />
@@ -115,7 +117,5 @@
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width="4"></td>
</tr>
</table>
</f:verbatim>

View File

@@ -4287,9 +4287,12 @@ alfresco.xforms.XForm = new Class({
var clone = prototypeClones.pop();
// walk all nodes of the clone and ensure that they have generated ids.
// those that do not are nested repeats that should not be added
assert(clone.getAttribute("id") in generatedIds,
"expected clone id " + clone.getAttribute("id") +
if ((clone.getAttribute("id") in generatedIds) == false)
{
throw new Error("expected clone id " + clone.getAttribute("id") +
" to be a generated id");
}
function _removeNonGeneratedChildNodes(node, ids)
{
var child = node.firstChild;