Merged V2.2 to HEAD

7531: Merged V2.1 to V2.2
             7397: Fix and improvments to all web-client People pickers - all now search on Username and build Lucene queries rather than XPath. Fixes AWC-853, AWC-935, AWC-1180, AWC-1660
             Merge conflicts resolved around query strings and client session cluster changes
   7532: Added action to go back to last deployment report in history panel
   7533: Moved deploy actions to resources panel header in review task dialog

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@8400 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2008-02-29 08:44:21 +00:00
parent bbc2156235
commit ba5174613d
9 changed files with 144 additions and 81 deletions

View File

@@ -1221,6 +1221,7 @@ deployed_by=By
deployment_report_action=View Deployments deployment_report_action=View Deployments
deployment_report_title=Last Deployment Report deployment_report_title=Last Deployment Report
deployment_report_desc=View deployment details for each of the servers selected in the last deployment. deployment_report_desc=View deployment details for each of the servers selected in the last deployment.
last_deploy_report=Show Last Deployment Report
more_deploy_reports=More Deployment Reports more_deploy_reports=More Deployment Reports
deployment_previous_report_title=Deployment Report for {0} deployment_previous_report_title=Deployment Report for {0}
deployment_previous_report_desc=View deployment details for each of the servers selected in the deployment. deployment_previous_report_desc=View deployment details for each of the servers selected in the deployment.

View File

@@ -37,10 +37,12 @@ import javax.faces.model.SelectItem;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.search.impl.lucene.QueryParser;
import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
@@ -202,15 +204,21 @@ public class AddUsersDialog extends BaseDialogBean
{ {
SelectItem[] items; SelectItem[] items;
// build xpath to match available User/Person objects // Use lucene search to retrieve user details
ServiceRegistry services = Repository.getServiceRegistry(context); String term = QueryParser.escape(contains.trim());
NodeRef peopleRef = getPersonService().getPeopleContainer(); StringBuilder query = new StringBuilder(128);
String xpath = "*[like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:*");
"%', false)" + " or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + query.append(term);
"lastName, '%" + contains + "%', false)]"; query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:*");
query.append(term);
List<NodeRef> nodes = services.getSearchService().selectNodes(peopleRef, xpath, null, query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
services.getNamespaceService(), false); query.append(term);
query.append("*");
ResultSet resultSet = Repository.getServiceRegistry(context).getSearchService().query(
Repository.getStoreRef(),
SearchService.LANGUAGE_LUCENE,
query.toString());
List<NodeRef> nodes = resultSet.getNodeRefs();
ArrayList<SelectItem> itemList = new ArrayList<SelectItem>(nodes.size()); ArrayList<SelectItem> itemList = new ArrayList<SelectItem>(nodes.size());
for (NodeRef personRef : nodes) for (NodeRef personRef : nodes)
@@ -221,7 +229,7 @@ public class AddUsersDialog extends BaseDialogBean
String firstName = (String)getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME); String firstName = (String)getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME);
String lastName = (String)getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME); String lastName = (String)getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME);
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName); SelectItem item = new SortableSelectItem(username, firstName + " " + lastName + " [" + username + "]", lastName);
itemList.add(item); itemList.add(item);
} }
} }

View File

@@ -43,6 +43,7 @@ import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.Application; import org.alfresco.web.app.Application;
import org.alfresco.web.app.context.IContextListener; import org.alfresco.web.app.context.IContextListener;
@@ -320,20 +321,18 @@ public class UsersDialog extends BaseDialogBean implements IContextListener, Cha
// define the query to find people by their first or last name // define the query to find people by their first or last name
String search = properties.getSearchCriteria().trim(); String search = properties.getSearchCriteria().trim();
StringBuilder query = new StringBuilder(256); StringBuilder query = new StringBuilder(128);
query.append("TYPE:\"{http://www.alfresco.org/model/content/1.0}person\" AND (");
for (StringTokenizer t = new StringTokenizer(search, " "); t.hasMoreTokens(); /**/) for (StringTokenizer t = new StringTokenizer(search, " "); t.hasMoreTokens(); /**/)
{ {
String term = QueryParser.escape(t.nextToken()); String term = QueryParser.escape(t.nextToken());
query.append("((@\\{http\\://www.alfresco.org/model/content/1.0\\}firstName:*"); query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:*");
query.append(term); query.append(term);
query.append("*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}lastName:*"); query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:*");
query.append(term); query.append(term);
query.append("*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}userName:"); query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
query.append(term); query.append(term);
query.append("*)) "); // final space here is important as default OR separator query.append("*");
} }
query.append(")");
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("Query: " + query.toString()); logger.debug("Query: " + query.toString());

