cancel
Showing results for 
Search instead for 
Did you mean: 

TableFilter: NullPointerException at empty search result

Former Member
0 Kudos

Hi,

I implemented a table filter as per description in: https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/5439. [original link is broken] [original link is broken] [original link is broken]

If my search has results everything works fine, but when my search should deliver an empty table, I get the following error:

java.lang.NullPointerException

at at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.LinkToActionAdapter.getSelection(LinkToActionAdapter.java:1225)

at at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:424)

at at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at at com.sap.tc.ur.renderer.ie6.SapTableCellRenderer.renderSapTableGenericCellFragment(SapTableCellRenderer.java:1212)

at at com.sap.tc.ur.renderer.ie6.SapTableCellRenderer.renderSapTableCellFragment(SapTableCellRenderer.java:209)

Any ideas?

Best regards

Roman

Accepted Solutions (0)

Answers (7)

Answers (7)

Former Member
0 Kudos

Hey

we've got a very similar problem. also with LinkToAction and Filter.

I solved the problem (my issue).

The attribute "visibleRowCount" of the UI table element was set on a context variable.

I changed "visibleRowCount" to a fix value (-> 10) and the exception doesn't appear anymore!

Maybe it will help you.

Cu

-Klaudio

Former Member
0 Kudos

This is indeed a strange error. The LinkToActionAdapter class is an internal class that adapts the interface expected by the HTML renderer to the Web Dynpro UI element implementation. The method where the NPE occurs only checks if there is a menu attached at the link and delegates to separate objects accordingly. A NPE at this point means the LinkToAction itself is NULL which normally cannot be the case.

Maybe you can debug a little bit more with this information.

Armin

Former Member
0 Kudos

Still the same exception...

java.lang.NullPointerException

at com.sap.tc.webdynpro.clientserver.uielib.standard.uradapter.LinkToActionAdapter.getSelection(LinkToActionAdapter.java:1225)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:424)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.SapTableCellRenderer.renderSapTableGenericCellFragment(SapTableCellRenderer.java:1212)

at com.sap.tc.ur.renderer.ie6.SapTableCellRenderer.renderSapTableCellFragment(SapTableCellRenderer.java:209)

at com.sap.tc.ur.renderer.ie6.SapTableCellRenderer.render(SapTableCellRenderer.java:84)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.SapTableRowRenderer.renderSapTableRowFragment(SapTableRowRenderer.java:126)

at com.sap.tc.ur.renderer.ie6.SapTableRowRenderer.render(SapTableRowRenderer.java:54)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.SapTableDefaultBodyRenderer.renderSapTableDefaultBodyFragment(SapTableDefaultBodyRenderer.java:214)

at com.sap.tc.ur.renderer.ie6.SapTableDefaultBodyRenderer.render(SapTableDefaultBodyRenderer.java:44)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.SapTableRenderer.renderSapTableFragment(SapTableRenderer.java:795)

at com.sap.tc.ur.renderer.ie6.SapTableRenderer.render(SapTableRenderer.java:84)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutItemFragment(FlowLayoutRenderer.java:288)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutFragment(FlowLayoutRenderer.java:244)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.render(FlowLayoutRenderer.java:49)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.renderScrollContainerFragment(ScrollContainerRenderer.java:619)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.render(ScrollContainerRenderer.java:74)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutItemFragment(FlowLayoutRenderer.java:288)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutFragment(FlowLayoutRenderer.java:244)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.render(FlowLayoutRenderer.java:49)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.GroupRenderer.renderGroupFragment(GroupRenderer.java:1184)

at com.sap.tc.ur.renderer.ie6.GroupRenderer.render(GroupRenderer.java:74)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutItemFragment(FlowLayoutRenderer.java:288)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.renderFlowLayoutFragment(FlowLayoutRenderer.java:244)

at com.sap.tc.ur.renderer.ie6.FlowLayoutRenderer.render(FlowLayoutRenderer.java:49)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.renderScrollContainerFragment(ScrollContainerRenderer.java:619)

at com.sap.tc.ur.renderer.ie6.ScrollContainerRenderer.render(ScrollContainerRenderer.java:74)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.UiWindowRenderer.render(UiWindowRenderer.java:52)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:434)

