[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao ...

Christian Bauer christian at hibernate.org
Mon Jan 14 20:00:01 EST 2008


  User: cbauer  
  Date: 08/01/14 20:00:01

  Modified:    examples/wiki/src/main/org/jboss/seam/wiki/core/dao  
                        WikiNodeDAO.java TagDAO.java
  Log:
  Make ORDER BY in queries more typesafe
  
  Revision  Changes    Path
  1.8       +26 -16    jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/WikiNodeDAO.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: WikiNodeDAO.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/WikiNodeDAO.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -b -r1.7 -r1.8
  --- WikiNodeDAO.java	14 Jan 2008 05:10:47 -0000	1.7
  +++ WikiNodeDAO.java	15 Jan 2008 01:00:01 -0000	1.8
  @@ -105,17 +105,15 @@
           return null;
       }
   
  -    public List<WikiNode> findChildren(WikiNode node, String orderByProperty, boolean orderAscending, int firstResult, int maxResults) {
  -        // Sanitize input
  -        orderByProperty = orderByProperty.replaceAll("[^a-zA-Z0-9]", "");
  +    public List<WikiNode> findChildren(WikiNode node, WikiNode.SortableProperty orderBy, boolean orderAscending, int firstResult, int maxResults) {
   
           StringBuilder queryString = new StringBuilder();
           queryString.append("select n from WikiNode n where n.parent = :parent").append(" ");
  -        queryString.append("order by n.").append(orderByProperty).append(" ").append(orderAscending ? "asc" : "desc");
  +        queryString.append("order by n.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
   
           return restrictedEntityManager
                   .createQuery(queryString.toString())
  -                .setHint("org.hibernate.comment", "Find wikinode children order by "+orderByProperty)
  +                .setHint("org.hibernate.comment", "Find wikinode children order by "+orderBy.name())
                   .setParameter("parent", node)
                   .setHint("org.hibernate.cacheable", true)
                   .setFirstResult(firstResult)
  @@ -311,8 +309,12 @@
           return null;
       }
   
  -    public List<WikiDocument> findWikiDocuments(WikiDirectory directory) {
  -        return restrictedEntityManager.createQuery("select d from WikiDocument d where d.parent = :dir order by d.createdOn asc")
  +    public List<WikiDocument> findWikiDocuments(WikiDirectory directory, WikiNode.SortableProperty orderBy, boolean orderAscending) {
  +
  +        StringBuilder query = new StringBuilder();
  +        query.append("select d from WikiDocument d where d.parent = :dir");
  +        query.append(" order by d.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
  +        return restrictedEntityManager.createQuery(query.toString())
                   .setParameter("dir", directory)
                   .setHint("org.hibernate.comment", "Find documents of directory")
                   .setHint("org.hibernate.cacheable", true)
  @@ -338,23 +340,27 @@
           return null;
       }
       
  -    public List<WikiDocument> findWikiDocumentsOrderByLastModified(int maxResults) {
  -        //noinspection unchecked
  +    public List<WikiDocument> findWikiDocuments(int maxResults, WikiNode.SortableProperty orderBy, boolean orderAscending) {
  +
  +        StringBuilder query = new StringBuilder();
  +        query.append("select d from WikiDocument d where d.lastModifiedOn is not null");
  +        query.append(" order by d.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
  +
  +
           return (List<WikiDocument>)restrictedEntityManager
  -                .createQuery("select d from WikiDocument d where d.lastModifiedOn is not null order by d.lastModifiedOn desc")
  -                .setHint("org.hibernate.comment", "Find documents order by lastModified")
  +                .createQuery(query.toString())
  +                .setHint("org.hibernate.comment", "Find documents order by " + orderBy.name())
                   .setHint("org.hibernate.cacheable", true)
                   .setMaxResults(maxResults)
                   .getResultList();
       }
   
  -    public WikiDocument findSiblingWikiDocumentInDirectory(WikiDocument currentDocument, String byProperty, boolean previousOrNext) {
  -        byProperty = byProperty.replaceAll("[^\\p{Alnum}]+", ""); // Avoid SQL injection hole!
  +    public WikiDocument findSiblingWikiDocumentInDirectory(WikiDocument currentDocument, WikiNode.SortableProperty byProperty, boolean previousOrNext) {
           try {
               return (WikiDocument)restrictedEntityManager
                       .createQuery("select sibling from WikiDocument sibling, WikiDocument current" +
                                    " where sibling.parent = current.parent and current = :current and not sibling = :current" +
  -                                 " and sibling."+ byProperty + " " + (previousOrNext ? "<=" : ">=") + "current."+byProperty +
  +                                 " and sibling."+ byProperty.name() + " " + (previousOrNext ? "<=" : ">=") + "current."+ byProperty.name() +
                                    " order by sibling." +byProperty + " " + (previousOrNext ? "desc" : "asc") )
                       .setHint("org.hibernate.cacheable", true)
                       .setMaxResults(1)
  @@ -380,8 +386,12 @@
           return null;
       }
   
  -    public List<WikiUpload> findWikiUploads(WikiDirectory directory) {
  -        return restrictedEntityManager.createQuery("select u from WikiUpload u where u.parent = :dir order by u.createdOn asc")
  +    public List<WikiUpload> findWikiUploads(WikiDirectory directory, WikiNode.SortableProperty orderBy, boolean orderAscending) {
  +        StringBuilder query = new StringBuilder();
  +        query.append("select u from WikiUpload u where u.parent = :dir");
  +        query.append(" order by u.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
  +
  +        return restrictedEntityManager.createQuery(query.toString())
                   .setParameter("dir", directory)
                   .setHint("org.hibernate.comment", "Find uploads of directory")
                   .setHint("org.hibernate.cacheable", true)
  
  
  
  1.4       +4 -2      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/TagDAO.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: TagDAO.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/TagDAO.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- TagDAO.java	19 Dec 2007 04:29:26 -0000	1.3
  +++ TagDAO.java	15 Jan 2008 01:00:01 -0000	1.4
  @@ -11,6 +11,7 @@
   import org.jboss.seam.wiki.core.model.DisplayTagCount;
   import org.jboss.seam.wiki.core.model.WikiDirectory;
   import org.jboss.seam.wiki.core.model.WikiFile;
  +import org.jboss.seam.wiki.core.model.WikiNode;
   import org.jboss.seam.wiki.core.nestedset.query.NestedSetQueryBuilder;
   
   import javax.persistence.EntityManager;
  @@ -54,7 +55,8 @@
           return nestedSetQuery.list();
       }
   
  -    public List<WikiFile> findWikFiles(WikiDirectory startDir, WikiFile ignoreFile, final String tag) {
  +    public List<WikiFile> findWikFiles(WikiDirectory startDir, WikiFile ignoreFile, final String tag,
  +                                       WikiNode.SortableProperty orderBy, boolean orderAscending) {
   
           if (tag == null || tag.length() == 0) return Collections.emptyList();
   
  @@ -64,7 +66,7 @@
           queryString.append("(").append(getNestedDirectoryQuery(startDir)).append(")").append(" ");
           if (ignoreFile != null && ignoreFile.getId() != null) queryString.append("and not f = :ignoreFile").append(" ");
           queryString.append("and t = :tag").append(" ");
  -        queryString.append("order by f.createdOn desc");
  +        queryString.append("order by f.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc");
   
           Query nestedSetQuery = getSession().createQuery(queryString.toString());
           nestedSetQuery.setParameter("nsThread", startDir.getNodeInfo().getNsThread());
  
  
  



More information about the jboss-cvs-commits mailing list