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

Christian Bauer christian at hibernate.org
Sun Apr 8 11:10:37 EDT 2007


  User: cbauer  
  Date: 07/04/08 11:10:37

  Modified:    examples/wiki/src/main/org/jboss/seam/wiki/core/dao  
                        NodeDAO.java
  Added:       examples/wiki/src/main/org/jboss/seam/wiki/core/dao  
                        FeedDAO.java
  Log:
  Implemented Atom feeds for site and directories
  
  Revision  Changes    Path
  1.10      +40 -0     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/NodeDAO.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: NodeDAO.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/NodeDAO.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -b -r1.9 -r1.10
  --- NodeDAO.java	4 Apr 2007 10:38:13 -0000	1.9
  +++ NodeDAO.java	8 Apr 2007 15:10:37 -0000	1.10
  @@ -22,6 +22,7 @@
   import javax.persistence.EntityNotFoundException;
   import javax.persistence.NoResultException;
   import java.util.List;
  +import java.util.ArrayList;
   
   /**
    * DAO for nodes, transparently respects security access levels.
  @@ -191,6 +192,45 @@
                               .list();
       }
   
  +    // TODO: Although it seem like a good idea this is broken until I implement ON CASCADE DELETE on the foreign keys
  +    public void removeChildNodes(Directory dir) {
  +        throw new UnsupportedOperationException("Not implemented, see TODO");
  +        /*
  +        entityManager.joinTransaction();
  +
  +        // Find all the parents of this area whose children we should NOT delete 
  +        List<Long> excludeIdentifiers = new ArrayList<Long>();
  +        Directory temp = dir;
  +        while (temp.getParent() != null && temp.getParent().getId() != null) {
  +            excludeIdentifiers.add(temp.getParent().getId());
  +            temp = temp.getParent();
  +        }
  +
  +        // Avoid FK violation if one of the child nodes is the default document of the directory
  +        entityManager.createQuery("update Node n set n.defaultDocument = null where n = :node").setParameter("node", dir).executeUpdate();
  +
  +        System.out.println("################# DELETING FILES");
  +        // Delete all records from the File secondary table
  +        ((Session)entityManager.getDelegate())
  +                .createQuery("delete from File f where f.areaNumber = :area" +
  +                             " and f.parent.id not in (:excludedIdentifiers)")
  +                .setParameter("area", dir.getAreaNumber())
  +                .setParameterList("excludedIdentifiers", excludeIdentifiers)
  +                .executeUpdate();
  +
  +        System.out.println("################# DELETING NODES");
  +
  +        // Delete all records from the Node main table
  +        ((Session)entityManager.getDelegate())
  +                .createQuery("delete from Node n where n.areaNumber = :area" +
  +                             " and n.parent.id not in (:excludedIdentifiers) and not n = :exclude")
  +                .setParameter("area", dir.getAreaNumber())
  +                .setParameter("exclude", dir)
  +                .setParameterList("excludedIdentifiers", excludeIdentifiers)
  +                .executeUpdate();
  +        */
  +    }
  +
       // Multi-row constraint validation
       public boolean isUniqueWikiname(Node node) {
           Node foundNode = findNodeInArea(node.getParent().getAreaNumber(), node.getWikiname(), entityManager);
  
  
  
  1.1      date: 2007/04/08 15:10:37;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/dao/FeedDAO.java
  
  Index: FeedDAO.java
  ===================================================================
  package org.jboss.seam.wiki.core.dao;
  
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.wiki.core.model.*;
  import org.jboss.seam.wiki.core.engine.WikiTextParser;
  import org.jboss.seam.wiki.core.engine.WikiTextRenderer;
  import org.jboss.seam.wiki.core.engine.WikiLink;
  import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
  import org.jboss.seam.wiki.util.WikiUtil;
  import org.jboss.seam.Component;
  
  import javax.persistence.EntityManager;
  import javax.persistence.EntityNotFoundException;
  import javax.persistence.NoResultException;
  import java.util.List;
  import java.util.Set;
  import java.util.HashSet;
  
  /**
   * DAO for feeds.
   *
   * @author Christian Bauer
   *
   */
  @Name("feedDAO")
  @AutoCreate
  @Transactional
  public class FeedDAO {
  
      @In protected EntityManager restrictedEntityManager;
  
      public Feed findFeed(Long feedId) {
          restrictedEntityManager.joinTransaction();
          try {
              return (Feed) restrictedEntityManager
                  .createQuery("select f from Feed f where f.id = :id")
                  .setParameter("id", feedId)
                  .getSingleResult();
          } catch (EntityNotFoundException ex) {
          } catch (NoResultException ex) {}
          return null;
      }
  
      public List<FeedEntry> findFeedEntries(Feed feed) {
          restrictedEntityManager.joinTransaction();
          //noinspection unchecked
          return (List<FeedEntry>)restrictedEntityManager
                  .createQuery("select fe from FeedEntry fe join fe.feeds f where f = :feed")
                  .setParameter("feed", feed)
                  .getResultList();
      }
  
      public void createFeedEntries(Document document) {
          restrictedEntityManager.joinTransaction();
  
          Set<Feed> feeds = new HashSet<Feed>();
          Directory temp = document.getParent();
          while (temp.getParent() != null) {
              if (temp.getFeed() != null) feeds.add(temp.getFeed());
              temp = temp.getParent();
          }
          feeds.add(temp.getFeed()); // Reached wiki root, feed for whole site
  
          FeedEntry feedEntry = new FeedEntry();
          feedEntry.setDocument(document);
          feedEntry.setLink(renderFeedURL(document));
          feedEntry.setTitle(document.getName());
          feedEntry.setAuthor(document.getCreatedBy().getFullname());
          feedEntry.setDescriptionType("text/html");
          feedEntry.setDescriptionValue(renderWikiText(document.getContent()));
          feedEntry.getFeeds().addAll(feeds);
  
          restrictedEntityManager.persist(feedEntry);
      }
  
      public void updateFeedEntries(Document document) {
          restrictedEntityManager.joinTransaction();
  
          int updatedEntries = restrictedEntityManager
              .createQuery("update FeedEntry fe set" +
                           " fe.updatedDate = :date," +
                           " fe.title = :title," +
                           " fe.author = :author, " +
                           " fe.descriptionValue = :description" +
                           " where fe.document = :document")
              .setParameter("date", document.getLastModifiedOn())
              .setParameter("title", document.getName())
              .setParameter("author", document.getLastModifiedBy().getFullname())
              .setParameter("description", renderWikiText(document.getContent()))
              .setParameter("document", document)
              .executeUpdate();
  
          if (updatedEntries == 0) createFeedEntries(document);
      }
  
      public void removeFeedEntries(Document document) {
          restrictedEntityManager.joinTransaction();
  
          try {
              FeedEntry entry = (FeedEntry) restrictedEntityManager
                  .createQuery("select fe from FeedEntry fe where fe.document = :document")
                  .setParameter("document", document)
                  .getSingleResult();
  
              restrictedEntityManager.remove(entry);
          } catch (EntityNotFoundException ex) {
          } catch (NoResultException ex) {}
      }
  
      private String renderFeedURL(Node node) {
          WikiPreferences wikiPrefs = (WikiPreferences) Component.getInstance("wikiPreferences");
          return wikiPrefs.getBaseUrl() + WikiUtil.renderURL(node);
      }
  
      private String renderWikiText(String wikiText) {
          // Use the WikiTextParser to resolve macros
          WikiTextParser parser = new WikiTextParser(wikiText, false);
  
          // Set a customized renderer for parser macro callbacks
          parser.setRenderer(
              new WikiTextRenderer() {
  
                  public String renderInlineLink(WikiLink inlineLink) {
                      return !inlineLink.isBroken() ?
                              "<a href=\""
                              + renderFeedURL(inlineLink.getNode())
                              + "\">"
                              + inlineLink.getDescription()
                              + "</a>" : "[Broken Link]";
                  }
  
                  public String renderExternalLink(WikiLink externalLink) {
                      return "<a href=\""
                              + externalLink.getUrl()
                              + "\">"
                              + externalLink.getDescription()
                              + "</a>";
                  }
  
                  public String renderFileAttachmentLink(int attachmentNumber, WikiLink attachmentLink) {
                      return "[Attachment]";
                  }
  
                  public String renderThumbnailImageInlineLink(WikiLink inlineLink) {
                      return "[Embedded Image]";
                  }
  
                  public String renderMacro(String macroName) {
                      return "[Embedded Plugin]";
                  }
  
                  public void setAttachmentLinks(List<WikiLink> attachmentLinks) {}
                  public void setExternalLinks(List<WikiLink> externalLinks) {}
              }
          );
  
          // Run the parser
          parser.parse(true);
          return parser.toString();
      }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list