at com.sap.tc.webdynpro.clientimpl.html.renderer.uielements.base.RenderManager.render(RenderManager.java:133)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.sendHtml(HtmlClient.java:1056)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.fillDynamicTemplateContext(HtmlClient.java:456)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.sendResponse(HtmlClient.java:1240)

at com.sap.tc.webdynpro.clientimpl.html.client.HtmlClient.retrieveData(HtmlClient.java:252)

at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.doRetrieveData(WindowPhaseModel.java:595)

at com.sap.tc.webdynpro.clientserver.window.WindowPhaseModel.processRequest(WindowPhaseModel.java:156)

at com.sap.tc.webdynpro.clientserver.window.WebDynproWindow.processRequest(WebDynproWindow.java:335)

at com.sap.tc.webdynpro.clientserver.cal.AbstractClient.executeTasks(AbstractClient.java:143)

at com.sap.tc.webdynpro.clientserver.session.ApplicationSession.doProcessing(ApplicationSession.java:319)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doApplicationProcessingStandalone(ClientSession.java:713)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doApplicationProcessing(ClientSession.java:666)

at com.sap.tc.webdynpro.clientserver.session.ClientSession.doProcessing(ClientSession.java:250)

at com.sap.tc.webdynpro.clientserver.session.RequestManager.doProcessing(RequestManager.java:149)

at com.sap.tc.webdynpro.serverimpl.defaultimpl.DispatcherServlet.doContent(DispatcherServlet.java:62)

at com.sap.tc.webdynpro.serverimpl.defaultimpl.DispatcherServlet.doPost(DispatcherServlet.java:53)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:401)

at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:266)

at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:386)

at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:364)

at com.sap.engine.services.httpserver.server.RequestAnalizer.invokeWebContainer(RequestAnalizer.java:1039)

at com.sap.engine.services.httpserver.server.RequestAnalizer.handle(RequestAnalizer.java:265)

at com.sap.engine.services.httpserver.server.Client.handle(Client.java:95)

at com.sap.engine.services.httpserver.server.Processor.request(Processor.java:175)

at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33)

at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41)

at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)

at java.security.AccessController.doPrivileged(AccessController.java:207)

at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:102)

at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:172)

former_member201361
Active Contributor
0 Kudos

hi,

please check whether u have binded the Table property correctly. and while creating action we should have used the default event handler. (or u delete the action and again create the action and bind it ot the OnFilter of the Table)

thanks and regards

fazal.

Former Member
0 Kudos

I already use Hashtable, so that didn´t solve my problem.

Thanks anyway, any other solutions?

Edited by: Roman Götte on Apr 15, 2008 8:50 AM

former_member201361
Active Contributor
0 Kudos

hi,

it should display an empty table when there is no match .

i think the problem might be in the table filter class

use this code for table filter

package **********;

import java.io.FileWriter;

import java.io.IOException;

import java.math.BigDecimal;

import java.sql.Date;

import java.text.Collator;

import java.text.NumberFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Comparator;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Hashtable;

import java.util.Iterator;

import java.util.StringTokenizer;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDAbstractDropDownByIndex;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDAbstractDropDownByKey;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDAbstractInputField;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDAbstractTableColumn;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDCaption;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDCheckBox;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDLink;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDProgressIndicator;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDRadioButton;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTable;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTableCellEditor;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTableColumn;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTableColumnGroup;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTextEdit;

import com.sap.tc.webdynpro.clientserver.uielib.standard.api.IWDTextView;

import com.sap.tc.webdynpro.progmodel.api.IWDAction;

import com.sap.tc.webdynpro.progmodel.api.IWDAttributeInfo;

import com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent;

import com.sap.tc.webdynpro.progmodel.api.IWDNode;

import com.sap.tc.webdynpro.progmodel.api.IWDNodeElement;

import com.sap.tc.webdynpro.progmodel.api.IWDViewElement;

import com.sap.tc.webdynpro.progmodel.api.WDCopyService;

import com.sap.tc.webdynpro.services.sal.localization.api.WDResourceHandler;

/**

  • Helper class that makes a Web Dynpro table filterable.

*/

