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

Christian Bauer christian at hibernate.org
Mon Mar 19 22:38:15 EDT 2007


  User: cbauer  
  Date: 07/03/19 22:38:15

  Modified:    examples/wiki/src/main/org/jboss/seam/wiki/core/action      
                        FileHome.java DirectoryHome.java NodeBrowser.java
                        Menu.java DocumentHome.java NodeHome.java
  Log:
  Implemented moving of documents and files between directories
  
  Revision  Changes    Path
  1.5       +26 -22    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.4
  retrieving revision 1.5
  diff -u -b -r1.4 -r1.5
  --- FileHome.java	18 Mar 2007 15:44:37 -0000	1.4
  +++ FileHome.java	20 Mar 2007 02:38:15 -0000	1.5
  @@ -16,18 +16,35 @@
   @Scope(ScopeType.CONVERSATION)
   public class FileHome extends NodeHome<File> {
   
  +    /* -------------------------- Context Wiring ------------------------------ */
  +
       @In
       Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
   
  +    /* -------------------------- Internal State ------------------------------ */
  +
       private String filename;
       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;
   
  +    public String getFilename() { return filename; }
  +    public void setFilename(String filename) { this.filename = filename; }
  +
  +    public String getContentType() { return contentType; }
  +    public void setContentType(String contentType) { this.contentType = contentType; }
  +
  +    public byte[] getFiledata() { return filedata; }
  +    public void setFiledata(byte[] filedata) { this.filedata = filedata; }
  +
  +    public int getImagePreviewSize() { return imagePreviewSize; }
   
  -    @Override
  -    public String persist() {
  +    /* -------------------------- Custom CUD ------------------------------ */
  +
  +    protected boolean preparePersist() {
  +        // Sync file instance with form data
  +        syncFile();
   
           // Validate
           if (filedata == null || filedata.length == 0) {
  @@ -36,32 +53,20 @@
                   getMessageKeyPrefix() + "noFileUploaded",
                   "Please select a file to upload"
               );
  -            return null;
  +            return false;
           }
   
  -        // Sync file instance with form data
  -        syncFile();
  -
  -        return super.persist();
  +        return true;
       }
   
  -    @Override
  -    public String update() {
  -
  +    protected boolean prepareUpdate() {
           // Sync file instance with form data
           syncFile();
   
  -        return super.update();
  +        return true;
       }
   
  -    public String getFilename() { return filename; }
  -    public void setFilename(String filename) { this.filename = filename; }
  -
  -    public String getContentType() { return contentType; }
  -    public void setContentType(String contentType) { this.contentType = contentType; }
  -
  -    public byte[] getFiledata() { return filedata; }
  -    public void setFiledata(byte[] filedata) { this.filedata = filedata; }
  +    /* -------------------------- Internal Methods ------------------------------ */
   
       private void syncFile() {
           if (filedata != null && filedata.length >0) {
  @@ -89,9 +94,7 @@
           }
       }
   
  -    public int getImagePreviewSize() {
  -        return imagePreviewSize;
  -    }
  +    /* -------------------------- Public Features ------------------------------ */
   
       public void zoomPreviewIn() {
           if (imagePreviewSize < 1600) imagePreviewSize = imagePreviewSize + 240;
  @@ -100,4 +103,5 @@
       public void zoomPreviewOut() {
           if (imagePreviewSize > 240) imagePreviewSize = imagePreviewSize - 240;
       }
  +
   }
  
  
  
  1.4       +25 -24    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.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- DirectoryHome.java	18 Mar 2007 15:44:37 -0000	1.3
  +++ DirectoryHome.java	20 Mar 2007 02:38:15 -0000	1.4
  @@ -5,7 +5,6 @@
   import org.jboss.seam.annotations.datamodel.DataModel;
   import org.jboss.seam.annotations.datamodel.DataModelSelection;
   import org.jboss.seam.ScopeType;
  -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;
  @@ -18,10 +17,22 @@
   @Scope(ScopeType.CONVERSATION)
   public class DirectoryHome extends NodeHome<Directory> {
   
  +    /* -------------------------- Context Wiring ------------------------------ */
  +
  +    @DataModel
  +    List<Node> childNodes;
  +
  +    @DataModelSelection
  +    Node selectedChildNode;
  +
  +    /* -------------------------- Internal State ------------------------------ */
  +
       private List<Document> childDocuments = new ArrayList<Document>();
  +    public List<Document> getChildDocuments() { return childDocuments; }
  +
  +    /* -------------------------- Basic Overrides ------------------------------ */
   
       @Override
  -    @Transactional
       public void create() {
           super.create();
   
  @@ -29,9 +40,9 @@
           refreshChildNodes();
       }
   
  +    /* -------------------------- Custom CUD ------------------------------ */
   
       @Override
  -    @Transactional
       public String persist() {
   
           if (getParentDirectory().getParent() != null) {
  @@ -55,21 +66,20 @@
           }
       }
   
  -    @Override
  -    public String remove() {
  -        if (getInstance().getParent() == null) return null; // Can not delete wiki root
  -        return super.remove();
  +    protected boolean prepareRemove() {
  +        return getInstance().getParent() == null; // Can not delete wiki root
       }
   
  -    public List<Document> getChildDocuments() {
  -        return childDocuments;
  -    }
  +    /* -------------------------- Internal Methods ------------------------------ */
   
  -    @DataModel
  -    List<Node> childNodes;
  +    private void refreshChildNodes() {
  +        childNodes = getInstance().getChildren();
  +        for (Node childNode : childNodes) {
  +            if (childNode instanceof Document) childDocuments.add((Document)childNode);
  +        }
  +    }
   
  -    @DataModelSelection
  -    Node selectedChildNode;
  +    /* -------------------------- Public Features ------------------------------ */
   
       @Restrict("#{s:hasPermission('Node', 'editMenu', directoryHome.instance)}")
       public void moveNodeUpInList() {
  @@ -85,17 +95,8 @@
           refreshChildNodes();
       }
   
  -    private void refreshChildNodes() {
  -        childNodes = getInstance().getChildren();
  -        for (Node childNode : childNodes) {
  -            if (childNode instanceof Document) childDocuments.add((Document)childNode);
  -        }
  -    }
  -
       @Restrict("#{s:hasPermission('Node', 'editMenu', directoryHome.instance)}")
       public void previewMenuItems() {
  -        // Refresh UI
  -        Events.instance().raiseEvent("Nodes.menuStructureModified");
  +        refreshMenuItems();
       }
  -
   }
  
  
  
  1.4       +18 -0     jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeBrowser.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: NodeBrowser.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeBrowser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- NodeBrowser.java	18 Mar 2007 15:44:37 -0000	1.3
  +++ NodeBrowser.java	20 Mar 2007 02:38:15 -0000	1.4
  @@ -2,6 +2,7 @@
   
   import org.jboss.seam.annotations.*;
   import org.jboss.seam.ScopeType;
  +import org.jboss.seam.core.Conversation;
   import org.jboss.seam.security.Identity;
   import org.jboss.seam.wiki.core.dao.NodeDAO;
   import org.jboss.seam.wiki.core.model.Node;
  @@ -109,6 +110,23 @@
           redirect.returnToCapturedView();
       }
   
  +    // 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)
  +                redirectToLastBrowsedPage();
  +            else
  +                redirectToLastBrowsedPageWithConversation();
  +        }
  +    }
  +
       // Just a convenience method for recursive calling
       protected void addDirectoryToPath(List<Node> path, Node directory) {
           if (Identity.instance().hasPermission("Node", "read", directory) ||
  
  
  
  1.3       +0 -0      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Menu.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  
  
  
  1.5       +64 -59    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.4
  retrieving revision 1.5
  diff -u -b -r1.4 -r1.5
  --- DocumentHome.java	18 Mar 2007 15:44:37 -0000	1.4
  +++ DocumentHome.java	20 Mar 2007 02:38:15 -0000	1.5
  @@ -6,20 +6,24 @@
   import org.jboss.seam.core.Events;
   import org.jboss.seam.Component;
   import org.jboss.seam.ScopeType;
  -import org.jboss.seam.security.AuthorizationException;
   import org.jboss.seam.contexts.Contexts;
   
   @Name("documentHome")
   @Scope(ScopeType.CONVERSATION)
   public class DocumentHome extends NodeHome<Document> {
   
  -    private String formContent;
  -    private boolean enabledPreview = false;
  +    /* -------------------------- Context Wiring ------------------------------ */
  +
  +    @In(required = false) private Node selectedHistoricalNode;
  +
  +    /* -------------------------- Internal State ------------------------------ */
   
  -    @In(required = false)
  -    Node selectedHistoricalNode;
       private Document historicalCopy;
       private boolean minorRevision = true;
  +    private String formContent;
  +    private boolean enabledPreview = false;
  +
  +    /* -------------------------- Basic Overrides ------------------------------ */
   
       @Override
       public void create() {
  @@ -36,59 +40,79 @@
           historicalCopy = new Document(getInstance());
       }
   
  -    @Override
  -    public String persist() {
  -        checkNodeAccessLevelChangePermission();
  +    /* -------------------------- Custom CUD ------------------------------ */
   
  -        syncFormText();
  -        return super.persist();
  -    }
  +    protected boolean beforePersist() {
  +        // Sync document content
  +        syncFormToInstance(getParentDirectory());
   
  -    @Override
  -    @Transactional
  -    public String update() {
  -        checkNodeAccessLevelChangePermission();
  +        // Make a copy
  +        historicalCopy = new Document(getInstance());
  +
  +        return true;
  +    }
   
  -        syncFormText();
  +    protected boolean beforeUpdate() {
           
  -        Events.instance().raiseEvent("Nodes.menuStructureModified");
  +        // Sync document content
  +        syncFormToInstance(getParentDirectory());
   
           // Write history log and prepare a new copy for further modification
           if (!isMinorRevision()) {
  +            historicalCopy.setId(getInstance().getId());
               getNodeDAO().persistHistoricalNode(historicalCopy);
               getInstance().incrementRevision();
               // New historical copy in conversation
               historicalCopy = new Document(getInstance());
           }
   
  -        return super.update();
  +        return true;
       }
   
  -    @Override
  -    @Transactional
  -    public String remove() {
  +    protected boolean beforeRemove() {
   
           // Delete all history nodes
           getNodeDAO().removeHistoricalNodes(getInstance());
   
  -        // Unset the default document id
  -        if (getParentDirectory().getDefaultDocument().equals(getInstance()))
  -            getParentDirectory().setDefaultDocument(null);
  +        // Null out default document
  +        removeAsDefaultDocument(getParentDirectory());
   
  -        return super.remove();
  +        return true;
       }
   
  -    public String getFormContent() {
  -        // Load the document content and resolve links
  -        if (formContent == null) {
  +    protected void afterNodeMoved(Directory oldParent, Directory newParent) {
  +        // Update view
  +        syncFormToInstance(oldParent); // Resolve existing links in old directory
  +        syncInstanceToForm(newParent); // Now update the form, effectively re-rendering the links
  +    }
  +
  +    /* -------------------------- Internal Methods ------------------------------ */
  +
  +
  +    private void syncFormToInstance(Directory area) {
  +        // Outject instances required for WikiLinkResolver
  +        Contexts.getEventContext().set("currentDocument", getInstance());
  +        Contexts.getEventContext().set("currentDirectory", area);
  +
  +        WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
  +        getInstance().setContent(wikiLinkResolver.convertToWikiLinks(area, formContent));
  +    }
   
  +    private void syncInstanceToForm(Directory parentDirectory) {
               // Outject instances required for WikiLinkResolver
               Contexts.getEventContext().set("currentDocument", getInstance());
  -            Contexts.getEventContext().set("currentDirectory", getParentDirectory());
  +        Contexts.getEventContext().set("currentDirectory", parentDirectory);
   
               WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
  -            formContent = wikiLinkResolver.convertFromWikiLinks(getParentDirectory(), getInstance().getContent());
  +        formContent = wikiLinkResolver.convertFromWikiLinks(parentDirectory, getInstance().getContent());
           }
  +
  +
  +    /* -------------------------- Public Features ------------------------------ */
  +
  +    public String getFormContent() {
  +        // Load the document content and resolve links
  +        if (formContent == null) syncInstanceToForm(getParentDirectory());
           return formContent;
       }
   
  @@ -96,35 +120,16 @@
           this.formContent = formContent;
       }
   
  +    public boolean isMinorRevision() { return minorRevision; }
  +    public void setMinorRevision(boolean minorRevision) { this.minorRevision = minorRevision; }
  +
       public boolean isEnabledPreview() {
           return enabledPreview;
       }
   
       public void setEnabledPreview(boolean enabledPreview) {
           this.enabledPreview = enabledPreview;
  -        syncFormText();
  -        Events.instance().raiseEvent("Nodes.menuStructureModified");
  -    }
  -
  -    public boolean isMinorRevision() {
  -        return minorRevision;
  -    }
  -
  -    public void setMinorRevision(boolean minorRevision) {
  -        this.minorRevision = minorRevision;
  +        syncFormToInstance(getParentDirectory());
  +        refreshMenuItems();
       }
  -
  -    private void syncFormText() {
  -
  -        // Outject instances required for WikiLinkResolver
  -        Contexts.getEventContext().set("currentDocument", getInstance());
  -        Contexts.getEventContext().set("currentDirectory", getParentDirectory());
  -
  -        // Convert and set form content onto entity instance
  -        WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
  -        getInstance().setContent(
  -            wikiLinkResolver.convertToWikiLinks(getParentDirectory(), getFormContent())
  -        );
  -    }
  -
   }
  
  
  
  1.6       +154 -60   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.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- NodeHome.java	19 Mar 2007 04:53:54 -0000	1.5
  +++ NodeHome.java	20 Mar 2007 02:38:15 -0000	1.6
  @@ -1,7 +1,6 @@
   package org.jboss.seam.wiki.core.action;
   
   import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
  -import javax.persistence.EntityManager;
   
   import org.jboss.seam.framework.EntityHome;
   import org.jboss.seam.wiki.core.dao.NodeDAO;
  @@ -12,14 +11,18 @@
   import org.jboss.seam.wiki.core.ui.WikiUtil;
   import org.jboss.seam.annotations.In;
   import org.jboss.seam.annotations.RequestParameter;
  -import org.jboss.seam.core.Conversation;
  +import org.jboss.seam.annotations.Out;
   import org.jboss.seam.core.Events;
  -import org.jboss.seam.Component;
  +import org.jboss.seam.ScopeType;
   import org.jboss.seam.contexts.Contexts;
   import org.jboss.seam.security.AuthorizationException;
   import org.jboss.seam.security.Identity;
  +import org.richfaces.component.html.HtmlTree;
  +import org.richfaces.component.TreeRowKey;
  +import org.richfaces.component.events.NodeSelectedEvent;
   
   import java.util.Date;
  +import java.util.Iterator;
   
   /**
    * Superclass for all creating and editing documents, directories, files, etc.
  @@ -28,23 +31,37 @@
    */
   public abstract class NodeHome<N extends Node> extends EntityHome<N> {
   
  -    // Convenience wiring for subclasses
  +    /* -------------------------- Context Wiring ------------------------------ */
  +
       @In private NodeDAO nodeDAO;
       @In private UserDAO userDAO;
       @In private User currentUser;
  -    private Directory parentDirectory; // Assigned in create()
  -
       protected NodeDAO getNodeDAO() { return nodeDAO; }
       protected UserDAO getUserDAO() { return userDAO; }
       protected User getCurrentUser() { return currentUser; }
  -    public Directory getParentDirectory() { return parentDirectory; }
   
  -    // 'Edit' request parameter
  +    @Override
  +    @Out(value = "currentNode", scope = ScopeType.CONVERSATION)
  +    public N getInstance() {
  +        return super.getInstance();
  +    }
  +
  +    /* -------------------------- Request Wiring ------------------------------ */
  +
  +    // Required 'Edit' request parameter
       @RequestParameter private Long nodeId;
   
  -    // 'Create' request parameter
  +    // Required 'Edit' and 'Create' request parameter
       @RequestParameter private Long parentDirId;
   
  +    /* -------------------------- Internal State ------------------------------ */
  +
  +    private Directory parentDirectory;
  +    public Directory getParentDirectory() { return parentDirectory; }
  +    public void setParentDirectory(Directory parentDirectory) { this.parentDirectory = parentDirectory; }
  +
  +    /* -------------------------- Basic Overrides ------------------------------ */
  +
       @Override
       protected String getPersistenceContextName() {
           return "restrictedEntityManager";
  @@ -53,7 +70,6 @@
       // 'Edit' or 'Create'
       @Override
       public Object getId() {
  -
           if (nodeId == null) {
               return super.getId();
           } else {
  @@ -61,19 +77,30 @@
           }
       }
   
  -    // Access level filtered DAO
  +    // Access level filtered DAO for retrieval by identifier
       @Override
       public N find() {
  +        //noinspection unchecked
           N result = (N)nodeDAO.findNode((Long)getId());
           if (result==null) handleNotFound();
           return result;
       }
   
       @Override
  +    protected N createInstance() {
  +        N node = super.createInstance();
  +
  +        // Set default permissions for new nodes - default to same access as parent directory
  +        node.setWriteAccessLevel(getParentDirectory().getWriteAccessLevel());
  +        node.setReadAccessLevel(getParentDirectory().getReadAccessLevel());
  +
  +        return node;
  +    }
  +
  +    @Override
       public void create() {
           super.create();
   
  -
           // Load the parent directory (needs to be called first)
           // The parentDirectory (and parentDirId) parameter can actually be null but this only happens
           // when the wiki root is edited... it can only be update()ed anyway, all the other code is null-safe.
  @@ -90,25 +117,20 @@
           Contexts.getConversationContext().set("currentNode", getInstance());
       }
   
  -    @Override
  -    protected N createInstance() {
  -        N node = super.createInstance();
  -
  -        // Set default permissions for new nodes - default to same access as parent directory
  -        node.setWriteAccessLevel(getParentDirectory().getWriteAccessLevel());
  -        node.setReadAccessLevel(getParentDirectory().getReadAccessLevel());
  -
  -        return node;
  -    }
  +    /* -------------------------- Custom CUD ------------------------------ */
   
       @Override
       public String persist() {
  +        if (!preparePersist()) return null;
   
  -        // Permission check (double check if subclass already called it)
  +        // Permission checks
           checkNodeAccessLevelChangePermission();
   
  -        // Set the wikiname
  -        getInstance().setWikiname(WikiUtil.convertToWikiName(getInstance().getName()));
  +        // Last modified metadata
  +        setLastModifiedMetadata();
  +
  +        // Wiki name conversion
  +        setWikiName();
   
           // Link the node with its parent directory
           getParentDirectory().addChild(getInstance());
  @@ -118,75 +140,75 @@
   
           // Set its area number (if subclass didn't already set it)
           if (getInstance().getAreaNumber() == null)
  -            getInstance().setAreaNumber(getParentDirectory().getAreaNumber());
  +            getInstance().setAreaNumber(parentDirectory.getAreaNumber());
   
           // Validate
           if (!isValidModel()) return null;
   
  +        if (!beforePersist()) return null;
           return super.persist();
       }
   
       @Override
       public String update() {
  +        if (!prepareUpdate()) return null;
   
  -        // Permission check (double check if subclass already called it)
  +        // Permission checks
           checkNodeAccessLevelChangePermission();
   
  -        // Set last modified by metadata
  -        getInstance().setLastModifiedBy(getCurrentUser());
  -        getInstance().setLastModifiedOn(new Date());
  +        // Last modified metadata
  +        setLastModifiedMetadata();
   
  -        // Validate
  -        if (!isValidModel()) return null;
  +        // Wiki name conversion
  +        setWikiName();
   
           // Refresh UI
  -        Events.instance().raiseEvent("Nodes.menuStructureModified");
  +        refreshMenuItems();
   
  -        // Set the wikiname
  -        getInstance().setWikiname(WikiUtil.convertToWikiName(getInstance().getName()));
  +        // Validate
  +        if (!isValidModel()) return null;
   
  +        if (!beforeUpdate()) return null;
           return super.update();
       }
   
       @Override
       public String remove() {
  +        if (!prepareRemove()) return null;
   
           // Unlink the node from its directory
           getInstance().getParent().removeChild(getInstance());
   
           // Refresh UI
  -        Events.instance().raiseEvent("Nodes.menuStructureModified");
  +        refreshMenuItems();
   
  +        if (!beforeRemove()) return null;
           return super.remove();
       }
   
  -    // 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();
  -        }
  -    }
  +    public void parentDirectorySelected(NodeSelectedEvent nodeSelectedEvent) {
  +        TreeRowKey rowkey = (TreeRowKey)((HtmlTree)nodeSelectedEvent.getSource()).getRowKey();
  +        Iterator pathIterator = rowkey.iterator();
  +        Long dirId = null;
  +        while (pathIterator.hasNext()) dirId = (Long)pathIterator.next();
  +        parentDirectory = nodeDAO.findDirectory(dirId);
  +        Directory oldParentDirectory = (Directory)getInstance().getParent();
   
  -    protected void checkNodeAccessLevelChangePermission() {
  +        // Move node to different directory
  +        if (parentDirectory.getId() != oldParentDirectory.getId()) {
   
  -        if (!Identity.instance().hasPermission("Node", "changeAccessLevel", getInstance()))
  -            throw new AuthorizationException("You don't have permission for this operation");
  -    }
  +            // Null out default document of old parent
  +            removeAsDefaultDocument(oldParentDirectory);
   
  -    // Validation rules for persist(), update(), and remove();
  +            // Attach to new parent
  +            parentDirectory.addChild(getInstance()); // Disconnects from old parent
  +            getInstance().setAreaNumber(parentDirectory.getAreaNumber());
  +
  +            afterNodeMoved(oldParentDirectory, parentDirectory);
  +        }
  +    }
   
  -    private boolean isValidModel() {
  +    protected boolean isValidModel() {
           if (getParentDirectory() == null) return true; // Special case, editing the wiki root
   
           // Unique wiki name
  @@ -204,4 +226,76 @@
   
       }
   
  +    /* -------------------------- Internal Methods ------------------------------ */
  +
  +    protected void setWikiName() {
  +        getInstance().setWikiname(WikiUtil.convertToWikiName(getInstance().getName()));
  +    }
  +
  +    protected void setLastModifiedMetadata() {
  +        getInstance().setLastModifiedBy(currentUser);
  +        getInstance().setLastModifiedOn(new Date());
  +    }
  +
  +    protected void checkNodeAccessLevelChangePermission() {
  +        if (!Identity.instance().hasPermission("Node", "changeAccessLevel", getInstance()))
  +            throw new AuthorizationException("You don't have permission for this operation");
  +    }
  +
  +    protected void removeAsDefaultDocument(Directory directory) {
  +        if (directory.getDefaultDocument() != null &&
  +            directory.getDefaultDocument().getId().equals(getInstance().getId())
  +           ) directory.setDefaultDocument(null);
  +    }
  +
  +    protected void refreshMenuItems() {
  +        if (getInstance().isMenuItem())
  +            Events.instance().raiseEvent("Nodes.menuStructureModified");
  +    }
  +
  +    /* -------------------------- Subclass Callbacks ------------------------------ */
  +
  +    /**
  +     * Called before the superclass does its preparation;
  +     * @return boolean continue or veto
  +     */
  +    protected boolean preparePersist() { return true; }
  +
  +    /**
  +     * Called after superclass did its preparation right before the actual persist()
  +     * @return boolean continue or veto
  +     */
  +    protected boolean beforePersist() { return true; }
  +
  +    /**
  +     * Called before the superclass does its preparation;
  +     * @return boolean continue or veto
  +     */
  +    protected boolean prepareUpdate() { return true; }
  +
  +    /**
  +     * Called after superclass did its preparation right before the actual update()
  +     * @return boolean continue or veto
  +     */
  +    protected boolean beforeUpdate() { return true; }
  +
  +    /**
  +     * Called before the superclass does its preparation;
  +     * @return boolean continue or veto
  +     */
  +    protected boolean prepareRemove() { return true; }
  +
  +    /**
  +     * Called after superclass did its preparation right before the actual remove()
  +     * @return boolean continue or veto
  +     */
  +    protected boolean beforeRemove() { return true; }
  +
  +    /**
  +     * Called after the node has been disconnected from the old parent and reconnected to the new.
  +     * @param oldParent the previous parent directory
  +     * @param newParent the new parent directory
  +     */
  +    protected void afterNodeMoved(Directory oldParent, Directory newParent) {}
  +
   }
  
  
  



More information about the jboss-cvs-commits mailing list