View Javadoc
1   package org.argeo.cms.ui.internal;
2   
3   import static javax.jcr.nodetype.NodeType.NT_FILE;
4   
5   import java.io.IOException;
6   import java.io.InputStream;
7   
8   import javax.jcr.Node;
9   import javax.jcr.Property;
10  import javax.jcr.RepositoryException;
11  import javax.jcr.nodetype.NodeType;
12  
13  import org.apache.commons.io.FilenameUtils;
14  import org.argeo.cms.CmsException;
15  import org.argeo.cms.ui.CmsImageManager;
16  import org.argeo.jcr.JcrUtils;
17  import org.eclipse.rap.fileupload.FileDetails;
18  import org.eclipse.rap.fileupload.FileUploadReceiver;
19  
20  public class JcrFileUploadReceiver extends FileUploadReceiver {
21  	private final Node parentNode;
22  	private final String nodeName;
23  	private final CmsImageManager imageManager;
24  
25  	/** If nodeName is null, use the uploaded file name */
26  	public JcrFileUploadReceiver(Node parentNode, String nodeName, CmsImageManager imageManager) {
27  		super();
28  		this.parentNode = parentNode;
29  		this.nodeName = nodeName;
30  		this.imageManager = imageManager;
31  	}
32  
33  	@Override
34  	public void receive(InputStream stream, FileDetails details) throws IOException {
35  		try {
36  			String fileName = nodeName != null ? nodeName : details.getFileName();
37  			String contentType = details.getContentType();
38  			if (isImage(details.getFileName(), contentType)) {
39  				imageManager.uploadImage(parentNode, fileName, stream);
40  				return;
41  				// InputStream inputStream = new ByteArrayInputStream(arr);
42  				// ImageData id = new ImageData(inputStream);
43  				// fileNode.addMixin(CmsTypes.CMS_IMAGE);
44  				// fileNode.setProperty(CMS_IMAGE_WIDTH, id.width);
45  				// fileNode.setProperty(CMS_IMAGE_HEIGHT, id.height);
46  			}
47  
48  			Node fileNode;
49  			if (parentNode.hasNode(fileName)) {
50  				fileNode = parentNode.getNode(fileName);
51  				if (!fileNode.isNodeType(NT_FILE))
52  					fileNode.remove();
53  			}
54  			fileNode = JcrUtils.copyStreamAsFile(parentNode, fileName, stream);
55  
56  			if (contentType != null) {
57  				fileNode.addMixin(NodeType.MIX_MIMETYPE);
58  				fileNode.setProperty(Property.JCR_MIMETYPE, contentType);
59  			}
60  			processNewFile(fileNode);
61  			fileNode.getSession().save();
62  		} catch (RepositoryException e) {
63  			throw new CmsException("cannot receive " + details, e);
64  		}
65  	}
66  
67  	protected Boolean isImage(String fileName, String contentType) {
68  		String ext = FilenameUtils.getExtension(fileName);
69  		return ext != null && (ext.equals("png") || ext.equalsIgnoreCase("jpg"));
70  	}
71  
72  	protected void processNewFile(Node node) {
73  
74  	}
75  
76  }