View File

@@ -166,6 +166,16 @@ public class ViewDeploymentReportDialog extends BaseDialogBean
this.panelExpanded = !this.panelExpanded; this.panelExpanded = !this.panelExpanded;
} }
/**
* Action handler called when user wants to go back to the last report
*/
public void showLastReport(ActionEvent event)
{
this.attempt = null;
this.attemptDate = null;
this.panelExpanded = false;
}
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
// Bean getters and setters // Bean getters and setters

View File

@@ -44,6 +44,7 @@ import javax.faces.model.SelectItem;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.search.impl.lucene.QueryParser;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
@@ -342,13 +343,20 @@ public abstract class BaseInviteUsersWizard extends BaseWizardBean
if (filterIndex == 0) if (filterIndex == 0)
{ {
// build xpath to match available User/Person objects
NodeRef peopleRef = getPersonService().getPeopleContainer();
// Use lucene search to retrieve user details // Use lucene search to retrieve user details
String lucene = "@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:firstName:*" + contains + "* " + String term = QueryParser.escape(contains.trim());
"@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:lastName:*" + contains + "* "; StringBuilder query = new StringBuilder(128);
ResultSet resultSet = getSearchService().query(peopleRef.getStoreRef(), SearchService.LANGUAGE_LUCENE, lucene); query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:*");
query.append(term);
query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:*");
query.append(term);
query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
query.append(term);
query.append("*");
ResultSet resultSet = Repository.getServiceRegistry(context).getSearchService().query(
Repository.getStoreRef(),
SearchService.LANGUAGE_LUCENE,
query.toString());
List<NodeRef> nodes = resultSet.getNodeRefs(); List<NodeRef> nodes = resultSet.getNodeRefs();
items = new SelectItem[nodes.size()]; items = new SelectItem[nodes.size()];
@@ -369,7 +377,7 @@ public abstract class BaseInviteUsersWizard extends BaseWizardBean
groups.addAll(getAuthorityService().getAllAuthorities(AuthorityType.EVERYONE)); groups.addAll(getAuthorityService().getAllAuthorities(AuthorityType.EVERYONE));
List<SelectItem> results = new ArrayList<SelectItem>(groups.size()); List<SelectItem> results = new ArrayList<SelectItem>(groups.size());
String containsLower = contains.toLowerCase(); String containsLower = contains.trim().toLowerCase();
int offset = PermissionService.GROUP_PREFIX.length(); int offset = PermissionService.GROUP_PREFIX.length();
for (String group : groups) for (String group : groups)
{ {

View File

@@ -26,6 +26,7 @@ package org.alfresco.web.bean.workflow;
import java.io.Serializable; import java.io.Serializable;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -38,7 +39,11 @@ import javax.faces.model.SelectItem;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.search.impl.lucene.QueryParser;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
@@ -164,30 +169,36 @@ public class ReassignTaskDialog extends BaseDialogBean
tx = Repository.getUserTransaction(context, true); tx = Repository.getUserTransaction(context, true);
tx.begin(); tx.begin();
// build xpath to match available User/Person objects // Use lucene search to retrieve user details
NodeRef peopleRef = getPersonService().getPeopleContainer(); String term = QueryParser.escape(contains.trim());
// NOTE: see SearcherComponentTest StringBuilder query = new StringBuilder(128);
String xpath = "*[not(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "userName='guest') and " + query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:*");
"(like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + "%', false)" + query.append(term);
" or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "lastName, '%" + contains + "%', false))]"; query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:*");
query.append(term);
query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
query.append(term);
query.append("*");
ResultSet resultSet = Repository.getServiceRegistry(context).getSearchService().query(
Repository.getStoreRef(),
SearchService.LANGUAGE_LUCENE,
query.toString());
List<NodeRef> nodes = resultSet.getNodeRefs();
List<NodeRef> nodes = getSearchService().selectNodes( ArrayList<SelectItem> itemList = new ArrayList<SelectItem>(nodes.size());
peopleRef, for (NodeRef personRef : nodes)
xpath,
null,
this.getNamespaceService(),
false);
items = new SelectItem[nodes.size()];
for (int index=0; index<nodes.size(); index++)
{ {
NodeRef personRef = nodes.get(index); String username = (String) getNodeService().getProperty(personRef, ContentModel.PROP_USERNAME);
String firstName = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME); if (PermissionService.GUEST_AUTHORITY.equals(username) == false)
String lastName = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME); {
String username = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_USERNAME); String firstName = (String) getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME);
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName); String lastName = (String) getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME);
items[index] = item; SelectItem item = new SortableSelectItem(username, firstName + " " + lastName + " [" + username + "]", lastName);
itemList.add(item);
}
} }
items = new SelectItem[itemList.size()];
itemList.toArray(items);
Arrays.sort(items); Arrays.sort(items);