public final class TableFilter {

public TableFilter(IWDTable table, IWDAction filterAction, IWDNode sourceNode, Hashtable

hashicons) {

init(table, filterAction, sourceNode, hashicons);

}

private void init(IWDTable table, IWDAction filterAction, IWDNode sourceNode, Hashtable

hashicons) {

this.table = table;

// sanity checks

if (sourceNode == null)

throw new IllegalArgumentException("SourceNode must be given");

if (filterAction == null)

throw new IllegalArgumentException("Filter action must be given");

if (table == null)

throw new IllegalArgumentException("Table must be given");

if (table.bindingOfDataSource() == null)

throw new IllegalArgumentException("Data source of table with id '" + table.getId() +

"' must be bound");

this.sourceNode = sourceNode;

if (hashicons != null) {

this.hashIcon = new Hashtable();

this.hashIcon = hashicons;

}

String dataSourcePrefix = table.bindingOfDataSource() + ".";

//works on columns

setFiltersForColumns(dataSourcePrefix, table.iterateColumns(), sourceNode);

setFiltersForColumns(dataSourcePrefix, table.iterateGroupedColumns(), sourceNode);

//set up the table properties

table.setOnFilter(filterAction);

filterAction.setEnabled(true); //filterAction.setText("TESTTTTTT");

//logString("filtertext"+filterAction.getText());

this.sourceNode = sourceNode;

}

/**

  • Try to make the given columns filtertable

*/

private void setFiltersForColumns(String dataSourcePrefix, Iterator columnIterator, IWDNode

sourceNode) {

attributeSource = new Hashtable();

for (Iterator iter = sourceNode.getNodeInfo().iterateAttributes(); iter.hasNext();) {

IWDAttributeInfo attribInfo = (IWDAttributeInfo) iter.next();

String attribName = attribInfo.getName();

attributeSource.put(attribName, attribInfo.getSimpleType().getBuiltInType());

}

int index = 0;

for (Iterator it = columnIterator; it.hasNext(); ++index) { // for every column: try to make itbindable

IWDAbstractTableColumn abstractColumn = (IWDAbstractTableColumn) it.next();

if (abstractColumn instanceof IWDTableColumn) {

IWDTableColumn column = (IWDTableColumn) abstractColumn;

String columnId = column.getId();

Comparator comparator = null;

NodeElementByAttributeComparator elementComparator = null;

String bindingOfPrimaryProperty =

bindingOfPrimaryProperty(column.getTableCellEditor());

String attributeName = null;

if (bindingOfPrimaryProperty == null ||

!bindingOfPrimaryProperty.startsWith(dataSourcePrefix)) {

if (hashIcon == null) {

continue;

} else {

if (!hashIcon.containsKey(columnId)) {

continue;

} else {

attributeName = hashIcon.get(columnId).toString();

}

}

} else {

attributeName =

bindingOfPrimaryProperty.substring(dataSourcePrefix.length());

if (hashIcon.containsKey(columnId))

attributeName = hashIcon.get(columnId).toString();

}

String attributeInfo = null;

if (attributeSource.containsKey(attributeName))

attributeInfo = (String) attributeSource.get(attributeName);

elementComparator = new

NodeElementByAttributeComparator(attributeInfo, column, comparator);

filterForColumn.put(attributeName, elementComparator);

} else if (abstractColumn instanceof IWDTableColumnGroup) {

//if it is column group -> try to bind the columns of the column group

IWDTableColumnGroup columnGroup = (IWDTableColumnGroup)

abstractColumn;

setFiltersForColumns(dataSourcePrefix, columnGroup.iterateColumns(),

sourceNode);

}

}

}

/*filter data

*

*

*/

public void filter( IWDNode allDataNode, IWDNode targetNode) {

if (allDataNode != null) {

this.sourceNode = allDataNode;

}

HashMap FilterValuesByAttribute = prepareFilterValuesByAttribute();

ArrayList ar = new ArrayList();

for (int i = 0; i < sourceNode.size(); i++) {

IWDNodeElement el = sourceNode.getElementAt(i);

boolean addelement = true;

for (Enumeration e = this.attributeSource.keys(); e.hasMoreElements();) {

String attributeName = e.nextElement().toString();

Object o1 = el.getAttributeValue(attributeName);

if (FilterValuesByAttribute.containsKey(attributeName) &&

filterForColumn.containsKey(attributeName)) {

NodeElementByAttributeComparator elementComparator =

(NodeElementByAttributeComparator) filterForColumn.get(attributeName);

HashMap valuehash = new HashMap();

valuehash = (HashMap) FilterValuesByAttribute.get(attributeName);

String attributetype = elementComparator.attributeInfo;

Comparator comparator = elementComparator.comparator;

if (valuehash.size()==0){

elementComparator.column.setIsFiltered(false);

} else {

elementComparator.column.setIsFiltered(true);

}

addelement = this.evaluateFilteredAttributeValue(valuehash,

attributetype, comparator, o1);

if (!addelement)

break;

}

if (!addelement)

break;

}

if (!addelement)

continue;

IWDNodeElement targetElement = targetNode.createElement(); ///***~182

WDCopyService.copyCorresponding(el, targetElement);

ar.add(targetElement);

}

targetNode.bind(ar);

}

/* delete all data node if the table node had some elements deleted

*

*/

public void deleteAllDataNodeElement(

IWDNode sourceNode,

IWDNode targetNode,

String attributeRowId,

ArrayList idsToDelete) {

for (int j = sourceNode.size() - 1; j >= 0; --j) {

IWDNodeElement els = sourceNode.getElementAt(j);

String elsid = els.getAttributeAsText(attributeRowId);

if (!idsToDelete.contains(elsid))

continue;

sourceNode.removeElement(els);

}

for (int i = targetNode.size() - 1; i >= 0; --i) {

IWDNodeElement elt = targetNode.getElementAt(i);

String eltid = elt.getAttributeAsText(attributeRowId);

if (!idsToDelete.contains(eltid))

continue;

targetNode.removeElement(elt);

}

}

/*Update all data node if the table node has been updated

  • if a row has been added in the table node,

  • the all data node can also be updated by using the using the flag addRowOnFly

*/

public void updateAllDataNodeElement(

IWDNode sourceNode,

IWDNode targetNode,

String attributeRowId,

boolean addRowOnFly) {

HashMap hashs = new HashMap();

HashMap hasht = new HashMap();

HashMap hashup = new HashMap();

IWDNodeElement elt;

IWDNodeElement els;

for (int j = sourceNode.size() - 1; j >= 0; --j) {

els = sourceNode.getElementAt(j);

String elsid = els.getAttributeAsText(attributeRowId);

hashs.put(elsid, els);

}

for (int i = 0; i < targetNode.size(); i++) {

elt = targetNode.getElementAt(i);

String rowid = elt.getAttributeAsText(attributeRowId);

boolean isInSource = hashs.containsKey(rowid);

if (isInSource && !elt.isChangedByClient())

continue;

if (!isInSource) {

els = sourceNode.createElement();

WDCopyService.copyCorresponding(elt, els);

//logString("isInSource");

sourceNode.addElement(els);

} else {

els = (IWDNodeElement) hashs.get(rowid);

WDCopyService.copyCorresponding(elt, els);

}

}

}

/*find if an cloumn has a valid filter

  • and if so parse the filter and put in a hash table

*

*/

private HashMap prepareFilterValuesByAttribute() {

HashMap hashmap = new HashMap();

for (Enumeration e = this.attributeSource.keys(); e.hasMoreElements();) {

String attributeName = e.nextElement().toString();

if (filterForColumn.containsKey(attributeName)) {

NodeElementByAttributeComparator elementComparator =

(NodeElementByAttributeComparator) filterForColumn.get(attributeName);

IWDTableColumn column = elementComparator.column;

column.setIsFiltered(false);

String filtervalue = column.getFilterValue();

if (filtervalue == null || filtervalue.trim().length() == 0) {

continue;

}

String attributetype = elementComparator.attributeInfo;

HashMap valuehash = new HashMap();

valuehash = this.detectFilterSign(filtervalue);

hashmap.put(attributeName, valuehash);

}

}

return hashmap;

}

/* generate a filter value into the right object

*

*/

private Object generateObject(String filtervalue, String attributetype, String sign) {

Object o2 = filtervalue;

try {

if (filtervalue == null) {

return o2;

}

if (attributetype.equalsIgnoreCase("decimal")) {

o2 = new BigDecimal(filtervalue);

}

if (attributetype.equalsIgnoreCase("double")) {

o2 = new Double((filtervalue));

}

if (attributetype.equalsIgnoreCase("long")) {

o2 = new Long(filtervalue);

}

if (attributetype.equalsIgnoreCase("float")) {

o2 = new Float(filtervalue);

}

if (attributetype.equalsIgnoreCase("short")) {

o2 = new Short(filtervalue);

}

if (attributetype.equalsIgnoreCase("integer")) {

o2 = new Integer(filtervalue); //***254 for 2000 ~

}

if (attributetype.equalsIgnoreCase("long")) {

o2 = new Long(filtervalue);

}

if (attributetype.equalsIgnoreCase("date")) {

try {

java.util.Date dtTmp = new java.util.Date(filtervalue);

SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd");

o2 = Date.valueOf(template.format(dtTmp));

} catch (Exception ex) {

o2 = filtervalue;

}

}

if (attributetype.equalsIgnoreCase("time")) {

try {

SimpleDateFormat timeformater = new SimpleDateFormat("hh:mm:ss",

WDResourceHandler.getCurrentSessionLocale());

o2 = timeformater.parse(filtervalue);

} catch (ParseException ex) {

o2 = filtervalue;

}

}

if (attributetype.equalsIgnoreCase("boolean")) {

if (sign.equalsIgnoreCase(NE)) {

o2 = new Boolean(true);

} else {

o2 = new Boolean(true);

}

}

return o2;

}catch (Exception ex){

return filtervalue;

}

}

/*compare object according the filter

*

*/

private boolean evaluateFilteredAttributeValue(HashMap filter, String attributetype, Comparator

comparator, Object o1) {

boolean accept = true;

try{

if (filter == null || filter.size() == 0) //***268

return accept;

if (attributetype == null || attributetype.trim().length() == 0)

return accept;

Object o2 = filter.get("value1");

if (filter.get("sign") == null) {

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, null);

}

int compared = comparator.compare(o1, o2);

if (!attributetype.equalsIgnoreCase("string")) {

if (compared == 0) {

return accept;

} else {

return (!accept);

}

} else {

if (compared >= 0) {

return accept;

} else {

return (!accept);

}

}

}

String sign = filter.get("sign").toString();

String place = filter.get("place").toString();

if (sign.equalsIgnoreCase(EQ) && place.equalsIgnoreCase("S")) {

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, sign);

} else {

if (attributetype.equalsIgnoreCase("boolean")) {

o2 = generateObject("", attributetype, sign);

}

if (attributetype.equalsIgnoreCase("string") && o1 != null &&

o1.toString().trim().length() == 0) {

o2 = generateObject("", attributetype, sign);

}

}

