/*
*
* Copyright (c) 2004 SourceTap - www.sourcetap.com
*
* The contents of this file are subject to the SourceTap Public License
* ("License"); You may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.sourcetap.com/license.htm
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
*/
package com.sourcetap.sfa.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilFormatOut;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.condition.EntityComparisonOperator;
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.condition.EntityConditionList;
import org.ofbiz.entity.condition.EntityExpr;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.entity.model.ModelEntity;
import org.ofbiz.entity.util.EntityListIterator;
import com.sourcetap.sfa.event.EventUtility;
import com.sourcetap.sfa.event.GenericEventProcessor;
import com.sourcetap.sfa.replication.GenericReplicator;
import com.sourcetap.sfa.security.SecurityLinkInfo;
import com.sourcetap.sfa.security.SecurityWrapper;
import com.sourcetap.sfa.util.QueryInfo;
import com.sourcetap.sfa.util.UserInfo;
public class UIReport {
public static final String module = UIReport.class.getName();
protected boolean primaryFieldsLoaded = false;
protected boolean relatedFieldsLoaded = false;
protected List primaryFields = null;
protected List relatedFields = null;
protected String reportId = null;
protected String sectionId = null;
protected String partyId = null;
protected String reportName = null;
protected String publicFlag = null;
protected List reportFields = null;
protected List reportCriteria = null;
protected List reportOrderBy = null;
private List selectFieldLabels = null;
private List selectFieldNames = null;
protected GenericDelegator delegator = null;
protected QueryInfo queryInfo = null;
protected GenericEventProcessor eventProcessor = null;
public UIReport(GenericDelegator delegator_)
{
setDelegator(delegator_);
}
public UIReport(String reportId_, GenericDelegator delegator_)
{
setDelegator(delegator_);
loadReport(reportId_);
}
public void loadReport(String reportId_)
{
try
{
GenericValue reportGV = delegator.findByPrimaryKey("UiReport", UtilMisc.toMap("reportId", reportId_));
if ( reportGV == null )
throw new IllegalArgumentException("Unable to find report with ID " + reportId_ );
setReportId(reportId_);
setSectionId(reportGV.getString("sectionId"));
setPartyId(reportGV.getString("partyId"));
setReportName(reportGV.getString("reportName"));
setPublicFlag(reportGV.getString("publicFlag"));
List reportFieldsGVL = delegator.findByAnd("UiReportField", UtilMisc.toMap("reportId", reportId_), UtilMisc.toList("displayOrder"));
setReportFields(UIReportField.loadFromGVL(reportFieldsGVL));
List reportCriteriaGVL = delegator.findByAnd("UiReportCriteria", UtilMisc.toMap("reportId", reportId_), null);
setReportCriteria(UIReportCriteria.loadFromGVL(reportCriteriaGVL));
List reportOrderByGVL = delegator.findByAnd("UiReportOrderBy", UtilMisc.toMap("reportId", reportId_), UtilMisc.toList("sortOrder"));
setReportOrderBy(UIReportOrderBy.loadFromGVL(reportOrderByGVL));
} catch (GenericEntityException e)
{
Debug.logError("Error getting report: " + e.getMessage(), module);
e.printStackTrace();
}
}
public void saveReport(String partyId, String reportName)
{
setPartyId(partyId);
if ( !reportName.equals(getReportName()))
{
setReportName(reportName);
setReportId(null);
}
saveReport();
}
public void saveReport()
{
try
{
String reportId = getReportId();
if ( reportId == null )
{
reportId = GenericReplicator.getNextSeqId("UiReport", delegator);
setReportId(reportId);
}
else
{
// TODO need to delete old report info
}
List valuesToStore = new ArrayList();
GenericValue reportGV = new GenericValue(delegator.getModelEntity("UiReport"));
reportGV.setDelegator(delegator);
reportGV.set("reportId", reportId);
reportGV.set("sectionId", getSectionId());
reportGV.set("partyId", getPartyId());
reportGV.set("reportName", getReportName());
reportGV.set("publicFlag", getPublicFlag());
valuesToStore.add(reportGV);
Iterator iter = reportFields.iterator();
while ( iter.hasNext())
{
UIReportField rf = (UIReportField) iter.next();
GenericValue gv = new GenericValue(delegator.getModelEntity("UiReportField"));
gv.setDelegator(delegator);
gv.set("reportFieldId", GenericReplicator.getNextSeqId("UiReportField", delegator));
gv.set("reportId", reportId);
gv.set("attributeId", rf.getAttributeId());
gv.set("displayTypeId", rf.getDisplayTypeId());
gv.set("displayObjectId", rf.getDisplayObjectId());
gv.set("groupBy", rf.getGroupBy());
gv.set("displayOrder", new Integer(rf.getDisplayOrder()));
gv.set("sqlFunction", rf.getSqlFunction());
gv.set("displayLabel", rf.getDisplayLabel());
valuesToStore.add(gv);
}
iter = reportCriteria.iterator();
while ( iter.hasNext())
{
UIReportCriteria rc = (UIReportCriteria) iter.next();
GenericValue gv = new GenericValue(delegator.getModelEntity("UiReportCriteria"));
gv.setDelegator(delegator);
gv.set("reportCriteriaId", GenericReplicator.getNextSeqId("UiReportCriteria", delegator));
gv.set("reportId", reportId);
gv.set("attributeId", rc.getAttributeId());
gv.set("displayTypeId", rc.getDisplayTypeId());
gv.set("displayObjectId", rc.getDisplayObjectId());
gv.set("queryOperatorId", rc.getQueryOperatorId());
gv.set("attributeValue", rc.getAttributeValue());
gv.set("displayLabel", rc.getDisplayLabel());
valuesToStore.add(gv);
}
iter = reportOrderBy.iterator();
while ( iter.hasNext())
{
UIReportOrderBy ro = (UIReportOrderBy) iter.next();
GenericValue gv = new GenericValue(delegator.getModelEntity("UiReportOrderBy"));
gv.setDelegator(delegator);
gv.set("reportOrderId", GenericReplicator.getNextSeqId("UiReportOrderBy", delegator));
gv.set("reportId", reportId);
gv.set("attributeId", ro.getAttributeId());
gv.set("sortOrder", new Integer(ro.getSortOrder()));
gv.set("displayLabel", ro.getDisplayLabel());
valuesToStore.add(gv);
}
delegator.storeAll(valuesToStore);
} catch (GenericEntityException e)
{
e.printStackTrace();
Debug.logError("error saving report" + e.getMessage(), module);
}
}
public static boolean deleteReport(String reportId, GenericDelegator delegator)
{
try
{
List valuesToBeRemoved = new ArrayList();
GenericValue gv = new GenericValue(delegator.getModelEntity("UiReportCriteria"));
gv.set("reportId", reportId);
valuesToBeRemoved.add(gv);
gv = new GenericValue(delegator.getModelEntity("UiReportField"));
gv.set("reportId", reportId);
valuesToBeRemoved.add(gv);
gv = new GenericValue(delegator.getModelEntity("UiReportOrderBy"));
gv.set("reportId", reportId);
valuesToBeRemoved.add(gv);
gv = new GenericValue(delegator.getModelEntity("UiReport"));
gv.set("reportId", reportId);
valuesToBeRemoved.add(gv);
delegator.removeAll(valuesToBeRemoved);
} catch (GenericEntityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
Debug.logError("unable to delete report: " + reportId + " error:" + e.getMessage(), module);
return false;
}
return true;
}
public static List getReports(String companyId, String partyId, GenericDelegator delegator)
{
return getReports(null, partyId, delegator);
}
public static List getReports(String sectionId, String companyId, String partyId, GenericDelegator delegator)
{
try
{
Map condition = sectionId == null ? UtilMisc.toMap("partyId", "-1") : UtilMisc.toMap("sectionId", sectionId, "partyId", "-1");
List orderBy = UtilMisc.toList("reportName");
List reportList = delegator.findByAnd("UiReport", condition, orderBy);
if ( !partyId.equals("-1")) {
condition = sectionId == null ? UtilMisc.toMap("partyId", partyId) : UtilMisc.toMap("sectionId", sectionId, "partyId", partyId);
EntityCondition c1 = new EntityConditionList( UtilMisc.toList( new EntityExpr("partyId", EntityOperator.EQUALS, partyId),
new EntityConditionList( UtilMisc.toList( new EntityExpr("partyId", EntityOperator.EQUALS, companyId),
new EntityExpr("publicFlag", EntityOperator.EQUALS, "Y")),
EntityOperator.AND)), EntityOperator.OR);
if ( sectionId != null )
c1 = new EntityConditionList( UtilMisc.toList( c1, new EntityExpr("sectionId", EntityOperator.EQUALS, sectionId)), EntityOperator.AND);
if ( reportList == null)
reportList = delegator.findByCondition("UiReport", c1, null, orderBy);
else
reportList.addAll(delegator.findByCondition("UiReport", c1, null, orderBy));
}
return reportList;
} catch (GenericEntityException e)
{
Debug.logError("Error getting reportList: " + e.getMessage(), module);
e.printStackTrace();
}
return null;
}
public static List getAvailableReportScreens(GenericDelegator delegator)
{
try
{
List availableScreens = delegator.findByAnd("UiScreen", UtilMisc.toMap("allowReporting", "Y"), UtilMisc.toList("screenName"));
return availableScreens;
} catch (GenericEntityException e)
{
Debug.logError("Error getting availabel report section List: " + e.getMessage(), module);
e.printStackTrace();
}
return null;
}
public List loadPrimarySectionFields()
{
try
{
List primaryFields = getDelegator().findByAnd("UiScreenSectionFields",
UtilMisc.toMap("sectionId", getSectionId()),
UtilMisc.toList("displayOrder"));
setPrimaryFields(primaryFields);
return primaryFields;
} catch (GenericEntityException e)
{
Debug.logError("Unable to get Primary Screen Fields:" + e.getMessage(), module);
return null;
}
}
public List loadRelatedSectionQueryFields()
{
try
{
List relatedFields = getDelegator().findByAnd("UiRelatedSectionQueryFields",
UtilMisc.toMap("sectionId", getSectionId(), "useInAdvancedQueries", "Y", "isSearchable", "Y"),
UtilMisc.toList("relatedSectionId", "displayOrder"));
setRelatedFields(relatedFields);
return relatedFields;
} catch (GenericEntityException e)
{
Debug.logError("Unable to get Related Screen Fields:" + e.getMessage(), module);
return null;
}
}
public String getOrderBySelectedOptions()
{
List fieldList = getReportOrderBy();
if ( fieldList == null )
return "";
StringBuffer displayHtml = new StringBuffer(5000);
int fieldListSize = fieldList.size();
for (int fieldNbr = 0; fieldNbr < fieldListSize; fieldNbr++)
{
UIReportOrderBy fieldInfo = (UIReportOrderBy) fieldList.get(fieldNbr);
String htmlName = UIWebUtility.getHtmlName("REPORT", fieldInfo.getEntityName(), fieldInfo.getAttributeName(),0);
String attributeId = fieldInfo.getAttributeId();
String displayLabel = fieldInfo.getDisplayLabel();
String optValue = htmlName + ";" + attributeId + ";" + "NONE" + ";" + "NONE" + ";" + displayLabel;
displayHtml.append("<option value='" + optValue + "'>" + displayLabel + "</option>");
}
return displayHtml.toString();
}
public String getSelectListSelectedOptions()
{
List fieldList = getReportFields();
if ( fieldList == null )
return "";
StringBuffer displayHtml = new StringBuffer(5000);
int fieldListSize = fieldList.size();
for (int fieldNbr = 0; fieldNbr < fieldListSize; fieldNbr++)
{
UIReportField fieldInfo = (UIReportField) fieldList.get(fieldNbr);
String htmlName = UIWebUtility.getHtmlName("REPORT", fieldInfo.getEntityName(), fieldInfo.getAttributeName(),0);
String displayObjectId = fieldInfo.getDisplayObjectId();
String displayTypeId = fieldInfo.getDisplayTypeId();
String attributeId = fieldInfo.getAttributeId();
String displayLabel = fieldInfo.getDisplayLabel();
String optValue = htmlName + ";" + attributeId + ";" + displayTypeId + ";" + displayObjectId + ";" + displayLabel;
displayHtml.append("<option value='" + optValue + "'>" + displayLabel + "</option>");
}
return displayHtml.toString();
}
public String getSelectListAvailableOptions()
{
if (sectionId == null)
throw new IllegalArgumentException("section ID must be set before calling getConditionHtml");
StringBuffer displayHtml = new StringBuffer(5000);
List fieldList = getPrimaryFields();
int fieldListSize = fieldList.size();
StringBuffer fieldNameOptions = new StringBuffer(200);
// fieldNameOptions.append("<option value=''></option>");
for (int fieldNbr = 0; fieldNbr < fieldListSize; fieldNbr++) {
GenericValue fieldInfo = (GenericValue) fieldList.get(fieldNbr);
String isVisible = UtilFormatOut.checkNull(fieldInfo.getString("isVisible"));
if ( isVisible.equals("Y")) {
String htmlName = UIWebUtility.getHtmlName(fieldInfo.getString("sectionName"), fieldInfo.getString("entityName"), fieldInfo.getString("attributeName"),0);
String displayObjectId = fieldInfo.getString("displayObjectId");
String displayTypeId = fieldInfo.getString("displayTypeId");
String attributeId = fieldInfo.getString("attributeId");
String displayLabel = fieldInfo.getString("displayLabel");
String optValue = htmlName + ";" + attributeId + ";" + displayTypeId + ";" + displayObjectId + ";" + displayLabel;
fieldNameOptions.append("<option value='" + optValue + "'>" + displayLabel + "</option>");
}
}
List extendedFields = getRelatedFields();
if ( extendedFields != null )
{
int numFields = extendedFields.size();
for ( int i=0; i < numFields; i++)
{
GenericValue fieldInfo = (GenericValue) extendedFields.get(i);
String entityName = fieldInfo.getString("entityName");
String attributeId = fieldInfo.getString("attributeId");
String attributeName = fieldInfo.getString("attributeName");
String displayObjectId = fieldInfo.getString("displayObjectId");
String displayTypeId = fieldInfo.getString("displayTypeId");
String sectionName = fieldInfo.getString("sectionName");
String sectionDescription = fieldInfo.getString("sectionDescription");
String displayLabel = fieldInfo.getString("displayLabel");
String htmlName = UIWebUtility.getHtmlName( sectionName, entityName, attributeName, 0 );
String optValue = htmlName + ";" + attributeId + ";" + displayTypeId + ";" + displayObjectId + ";" + displayLabel;
displayLabel = sectionDescription + "." + displayLabel;
fieldNameOptions.append("<option value='" + optValue + "'>" + displayLabel + "</option>");
}
}
return fieldNameOptions.toString();
}
public String getConditionHtml()
{
if (sectionId == null)
throw new IllegalArgumentException("section ID must be set before calling getConditionHtml");
StringBuffer displayHtml = new StringBuffer(5000);
List fieldList = getPrimaryFields();
int fieldListSize = fieldList.size();
StringBuffer fieldNameOptions = new StringBuffer(200);
fieldNameOptions.append("<option value=''></option>");
for (int fieldNbr = 0; fieldNbr < fieldListSize; fieldNbr++) {
GenericValue fieldInfo = (GenericValue) fieldList.get(fieldNbr);
String isSearchable = UtilFormatOut.checkNull(fieldInfo.getString("isSearchable"));
if ( isSearchable.equals("Y")) {
String htmlName = UIWebUtility.getHtmlName(fieldInfo.getString("sectionName"), fieldInfo.getString("entityName"), fieldInfo.getString("attributeName"),0);
String displayObjectId = fieldInfo.getString("displayObjectId");
String displayTypeId = fieldInfo.getString("displayTypeId");
String attributeId = fieldInfo.getString("attributeId");
String optValue = htmlName + ";" + attributeId + ";" + displayTypeId + ";" + displayObjectId + ";" + fieldInfo.getString("displayLabel");
fieldNameOptions.append("<option value='" + optValue + "'>" + fieldInfo.getString("displayLabel") + "</option>");
}
}
List extendedFields = getRelatedFields();
if ( extendedFields != null )
{
int numFields = extendedFields.size();
for ( int i=0; i < numFields; i++)
{
GenericValue fieldInfo = (GenericValue) extendedFields.get(i);
String entityName = fieldInfo.getString("entityName");
String attributeId = fieldInfo.getString("attributeId");
String attributeName = fieldInfo.getString("attributeName");
String displayObjectId = fieldInfo.getString("displayObjectId");
String displayTypeId = fieldInfo.getString("displayTypeId");
String sectionName = fieldInfo.getString("sectionName");
String sectionDescription = fieldInfo.getString("sectionDescription");
String displayLabel = fieldInfo.getString("displayLabel");
String htmlName = UIWebUtility.getHtmlName( sectionName, entityName, attributeName, 0 );
String optValue = htmlName + ";" + attributeId + ";" + displayTypeId + ";" + displayObjectId + ";" + displayLabel;
displayLabel = sectionDescription + "." + displayLabel;
fieldNameOptions.append("<option value='" + optValue + "'>" + displayLabel + "</option>");
}
}
StringBuffer conditionOptions = new StringBuffer(100);
conditionOptions.append("<option value='equals'>=</option>");
conditionOptions.append("<option value='like'>CONTAINS</option>");
conditionOptions.append("<option value='startsWith'>STARTS WITH</option>");
conditionOptions.append("<option value='endsWith'>ENDS WITH</option>");
conditionOptions.append("<option value='equals'>=</option>");
conditionOptions.append("<option value='notEqual'>NOT EQUAL</option>");
conditionOptions.append("<option value='lessThan'><</option>");
conditionOptions.append("<option value='greaterThan'>></option>");
conditionOptions.append("<option value='lessThanEqualTo'><=</option>");
conditionOptions.append("<option value='greaterThanEqualTo'>>=</option>");
conditionOptions.append("<option value='in'>IN</option>");
conditionOptions.append("<option value='not-in'>NOT IN</option>");
conditionOptions.append("<option value='between'>BETWEEN</option>");
displayHtml.append("<table id='queryListTable' border=1>\n");
displayHtml.append("<tr><td>Field</td><td>Condition</td><td>Value</td><td>Action</td></tr>\n");
List reportConditions = getReportCriteria();
int numExistingConditions = 0;
if ( reportConditions != null )
{
Iterator rcIter = reportConditions.iterator();
while ( rcIter.hasNext() )
{
UIReportCriteria rc = (UIReportCriteria) rcIter.next();
numExistingConditions++;
int i = numExistingConditions;
String htmlName = UIWebUtility.getHtmlName("REPORT", rc.getEntityName(), rc.getAttributeName(),0);
String optValue = htmlName + ";" + rc.getAttributeId() + ";" + rc.getDisplayTypeId() + ";" + rc.getDisplayObjectId() + ";" + rc.getDisplayLabel();
displayHtml.append("<tr id=queryListRow" + i + "><td><input type=hidden name=queryListField" + i + " value='" + optValue + "'>" + rc.getDisplayLabel() + "</td>\n");
displayHtml.append(" <td><input type=hidden name=queryListOperator" + i + " value='" + rc.getQueryOperatorId() + "'>" + rc.getQueryOperatorId() + "</td>\n");
displayHtml.append(" <td><input type=hidden name=queryListValue" + i + " size=30 value='" + rc.getAttributeValue() + "'>" + rc.getAttributeValue() + "</td>\n");
displayHtml.append(" <td><img src=/sfaimages/remove.gif alt=Del onClick=delConditionRow(" + i + ")>\n");
displayHtml.append(" <img src=/sfaimages/add.gif alt=Add onClick=addConditionRow(" + i + ")></td>\n");
displayHtml.append("</tr>");
}
}
int startRow = numExistingConditions + 1;
int endRow = Math.max(startRow+2, 5);
// default show 4 rows
for ( int i=startRow; i < endRow; i++)
{
displayHtml.append("<tr id=queryListRow" + i + "><td><select name=queryListField" + i + ">" + fieldNameOptions.toString() + "</select></td>\n");
displayHtml.append(" <td><select name=queryListOperator" + i + ">" + conditionOptions.toString() + "</select></td>\n");
displayHtml.append(" <td><input name=queryListValue" + i + " size=30></td>\n");
displayHtml.append(" <td><img src=/sfaimages/remove.gif alt=Del onClick=delConditionRow(" + i + ")>\n");
displayHtml.append(" <img src=/sfaimages/add.gif alt=Add onClick=addConditionRow(" + i + ")></td>\n");
displayHtml.append("</tr>");
}
displayHtml.append("</table>\n");
displayHtml.append("<input type=hidden id=queryListMaxRows name=queryListMaxRows value=4>\n");
displayHtml.append("<script type='text/javascript'>\n");
displayHtml.append("function addConditionRow(i) {\n");
displayHtml.append(" var tab1=document.getElementById('queryListTable')\n");
displayHtml.append(" if ( tab1 ) {\n");
displayHtml.append(" var numRows = tab1.rows.length\n");
displayHtml.append(" var maxRows = 10\n");
displayHtml.append(" if ( numRows > maxRows )\n");
displayHtml.append(" alert(\"Can't have more than 10 conditions\");\n");
displayHtml.append(" else {\n");
displayHtml.append(" var x = tab1.insertRow(numRows)\n");
displayHtml.append(" var maxRows = document.getElementById('queryListMaxRows')\n");
displayHtml.append(" var newRow = maxRows.value - -1\n");
displayHtml.append(" maxRows.value = newRow\n");
displayHtml.append(" x.id = \"queryListRow\" + newRow\n");
displayHtml.append(" var c1=x.insertCell(0)\n");
displayHtml.append(" var c2=x.insertCell(1)\n");
displayHtml.append(" var c3=x.insertCell(2)\n");
displayHtml.append(" var c4=x.insertCell(3)\n");
displayHtml.append(" c1.innerHTML=\"<select name=queryListField\" + newRow + \">" + fieldNameOptions.toString() + "</select>\"\n");
displayHtml.append(" c2.innerHTML=\"<select name=queryListOperator\" + newRow + \">" + conditionOptions.toString() +"</select>\"\n");
displayHtml.append(" c3.innerHTML=\"<input name=queryListValue\" + newRow + \" size=30>\"\n");
displayHtml.append(" c4.innerHTML=\"<img src=/sfaimages/remove.gif alt=Del onClick=delConditionRow(\" + newRow + \")>\" + \" <img src=/sfaimages/add.gif alt=Add onClick=addConditionRow(\" + newRow + \")>\"\n");
displayHtml.append(" }\n");
displayHtml.append(" fixSize()\n");
displayHtml.append(" }\n");
displayHtml.append("}\n");
displayHtml.append("function delConditionRow(i)\n");
displayHtml.append("{\n");
displayHtml.append(" var row1 = document.getElementById('queryListRow' + i)\n");
displayHtml.append(" var tab = document.getElementById('queryListTable')\n");
displayHtml.append(" var rows = tab.rows\n");
displayHtml.append(" if ( rows.length == 2 ) {\n");
displayHtml.append(" event.returnValue = false\n");
displayHtml.append(" return;\n");
displayHtml.append(" }\n");
displayHtml.append(" for ( i=0; i < rows.length; i++ ) {\n");
displayHtml.append(" row = rows[i];\n");
displayHtml.append(" if ( row.id == row1.id) {\n");
displayHtml.append(" tab.deleteRow(i);\n");
displayHtml.append(" break;\n");
displayHtml.append(" }\n");
displayHtml.append(" }\n");
displayHtml.append(" fixSize()\n");
displayHtml.append("}\n");
displayHtml.append("</script>\n");
return displayHtml.toString();
}
public boolean loadQueryInfo(HttpServletRequest request, HttpServletResponse response, UICache uiCache)
{
try
{
List primaryFields = loadPrimarySectionFields();
List relatedQueryFields = loadRelatedSectionQueryFields();
List uiScreenSectionEntityGVL = delegator.findByAnd("UiScreenSectionEntity",
UtilMisc.toMap("sectionId", sectionId), UtilMisc.toList("retrieveOrder"));
UIScreenSectionEntity primaryEntity = new UIScreenSectionEntity((GenericValue) uiScreenSectionEntityGVL.get(0), delegator, uiCache);
GenericValue screenSectionGV = delegator.findByPrimaryKey("UiScreenSection", UtilMisc.toMap("sectionId", sectionId));
String eventProcessorClass = screenSectionGV.getString("eventProcessorClass");
eventProcessor = UIUtility.getEventProcessor(eventProcessorClass);
String primaryEntityName = primaryEntity.getUiEntity().getEntityName();
String searchAttribValue = "";
String searchEntityName = "";
String searchAttribName = "";
EntityComparisonOperator entityOperator = null;
List relatedSearchClauses = new LinkedList();
List selectFields = new ArrayList();
List selectFieldLabels = new ArrayList();
List sortFields = new ArrayList();
List reportFields = new ArrayList();
List reportCriteria = new ArrayList();
List reportOrderBy = new ArrayList();
ModelEntity primaryME = primaryEntity.getUiEntity().getModelEntity();
List primaryPkFieldNames =primaryEntity.getUiEntity().getPrimaryKeyFieldNames();
queryInfo = new QueryInfo(delegator, primaryEntityName);
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 uiScreenSectionEntityI = uiScreenSectionEntityGVL.iterator();
uiScreenSectionEntityI.next(); // Pass up the primary entity.
while (uiScreenSectionEntityI.hasNext()) {
GenericValue entityGV = (GenericValue) uiScreenSectionEntityI.next();
UIScreenSectionEntity uiScreenSectionEntity = new UIScreenSectionEntity(entityGV, delegator, uiCache) ;
String relationTitle = uiScreenSectionEntity.getRelationTitle();
String relatedEntityName = uiScreenSectionEntity.getUiEntity().getEntityName();
String relatedAndFields = uiScreenSectionEntity.getRelationByAndFields();
boolean isOuterJoin = uiScreenSectionEntity.getIsOuterJoined();
eventProcessor.addOneRelationClause(delegator, relationTitle, relatedAndFields,
relatedEntityName, primaryEntityName, primaryME, isOuterJoin,
queryInfo);
joinedEntities.put(relatedEntityName, "Y");
}
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 = "";
String qlDisplayLabel = "";
if (tokSemi.countTokens() == 5) {
qlFieldName = tokSemi.nextToken();
qlAttributeId = tokSemi.nextToken();
qlDisplayTypeId = tokSemi.nextToken();
qlDisplayObjectId = tokSemi.nextToken();
qlDisplayLabel = tokSemi.nextToken();
}
else
{
qlFieldName = qlFieldInfo;
}
String qlOperator = request.getParameter("queryListOperator" + i);
String qlValue = request.getParameter("queryListValue" + i);
reportCriteria.add( new UIReportCriteria(qlAttributeId, qlDisplayTypeId, qlDisplayObjectId, qlOperator,qlValue, qlDisplayLabel) );
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;
}
// Figure out the attribute ID for the UiAttribute this parameter corresponds to so we can
// save the query.
String attributeId = qlAttributeId;
// 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");
}
}
}
}
// get select List fields
String [] selectFieldsParam = request.getParameterValues("selectFields");
if ( selectFieldsParam == null )
return false;
for (int i = 0; i < selectFieldsParam.length; i++)
{
// Do what you need for each string: foo[i]
String selectField = selectFieldsParam[i];
StringTokenizer tokSemi = new StringTokenizer(selectField,";");
String qlFieldName = "";
String qlAttributeId = "";
String qlDisplayObjectId = "";
String qlDisplayTypeId = "";
String qlDisplayLabel = "";
if (tokSemi.countTokens() == 5) {
qlFieldName = tokSemi.nextToken();
qlAttributeId = tokSemi.nextToken();
qlDisplayTypeId = tokSemi.nextToken();
qlDisplayObjectId = tokSemi.nextToken();
qlDisplayLabel = tokSemi.nextToken();
}
else
{
qlFieldName = selectField;
}
reportFields.add(new UIReportField(qlAttributeId, qlDisplayTypeId, qlDisplayObjectId, qlDisplayLabel, String.valueOf(i)));
String entityName = UIWebUtility.getEntityFromParamName(qlFieldName);
String attributeName = UIWebUtility.getAttribFromParamName(qlFieldName);
String aliasName = attributeName;
if ( ! entityName.equals(primaryEntityName))
aliasName = entityName + "_" + attributeName;
String hasJoin = (String) joinedEntities.get(entityName);
if ( ( hasJoin == null ) || ( !hasJoin.equals("Y")) )
{
eventProcessor.addOneRelationClause(delegator, "", "", entityName, primaryEntityName, primaryME, false, queryInfo);
joinedEntities.put(entityName, "Y");
}
queryInfo.checkAttribute(entityName, attributeName, aliasName);
selectFields.add(aliasName);
selectFieldLabels.add(qlDisplayLabel);
}
setSelectFieldNames(selectFields);
setSelectFieldLabels(selectFieldLabels);
queryInfo.setSelectFields(selectFields);
//get orderBy Fields
String [] sortFieldsParam = request.getParameterValues("sortFields");
if ( sortFieldsParam != null )
{
for (int i = 0; i < sortFieldsParam.length; i++)
{
// Do what you need for each string: foo[i]
String sortField = sortFieldsParam[i];
StringTokenizer tokSemi = new StringTokenizer(sortField,";");
String qlFieldName = "";
String qlAttributeId = "";
String qlDisplayObjectId = "";
String qlDisplayTypeId = "";
String qlDisplayLabel = "";
if (tokSemi.countTokens() == 5) {
qlFieldName = tokSemi.nextToken();
qlAttributeId = tokSemi.nextToken();
qlDisplayTypeId = tokSemi.nextToken();
qlDisplayObjectId = tokSemi.nextToken();
qlDisplayLabel = tokSemi.nextToken();
}
else
{
qlFieldName = sortField;
}
reportOrderBy.add(new UIReportOrderBy(qlAttributeId, i, qlDisplayLabel));
String entityName = UIWebUtility.getEntityFromParamName(qlFieldName);
String attributeName = UIWebUtility.getAttribFromParamName(qlFieldName);
String aliasName = attributeName;
if ( ! entityName.equals(primaryEntityName))
aliasName = entityName + "_" + attributeName;
String hasJoin = (String) joinedEntities.get(entityName);
if ( ( hasJoin == null ) || ( !hasJoin.equals("Y")) )
{
eventProcessor.addOneRelationClause(delegator, "", "", entityName, primaryEntityName, primaryME, false, queryInfo);
joinedEntities.put(entityName, "Y");
}
queryInfo.checkAttribute(entityName, attributeName, aliasName);
sortFields.add(aliasName);
}
queryInfo.setOrderBy(sortFields);
}
setReportFields(reportFields);
setReportCriteria(reportCriteria);
setReportOrderBy(reportOrderBy);
} catch (NumberFormatException e)
{
Debug.logError("Error formatting Number: " + e.getMessage(), module);
return false;
} catch (GenericEntityException e)
{
Debug.logError("Error loading QueryInfo: " + e.getMessage(), module);
return false;
}
return true;
}
public List runReport(UserInfo userInfo, int maxRows)
{
EntityListIterator eli = null;
if ( eventProcessor == null)
eventProcessor = new GenericEventProcessor();
if ( queryInfo == null )
throw new RuntimeException("You must call loadQueryInfo prior to runReport");
SecurityLinkInfo securityInfo = eventProcessor.getSecurityLinkInfo(userInfo, delegator);
if (securityInfo == null) {
try {
eli = queryInfo.getQueryIterator();
} catch (GenericEntityException e) {
Debug.logError("An error occurred in the " +
"GenericDelegator.findByCondition method: " +
e.getLocalizedMessage(), module);
}
} else {
try {
eli = SecurityWrapper.findListIteratorByCondition(queryInfo.getPrimaryEntity(),
queryInfo, queryInfo.getOrderBy(), userInfo, securityInfo, delegator);
} catch (GenericEntityException e) {
Debug.logError("An error occurred in the " +
"SecurityWrapper.findByCondition method: " +
e.getLocalizedMessage(), module);
}
}
if ( eli != null )
{
try {
List resultGVL = eli.getPartialList( 1, maxRows);
boolean hasMoreRows = false;
// check next value since we close the cursor anyway.
if ( (resultGVL.size() == maxRows) && (eli.next() != null ))
hasMoreRows = true;
eli.close();
return resultGVL;
} catch (GenericEntityException e) {
Debug.logError("An error occurred in the getPartialList method: " + e.getLocalizedMessage(), module);
}
}
return null;
}
public GenericDelegator getDelegator()
{
return delegator;
}
public void setDelegator(GenericDelegator delegator_)
{
delegator = delegator_;
}
/**
* @return
*/
public String getPartyId()
{
return partyId;
}
/**
* @return
*/
public List getPrimaryFields()
{
if ( !primaryFieldsLoaded )
loadPrimarySectionFields();
return primaryFields;
}
/**
* @return
*/
public List getRelatedFields()
{
if ( !relatedFieldsLoaded )
loadRelatedSectionQueryFields();
return relatedFields;
}
/**
* @return
*/
public String getReportId()
{
return reportId;
}
/**
* @return
*/
public String getReportName()
{
return reportName;
}
/**
* @return
*/
public String getSectionId()
{
return sectionId;
}
/**
* @param string
*/
public void setPartyId(String string)
{
partyId = string;
}
/**
* @param list
*/
public void setPrimaryFields(List list)
{
primaryFields = list;
primaryFieldsLoaded = true;
}
/**
* @param list
*/
public void setRelatedFields(List list)
{
relatedFields = list;
relatedFieldsLoaded = true;
}
/**
* @param string
*/
public void setReportId(String string)
{
reportId = string;
}
/**
* @param string
*/
public void setReportName(String string)
{
reportName = string;
}
/**
* @param string
*/
public void setSectionId(String string)
{
sectionId = string;
}
/**
* @return
*/
public List getReportCriteria()
{
return reportCriteria;
}
/**
* @return
*/
public List getReportFields()
{
return reportFields;
}
/**
* @return
*/
public List getReportOrderBy()
{
return reportOrderBy;
}
/**
* @param list
*/
public void setReportCriteria(List list)
{
reportCriteria = list;
}
/**
* @param list
*/
public void setReportFields(List list)
{
reportFields = list;
}
/**
* @param list
*/
public void setReportOrderBy(List list)
{
reportOrderBy = list;
}
protected List getStringListfromGVL( List gvl, String fieldName)
{
List sList = new ArrayList();
Iterator iter = gvl.iterator();
while (iter.hasNext())
{
GenericValue gv = (GenericValue) iter.next();
sList.add(gv.getString(fieldName));
}
return sList;
}
/**
* @return
*/
public String getPublicFlag()
{
return publicFlag;
}
/**
* @param string
*/
public void setPublicFlag(String string)
{
publicFlag = string;
}
/**
* @return
*/
public List getSelectFieldLabels()
{
return selectFieldLabels;
}
/**
* @return
*/
public List getSelectFieldNames()
{
return selectFieldNames;
}
/**
* @param list
*/
public void setSelectFieldLabels(List list)
{
selectFieldLabels = list;
}
/**
* @param list
*/
public void setSelectFieldNames(List list)
{
selectFieldNames = list;
}
}