[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