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

Christian Bauer christian at hibernate.org
Wed Jan 9 10:59:24 EST 2008


  User: cbauer  
  Date: 08/01/09 10:59:24

  Modified:    examples/wiki/src/main/org/jboss/seam/wiki/core/action              
                        UserHome.java NodeHome.java Authenticator.java
                        WikiIdentity.java DirectoryHome.java Clipboard.java
                        UploadHome.java DocumentHome.java CommentHome.java
  Added:       examples/wiki/src/main/org/jboss/seam/wiki/core/action              
                        NodeRemover.java UploadNodeRemover.java
                        DocumentNodeRemover.java CommentNodeRemover.java
                        DirectoryNodeRemover.java
  Log:
  JBSEAM-2397 and JBSEAM-1883 - implemented trashcan feature and more reliable update of 2nd level cache and lucene index
  
  Revision  Changes    Path
  1.21      +6 -0      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: UserHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -b -r1.20 -r1.21
  --- UserHome.java	4 Jan 2008 00:26:54 -0000	1.20
  +++ UserHome.java	9 Jan 2008 15:59:24 -0000	1.21
  @@ -29,6 +29,7 @@
   import org.jboss.seam.wiki.core.upload.Uploader;
   import org.jboss.seam.wiki.preferences.PreferenceVisibility;
   import org.jboss.seam.wiki.preferences.Preferences;
  +import org.jboss.seam.wiki.preferences.PreferenceProvider;
   import org.jboss.seam.wiki.preferences.metamodel.PreferenceEntity;
   import org.jboss.seam.wiki.util.Hash;
   import org.jboss.seam.wiki.util.WikiUtil;
  @@ -261,6 +262,11 @@
           // All nodes created by this user are reset to be created by the admin user
           userDAO.resetNodeCreatorToAdmin(getInstance());
   
  +        // Remove preferences for this user
  +        PreferenceProvider prefProvider = (PreferenceProvider)Component.getInstance("preferenceProvider");
  +        prefProvider.deleteUserPreferenceValues(getInstance());
  +        prefProvider.flush();
  +
           return super.remove();
       }
   
  
  
  
  1.32      +42 -14    jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: NodeHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -b -r1.31 -r1.32
  --- NodeHome.java	20 Dec 2007 12:23:04 -0000	1.31
  +++ NodeHome.java	9 Jan 2008 15:59:24 -0000	1.32
  @@ -6,6 +6,7 @@
    */
   package org.jboss.seam.wiki.core.action;
   
  +import org.jboss.seam.Component;
   import org.jboss.seam.annotations.In;
   import org.jboss.seam.annotations.security.Restrict;
   import org.jboss.seam.contexts.Contexts;
  @@ -20,6 +21,7 @@
   import org.jboss.seam.wiki.util.WikiUtil;
   
   import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
  +import static javax.faces.application.FacesMessage.SEVERITY_INFO;
   import java.util.Date;
   import java.util.List;
   
  @@ -206,6 +208,7 @@
   
           if (!beforePersist()) return null;
   
  +        getLog().debug("persisting node: " + getInstance());
           String outcome = super.persist();
           if (outcome != null) {
               Events.instance().raiseEvent("PreferenceEditor.flushAll");
  @@ -230,6 +233,7 @@
   
           if (!beforeUpdate()) return null;
   
  +        getLog().debug("updating node: " + getInstance());
           String outcome = super.update();
           if (outcome != null) {
               Events.instance().raiseEvent("PreferenceEditor.flushAll");
  @@ -238,16 +242,22 @@
           return outcome;
       }
   
  +    public boolean isRemovable() {
  +        if (!isManaged()) return false;
  +        if (getNodeRemover() != null) {
  +            return getNodeRemover().isRemovable(getInstance());
  +        }
  +        return true;
  +    }
   
  -    // TODO: Doesn't handle recursive deletion (only db cascading), so 2nd level cache and lucene index out of sync!
       @Override
       public String remove() {
  -        checkRemovePermissions();
  -
  -        if (!prepareRemove()) return null;
  +        if (!isRemovable()) return null;
   
  -        if (!beforeRemove()) return null;
  +        checkRemovePermissions();
   
  +        getLog().debug("removing node: " + getInstance());
  +        getNodeRemover().removeWikiNode(getInstance());
           String outcome = super.remove();
           if (outcome != null) {
               Events.instance().raiseEvent("Nodes.menuStructureModified");
  @@ -255,6 +265,20 @@
           return outcome;
       }
   
  +    public String trash() {
  +        if (!isRemovable()) return null;
  +
  +        checkRemovePermissions();
  +
  +        getLog().debug("trashing node : " + getInstance());
  +        getNodeRemover().trashWikiNode(getInstance());
  +        setLastModifiedMetadata();
  +        getEntityManager().flush();
  +        trashedMessage();
  +
  +        return "removed";
  +    }
  +
       /* -------------------------- Internal (Subclass) Methods ------------------------------ */
   
       public abstract Class<N> getEntityClass();
  @@ -322,6 +346,15 @@
               throw new AuthorizationException("You don't have permission for this operation");
       }
   
  +    protected void trashedMessage() {
  +        getFacesMessages().addFromResourceBundleOrDefault(
  +                SEVERITY_INFO,
  +                "lacewiki.msg.Node.Trashed",
  +                "'{0}' has been moved into the trash.",
  +                getInstance().getName()
  +        );
  +    }
  +
       /* -------------------------- Optional Subclass Callbacks ------------------------------ */
   
       protected boolean isPageRootController() { return true; }
  @@ -351,16 +384,11 @@
       protected boolean beforeUpdate() { return true; }
   
       /**
  -     * Called before the superclass does its preparation;
  -     * @return boolean continue processing
  -     */
  -    protected boolean prepareRemove() { return true; }
  -
  -    /**
  -     * Called after superclass did its preparation right before the actual remove()
  -     * @return boolean continue processing
  +     * Called when a node is removed, obtains remover for execution of dependency deletion
  +     * before the node is finally removed.
  +     * @return NodeRemover instance
        */
  -    protected boolean beforeRemove() { return true; }
  +    protected abstract NodeRemover getNodeRemover();
   
       /* -------------------------- Public Features ------------------------------ */
   
  
  
  
  1.16      +6 -8      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Authenticator.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Authenticator.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Authenticator.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -b -r1.15 -r1.16
  --- Authenticator.java	4 Jan 2008 22:28:53 -0000	1.15
  +++ Authenticator.java	9 Jan 2008 15:59:24 -0000	1.16
  @@ -185,20 +185,18 @@
       /**
        * Assigns the Guest user to 'currentUser' when 'currentUser' is first referenced. If a
        * user actually logs in, the 'currentUser' is reset.
  -     * @return User Guest user
        */
  -    @Factory(value = "currentUser", scope = ScopeType.SESSION, autoCreate = true)
  -    public User getGuestUser() {
  -        return (User) Component.getInstance("guestUser");
  +    @Factory(value = "currentUser", autoCreate = true)
  +    public void setGuestUser() {
  +        Contexts.getSessionContext().set("currentUser", Component.getInstance("guestUser"));
       }
   
       /**
        * Assigns the context variable 'currentAccessLevel' when no user is logged in.
  -     * @return Integer Guest access level.
        */
  -    @Factory(value = "currentAccessLevel", scope = ScopeType.SESSION, autoCreate = true)
  -    public Integer getGuestAccessLevel() {
  -        return Role.GUESTROLE_ACCESSLEVEL;
  +    @Factory(value = "currentAccessLevel", autoCreate = true)
  +    public void setGuestAccessLevel() {
  +        Contexts.getSessionContext().set("currentAccessLevel", Role.GUESTROLE_ACCESSLEVEL);
       }
   
   }
  
  
  
  1.14      +23 -4     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/WikiIdentity.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: WikiIdentity.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/WikiIdentity.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -b -r1.13 -r1.14
  --- WikiIdentity.java	30 Dec 2007 02:33:25 -0000	1.13
  +++ WikiIdentity.java	9 Jan 2008 15:59:24 -0000	1.14
  @@ -17,10 +17,7 @@
   import org.jboss.seam.core.Events;
   import org.jboss.seam.security.AuthorizationException;
   import org.jboss.seam.security.Identity;
  -import org.jboss.seam.wiki.core.model.User;
  -import org.jboss.seam.wiki.core.model.WikiNode;
  -import org.jboss.seam.wiki.core.model.Role;
  -import org.jboss.seam.wiki.core.model.WikiDocument;
  +import org.jboss.seam.wiki.core.model.*;
   
   /**
    * Need this until Drools fixes bugs and becomes usable/debuggable.
  @@ -87,6 +84,12 @@
           } else
           if ("Comment".equals(name) && "delete".equals(action)) {
               return checkCommentDelete((WikiNode)args[0]);
  +        } else
  +        if ("Trash".equals(name) && "empty".equals(action)) {
  +            return checkTrashEmpty((WikiDirectory)args[0]);
  +        } else
  +        if ("Feed".equals(name) && "write".equals(action)) {
  +            return checkFeedWrite((WikiFeed)args[0]);
           }
   
   
  @@ -237,4 +240,20 @@
           return false;
       }
   
  +    /*
  +        Only admins can empty the trash
  +    */
  +    private boolean checkTrashEmpty(WikiDirectory trashArea) {
  +        if (currentAccessLevel == Role.ADMINROLE_ACCESSLEVEL) return true;
  +        return false;
  +    }
  +
  +    /*
  +        Only admins can write to feed or users who have write permission on the associated dir.
  +    */
  +    private boolean checkFeedWrite(WikiFeed feed) {
  +        if (currentAccessLevel == Role.ADMINROLE_ACCESSLEVEL) return true;
  +        return feed.getDirectory().getWriteAccessLevel() <= currentAccessLevel;
  +    }
  +
   }
  
  
  
  1.26      +46 -11    jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DirectoryHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: DirectoryHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DirectoryHome.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -b -r1.25 -r1.26
  --- DirectoryHome.java	30 Dec 2007 02:33:25 -0000	1.25
  +++ DirectoryHome.java	9 Jan 2008 15:59:24 -0000	1.26
  @@ -7,6 +7,7 @@
   package org.jboss.seam.wiki.core.action;
   
   import org.jboss.seam.ScopeType;
  +import org.jboss.seam.Component;
   import org.jboss.seam.contexts.Contexts;
   import org.jboss.seam.international.Messages;
   import org.jboss.seam.annotations.*;
  @@ -143,10 +144,8 @@
           return super.beforeUpdate();
       }
   
  -    @Override
  -    protected boolean prepareRemove() {
  -        // Wiki ROOT is special
  -        return getInstance().getParent() != null;
  +    protected NodeRemover getNodeRemover() {
  +        return (NodeRemover)Component.getInstance(DirectoryNodeRemover.class);
       }
   
       /* -------------------------- Messages ------------------------------ */
  @@ -209,6 +208,8 @@
                               new Long(pager.getNextRecord()).intValue(),
                               new Long(pager.getPageSize()).intValue()
                       );
  +        } else {
  +            childNodes = Collections.emptyList();
           }
       }
   
  @@ -227,17 +228,17 @@
               for (WikiMenuItem persistentMenuItem : persistentMenuItems) {
                   if (menuItems.contains(persistentMenuItem)) {
                       persistentMenuItem.setDisplayPosition(menuItems.indexOf(persistentMenuItem));
  -                    getLog().debug("Updated menu: " + persistentMenuItem);
  +                    getLog().debug("updated menu: " + persistentMenuItem);
                   } else {
                       getEntityManager().remove(persistentMenuItem);
  -                    getLog().debug("Removed menu: " + persistentMenuItem);
  +                    getLog().debug("removed menu: " + persistentMenuItem);
                   }
               }
               for (WikiMenuItem menuItem : menuItems) {
                   if (!persistentMenuItems.contains(menuItem)) {
                       menuItem.setDisplayPosition(menuItems.indexOf(menuItem));
                       getEntityManager().persist(menuItem);
  -                    getLog().debug("Inserted menu: " + menuItem);
  +                    getLog().debug("inserted menu: " + menuItem);
                   }
               }
           }
  @@ -351,7 +352,7 @@
           for (Map.Entry<WikiNode, Boolean> entry : getSelectedNodes().entrySet()) {
               if (entry.getValue()) {
                   getLog().debug("copying to clipboard: " + entry.getKey());
  -                clipboard.add(entry.getKey(), false);
  +                clipboard.add(entry.getKey().getId(), false);
               }
           }
           selectedNodes.clear();
  @@ -362,7 +363,7 @@
           for (Map.Entry<WikiNode, Boolean> entry : getSelectedNodes().entrySet()) {
               if (entry.getValue()) {
                   getLog().debug("cutting to clipboard: " + entry.getKey());
  -                clipboard.add(entry.getKey(), true);
  +                clipboard.add(entry.getKey().getId(), true);
               }
           }
           selectedNodes.clear();
  @@ -378,9 +379,9 @@
           int batchSize = 2;
           int i = 0;
           List<Long> batchIds = new ArrayList<Long>();
  -        for (WikiNode clipboardNode : clipboard.getItems()) {
  +        for (Long clipboardNodeId : clipboard.getItems()) {
               i++;
  -            batchIds.add(clipboardNode.getId());
  +            batchIds.add(clipboardNodeId);
               if (i % batchSize == 0) {
                   List<WikiNode> nodesForPasteBatch = getWikiNodeDAO().findWikiNodes(batchIds);
                   pasteNodes(nodesForPasteBatch);
  @@ -485,4 +486,38 @@
           getLog().debug("completed executing of paste batch");
       }
   
  +    @Restrict("#{s:hasPermission('Trash', 'empty', trashArea)}")
  +    public void emptyTrash() {
  +        WikiDirectory trashArea = (WikiDirectory) Component.getInstance("trashArea");
  +        if (!isManaged() || !trashArea.getId().equals(getInstance().getId())) return;
  +
  +        getLog().debug("emptying trash");
  +        List<WikiNode> children = getWikiNodeDAO().findChildren(getInstance(), "createdOn", false, 0, Integer.MAX_VALUE);
  +
  +        // TODO: This should be batched with a database cursor!
  +        for (WikiNode child : children) {
  +            getLog().debug("trashing item: " + child);
  +
  +            // TODO: Make this polymorphic and connect it somehow to the stuff that happens in DocumentHome/UploadHome
  +            if (child.isInstance(WikiDocument.class)) {
  +                List<WikiComment> comments = getWikiNodeDAO().findWikiCommentsFlat((WikiDocument)child, true);
  +                for (WikiComment comment : comments) {
  +                    getLog().debug("trashing sub-item: " + comment);
  +                    getEntityManager().remove(comment);
  +                }
  +            }
  +            getEntityManager().remove(child);
  +        }
  +        getEntityManager().flush();
  +
  +        getFacesMessages().addFromResourceBundleOrDefault(
  +                SEVERITY_INFO,
  +                "lacewiki.msg.Trash.Emptied",
  +                "All items in the trash have been permanently deleted."
  +        );
  +
  +        selectedNodes.clear();
  +        refreshChildNodes();
  +    }
  +
   }
  
  
  
  1.2       +7 -17     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Clipboard.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Clipboard.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Clipboard.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- Clipboard.java	20 Dec 2007 12:23:04 -0000	1.1
  +++ Clipboard.java	9 Jan 2008 15:59:24 -0000	1.2
  @@ -4,7 +4,6 @@
   import org.jboss.seam.annotations.AutoCreate;
   import org.jboss.seam.annotations.Name;
   import org.jboss.seam.annotations.Scope;
  -import org.jboss.seam.wiki.core.model.WikiNode;
   
   import java.util.*;
   import java.io.Serializable;
  @@ -14,35 +13,26 @@
   @AutoCreate
   public class Clipboard implements Serializable {
   
  -    private Map<WikiNode, Boolean> items = new LinkedHashMap<WikiNode, Boolean>();
  +    private Map<Long, Boolean> items = new LinkedHashMap<Long, Boolean>();
   
  -    public Set<WikiNode> getItems() {
  +    public Set<Long> getItems() {
           return items.keySet();
       }
   
  -    public List<WikiNode> getItemsAsList() {
  -        return new ArrayList<WikiNode>(getItems());
  +    public List<Long> getItemsAsList() {
  +        return new ArrayList<Long>(getItems());
       }
   
       public void clear() {
           items.clear();
       }
   
  -    public void add(WikiNode node, Boolean cut) {
  -        items.put(node, cut);
  +    public void add(Long nodeId, Boolean cut) {
  +        items.put(nodeId, cut);
       }
   
       public boolean isCut(Long nodeId) {
  -        for (WikiNode wikiNode : items.keySet()) {
  -            if (wikiNode.getId().equals(nodeId) && items.get(wikiNode)) return true;
  -        }
  -        return false;
  +        return items.containsKey(nodeId) && items.get(nodeId);
       }
   
  -    public boolean isContainsCutFromDirectory(Long dirId) {
  -        for (WikiNode wikiNode : items.keySet()) {
  -            if (wikiNode.getParent().getId().equals(dirId)) return true;
  -        }
  -        return false;
  -    }
   }
  
  
  
  1.2       +10 -2     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UploadHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: UploadHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UploadHome.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- UploadHome.java	19 Dec 2007 04:29:25 -0000	1.1
  +++ UploadHome.java	9 Jan 2008 15:59:24 -0000	1.2
  @@ -1,6 +1,7 @@
   package org.jboss.seam.wiki.core.action;
   
   import org.jboss.seam.ScopeType;
  +import org.jboss.seam.Component;
   import org.jboss.seam.annotations.In;
   import org.jboss.seam.annotations.Name;
   import org.jboss.seam.annotations.Scope;
  @@ -19,6 +20,8 @@
   @Scope(ScopeType.CONVERSATION)
   public class UploadHome extends NodeHome<WikiUpload, WikiDirectory> {
   
  +    public static final String UPLOAD_NODE_REMOVER = "uploadNodeRemover";
  +
       /* -------------------------- Context Wiring ------------------------------ */
   
       @In(required = false)
  @@ -100,8 +103,13 @@
       }
   
       @Override
  -    protected boolean beforeRemove() {
  -        return uploadEditor.beforeRemove();
  +    public String remove() {
  +        return trash();
  +    }
  +
  +    @Override
  +    protected NodeRemover getNodeRemover() {
  +        return (NodeRemover) Component.getInstance(UploadNodeRemover.class);
       }
   
       /* -------------------------- Internal Methods ------------------------------ */
  
  
  
  1.41      +7 -35     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: DocumentHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -b -r1.40 -r1.41
  --- DocumentHome.java	4 Jan 2008 22:28:53 -0000	1.40
  +++ DocumentHome.java	9 Jan 2008 15:59:24 -0000	1.41
  @@ -19,10 +19,7 @@
   import org.jboss.seam.wiki.core.feeds.FeedEntryManager;
   import org.jboss.seam.wiki.core.engine.WikiLinkResolver;
   import org.jboss.seam.wiki.core.engine.MacroWikiTextRenderer;
  -import org.jboss.seam.wiki.core.model.WikiDirectory;
  -import org.jboss.seam.wiki.core.model.WikiDocument;
  -import org.jboss.seam.wiki.core.model.WikiFile;
  -import org.jboss.seam.wiki.core.model.FeedEntry;
  +import org.jboss.seam.wiki.core.model.*;
   import org.jboss.seam.wiki.preferences.Preferences;
   
   import static javax.faces.application.FacesMessage.SEVERITY_INFO;
  @@ -212,39 +209,14 @@
       }
   
       @Override
  -    protected boolean prepareRemove() {
  -
  -        // Remove feed entry before removing document
  -        feedDAO.removeFeedEntry(
  -            feedDAO.findFeeds(getInstance()),
  -            feedDAO.findFeedEntry(getInstance())
  -        );
  -
  -        return super.prepareRemove();
  -    }
  -
  -    @Override
  -    protected boolean beforeRemove() {
  -
  -        /* TODO:
  -        // Delete preferences of this node
  -        PreferenceProvider provider = (PreferenceProvider) Component.getInstance("preferenceProvider");
  -        provider.deleteInstancePreferences(getInstance());
  -        */
  -
  -
  -        return super.beforeRemove();
  +    public String remove() {
  +        return trash();
       }
   
  -    /* TODO: Implement node moving
       @Override
  -    protected void afterNodeMoved(WikiDirectory oldParent, WikiDirectory newParent) {
  -        // Update view
  -        syncFormContentToInstance(oldParent); // Resolve existing links in old directory
  -        syncInstanceToFormContent(newParent); // Now update the form, effectively re-rendering the links
  -        Contexts.getConversationContext().set("currentDirectory", newParent);
  +    protected NodeRemover getNodeRemover() {
  +        return (DocumentNodeRemover)Component.getInstance(DocumentNodeRemover.class);
       }
  -    */
   
       /* -------------------------- Messages ------------------------------ */
   
  @@ -293,11 +265,11 @@
           if (isPageRootController()) {
               if (doc != null) {
                   getLog().debug("setting current document: " + doc);
  -                Contexts.getPageContext().set("currentDocument", doc);
  +                Contexts.getConversationContext().set("currentDocument", doc);
               }
               if (dir != null) {
                   getLog().debug("setting current directory: " + dir);
  -                Contexts.getPageContext().set("currentDirectory", dir);
  +                Contexts.getConversationContext().set("currentDirectory", dir);
               }
           }
       }
  
  
  
  1.16      +8 -1      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: CommentHome.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -b -r1.15 -r1.16
  --- CommentHome.java	30 Dec 2007 02:33:25 -0000	1.15
  +++ CommentHome.java	9 Jan 2008 15:59:24 -0000	1.16
  @@ -54,6 +54,7 @@
           return false;
       }
   
  +    @Override
       public Class<WikiComment> getEntityClass() {
           return WikiComment.class;
       }
  @@ -97,6 +98,7 @@
           return comment;
       }
   
  +    @Override
       protected void checkPersistPermissions() {
           getLog().trace("checking comment persist permissions");
           if (!Identity.instance().hasPermission("Comment", "create", documentHome.getInstance()) ) {
  @@ -125,7 +127,12 @@
           return null; // Prevent navigation
       }
   
  -    /* -------------------------- Messages ------------------------------ */
  +    @Override
  +    protected NodeRemover getNodeRemover() {
  +        return (CommentNodeRemover)Component.getInstance(CommentNodeRemover.class);
  +    }
  +
  +/* -------------------------- Messages ------------------------------ */
   
       @Override
       protected void createdMessage() {
  
  
  
  1.1      date: 2008/01/09 15:59:24;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeRemover.java
  
  Index: NodeRemover.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.seam.wiki.core.action;
  
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.log.Log;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.wiki.core.dao.UserDAO;
  import org.jboss.seam.wiki.core.dao.WikiNodeDAO;
  import org.jboss.seam.wiki.core.feeds.FeedDAO;
  import org.jboss.seam.wiki.core.model.WikiNode;
  import org.jboss.seam.wiki.core.model.WikiDirectory;
  import org.jboss.seam.wiki.util.WikiUtil;
  
  import javax.persistence.EntityManager;
  import java.util.Date;
  
  /**
   * @author Christian Bauer
   */
  @Scope(ScopeType.CONVERSATION)
  public abstract class NodeRemover<N extends WikiNode> {
  
      @Logger
      Log log;
  
      @In
      protected FeedDAO feedDAO;
  
      @In
      protected WikiNodeDAO wikiNodeDAO;
  
      @In
      protected UserDAO userDAO;
  
      @In
      protected EntityManager restrictedEntityManager;
  
      @In
      protected WikiDirectory trashArea;
  
      public abstract boolean isRemovable(N node);
  
      public void trashWikiNode(N node) {
  
          // Check if the cut item was a default file for its parent
          if (node.getParent().isInstance(WikiDirectory.class)) {
              WikiDirectory parent = (WikiDirectory)node.getParent();
              if ( parent.getDefaultFile() != null && parent.getDefaultFile().getId().equals(node.getId())) {
                  getLog().debug("trashing default file of directory: " + parent);
                  parent.setDefaultFile(null);
              }
          }
  
          // Generate a new (hopefully unique) name
          String newName = node.getName() + "." + new Date().getTime(); // Just append a timestamp
  
          // Add to trash area
          WikiDirectory persistentTrashArea = getEntityManager().find(WikiDirectory.class, trashArea.getId());
          node.setParent(persistentTrashArea);
          node.setAreaNumber(persistentTrashArea.getAreaNumber());
          node.setName(newName);
          node.setWikiname(WikiUtil.convertToWikiName(node.getName()));
  
      }
  
      public abstract void removeWikiNode(N node);
  
      protected Log getLog() {
          return log;
      }
  
      protected FeedDAO getFeedDAO() {
          return feedDAO;
      }
  
      protected WikiNodeDAO getWikiNodeDAO() {
          return wikiNodeDAO;
      }
  
      protected UserDAO getUserDAO() {
          return userDAO;
      }
  
      protected  EntityManager getEntityManager() {
          return restrictedEntityManager;
      }
  }
  
  
  
  1.1      date: 2008/01/09 15:59:24;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UploadNodeRemover.java
  
  Index: UploadNodeRemover.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.seam.wiki.core.action;
  
  import org.jboss.seam.wiki.core.model.*;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.Component;
  
  import java.util.List;
  
  /**
   * @author Christian Bauer
   */
  @Name("uploadNodeRemover")
  public class UploadNodeRemover extends NodeRemover<WikiUpload> {
  
      public boolean isRemovable(WikiUpload upload) {
          return true;
      }
  
      public void removeWikiNode(WikiUpload upload) {
          getLog().debug("removing dependencies of: " + upload);
  
      }
  }
  
  
  1.1      date: 2008/01/09 15:59:24;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentNodeRemover.java
  
  Index: DocumentNodeRemover.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.seam.wiki.core.action;
  
  import org.jboss.seam.wiki.core.model.*;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.Component;
  
  import java.util.List;
  
  /**
   * @author Christian Bauer
   */
  @Name("documentNodeRemover")
  public class DocumentNodeRemover extends NodeRemover<WikiDocument> {
  
      @In
      CommentNodeRemover commentNodeRemover;
  
      public boolean isRemovable(WikiDocument doc) {
          WikiNode wikiStart = (WikiNode)Component.getInstance("wikiStart");
          return !doc.getId().equals(wikiStart.getId());
      }
  
      public void trashWikiNode(WikiDocument doc) {
  
          feedDAO.removeFeedEntry(
              feedDAO.findFeeds(doc),
              feedDAO.findFeedEntry(doc)
          );
  
          List<WikiNode> children = getWikiNodeDAO().findChildren(doc, "createdOn", false, 0, Integer.MAX_VALUE);
          for (WikiNode child : children) {
              if (child.isInstance(WikiComment.class)) {
                  getLog().debug("deleting dependent comment: " + child);
                  commentNodeRemover.trashWikiNode( (WikiComment)child );
              }
          }
  
          super.trashWikiNode(doc);
      }
  
      public void removeWikiNode(WikiDocument doc) {
          getLog().debug("removing dependencies of: " + doc);
  
          List<WikiNode> children = getWikiNodeDAO().findChildren(doc, "createdOn", false, 0, Integer.MAX_VALUE);
          for (WikiNode child : children) {
              if (child.isInstance(WikiComment.class)) {
                  getLog().debug("deleting dependent comment: " + child);
                  commentNodeRemover.removeWikiNode( (WikiComment)child );
              }
          }
  
      }
  }
  
  
  1.1      date: 2008/01/09 15:59:24;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentNodeRemover.java
  
  Index: CommentNodeRemover.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.seam.wiki.core.action;
  
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.wiki.core.model.WikiComment;
  
  import java.util.List;
  
  /**
   * @author Christian Bauer
   */
  @Name("commentNodeRemover")
  @AutoCreate
  public class CommentNodeRemover extends NodeRemover<WikiComment> {
  
      public boolean isRemovable(WikiComment comment) {
          return true;
      }
  
      public void trashWikiNode(WikiComment comment) {
          feedDAO.removeFeedEntry(
              feedDAO.findFeeds(comment),
              feedDAO.findFeedEntry(comment)
          );
      }
  
      public void removeWikiNode(WikiComment comment) {
          getLog().debug("removing dependencies of: " + comment);
  
          List<WikiComment> children = getWikiNodeDAO().findWikiCommentSubtree(comment, true);
          // These are ordered by level, deepest first, so no FK violation if we delete in that order
          // (does it matter? Hibernate should sort it...)
          for (WikiComment child : children) {
              getLog().debug("deleting child comment: " + child);
              feedDAO.removeFeedEntry(
                  feedDAO.findFeeds(child),
                  feedDAO.findFeedEntry(child)
              );
              getEntityManager().remove(child);
          }
  
          feedDAO.removeFeedEntry(
              feedDAO.findFeeds(comment),
              feedDAO.findFeedEntry(comment)
          );
      }
  }
  
  
  1.1      date: 2008/01/09 15:59:24;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DirectoryNodeRemover.java
  
  Index: DirectoryNodeRemover.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.seam.wiki.core.action;
  
  import org.jboss.seam.wiki.core.model.User;
  import org.jboss.seam.wiki.core.model.WikiDirectory;
  import org.jboss.seam.wiki.core.model.WikiMenuItem;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.Component;
  
  import java.util.List;
  
  /**
   * @author Christian Bauer
   */
  @Name("directoryNodeRemover")
  public class DirectoryNodeRemover extends NodeRemover<WikiDirectory> {
  
      public boolean isRemovable(WikiDirectory dir) {
          if (getWikiNodeDAO().findChildrenCount(dir) > 0) {
              getLog().debug("directory is not deletable, has children: " + dir);
              return false;
          }
  
          WikiDirectory trashArea = (WikiDirectory)Component.getInstance("trashArea");
          WikiDirectory memberArea = (WikiDirectory)Component.getInstance("memberArea");
          WikiDirectory helpArea = (WikiDirectory) Component.getInstance("helpArea");
  
          return dir.getParent() != null // Wiki ROOT not deleteable
                  && !dir.getId().equals(trashArea.getId())
                  && !dir.getId().equals(memberArea.getId())
                  && !dir.getId().equals(helpArea.getId());
  
      }
  
      public void trashWikiNode(WikiDirectory node) {
          throw new IllegalStateException("Can't trash WikiDirectory instance");
      }
  
      public void removeWikiNode(WikiDirectory dir) {
          getLog().debug("removing dependencies of: " + dir);
  
          // Feed
          if (dir.getFeed() != null) {
              getLog().debug("removing feed of directory: " + dir);
              getFeedDAO().removeFeed(dir);
          }
  
          // WikiMenuItem
          List<WikiMenuItem> persistentMenuItems = getWikiNodeDAO().findMenuItems(dir);
          for (WikiMenuItem menuItem : persistentMenuItems) {
              getLog().debug("removing menu item of directory: " + menuItem);
              getEntityManager().remove(menuItem);
          }
  
          // User.homeDirectory
          User user = getWikiNodeDAO().findWikiDirectoryMemberHome(dir.getId());
          if (user != null) {
              getLog().debug("setting member home to null: " + user);
              user.setMemberHome(null);
          }
  
      }
  }
  
  
  



More information about the jboss-cvs-commits mailing list