code: public static List getDNF(Criteria crit)
      {
          List dnf = new ArrayList();
          Enumeration e = crit.getElements();
          Criteria tmpCrit;
  
          while (e.hasMoreElements())
          {
              Object o = e.nextElement();
              if (o instanceof Criteria)
              {
                  Criteria pc = (Criteria) o;
                  switch (pc.getType())
                  {
                      case (Criteria.OR):
                          {
                              dnf.addAll(getDNF(pc));
                              break;
                          }
                      case (Criteria.AND):
                          {
                              dnf = getDnfAndDnf(dnf, getDNF(pc));
                              break;
                          }
                  }
              }
              else
              {
                  SelectionCriteria c = (SelectionCriteria) o;
                  tmpCrit = new Criteria();
                  tmpCrit.getCriteria().add(c);
                  if (dnf.isEmpty())
                  {
                      dnf.add(tmpCrit);
                  }
                  else
                  {
  //#ifdef JDK13
  					dnf = getDnfAndDnf(dnf, Collections.singletonList(tmpCrit));
  //#else
  /*
  					Vector singletonList = new Vector(1);
  					singletonList.add(tmpCrit);
  					dnf = getDnfAndDnf(dnf,singletonList); 
  */
  
  //#endif                	
                  	
                      
                  }
              }
          } // while
  
          return dnf;
      }
docs: Disjunctive Normal Form: list of Criteria, which don't contain ORs,
  the elements of the list joined by ORs give the condition equivalent
  to the original Criteria.