View File

@@ -26,6 +26,7 @@ package org.alfresco.web.bean.workflow;
import java.io.Serializable; import java.io.Serializable;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -38,7 +39,11 @@ import javax.faces.model.SelectItem;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.search.impl.lucene.QueryParser;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
@@ -164,29 +169,36 @@ public class ReassignWorkItemDialog extends BaseDialogBean
tx = Repository.getUserTransaction(context, true); tx = Repository.getUserTransaction(context, true);
tx.begin(); tx.begin();
// build xpath to match available User/Person objects // Use lucene search to retrieve user details
NodeRef peopleRef = getPersonService().getPeopleContainer(); String term = QueryParser.escape(contains.trim());
// NOTE: see SearcherComponentTest StringBuilder query = new StringBuilder(128);
String xpath = "*[like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + "%', false)" + query.append("@").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:firstName:*");
" or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "lastName, '%" + contains + "%', false)]"; query.append(term);
query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:lastName:*");
query.append(term);
query.append("* @").append(NamespaceService.CONTENT_MODEL_PREFIX).append("\\:userName:");
query.append(term);
query.append("*");
ResultSet resultSet = Repository.getServiceRegistry(context).getSearchService().query(
Repository.getStoreRef(),
SearchService.LANGUAGE_LUCENE,
query.toString());
List<NodeRef> nodes = resultSet.getNodeRefs();
List<NodeRef> nodes = getSearchService().selectNodes( ArrayList<SelectItem> itemList = new ArrayList<SelectItem>(nodes.size());
peopleRef, for (NodeRef personRef : nodes)
xpath,
null,
this.getNamespaceService(),
false);
items = new SelectItem[nodes.size()];
for (int index=0; index<nodes.size(); index++)
{ {
NodeRef personRef = nodes.get(index); String username = (String) getNodeService().getProperty(personRef, ContentModel.PROP_USERNAME);
String firstName = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME); if (PermissionService.GUEST_AUTHORITY.equals(username) == false)
String lastName = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME); {
String username = (String)this.getNodeService().getProperty(personRef, ContentModel.PROP_USERNAME); String firstName = (String) getNodeService().getProperty(personRef, ContentModel.PROP_FIRSTNAME);
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName); String lastName = (String) getNodeService().getProperty(personRef, ContentModel.PROP_LASTNAME);
items[index] = item; SelectItem item = new SortableSelectItem(username, firstName + " " + lastName + " [" + username + "]", lastName);
itemList.add(item);
}
} }
items = new SelectItem[itemList.size()];
itemList.toArray(items);
Arrays.sort(items); Arrays.sort(items);

View File