int compared = comparator.compare(o1, o2);

if (!attributetype.equalsIgnoreCase("string")) {

if (compared == 0) {

return accept;

} else {

return (!accept);

}

} else {

if (compared >= 0) {

return accept;

} else {

return (!accept);

}

}

}

if (sign.equalsIgnoreCase(NE) && place.equalsIgnoreCase("S")) {

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, sign);

} else {

if (attributetype.equalsIgnoreCase("boolean")) {

o2 = generateObject("", attributetype, sign);

}

if (attributetype.equalsIgnoreCase("string") && o1 != null &&

o1.toString().trim().length() == 0) {

o2 = generateObject("", attributetype, sign);

}

}

int compared = comparator.compare(o1, o2);

if (!attributetype.equalsIgnoreCase("string")) {

if (compared == 0) {

return !accept;

} else {

return (accept);

}

} else {

if (compared >= 0) {

return !accept;

} else {

return (accept);

}

}

}

if (sign.equalsIgnoreCase(R) && place.equalsIgnoreCase("S")) {

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, sign);

}

int compared = comparator.compare(o1, o2);

if (compared > 0) {

return !accept;

} else {

return (accept);

}

}

if (sign.equalsIgnoreCase(R) && place.equalsIgnoreCase("E")) {

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, sign);

}

