queryName = listName;
}
// HashMap querySaveMap = new HashMap();
UIQuery uiQuery = null;
// Specify how associated entities will be retrieved.
Iterator uiScreenSectionEntityI = uiWebScreenSection.getUiScreenSectionEntityList()
.iterator();
uiScreenSectionEntityI.next(); // Pass up the primary entity.
while (uiScreenSectionEntityI.hasNext()) {
UIScreenSectionEntity uiScreenSectionEntity = (UIScreenSectionEntity) uiScreenSectionEntityI.next();
relatedSearchClauses.add(uiScreenSectionEntity);
}
uiScreenSectionEntityI = null; // Reset the iterator.
switch (retrieveMethod) {
case GenericEventProcessor.RETRIEVE_METHOD_ALL:
// Find all entities of this type.
// Don't need to populate the fields map.
break;
case GenericEventProcessor.RETRIEVE_METHOD_AND:
// Find the main entity(ies) by building a WHERE clause using "=" and AND.
throw new GenericEntityException(
"RETRIEVE_METHOD_AND not implemented yet.");
case GenericEventProcessor.RETRIEVE_METHOD_CLAUSE:
if (TIMER) {
timer.timerString(1,
"[GenericWebEventProcessor.processRetrieve] Start RETRIEVE_METHOD_CLAUSE");
}
HashMap joinedEntities = new HashMap();
joinedEntities.put(primaryEntityName, "Y");
// Find the main entity(ies) by building a WHERE clause using LIKE and AND, with one or more tables in the FROM clause.
// First join all secondary screen section entities in the WHERE and FROM clauses in case
// we are going to use query values from them.
Iterator relatedClauseI = relatedSearchClauses.iterator();
while (relatedClauseI.hasNext()) {
UIScreenSectionEntity uiScreenSectionEntity = (UIScreenSectionEntity) relatedClauseI.next();
String relationTitle = uiScreenSectionEntity.getRelationTitle();
String relatedEntityName = uiScreenSectionEntity.getUiEntity().getEntityName();
boolean isOuterJoin = uiScreenSectionEntity.getIsOuterJoined();
String relatedAndFields = uiScreenSectionEntity.getRelationByAndFields();
Debug.logVerbose("Adding relation clauses for " +
relationTitle + "/" + relatedEntityName, module);
eventProcessor.addOneRelationClause(delegator, relationTitle, relatedAndFields,
relatedEntityName, primaryEntityName, primaryME, isOuterJoin,
queryInfo);
joinedEntities.put(relatedEntityName, "Y");
}
Debug.logVerbose(
"queryId at beginning of RETRIEVE_METHOD_CLAUSE section: " +
queryId, module);
if (queryId.equalsIgnoreCase("NONE")) {
// Don't retrieve any data. The calling link specified to use the last query, but there wasn't one.
return STATUS_CONTINUE;
} else if (!queryId.equals("")) {
// User selected a saved query. Get it from the data base.
uiQuery = new UIQuery(queryId, delegator);
if (!uiQuery.getQueryId().equals("")) {
// Query was found.
uiQuery.appendEntityClauses(delegator, queryInfo);
// // Store the attribute ID and value in the query save map.
// querySaveMap.put(attributeId, searchAttribValue);
}
// add extra clauses from the hidden query parameters in case this is a detail screen
addUseQueryParameterClauses(uiWebScreenSection, queryInfo,
relatedSearchClauses, primaryEntityName, request);
} else {
// Brand new query. Process all the parameters coming in through the request object to get the values to search by.
uiQuery = new UIQuery();
String queryListMaxRows = request.getParameter("queryListMaxRows");
// if queryListMaxRows is set, then we are using advanced query mode
if ( (queryListMaxRows != null ) && ( queryListMaxRows.length() > 0) )
{
int maxRows = Integer.valueOf(queryListMaxRows).intValue();
for ( int i=1; i <= maxRows; i++ )
{
String qlFieldInfo = request.getParameter("queryListField" + i);
if ( ( qlFieldInfo != null ) && ( qlFieldInfo.length() > 0 ) )
{
StringTokenizer tokSemi = new StringTokenizer(qlFieldInfo,";");
String qlFieldName = "";
String qlAttributeId = "";
String qlDisplayObjectId = "";
String qlDisplayTypeId = "";
if (tokSemi.countTokens() == 4) {
qlFieldName = tokSemi.nextToken();
qlAttributeId = tokSemi.nextToken();
qlDisplayTypeId = tokSemi.nextToken();
qlDisplayObjectId = tokSemi.nextToken();
}
else
{
qlFieldName = qlFieldInfo;
}
String qlOperator = request.getParameter("queryListOperator" + i);
String qlValue = request.getParameter("queryListValue" + i);
if ( qlOperator.equals("like"))
qlValue = "%" + qlValue.replace('*','%') + "%";
else if ( qlOperator.equals("startsWith"))
{
qlValue = qlValue.replace('*','%') + "%";
qlOperator = "like";
}
else if ( qlOperator.equals("endsWith"))
{
qlValue = "%" + qlValue.replace('*','%');
qlOperator = "like";
}
searchEntityName = UIWebUtility.getEntityFromParamName(qlFieldName);
String hasJoin = (String) joinedEntities.get(searchEntityName);
if ( ( hasJoin == null ) || ( !hasJoin.equals("Y")) )
{
eventProcessor.addOneRelationClause(delegator, "", "",searchEntityName, primaryEntityName, primaryME, false, queryInfo);
joinedEntities.put(searchEntityName, "Y");
}
if ((searchEntityName == null) ||
searchEntityName.equals("")) {
searchEntityName = primaryEntityName;
}
searchAttribName = UIWebUtility.getAttribFromParamName(qlFieldName);
entityOperator = EntityOperator.lookupComparison(qlOperator);
Object searchValue = qlValue;
// If this is a set operator, convert the String param into a comma separated List
if ( (entityOperator.equals(EntityOperator.IN)) || (entityOperator.equals(EntityOperator.NOT_IN)) || (entityOperator.equals(EntityOperator.BETWEEN)))
{
List valueList = new ArrayList();
StringTokenizer tokComma = new StringTokenizer(qlValue, ",");
while (tokComma.hasMoreTokens()) {
String valueItem = tokComma.nextToken();
valueList.add(valueItem);
}
searchValue = valueList;
}
try {
// Figure out the attribute ID for the UiAttribute this parameter corresponds to so we can
// save the query.
String attributeId = UIWebUtility.getAttributeId(delegator,
searchAttribName, searchEntityName);
// Generate an entry in the WHERE clause for this attribute. The entityOperator
// is returned in case appendEntityClause changes it.
// NOTE: changes here must also be applied to UIQuery.appendEntityClauses() to work with saved queries
//
if ( qlDisplayTypeId.equals(UIDisplayObject.DISPLAY_TYPE_SELECT) || qlDisplayTypeId.equals(UIDisplayObject.DISPLAY_TYPE_SEARCH_TEXT))
{
String aliasName = searchEntityName + searchAttribName + "srch";
UIUtility.addSelectSearch( queryInfo, qlDisplayObjectId, searchEntityName, searchAttribName, aliasName, entityOperator, searchValue );
}
else
{
if ( searchValue instanceof String )
{
entityOperator = EventUtility.appendEntityClause(searchEntityName,
searchAttribName, (String) searchValue,
entityOperator, queryInfo);
}
else if ( searchValue instanceof Collection)
{
entityOperator = EventUtility.appendEntityClause(searchEntityName,
searchAttribName, (Collection) searchValue,
entityOperator, queryInfo);
}
else
throw new IllegalArgumentException("Query Param must be String or Collection");
}
// Store the attribute ID and value in the query save map.
// querySaveMap.put(attributeId, searchAttribValue);
uiQuery.addUiQueryValue(attributeId, entityOperator, qlValue, qlDisplayTypeId, qlDisplayObjectId, delegator);
} catch (GenericEntityException e) {
//this parameter was not associated with a column in a table, so skip it
Debug.logVerbose("skipping parameter which is not an entity attribute: " + qlFieldName, module);
}
}
}
}
else
{
params = request.getParameterNames();
while (params.hasMoreElements()) {
String paramName = (String) params.nextElement();
// boolean useSentQueryParameter =
// !action.equals(uiWebScreenSection.ACTION_QUERY_UPDATE &&
// !action.equals(uiWebScreenSection.ACTION_QUERY &&
// uiWebScreenSection.getUseQueryParameterMap().containsValue(paramName);
Debug.logVerbose("paramName: " + paramName, module);
Debug.logVerbose("action: " + action, module);
Debug.logVerbose(
"uiWebScreenSection.getUseQueryParameterMap().containsValue(paramName): " +
String.valueOf(uiWebScreenSection.getUseQueryParameterMap()
.containsValue(paramName)), module);
if (UIWebUtility.checkReservedParameterName(paramName)) {
// ( action.equals(uiWebScreenSection.ACTION_QUERY_UPDATE) || action.equals(uiWebScreenSection.ACTION_QUERY))
// ) {
// This is a value being passed in from the prior screen in query mode. Use it to search.
if (paramName.equals("nameToSearch")) {
// Alpha search using alphabet buttons.
HashMap alphaSearchValues = EventUtility.getAlphaSearchValues(delegator,
uiWebScreenSection,
request.getParameter("nameToSearch"));
searchEntityName = (String) alphaSearchValues.get(
"searchEntityName");
searchAttribName = (String) alphaSearchValues.get(
"searchAttribName");
searchAttribValue = (String) alphaSearchValues.get(
"searchAttribValue");
entityOperator = null;
} else {
// Regular search attribute in query mode.
searchEntityName = UIWebUtility.getEntityFromParamName(paramName);
if ((searchEntityName == null) ||
searchEntityName.equals("")) {
searchEntityName = primaryEntityName;
}
searchAttribName = UIWebUtility.getAttribFromParamName(paramName);
String[] searchAttribValueArray = request.getParameterValues(paramName);
Debug.logVerbose(
"Number of values for query attribute " +
paramName + ": " +
String.valueOf(
searchAttribValueArray.length), module);
searchAttribValue = getRequestParameterValue(paramName,
searchAttribValueArray);
// Determine the entity search operator to use. If multiple, use IN
if ((null != searchAttribValue) &&
(searchAttribValueArray.length > 1)) {
entityOperator = EntityOperator.IN;
} else {
entityOperator = null;
}
Debug.logVerbose("searchEntityName: " + searchEntityName, module);
Debug.logVerbose("searchAttribName: " + searchAttribName, module);
Debug.logVerbose("searchAttribValue: " + searchAttribValue, module);
}
if ((searchAttribValue != null) &&
!searchAttribValue.equals("")) {
try {
// Figure out the attribute ID for the UiAttribute this parameter corresponds to so we can
// save the query.
String attributeId = UIWebUtility.getAttributeId(delegator,
searchAttribName, searchEntityName);
// Generate an entry in the WHERE clause for this attribute. The entityOperator
// is returned in case appendEntityClause changes it.
entityOperator = EventUtility.appendEntityClause(searchEntityName,
searchAttribName, searchAttribValue,
entityOperator, queryInfo);
// Store the attribute ID and value in the query save map.
// querySaveMap.put(attributeId, searchAttribValue);
uiQuery.addUiQueryValue(attributeId, entityOperator, searchAttribValue, "", "", delegator);
} catch (GenericEntityException e) {
//this parameter was not associated with a column in a table, so skip it
Debug.logVerbose("skipping parameter which is not an entity attribute: " + paramName, module);
}
}
}
}
}
// add extra clauses from the hidden query parameters in case this is a detail screen
addUseQueryParameterClauses(uiWebScreenSection, queryInfo,
relatedSearchClauses, primaryEntityName, request);
}
// Save the Query
if (!queryName.equals("")) {
// User entered a name for the query. Save it with the given name.
// Change the party ID to the current user's party ID, and the section ID to the current section ID
// in case either of these was -1 (wildcard).
uiQuery.setSectionId(uiWebScreenSection.getSectionId());
uiQuery.setPartyId(userInfo.getPartyId());
uiQuery.setQueryName(queryName);
queryId = uiQuery.save(delegator);
// queryId = UIQuery.saveUiQuery(delegator, userInfo.getPartyId(), sectionId, queryName, querySaveMap);
Debug.logVerbose("queryId after saving query \"" + queryName + "\": " + queryId, module);
if (TIMER) {
timer.timerString(1,
"[GenericWebEventProcessor.processRetrieve] Saved query");
}
}
if ( listName.length() > 0)
{
// save the UiList info
List uiListGVL = delegator.findByAnd("UiList", UtilMisc.toMap("listName", listName, "partyId", userInfo.getAccountId()), null);
GenericValue uiListGV = null;
if ( uiListGVL.size() > 0)
{
uiListGV = (GenericValue) uiListGVL.get(0);
delegator.removeByAnd("UiListItem", UtilMisc.toMap("listId", uiListGV.getString("listId")));
}
else
{
uiListGV = new GenericValue(delegator.getModelEntity("UiList"));
String listId = GenericReplicator.getNextSeqId("UiList", delegator);
uiListGV.set("listId", listId);
}
String listId = uiListGV.getString("listId");
uiListGV.setDelegator(delegator);
uiListGV.set("listName", listName);
uiListGV.set("partyId", userInfo.getAccountId());
uiListGV.set("queryId", queryId);
uiListGV.set("sectionId", sectionId);
uiListGV.set("listType", primaryEntityName);
delegator.createOrStore(uiListGV);
queryInfo.setSaveResultListId(listId);
}
// Save the query as the last query. First make a new UIQuery using the same values as the original query.
// Change the party ID to the current user's party ID, and the section ID to the current section ID
// in case either of these was -1 (wildcard).
// UIQuery.saveUiQuery(delegator, userInfo.getPartyId(), sectionId, UIQuery.LAST_QUERY_NAME, querySaveMap);
UIQuery uiQueryLast = new UIQuery("",
uiWebScreenSection.getSectionId(), userInfo.getPartyId(),
UIQuery.LAST_QUERY_NAME, uiQuery.getUiQueryValueList());
String lastQueryId = uiQueryLast.save(delegator);
// if the query was not saved, set the queryId to be returned to lastQueryId so that the query parameters
// can be used when displaying the page (Primarily to set the params on the next and previous buttons for multi-page datasets
if ( queryId == null || queryId.equals(""))
queryId = lastQueryId;