[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