[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