int compared = comparator.compare(o1, o2);

if (compared >= 0) {

return accept;

} else {

return (!accept);

}

}

Object o3 = filter.get("value2").toString();

if (sign.equalsIgnoreCase(R) && place.equalsIgnoreCase("M")) {

boolean accept1 = true;

boolean accept2 = true;

if (o2 != null) {

String value1 = filter.get("value1").toString();

o2 = generateObject(value1, attributetype, sign);

}

if (o3 != null) {

String value1 = filter.get("value2").toString();

o3 = generateObject(value1, attributetype, sign);

}

int compared = comparator.compare(o1, o2);

if (compared >= 0) {

accept1 = accept;

} else {

accept1 = !accept;

}

int compared2 = comparator.compare(o1, o3);

if (compared2 > 0) {

accept2 = !accept;

} else {

accept2 = accept;

}

if (accept1 && accept2) {

return accept;

} else {

return !accept;

}

}

return accept;

} catch (Exception ex ){

return accept;

}

}

/* parse the filter

*

*/

private HashMap detectFilterSign(String value) {

HashMap ar = new HashMap();

String val1 = null;

String val2 = null;

String sign = null;

String place = null;

if (null == value) {

ar.put("value1", value);

ar.put("sign", null);

return ar;

}

if (!value.startsWith(EQ) & !value.startsWith(NE) & value.indexOf(R) < 0) {

ar.put("value1", value.trim());

ar.put("sign", null);

return ar;

}

if (value.startsWith(EQ)) {

if (value.trim().length() > 1) {

val1 = value.substring(1);

} else {

val1 = "";

val1 = null;

}

sign = EQ;

place = "S";

ar.put("value1", val1);

ar.put("sign", EQ);

ar.put("place", place);

//this.logString("detect3 sign: value1:"+val1);

return ar;

}

if (value.startsWith(NE)) {

if (value.trim().length() > 1) {

val1 = value.substring(1);

} else {

val1 = "";

val1 = null;

}

sign = NE;

place = "S";

ar.put("value1", val1);

ar.put("sign", NE);

ar.put("place", place);

return ar;

}

if (value.startsWith(R)) {

if (value.trim().length() > 1) {

val1 = value.substring(1);

} else {

val1 = "";

val1 = null;

}

sign = R;

place = "S";

ar.put("value1", val1);

ar.put("sign", R);

ar.put("place", place);

return ar;

}

if (value.endsWith(R)) {

if (value.trim().length() > 1) {

val1 = value.substring(0, value.length() - 1);

} else {

val1 = "";

val1 = null;

}

sign = R;

place = "E";

ar.put("value1", val1);

ar.put("sign", R);

ar.put("place", place);

return ar;

}

if (value.indexOf(R) > 0) {

sign = R;

place = "M";

val1 = value.substring(0, value.indexOf(R));

val2 = value.substring(value.indexOf(R) + 1);

ar.put("value1", val1);

ar.put("value2", val2);

ar.put("sign", R);

ar.put("place", place);

return ar;

}

if (ar.size() == 0)

ar.put("value1", value);

return ar;

}

