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

Christian Bauer christian.bauer at jboss.com
Wed Feb 28 13:25:07 EST 2007


  User: cbauer  
  Date: 07/02/28 13:25:07

  Modified:    examples/wiki/src/org/jboss/seam/wiki/core/node        
                        DocumentHome.java Menu.java DirectoryHome.java
                        NodeBrowser.java
  Added:       examples/wiki/src/org/jboss/seam/wiki/core/node        
                        File.java ImageMetaInfo.java FileHome.java
  Removed:     examples/wiki/src/org/jboss/seam/wiki/core/node        
                        UIBindings.java
  Log:
  Basic file attachment/image embedding support
  
  Revision  Changes    Path
  1.7       +12 -31    jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/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/org/jboss/seam/wiki/core/node/DocumentHome.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -b -r1.6 -r1.7
  --- DocumentHome.java	27 Feb 2007 15:43:20 -0000	1.6
  +++ DocumentHome.java	28 Feb 2007 18:25:07 -0000	1.7
  @@ -1,7 +1,6 @@
   package org.jboss.seam.wiki.core.node;
   
   import static javax.faces.application.FacesMessage.SEVERITY_ERROR;
  -import javax.persistence.Query;
   
   import org.jboss.seam.framework.EntityHome;
   import org.jboss.seam.annotations.*;
  @@ -12,8 +11,6 @@
   import org.jboss.seam.core.Conversation;
   import org.jboss.seam.ScopeType;
   
  -import java.util.List;
  -
   @Name("documentHome")
   public class DocumentHome extends EntityHome<Document> {
   
  @@ -30,13 +27,13 @@
       @In
       private FacesMessages facesMessages;
   
  -    @In(create = true)
  +    @In
       private NodeBrowser browser;
   
  -    @In(create=true)
  +    @In
       private WikiLinkResolver wikiLinkResolver;
   
  -    @In(create = true)
  +    @In
       private NodeDAO nodeDAO;
   
       private String formContent;
  @@ -83,7 +80,7 @@
       public String persist() {
   
           // Validate
  -        if (!isUniqueWikinameInDirectory(null) ||
  +        if (!isUniqueWikinameInDirectory() ||
               !isUniqueWikinameInArea()) return null;
   
           // Link the document with a directory
  @@ -105,7 +102,7 @@
       public String update() {
   
           // Validate
  -        if (!isUniqueWikinameInDirectory(getInstance()) ||
  +        if (!isUniqueWikinameInDirectory() ||
               !isUniqueWikinameInArea()) return null;
   
           // Convert and set form content onto entity instance
  @@ -154,44 +151,28 @@
   
       // Validation rules for persist(), update(), and remove();
   
  -    @Transactional
  -    private boolean isUniqueWikinameInDirectory(Document 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) {
  +    private boolean isUniqueWikinameInDirectory() {
  +        Node foundNode = nodeDAO.findNodeInDirectory(parentDirectory, getInstance().getWikiname());
  +        if (foundNode != null && foundNode != getInstance()) {
               facesMessages.addToControlFromResourceBundleOrDefault(
                   "name",
                   SEVERITY_ERROR,
                   getMessageKeyPrefix() + "duplicateName",
  -                "Directory or document with that name already exists."
  +                "This name is already used, please change it."
               );
               return false;
           }
           return true;
       }
   
  -    @Transactional
       private boolean isUniqueWikinameInArea() {
  -        getEntityManager().joinTransaction();
  -        // Unique document name within area
  -        Document foundDocument = nodeDAO.findDocumentInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
  -        if ( foundDocument != null && foundDocument != getInstance()) {
  +        Node foundNode = nodeDAO.findNodeInArea(parentDirectory.getAreaNumber(), getInstance().getWikiname());
  +        if (foundNode != null && foundNode != getInstance()) {
               facesMessages.addToControlFromResourceBundleOrDefault(
                   "name",
                   SEVERITY_ERROR,
                   getMessageKeyPrefix() + "duplicateNameInArea",
  -                "Document with that name already exists in this area."
  +                "This name is already used in this area, please change it."
               );
               return false;
           }
  
  
  
  1.5       +3 -2      jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/Menu.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Menu.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/Menu.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -b -r1.4 -r1.5
  --- Menu.java	27 Feb 2007 13:21:45 -0000	1.4
  +++ Menu.java	28 Feb 2007 18:25:07 -0000	1.5
  @@ -6,12 +6,13 @@
   
   import java.util.List;
   import java.util.ArrayList;
  +import java.io.Serializable;
   
   @Name("menu")
   @Scope(ScopeType.CONVERSATION)
  -public class Menu {
  +public class Menu implements Serializable {
   
  -    @In(create = true)
  +    @In
       private Directory wikiRoot;
   
       private List<MenuItem> items;
  
  
  
  1.7       +2 -2      jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/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/org/jboss/seam/wiki/core/node/DirectoryHome.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -b -r1.6 -r1.7
  --- DirectoryHome.java	27 Feb 2007 15:43:20 -0000	1.6
  +++ DirectoryHome.java	28 Feb 2007 18:25:07 -0000	1.7
  @@ -34,10 +34,10 @@
       @In
       private FacesMessages facesMessages;
   
  -    @In(create = true)
  +    @In
       private NodeBrowser browser;
   
  -    @In(create=true)
  +    @In
       private NodeDAO nodeDAO;
   
       @Override
  
  
  
  1.5       +5 -12     jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/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/org/jboss/seam/wiki/core/node/NodeBrowser.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -b -r1.4 -r1.5
  --- NodeBrowser.java	27 Feb 2007 13:21:45 -0000	1.4
  +++ NodeBrowser.java	28 Feb 2007 18:25:07 -0000	1.5
  @@ -4,6 +4,7 @@
   import org.jboss.seam.ScopeType;
   import org.jboss.seam.Component;
   import org.jboss.seam.wiki.core.dao.NodeDAO;
  +import org.jboss.seam.wiki.core.links.WikiLinkResolver;
   
   import java.util.*;
   
  @@ -30,6 +31,7 @@
    */
   @Name("browser")
   @Scope(ScopeType.EVENT)
  + at AutoCreate
   public class NodeBrowser {
   
       @RequestParameter
  @@ -45,10 +47,10 @@
       @In
       protected org.jboss.seam.core.Redirect redirect;
   
  -    @In(create = true)
  +    @In
       protected Directory wikiRoot;
   
  -    @In(create = true)
  +    @In
       protected NodeDAO nodeDAO;
   
       // These are only EVENT scoped, we don't want them to jump from DocumentBrowser to
  @@ -141,7 +143,7 @@
               Directory area = nodeDAO.findArea(areaName);
               if (area != null) {
                   Node node = nodeDAO.findNodeInArea(area.getAreaNumber(), nodeName);
  -                if (isDirectory(node)) {
  +                if (WikiLinkResolver.isDirectory(node)) {
                       currentDirectory = (Directory)node;
                       currentDocument = currentDirectory.getDefaultDocument();
                    } else {
  @@ -171,13 +173,4 @@
           return "prepared";
       }
   
  -    // Replacement for missing instaceOf in EL (can't use string comparison, might be proxy)
  -    public static boolean isDirectory(Node node) {
  -        return node != null && Directory.class.isAssignableFrom(node.getClass());
  -    }
  -
  -    public static boolean isDocument(Node node) {
  -        return node != null && Document.class.isAssignableFrom(node.getClass());
  -    }
  -
   }
  
  
  
  1.1      date: 2007/02/28 18:25:07;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/File.java
  
  Index: File.java
  ===================================================================
  package org.jboss.seam.wiki.core.node;
  
  import org.hibernate.validator.Length;
  import org.hibernate.validator.Pattern;
  
  import javax.persistence.Entity;
  import javax.persistence.DiscriminatorValue;
  import javax.persistence.Column;
  import javax.persistence.Lob;
  import java.math.BigDecimal;
  
  @Entity
  @DiscriminatorValue("FILE")
  public class File extends Node {
  
      @Column(name = "FILENAME", length = 255)
      private String filename;
  
      @Column(name = "FILESIZE")
      private int filesize;
  
      @Lob
      @Column(name = "FILEDATA")
      private byte[] data;
  
      @Column(name = "CONTENT_TYPE")
      private String contentType;
  
      private ImageMetaInfo imageMetaInfo;
  
      public File() { super("New File"); }
  
      public File(String name) {
          super(name);
      }
  
      // Mutable properties
  
      public String getFilename() {
          return filename;
      }
  
      public void setFilename(String filename) {
          this.filename = filename;
      }
  
      public int getFilesize() {
          return filesize;
      }
  
      public void setFilesize(int filesize) {
          this.filesize = filesize;
      }
  
      public byte[] getData() {
          return data;
      }
  
      public void setData(byte[] data) {
          this.data = data;
          makeDirty();
      }
  
      public String getContentType() {
          return contentType;
      }
  
      public void setContentType(String contentType) {
          this.contentType = contentType;
          makeDirty();
      }
  
      public ImageMetaInfo getImageMetaInfo() {
          return imageMetaInfo;
      }
  
      public void setImageMetaInfo(ImageMetaInfo imageMetaInfo) {
          this.imageMetaInfo = imageMetaInfo;
          makeDirty();
      }
  
      public Directory getParent() {
          return (Directory)super.getParent();
      }
  
      public void addChild(Node child) {
          throw new UnsupportedOperationException("Files can't have children");
      }
  
      public void removeChild(Node child) {
          throw new UnsupportedOperationException("Files can't have children");
      }
  
      public String toString() {
          return getName();
      }
  
      public String getHumanReadableFilesize() {
          // TODO: Yeah, that could be done smarter..
          if (getFilesize() >= 1073741824) {
              return new BigDecimal(getFilesize() / 1024 / 1024 / 1024) + " GiB";
          }else if (getFilesize() >= 1048576) {
              return new BigDecimal(getFilesize() / 1024 / 1024) + "MiB";
          } else if (getFilesize() >= 1024) {
              return new BigDecimal(getFilesize() / 1024) + " KiB";
          } else {
              return new BigDecimal(getFilesize()) + " Bytes";
          }
      }
  
  }
  
  
  
  1.1      date: 2007/02/28 18:25:07;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/ImageMetaInfo.java
  
  Index: ImageMetaInfo.java
  ===================================================================
  package org.jboss.seam.wiki.core.node;
  
  import javax.persistence.Embeddable;
  import javax.persistence.Column;
  
  @Embeddable
  public class ImageMetaInfo {
  
      @Column(name = "IMAGE_SIZE_X")
      private int sizeX;
  
      @Column(name = "IMAGE_SIZE_Y")
      private int sizeY;
  
      @Column(name = "IMAGE_THUMBNAIL")
      private char thumbnail = 'A'; // Disable embedding by default, attach
  
  
      public ImageMetaInfo() {}
  
      public ImageMetaInfo(int sizeX, int sizeY, boolean embeddable, char thumbnail) {
          this.sizeX = sizeX;
          this.sizeY = sizeY;
          this.thumbnail = thumbnail;
      }
  
      public int getSizeX() {
          return sizeX;
      }
  
      public void setSizeX(int sizeX) {
          this.sizeX = sizeX;
      }
  
      public int getSizeY() {
          return sizeY;
      }
  
      public void setSizeY(int sizeY) {
          this.sizeY = sizeY;
      }
  
  
      public char getThumbnail() {
          return thumbnail;
      }
  
      public void setThumbnail(char thumbnail) {
          this.thumbnail = thumbnail;
      }
  
      public boolean equals(Object o) {
          if (this == o) return true;
          if (o == null || getClass() != o.getClass()) return false;
  
          ImageMetaInfo that = (ImageMetaInfo) o;
  
          if (sizeX != that.sizeX) return false;
          if (sizeY != that.sizeY) return false;
          if (thumbnail != that.thumbnail) return false;
  
          return true;
      }
  
      public int hashCode() {
          int result;
          result = sizeX;
          result = 31 * result + sizeY;
          result = 31 * result + (int) thumbnail;
          return result;
      }
  }
  
  
  
  1.1      date: 2007/02/28 18:25:07;  author: cbauer;  state: Exp;jboss-seam/examples/wiki/src/org/jboss/seam/wiki/core/node/FileHome.java
  
  Index: FileHome.java
  ===================================================================
  package org.jboss.seam.wiki.core.node;
  
  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.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;
  
      @In
      Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
  
      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;
  
      @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; }
  
      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; }
  
      private void syncFile() {
          if (filedata != null && filedata.length >0) {
              getInstance().setFilename(filename);
              getInstance().setFilesize(filedata.length); // Don't trust the browsers headers!
              getInstance().setData(filedata);
              getInstance().setContentType(contentType);
  
              // Handle image/picture meta info
              if (fileMetaMap.get(getInstance().getContentType()).image) {
  
                  ImageMetaInfo imageMetaInfo =
                          getInstance().getImageMetaInfo() != null
                                  ? getInstance().getImageMetaInfo()
                                  : new ImageMetaInfo();
                  getInstance().setImageMetaInfo(imageMetaInfo);
  
                  ImageIcon icon = new ImageIcon(getInstance().getData());
                  int imageSizeX = icon.getImage().getWidth(null);
                  int imageSizeY = icon.getImage().getHeight(null);
                  getInstance().getImageMetaInfo().setSizeX(imageSizeX);
                  getInstance().getImageMetaInfo().setSizeY(imageSizeY);
              }
          }
      }
  
      public int getImagePreviewSize() {
          return imagePreviewSize;
      }
  
      public void zoomPreviewIn() {
          if (imagePreviewSize < 1600) imagePreviewSize = imagePreviewSize + 240;
      }
  
      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;
      }
  }
  
  
  



More information about the jboss-cvs-commits mailing list