[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action ...
Christian Bauer
christian at hibernate.org
Thu Mar 8 12:50:58 EST 2007
User: cbauer
Date: 07/03/08 12:50:58
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/action
DocumentHome.java FileHome.java DirectoryHome.java
Added: examples/wiki/src/main/org/jboss/seam/wiki/core/action
NodePermissions.java NodeHome.java
Log:
Refactored Node editing framework, work on permission system
Revision Changes Path
1.3 +15 -169 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.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- DocumentHome.java 8 Mar 2007 10:44:16 -0000 1.2
+++ DocumentHome.java 8 Mar 2007 17:50:58 -0000 1.3
@@ -1,78 +1,29 @@
package org.jboss.seam.wiki.core.action;
-import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
-
-import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.annotations.*;
import org.jboss.seam.wiki.core.links.WikiLinkResolver;
-import org.jboss.seam.wiki.core.dao.NodeDAO;
-import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.wiki.core.model.*;
-import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.core.Events;
-import org.jboss.seam.core.Conversation;
-import org.jboss.seam.ScopeType;
import org.jboss.seam.Component;
-
-import java.util.List;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.contexts.Contexts;
@Name("documentHome")
-public class DocumentHome extends EntityHome<Document> {
-
- @RequestParameter
- private Long docId;
-
- @RequestParameter
- private Long parentDirId;
-
- // Pages need this for rendering
- @Out(required = true, scope = ScopeType.CONVERSATION, value = "currentDirectory")
- Directory parentDirectory;
-
- @Out(required = true, scope = ScopeType.CONVERSATION, value = "currentDocument")
- Document currentDocument;
+ at Scope(ScopeType.CONVERSATION)
+public class DocumentHome extends NodeHome<Document> {
@In
- private FacesMessages facesMessages;
+ WikiLinkResolver wikiLinkResolver;
- @In
- private NodeBrowser browser;
-
- @In
- private WikiLinkResolver wikiLinkResolver;
-
- @In
- private NodeDAO nodeDAO;
-
- @In
- private UserDAO userDAO;
-
- @In
- private User authenticatedUser;
+ private String formContent;
+ private boolean enabledPreview = false;
@In(required = false)
Node selectedHistoricalNode;
-
private Document historicalCopy;
- private String formContent;
- private boolean enabledPreview = false;
private boolean minorRevision = true;
- private List<org.jboss.seam.wiki.core.model.Role> roles;
- private org.jboss.seam.wiki.core.model.Role writableByRole;
- private org.jboss.seam.wiki.core.model.Role readableByRole;
-
- @Override
- public Object getId() {
-
- if (docId == null) {
- return super.getId();
- } else {
- return docId;
- }
- }
@Override
- @Transactional
public void create() {
super.create();
@@ -80,17 +31,6 @@
GlobalPreferences globalPrefs = (GlobalPreferences) Component.getInstance("globalPrefs");
minorRevision = !globalPrefs.isDefaultNewRevisionForEditedDocument();
- // Load the parent directory
- parentDirectory = nodeDAO.findDirectory(parentDirId);
-
- // Outject current document
- currentDocument = getInstance();
-
- // Load the availale roles and set permission defaults
- roles = userDAO.findRoles();
- writableByRole = userDAO.findRole(getInstance().getWriteAccessLevel());
- readableByRole = userDAO.findRole(getInstance().getReadAccessLevel());
-
// Rollback to historical revision?
if (selectedHistoricalNode != null) getInstance().rollback(selectedHistoricalNode);
@@ -98,48 +38,14 @@
historicalCopy = new Document(getInstance());
}
- // TODO: Typical exit method to get out of a root or nested conversation, JBSEAM-906
- public void exitConversation(Boolean endBeforeRedirect) {
- Conversation currentConversation = Conversation.instance();
- if (currentConversation.isNested()) {
- // End this nested conversation and return to last rendered view-id of parent
- currentConversation.endAndRedirect(endBeforeRedirect);
- } else {
- // End this root conversation
- currentConversation.end();
- // Return to the view-id that was captured when this conversation started
- if (endBeforeRedirect)
- browser.redirectToLastBrowsedPage();
- else
- browser.redirectToLastBrowsedPageWithConversation();
- }
- }
-
@Override
public String persist() {
- // Validate
- if (!isUniqueWikinameInDirectory() ||
- !isUniqueWikinameInArea()) return null;
-
- // Link the document with a directory
- parentDirectory.addChild(getInstance());
-
- // Set created by user
- getInstance().setCreatedBy(authenticatedUser);
-
- // Set its area number
- getInstance().setAreaNumber(parentDirectory.getAreaNumber());
-
// Convert and set form content onto entity instance
getInstance().setContent(
wikiLinkResolver.convertToWikiLinks(parentDirectory, getFormContent())
);
- // Permissions
- getInstance().setWriteAccessLevel(writableByRole != null ? writableByRole.getAccessLevel() : 1000);
- getInstance().setReadAccessLevel(readableByRole != null ? readableByRole.getAccessLevel() : 1000);
-
return super.persist();
}
@@ -147,44 +53,28 @@
@Override
public String update() {
- // Validate
- if (!isUniqueWikinameInDirectory() ||
- !isUniqueWikinameInArea()) return null;
-
// Convert and set form content onto entity instance
getInstance().setContent(
wikiLinkResolver.convertToWikiLinks(parentDirectory, getFormContent())
);
- // Set last modified by user
- getInstance().setLastModifiedBy(authenticatedUser);
-
Events.instance().raiseEvent("Nodes.menuStructureModified");
// Write history log and prepare a new copy for further modification
if (!isMinorRevision()) {
- nodeDAO.persistHistoricalNode(historicalCopy);
+ getNodeDAO().persistHistoricalNode(historicalCopy);
getInstance().incrementRevision();
historicalCopy = new Document(getInstance());
}
- // Permissions
- getInstance().setWriteAccessLevel(writableByRole != null ? writableByRole.getAccessLevel() : 1000);
- getInstance().setReadAccessLevel(readableByRole != null ? readableByRole.getAccessLevel() : 1000);
-
return super.update();
}
@Override
public String remove() {
- // Unlink the document from its directory
- getInstance().getParent().removeChild(getInstance());
-
- Events.instance().raiseEvent("Nodes.menuStructureModified");
-
// Delete all history nodes
- nodeDAO.removeHistoricalNodes(getInstance());
+ getNodeDAO().removeHistoricalNodes(getInstance());
return super.remove();
}
@@ -206,10 +96,16 @@
public void setEnabledPreview(boolean enabledPreview) {
this.enabledPreview = enabledPreview;
+
// Convert and set form content onto entity instance
getInstance().setContent(
wikiLinkResolver.convertToWikiLinks(parentDirectory, getFormContent())
);
+
+ // Outject instances required for WikiLinkResolver during preview rendering
+ Contexts.getEventContext().set("currentDocument", getInstance());
+ Contexts.getEventContext().set("currentDirectory", getParentDirectory());
+
}
public boolean isMinorRevision() {
@@ -220,54 +116,4 @@
this.minorRevision = minorRevision;
}
- public List<org.jboss.seam.wiki.core.model.Role> getRoles() {
- return roles;
- }
-
- public org.jboss.seam.wiki.core.model.Role getWritableByRole() {
- return writableByRole;
- }
-
- public void setWritableByRole(org.jboss.seam.wiki.core.model.Role writableByRole) {
- this.writableByRole = writableByRole;
- }
-
- public org.jboss.seam.wiki.core.model.Role getReadableByRole() {
- return readableByRole;
- }
-
- public void setReadableByRole(org.jboss.seam.wiki.core.model.Role readableByRole) {
- this.readableByRole = readableByRole;
- }
-
- // Validation rules for persist(), update(), and remove();
-
- private boolean isUniqueWikinameInDirectory() {
- Node foundNode = nodeDAO.findNodeInDirectory(parentDirectory, getInstance().getWikiname());
- if (foundNode != null && foundNode != getInstance()) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateName",
- "This name is already used, please change it."
- );
- return false;
- }
- return true;
- }
-
- private boolean isUniqueWikinameInArea() {
- Node foundNode = nodeDAO.findNodeInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
- if (foundNode != null && foundNode != getInstance()) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateNameInArea",
- "This name is already used in this area, please change it."
- );
- return false;
- }
- return true;
- }
-
}
1.2 +2 -121 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/FileHome.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: FileHome.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/FileHome.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- FileHome.java 7 Mar 2007 18:37:37 -0000 1.1
+++ FileHome.java 8 Mar 2007 17:50:58 -0000 1.2
@@ -1,43 +1,18 @@
package org.jboss.seam.wiki.core.action;
-import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
import javax.swing.*;
import org.jboss.seam.annotations.*;
-import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.ScopeType;
-import org.jboss.seam.wiki.core.dao.NodeDAO;
import org.jboss.seam.wiki.core.ui.FileMetaMap;
-import org.jboss.seam.wiki.core.model.Directory;
-import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.core.model.File;
import org.jboss.seam.wiki.core.model.ImageMetaInfo;
-import org.jboss.seam.core.FacesMessages;
-import org.jboss.seam.core.Conversation;
import java.util.Map;
@Name("fileHome")
-public class FileHome extends EntityHome<File> {
-
- @RequestParameter
- private Long fileId;
-
- @RequestParameter
- private Long parentDirId;
-
- // Pages need this for rendering
- @Out(required = true, scope = ScopeType.CONVERSATION, value = "currentDirectory")
- Directory parentDirectory;
-
- @In
- private FacesMessages facesMessages;
-
- @In
- private NodeBrowser browser;
-
- @In
- private NodeDAO nodeDAO;
+ at Scope(ScopeType.CONVERSATION)
+public class FileHome extends NodeHome<File> {
@In
Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
@@ -46,91 +21,27 @@
private String contentType;
// TODO: This should really use an InputStream and directly stream into the BLOB without consuming server memory
private byte[] filedata;
-
private int imagePreviewSize = 240;
- @Override
- public Object getId() {
-
- if (fileId == null) {
- return super.getId();
- } else {
- return fileId;
- }
- }
-
- @Override
- @Transactional
- public void create() {
- super.create();
-
- // Load the parent directory
- getEntityManager().joinTransaction();
- parentDirectory = getEntityManager().find(Directory.class, parentDirId);
- }
-
- // TODO: Typical exit method to get out of a root or nested conversation, JBSEAM-906
- public void exitConversation(Boolean endBeforeRedirect) {
- Conversation currentConversation = Conversation.instance();
- if (currentConversation.isNested()) {
- // End this nested conversation and return to last rendered view-id of parent
- currentConversation.endAndRedirect(endBeforeRedirect);
- } else {
- // End this root conversation
- currentConversation.end();
- // Return to the view-id that was captured when this conversation started
- if (endBeforeRedirect)
- browser.redirectToLastBrowsedPage();
- else
- browser.redirectToLastBrowsedPageWithConversation();
- }
- }
@Override
public String persist() {
- // Validate
- if (!isUniqueWikinameInDirectory() ||
- !isUniqueWikinameInArea()) return null;
-
-
// Sync file instance with form data
syncFile();
- // Link the document with a directory
- parentDirectory.addChild(getInstance());
-
- // Set its area number
- getInstance().setAreaNumber(parentDirectory.getAreaNumber());
-
return super.persist();
}
-
@Override
public String update() {
- // Validate
- if (!isUniqueWikinameInDirectory() ||
- !isUniqueWikinameInArea()) return null;
-
// Sync file instance with form data
syncFile();
return super.update();
}
- @Override
- public String remove() {
-
- // Unlink the document from its directory
- getInstance().getParent().removeChild(getInstance());
-/*
- Events.instance().raiseEvent("Nodes.menuStructureModified");
-*/
- return super.remove();
- }
-
public String getFilename() { return filename; }
public void setFilename(String filename) { this.filename = filename; }
@@ -176,34 +87,4 @@
public void zoomPreviewOut() {
if (imagePreviewSize > 240) imagePreviewSize = imagePreviewSize - 240;
}
-
- // Validation rules for persist(), update(), and remove();
-
- private boolean isUniqueWikinameInDirectory() {
- Node foundNode = nodeDAO.findNodeInDirectory(parentDirectory, getInstance().getWikiname());
- if (foundNode != null && foundNode != getInstance()) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateName",
- "This name is already used, please change it."
- );
- return false;
- }
- return true;
- }
-
- private boolean isUniqueWikinameInArea() {
- Node foundNode = nodeDAO.findNodeInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
- if (foundNode != null && foundNode != getInstance()) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateNameInArea",
- "This name is already used in this area, please change it."
- );
- return false;
- }
- return true;
- }
}
1.2 +6 -173 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.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- DirectoryHome.java 7 Mar 2007 18:37:37 -0000 1.1
+++ DirectoryHome.java 8 Mar 2007 17:50:58 -0000 1.2
@@ -1,103 +1,35 @@
package org.jboss.seam.wiki.core.action;
-import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
-
import org.jboss.seam.annotations.*;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
-import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.ScopeType;
-import org.jboss.seam.wiki.core.dao.NodeDAO;
+import org.jboss.seam.core.Events;
import org.jboss.seam.wiki.core.model.Directory;
import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.core.model.Document;
-import org.jboss.seam.core.FacesMessages;
-import org.jboss.seam.core.Events;
-import org.jboss.seam.core.Conversation;
-import javax.persistence.Query;
import java.util.List;
import java.util.Collections;
@Name("directoryHome")
-public class DirectoryHome extends EntityHome<Directory> {
-
- @RequestParameter
- Long dirId;
-
- @RequestParameter
- Long parentDirId;
-
- Directory parentDirectory;
-
- @In(required = false)
- @Out(required = false, scope = ScopeType.CONVERSATION) // Propagate it through the conversation
- Directory currentDirectory;
-
- @In
- private FacesMessages facesMessages;
-
- @In
- private NodeBrowser browser;
-
- @In
- private NodeDAO nodeDAO;
-
- @Override
- public Object getId() {
-
- if (dirId == null) {
- return super.getId();
- } else {
- return dirId;
- }
- }
+ at Scope(ScopeType.CONVERSATION)
+public class DirectoryHome extends NodeHome<Directory> {
@Override
@Transactional
public void create() {
super.create();
- currentDirectory = getInstance(); // Prepare for outjection
-
- getEntityManager().joinTransaction();
- if (parentDirId != null) {
- parentDirectory = getEntityManager().find(Directory.class, parentDirId);
- } else {
- parentDirectory = getInstance().getParent();
- }
-
// Fill the datamodel for outjection
refreshChildNodes();
}
- // TODO: Typical exit method to get out of a root or nested conversation, JBSEAM-906
- public void exitConversation(Boolean endBeforeRedirect) {
- Conversation currentConversation = Conversation.instance();
- if (currentConversation.isNested()) {
- // End this nested conversation and return to last rendered view-id of parent
- currentConversation.endAndRedirect(endBeforeRedirect);
- } else {
- // End this root conversation
- currentConversation.end();
- // Return to the view-id that was captured when this conversation started
- if (endBeforeRedirect)
- browser.redirectToLastBrowsedPage();
- else
- browser.redirectToLastBrowsedPageWithConversation();
- }
- }
@Override
+ @Transactional
public String persist() {
- // Validate
- if (!isUniqueWikinameInDirectory(null) ||
- !isUniqueWikinameInArea()) return null;
-
- // Link the directory with its parent
- parentDirectory.addChild(getInstance());
-
if (parentDirectory.getParent() != null) {
// This is a subdirectory in an area
getInstance().setAreaNumber(parentDirectory.getAreaNumber());
@@ -121,55 +53,11 @@
@Override
- public String update() {
-
- // Validate
- if (!isUniqueWikinameInDirectory(getInstance()) ||
- !isUniqueWikinameInArea()) return null;
-
- Events.instance().raiseEvent("Nodes.menuStructureModified");
-
- return super.update();
- }
-
- @Override
public String remove() {
-
- // Unlink the document from its parent directory
- parentDirectory.removeChild(getInstance());
-
- // Null the outjected value
- currentDirectory = null;
-
- Events.instance().raiseEvent("Nodes.menuStructureModified");
-
+ if (getInstance().getParent() == null) return null; // Can not delete wiki root
return super.remove();
}
- @Override
- public String getUpdatedMessage() {
- return super.getUpdatedMessage() + ": '" + getInstance().getName() + "'";
- }
-
-
- @Override
- public String getDeletedMessage() {
- return super.getDeletedMessage() + ": '" + getInstance().getName() + "'";
- }
-
- @Override
- public String getCreatedMessage() {
- return super.getCreatedMessage() + ": '" + getInstance().getName() + "'";
- }
-
- public Directory getParentDirectory() {
- return parentDirectory;
- }
-
- public void setParentDirectory(Directory parentDirectory) {
- this.parentDirectory = parentDirectory;
- }
-
@DataModel
List<Node> childNodes;
@@ -198,63 +86,8 @@
}
public void previewMenuItems() {
+ // Refresh UI
Events.instance().raiseEvent("Nodes.menuStructureModified");
}
- // Validation rules for persist(), update(), and remove();
-
- @Transactional
- private boolean isUniqueWikinameInDirectory(Directory ignore) {
- getEntityManager().joinTransaction();
-
- String queryString = "select n from Node n where n.parent = :parent and n.wikiname = :wikiname";
- if (ignore != null) queryString = queryString + " and not n = :ignore";
-
- Query q = getEntityManager().createQuery(queryString);
- if (ignore != null) q.setParameter("ignore", ignore);
-
- // Unique directory name within parent
- List existingChildren = q
- .setParameter("parent", parentDirectory)
- .setParameter("wikiname", getInstance().getWikiname())
- .getResultList();
- if (existingChildren.size() >0) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateName",
- "Directory or document with that name already exists."
- );
- return false;
- }
- return true;
- }
-
- /**
- * This is used to check for duplicate directory names in area. We could allow duplicate
- * directory names from a logical/automatic linking perspective, but the database constraint
- * would require a custom trigger. If we don't allow duplicate directory names in a logical
- * area, we can apply a simple multicolumn UNIQUE constraint, that is a lot easier.
- *
- * @return boolean True if the current instances WikiName already exists in the parents area
- */
- @Transactional
- private boolean isUniqueWikinameInArea() {
- if (parentDirectory == null) return true;
- getEntityManager().joinTransaction();
- // Unique directory name within area
- Directory foundDirectory =
- nodeDAO.findDirectoryInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
- if (foundDirectory != null && foundDirectory != getInstance()) {
- facesMessages.addToControlFromResourceBundleOrDefault(
- "name",
- SEVERITY_ERROR,
- getMessageKeyPrefix() + "duplicateNameInArea",
- "Directory with that name already exists in this area."
- );
- return false;
- }
- return true;
- }
-
}
1.1 date: 2007/03/08 17:50:58; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodePermissions.java
Index: NodePermissions.java
===================================================================
package org.jboss.seam.wiki.core.action;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.ScopeType;
@Name("nodePermissions")
@Scope(ScopeType.CONVERSATION)
public class NodePermissions {
@In
Node currentNode;
private org.jboss.seam.wiki.core.model.Role writableByRole;
private org.jboss.seam.wiki.core.model.Role readableByRole;
@In
private UserDAO userDAO;
@Create
public void setCurrentNodePermissions() {
// Set permission defaults
writableByRole = userDAO.findRole(currentNode.getWriteAccessLevel());
readableByRole = userDAO.findRole(currentNode.getReadAccessLevel());
}
public org.jboss.seam.wiki.core.model.Role getWritableByRole() {
return writableByRole;
}
public void setWritableByRole(org.jboss.seam.wiki.core.model.Role writableByRole) {
this.writableByRole = writableByRole;
currentNode.setWriteAccessLevel(writableByRole != null ? writableByRole.getAccessLevel() : 1000);
}
public org.jboss.seam.wiki.core.model.Role getReadableByRole() {
return readableByRole;
}
public void setReadableByRole(org.jboss.seam.wiki.core.model.Role readableByRole) {
this.readableByRole = readableByRole;
currentNode.setReadAccessLevel(readableByRole != null ? readableByRole.getAccessLevel() : 1000);
}
}
1.1 date: 2007/03/08 17:50:58; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java
Index: NodeHome.java
===================================================================
package org.jboss.seam.wiki.core.action;
import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.wiki.core.dao.NodeDAO;
import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.wiki.core.model.User;
import org.jboss.seam.wiki.core.model.Directory;
import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.core.ui.WikiUtil;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.RequestParameter;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.Events;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
/**
* Superclass for all creating and editing documents, directories, files, etc.
*
* @author Christian Bauer
*/
public abstract class NodeHome<N extends Node> extends EntityHome<N> {
// Convenience wiring for subclasses
@In private NodeDAO nodeDAO;
@In private UserDAO userDAO;
@In private User authenticatedUser;
protected Directory parentDirectory; // Assigned in create()
protected NodeDAO getNodeDAO() { return nodeDAO; }
protected UserDAO getUserDAO() { return userDAO; }
protected User getAuthenticatedUser() { return authenticatedUser; }
public Directory getParentDirectory() { return parentDirectory; }
// 'Edit' request parameter
@RequestParameter private Long nodeId;
// 'Create' request parameter
@RequestParameter private Long parentDirId;
@Out(required = true, scope = ScopeType.CONVERSATION)
protected N currentNode;
// TODO: Typical exit method to get out of a root or nested conversation, JBSEAM-906
public void exitConversation(Boolean endBeforeRedirect) {
Conversation currentConversation = Conversation.instance();
if (currentConversation.isNested()) {
// End this nested conversation and return to last rendered view-id of parent
currentConversation.endAndRedirect(endBeforeRedirect);
} else {
// End this root conversation
currentConversation.end();
// Return to the view-id that was captured when this conversation started
NodeBrowser browser = (NodeBrowser) Component.getInstance("browser");
if (endBeforeRedirect)
browser.redirectToLastBrowsedPage();
else
browser.redirectToLastBrowsedPageWithConversation();
}
}
// 'Edit' or 'Create'
@Override
public Object getId() {
if (nodeId == null) {
return super.getId();
} else {
return nodeId;
}
}
@Override
public void create() {
super.create();
// Load the parent directory (needs to be called first, ugly dependency in createInstance() )
// The parentDirectory (and parentDirId) parameter can actually be null but this onl happens
// when the wiki root is edited... it can only be update()ed anyway.
parentDirectory = nodeDAO.findDirectory(parentDirId);
// Outject current node
currentNode = getInstance();
}
@Override
protected N createInstance() {
N node = super.createInstance();
// Set default permissions for new nodes - just like parent directory
node.setWriteAccessLevel(parentDirectory.getWriteAccessLevel());
node.setReadAccessLevel(parentDirectory.getReadAccessLevel());
return node;
}
@Override
public String persist() {
// Validate
if (!isUniqueWikinameInDirectory() ||
!isUniqueWikinameInArea()) return null;
// Link the document with a directory
parentDirectory.addChild(getInstance());
// Set created by user
getInstance().setCreatedBy(authenticatedUser);
// Set its area number
if (getInstance().getAreaNumber() == null)
getInstance().setAreaNumber(parentDirectory.getAreaNumber());
// Set the wikiname
getInstance().setWikiname(WikiUtil.convertToWikiName(getInstance().getName()));
return super.persist();
}
@Override
public String update() {
// Validate
if (!isUniqueWikinameInDirectory() ||
!isUniqueWikinameInArea()) return null;
// Set last modified by user
getInstance().setLastModifiedBy(authenticatedUser);
// Refresh UI
Events.instance().raiseEvent("Nodes.menuStructureModified");
// Set the wikiname
getInstance().setWikiname(WikiUtil.convertToWikiName(getInstance().getName()));
return super.update();
}
@Override
public String remove() {
// Unlink the document from its directory
getInstance().getParent().removeChild(getInstance());
// Refresh UI
Events.instance().raiseEvent("Nodes.menuStructureModified");
return super.remove();
}
// Validation rules for persist(), update(), and remove();
protected boolean isUniqueWikinameInDirectory() {
if (parentDirectory == null) return true; // Editing wiki root
Node foundNode = nodeDAO.findNodeInDirectory(parentDirectory, getInstance().getWikiname());
if (foundNode != null && foundNode != getInstance()) {
getFacesMessages().addToControlFromResourceBundleOrDefault(
"name",
SEVERITY_ERROR,
getMessageKeyPrefix() + "duplicateName",
"This name is already used, please change it."
);
return false;
}
return true;
}
protected boolean isUniqueWikinameInArea() {
if (parentDirectory == null) return true; // Editing wiki root
Node foundNode = nodeDAO.findNodeInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
if (foundNode != null && foundNode != getInstance()) {
getFacesMessages().addToControlFromResourceBundleOrDefault(
"name",
SEVERITY_ERROR,
getMessageKeyPrefix() + "duplicateNameInArea",
"This name is already used in this area, please change it."
);
return false;
}
return true;
}
}
More information about the jboss-cvs-commits
mailing list