/**

  • Returns the binding of the given table cell editor's property that is

  • considered "primary" or <code>null</code> if no such binding exists or no

  • such property can be determined.

*/

private static final String bindingOfPrimaryProperty(IWDTableCellEditor editor) {

return editor instanceof IWDViewElement ? bindingOfPrimaryProperty((IWDViewElement)

editor) : null;

}

/**

  • Returns the binding of the given view element's property that is

  • considered "primary" or <code>null</code> if no such binding exists or no

WDJ - A Generic Java Class for Filtering Web Dynpro Tables

SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com

© 2007 SAP AG 33

  • such property can be determined.

*/

private static final String bindingOfPrimaryProperty(IWDViewElement element) {

if (element instanceof IWDAbstractDropDownByIndex)

return ((IWDAbstractDropDownByIndex) element).bindingOfTexts();

if (element instanceof IWDAbstractDropDownByKey)

return ((IWDAbstractDropDownByKey) element).bindingOfSelectedKey();

if (element instanceof IWDAbstractInputField)

return ((IWDAbstractInputField) element).bindingOfValue();

if (element instanceof IWDCaption)

return ((IWDCaption) element).bindingOfText();

if (element instanceof IWDCheckBox)

return ((IWDCheckBox) element).bindingOfChecked();

if (element instanceof IWDLink)

return ((IWDLink) element).bindingOfText();

if (element instanceof IWDProgressIndicator)

return ((IWDProgressIndicator) element).bindingOfPercentValue();

if (element instanceof IWDRadioButton)

return ((IWDRadioButton) element).bindingOfSelectedKey();

if (element instanceof IWDTextEdit)

return ((IWDTextEdit) element).bindingOfValue();

if (element instanceof IWDTextView)

return ((IWDTextView) element).bindingOfText();

return null;

}

/**

  • Instance of a comparator according to the ordering imposed by the

  • implementation of <code>Comparable</code>.

*/