@@ -34,9 +34,18 @@
<w:deploymentReports value="#{DialogManager.bean.store}" attempt="#{DialogManager.bean.attempt}" /> <w:deploymentReports value="#{DialogManager.bean.store}" attempt="#{DialogManager.bean.attempt}" />
<a:panel id="more-reports-panel" label="#{msg.more_deploy_reports}" progressive="true" styleClass="mainSubTitle" <h:panelGroup id="panel-facets">
border="innerwhite" bgcolor="white" titleBgcolor="white" expanded="#{DialogManager.bean.panelExpanded}" <f:facet name="title">
expandedActionListener="#{DialogManager.bean.panelToggled}"> <a:actionLink id="back-to-last-report" value="#{msg.last_deploy_report}" showLink="false"
rendered="#{DialogManager.bean.attempt != null}"
image="/images/icons/deployment_report.gif"
actionListener="#{DialogManager.bean.showLastReport}" />
</f:facet>
</h:panelGroup>
<a:panel id="more-reports-panel" label="#{msg.more_deploy_reports}" progressive="true" facetsId="dialog-body:panel-facets"
styleClass="mainSubTitle" border="innerwhite" bgcolor="white" titleBgcolor="white"
expanded="#{DialogManager.bean.panelExpanded}" expandedActionListener="#{DialogManager.bean.panelToggled}">
<h:outputText value="<div class='deployMoreReportsPanel'>" escape="false" /> <h:outputText value="<div class='deployMoreReportsPanel'>" escape="false" />
<h:panelGrid id="more-reports-filter" columns="2" styleClass="deployMoreReportsList" width="100%" columnClasses=",rightHandColumn"> <h:panelGrid id="more-reports-filter" columns="2" styleClass="deployMoreReportsList" width="100%" columnClasses=",rightHandColumn">
@@ -53,7 +62,7 @@
</h:panelGrid> </h:panelGrid>
<w:deploymentReports id="more-reports-list" value="#{DialogManager.bean.store}" showPrevious="true" <w:deploymentReports id="more-reports-list" value="#{DialogManager.bean.store}" showPrevious="true"
dateFilter="#{DialogManager.bean.dateFilter}" /> dateFilter="#{DialogManager.bean.dateFilter}" />
<h:outputText value="</div>" escape="false" /> <h:outputText value="</div>" escape="false" />
</a:panel> </a:panel>

View File

@@ -62,17 +62,22 @@
<h:outputText id="padding3" styleClass="paddingRow" value="&nbsp;" escape="false" /> <h:outputText id="padding3" styleClass="paddingRow" value="&nbsp;" escape="false" />
<a:panel id="resources-panel" label="#{msg.resources}" <h:panelGroup id="resources-panel-facets">
border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white" styleClass="mainSubTitle"> <f:facet name="title">
<h:panelGroup id="resources-actions" styleClass="deployReviewTaskActions">
<a:actionLink id="resources-action1" value="#{msg.sandbox_deploy}" image="/images/icons/deploy.gif"
action="#{DialogManager.bean.deploy}" showLink="false"
rendered="#{DialogManager.bean.testServersAvailable}" />
<a:actionLink id="resources-action2" value="#{msg.deployment_report_action}" image="/images/icons/deployment_report.gif"
action="#{DialogManager.bean.viewDeployReport}" showLink="false"
rendered="#{DialogManager.bean.deployAttempted}" />
</h:panelGroup>
</f:facet>
</h:panelGroup>
<h:panelGroup id="resources-actions" styleClass="deployReviewTaskActions"> <a:panel id="resources-panel" label="#{msg.resources}" facetsId="dialog-body:resources-panel-facets"
<a:actionLink id="resources-action1" value="#{msg.sandbox_deploy}" image="/images/icons/deploy.gif" border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white"
action="#{DialogManager.bean.deploy}" styleClass="mainSubTitle">
rendered="#{DialogManager.bean.testServersAvailable}" />
<a:actionLink id="resources-action2" value="#{msg.deployment_report_action}" image="/images/icons/deployment_report.gif"
action="#{DialogManager.bean.viewDeployReport}"
rendered="#{DialogManager.bean.deployAttempted}" />
</h:panelGroup>
<h:outputText value="<div>#{msg.no_resources}</div>" rendered="#{empty DialogManager.bean.resources}" /> <h:outputText value="<div>#{msg.no_resources}</div>" rendered="#{empty DialogManager.bean.resources}" />