docs: public void parseSearchExpression(String searchExpr) throws WIMException {
          try {
              if (searchExpr == null || searchExpr.trim().length() == 0) {
                  return;
              }
  
              WIMXPathInterpreter parser = new WIMXPathInterpreter(new StringReader(searchExpr));
              node = parser.parse(null);
  
              entityTypes = parser.getEntityTypes();
  
              // remove the namespace from property names and also validate
              // that valid wildcard is specified
              HashMap propNodes = new HashMap();
              if (node != null) {
                  Iterator<PropertyNode> propNodesItr = node.getPropertyNodes(propNodes);
                  // skip if more than one node present. if (uid="a*" or cn="b*") then only one of the node uid=a* or cn=b* will be taken
                  // since urbridge supports only search by prinicpal Name.
                  // we can implement/override  PropertyNode to return ListIterator so that it always uses first node uid=a*
                  while (propNodesItr.hasNext()) {
                      PropertyNode propNode = propNodesItr.next();
                      node = propNode; //PM43353 assign node to first propNode
                      propNode.setName(removeNamespace(propNode.getName()));
                      // validate property
                      boolean foundProperty = false;
                      String propName = propNode.getName();
                      for (Iterator<String> iter = entityTypes.iterator(); iter.hasNext() && (!foundProperty);) {
                          String entityType = iter.next();
                          if (entityType.equalsIgnoreCase(Service.DO_LOGIN_ACCOUNT)) //This is to avoid propertynotsupported for LoginAc if search returns rdn property.
                              entityType = Service.DO_PERSON_ACCOUNT;
  
                          foundProperty = Entity.getPropertyNames(entityType).contains(propName);
                      }
                      if (!foundProperty) {
                          throw new PropertyNotDefinedException(WIMMessageKey.PROPERTY_NOT_DEFINED_FOR_ENTITY, Tr.formatMessage(tc, WIMMessageKey.PROPERTY_NOT_DEFINED_FOR_ENTITY,
                                                                                                                                WIMMessageHelper.generateMsgParms(propName,
                                                                                                                                                                  entityTypes)));
                      }
                      break;
                      //validate end
                  }
              }
          } catch (Exception e) {
              throw new WIMApplicationException(WIMMessageKey.MALFORMED_SEARCH_EXPRESSION, Tr.formatMessage(tc, WIMMessageKey.MALFORMED_SEARCH_EXPRESSION,
                                                                                                            WIMMessageHelper.generateMsgParms(searchExpr)), e);
          } catch (TokenMgrError e) {
              throw new SearchControlException(WIMMessageKey.INVALID_SEARCH_EXPRESSION, Tr.formatMessage(tc, WIMMessageKey.INVALID_SEARCH_EXPRESSION,
                                                                                                         WIMMessageHelper.generateMsgParms(searchExpr)), e);
          }
      }