private static final Comparator DEFAULT = new Comparator() {

/**

  • Compares the given objects according to the ordering imposed by the first

  • ones <code>compareTo(Object)</code> function. Furthermore, <code>null</code>

  • is treated to be less than any object.

*

  • @see java.lang.Comparable#compareTo(java.lang.Object)

  • @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)

*/

public int compare(Object o1, Object o2) {

if (o1 == null && o2 == null) {

return 0;

}

if (o1 == null) {

return -1;

}

if (o2 == null) {

return -1;

}

if (o1 instanceof Boolean && o2 instanceof Boolean) {

return o1.toString().compareTo(o2.toString());

}

if (o1 instanceof Date && o2 instanceof Date) {

return ((java.util.Date) o1).compareTo((java.util.Date) o2);

}

if (o1 instanceof String && o2 instanceof String) {

Collator collate =

Collator.getInstance(WDResourceHandler.getCurrentSessionLocale());

return

o1.toString().toUpperCase(WDResourceHandler.getCurrentSessionLocale()).indexOf(

o2.toString().toUpperCase(WDResourceHandler.getCurrentSessionLocale()));

}

return ((Comparable) o1).compareTo((Comparable) o2);

}

};

private Hashtable filterForColumn = new Hashtable();

private IWDTable table = null;

private Hashtable attributeSource = null;

private Hashtable sourceNodeHash = null;

private Hashtable hashIcon = null;

private IWDNode sourceNode = null;

private IWDNode targetNode = null;

String EQ = "=";

String NE = "#";

String R = "~";

/**

  • Generic comparator that compares node elements by a given attribute with

  • the help of a given comparator.

*/

public final class NodeElementByAttributeComparator {

public NodeElementByAttributeComparator(String attributeInfo, IWDTableColumn column,

Comparator comparator) {

this(attributeInfo, column, comparator, false, new ArrayList());

}

/**

  • Internal constructor.

*/

private NodeElementByAttributeComparator(

String attributeInfo,

IWDTableColumn column,

Comparator comparator,

boolean compareAsText,

Collection subNodes) {

if (attributeInfo == null)

throw new IllegalArgumentException("attributeInfo must not be null");

if (column == null)

throw new IllegalArgumentException("Column must not be null");

if (comparator == null)

comparator = DEFAULT;

this.attributeInfo = attributeInfo;

this.column = column;

this.comparator = comparator;

this.compareAsText = compareAsText;

this.subNodes = subNodes;

}

private final Comparator comparator;

private final boolean compareAsText;

private boolean sortDirection;

private IWDTableColumn column;

private Collection subNodes;

private String attributeInfo;

}

}

thanks and regards

fazal

Former Member
0 Kudos

Hi,

I use:

wdContext.currentContextElement().setTableFilter( new TableFilter(table, wdThis.wdGetFilterAction(), wdContext.nodeCheckAudTableSource(), new Hashtable()));

(Hashtable vom java.util)

instead of your suggest:

wdContext.currentContextElement().setTableFilter( new TableFilter(table, wdThis.wdGetFilterAction(), wdContext.nodeCheckAudTableSource(), new HashTable()));

Where can I find the class HashTable?

former_member201361
Active Contributor
0 Kudos

hi,

ya we have to use Hashtable for the filter action (java.util.Hashtable)

wdContext.currentContextElement().setTableFilter( new TableFilter(table, wdThis.wdGetFilterAction(), wdContext.nodeCheckAudTableSource(), new Hashtable()));

thanks and regards

fazal

Edited by: fazal ahamed on Apr 15, 2008 8:45 AM

nikhil_bose
Active Contributor
0 Kudos

yeah. you are right.that was my mistake.

I changed that code. please have a look on previous post

nikhiL

nikhil_bose
Active Contributor
0 Kudos

in wdModifyView(), replace the following code


wdThis.wdGetFilterAction(), wdContext.nodeSource(),null)); 

by


wdThis.wdGetFilterAction(), wdContext.nodeSource(),new HashTable())); 

nikhiL

Edited by: Nikhil Bos on Apr 15, 2008 12:09 PM

former_member201361
Active Contributor
0 Kudos

hi ,

in the domodify method replace null with hashtable

if (firstTime ) {

IWDTable table = (IWDTable) view.getElement("Table");

wdContext.currentContextElement().setTableFilter( new TableFilter(table, wdThis.wdGetFilterAction(), wdContext.nodeSource(),new HashTable()));

}

hope ur problem will get resolved

thanks and regards

fazal