/*************************************************************************** * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. * **************************************************************************/ package org.exoplatform.services.ecm.dms.thumbnail; import java.io.InputStream; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.List; import javax.imageio.ImageIO; import javax.jcr.Node; import javax.jcr.Value; import javax.jcr.ValueFactory; import org.exoplatform.services.cms.impl.ImageUtils; import org.exoplatform.services.cms.thumbnail.ThumbnailService; import org.exoplatform.services.jcr.impl.core.NodeImpl; import org.exoplatform.services.wcm.BaseWCMTestCase; /** * Created by The eXo Platform SARL * Author : Hoang Van Hung * hunghvit@gmail.com * Jun 20, 2009 */ public class TestThumbnailService extends BaseWCMTestCase { private ThumbnailService thumbnailService; public void setUp() throws Exception { super.setUp(); thumbnailService = (ThumbnailService)container.getComponentInstanceOfType(ThumbnailService.class); applySystemSession(); } /** * Test method ThumbnailService.addThumbnailNode() * Input: Node test with no thumbnail node folder * Expect: Node with name = identifier of test node in ThumbnailService.EXO_THUMBNAILS_FOLDER node exists * @throws Exception */ public void testAddThumbnailNode1() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); assertFalse(test.getParent().hasNode(ThumbnailService.EXO_THUMBNAILS_FOLDER)); thumbnailService.addThumbnailNode(test); assertTrue(test.getParent().hasNode(ThumbnailService.EXO_THUMBNAILS_FOLDER)); Node thumbnailFoder = test.getParent().getNode(ThumbnailService.EXO_THUMBNAILS_FOLDER); String identifier = ((NodeImpl)test).getInternalIdentifier(); assertTrue(thumbnailFoder.hasNode(identifier)); } /** * Test method ThumbnailService.addThumbnailNode() * Input: Node test with thumbnail node folder * Expect: Node with name = identifier of test node in ThumbnailService.EXO_THUMBNAILS_FOLDER node exists * @throws Exception */ public void testAddThumbnailNode2() throws Exception { Node test = session.getRootNode().addNode("test"); test.getParent().addNode(ThumbnailService.EXO_THUMBNAILS_FOLDER, ThumbnailService.EXO_THUMBNAILS); session.save(); assertTrue(test.getParent().hasNode(ThumbnailService.EXO_THUMBNAILS_FOLDER)); thumbnailService.addThumbnailNode(test); assertTrue(test.getParent().hasNode(ThumbnailService.EXO_THUMBNAILS_FOLDER)); Node thumbnailFoder = test.getParent().getNode(ThumbnailService.EXO_THUMBNAILS_FOLDER); String identifier = ((NodeImpl)test).getInternalIdentifier(); assertTrue(thumbnailFoder.hasNode(identifier)); } /** * Test method ThumbnailService.getFlowImages() * Input: Add node test * Expect: return empty list images of node test * @throws Exception */ public void testGetFlowImages1() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); List<Node> lstFlowImages = thumbnailService.getFlowImages(test); assertEquals(0, lstFlowImages.size()); } /** * Test method ThumbnailService.getFlowImages() * Input: Add node test, add node childTest. getFlowImages of test * Expect: return list images of childTest node with one node name = identifier of childTest node * @throws Exception */ public void testGetFlowImages2() throws Exception { Node test = session.getRootNode().addNode("test"); Node childTest = test.addNode("childTest"); session.save(); Node thumbnail = thumbnailService.addThumbnailNode(childTest); thumbnail.hasProperty(ThumbnailService.BIG_SIZE); InputStream is = getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"); Value contentValue = session.getValueFactory().createValue(is); thumbnail.setProperty(ThumbnailService.BIG_SIZE, contentValue); thumbnail.save(); session.save(); thumbnail.getPrimaryNodeType().getName(); thumbnail.hasProperty(ThumbnailService.BIG_SIZE); List<Node> lstFlowImages = thumbnailService.getFlowImages(test); String identifier = ((NodeImpl) childTest).getInternalIdentifier(); assertTrue(test.hasNode(ThumbnailService.EXO_THUMBNAILS_FOLDER)); Node thumbnailFolder = test.getNode(ThumbnailService.EXO_THUMBNAILS_FOLDER); assertTrue(thumbnailFolder.hasNode(identifier)); assertTrue(lstFlowImages.contains(childTest)); } /** * Test method ThumbnailService.getAllFileInNode() * Input: Add 2 node (file1 and file2) with node type = nt:file * Expect: List of 2 node file1 and file2 * @throws Exception */ public void testGetAllFileInNode() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); Node file1 = test.addNode("file1", "nt:file"); file1.addNode("jcr:content", "nt:resource"); Value contentValue = session.getValueFactory().createValue("test"); file1.getNode("jcr:content").setProperty("jcr:data", contentValue); file1.getNode("jcr:content").setProperty("jcr:mimeType", "text/xml"); file1.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); Node file2 = test.addNode("file2", "nt:file"); file2.addNode("jcr:content", "nt:resource"); file2.getNode("jcr:content").setProperty("jcr:data", contentValue); file2.getNode("jcr:content").setProperty("jcr:mimeType", "text/xml"); file2.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); test.save(); session.save(); List<Node> lstNode = thumbnailService.getAllFileInNode(test); assertEquals(2, lstNode.size()); assertTrue(lstNode.contains(file1)); assertTrue(lstNode.contains(file2)); } /** * Test method ThumbnailService.getFileNodesByType() * Input: Add 2 node (file1 and file2) with node type = nt:file * file1 has child node jcr:content with mimeType = text/xml * file1 has child node jcr:content with mimeType = text/html * Expect: with type = text/xml return list of 1 node (file1) * with type = text/xml return list of 1 node (file2) * @throws Exception */ public void testGetFileNodesByType() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); Node file1 = test.addNode("file1", "nt:file"); file1.addNode("jcr:content", "nt:resource"); Value contentValue = session.getValueFactory().createValue("test"); file1.getNode("jcr:content").setProperty("jcr:data", contentValue); file1.getNode("jcr:content").setProperty("jcr:mimeType", "text/xml"); file1.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); Node file2 = test.addNode("file2", "nt:file"); file2.addNode("jcr:content", "nt:resource"); file2.getNode("jcr:content").setProperty("jcr:data", contentValue); file2.getNode("jcr:content").setProperty("jcr:mimeType", "text/html"); file2.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); test.save(); session.save(); List<Node> lstNode1 = thumbnailService.getFileNodesByType(test, "text/xml"); assertEquals(1, lstNode1.size()); assertTrue(lstNode1.contains(file1)); assertEquals(lstNode1.get(0), file1); List<Node> lstNode2 = thumbnailService.getFileNodesByType(test, "text/html"); assertEquals(1, lstNode2.size()); assertTrue(lstNode2.contains(file2)); assertEquals(lstNode2.get(0), file2); } /** * Test method ThumbnailService.addThumbnailImage() * Input: Node: thumbnail, resource /conf/dms/artifacts/images/ThumnailView.jpg, size = ThumbnailService.SMALL_SIZE * Expect: data in property exo:smallSize of thumbmail node is resource with height*width = 32x32 * @throws Exception */ public void testAddThumbnailImage() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); Node childTest = thumbnailService.addThumbnailNode(test); Value value = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 32, 32)); thumbnailService.addThumbnailImage(childTest, ImageIO.read(getClass().getResource("/conf/dms/artifacts/images/ThumnailView.jpg").openStream()), ThumbnailService.SMALL_SIZE); assertNotNull(value); } /** * Test method ThumbnailService.getThumbnailImage() * Input: add thumbnail image to childTest node with resource = /conf/dms/artifacts/images/ThumnailView.jpg, size = ThumbnailService.SMALL_SIZE * Expect: property exo:smallSize contains data of resource = /conf/dms/artifacts/images/ThumnailView.jpg * @throws Exception */ public void testGetThumbnailImage() throws Exception { Node test = session.getRootNode().addNode("test"); assertNull(thumbnailService.getThumbnailImage(test, "exo:smallSize")); Node childTest = thumbnailService.addThumbnailNode(test); // Value value = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 32, 32)); thumbnailService.addThumbnailImage(childTest, ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), ThumbnailService.SMALL_SIZE); assertNotNull(childTest.getProperty(ThumbnailService.SMALL_SIZE).getValue()); } /** * Test method ThumbnailService.createSpecifiedThumbnail() * Input: resource = /conf/dms/artifacts/images/ThumnailView.jpg, mimeType = image/jpeg, node = test * Output: thumbnail node has property exo:smallSize contains data of resource * /conf/dms/artifacts/images/ThumnailView.jpg which is scale by size = 32*32 * @throws Exception */ public void testCreateSpecifiedThumbnail() throws Exception { Node test = session.getRootNode().addNode("test"); // Value value = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 32, 32)); thumbnailService.createSpecifiedThumbnail(test, ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), ThumbnailService.SMALL_SIZE); Node thumbnail = thumbnailService.getThumbnailNode(test); assertNotNull(thumbnail.getProperty(ThumbnailService.SMALL_SIZE).getValue()); } /** * Test method ThumbnailService.createThumbnailImage() * Input: resource = /conf/dms/artifacts/images/ThumnailView.jpg, mimeType = image/jpeg, node = test * Output: thumbnail node has 3 property exo:smallSize, exo:midiumSize, exo:bigSize contain data of resource * /conf/dms/artifacts/images/ThumnailView.jpg which is scale by size = 32*32, 64*64, 300*300 respectively * @throws Exception */ public void testCreateThumbnailImage() throws Exception { Node test = session.getRootNode().addNode("test"); // Value value1 = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 32, 32)); // Value value2 = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 64, 64)); // Value value3 = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 300, 300)); InputStream is = getClass().getResource("/conf/dms/artifacts/images/ThumnailView.jpg").openStream(); thumbnailService.createThumbnailImage(test, ImageIO.read(is), "image/jpeg"); Node thumbnail = thumbnailService.getThumbnailNode(test); assertNotNull(thumbnail.getProperty(ThumbnailService.SMALL_SIZE).getValue().getStream()); assertNotNull(thumbnail.getProperty(ThumbnailService.MEDIUM_SIZE).getValue()); assertNotNull(thumbnail.getProperty(ThumbnailService.BIG_SIZE).getValue()); } /** * Test method ThumbnailService.processThumbnailList() * Input: List child node, 3 in 4 node are nt:file node type, data in nt:file has mimeType = image/jpeg * binary data = /conf/dms/artifacts/images/ThumnailView.jpg, propertyName = SMALL_SIZE * Output: Create thumbnail node for each node in list, each node has property = SMALL_SIZE * with binary data = /conf/dms/artifacts/images/ThumnailView.jpg * @throws Exception */ public void testProcessThumbnailList() throws Exception { Node test = session.getRootNode().addNode("test2"); Node child1 = test.addNode("child1", "nt:file"); child1.addNode("jcr:content", "nt:resource"); ValueFactory valueFactory = session.getValueFactory(); child1.getNode("jcr:content").setProperty("jcr:data", valueFactory.createValue(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"))); child1.getNode("jcr:content").setProperty("jcr:mimeType", "image/jpeg"); child1.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); Node child2 = test.addNode("child2", "nt:file"); child2.addNode("jcr:content", "nt:resource"); valueFactory = session.getValueFactory(); child2.getNode("jcr:content").setProperty("jcr:data", valueFactory.createValue(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"))); child2.getNode("jcr:content").setProperty("jcr:mimeType", "image/jpeg"); child2.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); Node child3 = test.addNode("child3", "nt:file"); child3.addNode("jcr:content", "nt:resource"); child3.getNode("jcr:content").setProperty("jcr:data", valueFactory.createValue(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"))); child3.getNode("jcr:content").setProperty("jcr:mimeType", "image/jpeg"); child3.getNode("jcr:content").setProperty("jcr:lastModified", new GregorianCalendar()); Node child4 = test.addNode("child4"); List<Node> lstNode = new ArrayList<Node>(); lstNode.add(child1); lstNode.add(child2); lstNode.add(child3); lstNode.add(child4); session.save(); thumbnailService.processThumbnailList(lstNode, ThumbnailService.SMALL_SIZE); assertTrue(session.itemExists("/test2/" + ThumbnailService.EXO_THUMBNAILS_FOLDER)); Node thumbnailsFolder = (Node)session.getItem("/test2/" + ThumbnailService.EXO_THUMBNAILS_FOLDER); assertTrue(thumbnailsFolder.hasNode(((NodeImpl)child1).getInternalIdentifier())); assertTrue(thumbnailsFolder.hasNode(((NodeImpl)child2).getInternalIdentifier())); assertTrue(thumbnailsFolder.hasNode(((NodeImpl)child3).getInternalIdentifier())); assertTrue(thumbnailsFolder.hasNode(((NodeImpl)child4).getInternalIdentifier())); Node thumbnailImage1 = thumbnailsFolder.getNode(((NodeImpl)child1).getInternalIdentifier()); Node thumbnailImage2 = thumbnailsFolder.getNode(((NodeImpl)child2).getInternalIdentifier()); Node thumbnailImage3 = thumbnailsFolder.getNode(((NodeImpl)child3).getInternalIdentifier()); //Value value = session.getValueFactory().createValue(ImageUtils.scaleImage(ImageIO.read(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg")), 32, 32)); assertNotNull(thumbnailImage1.getProperty(ThumbnailService.SMALL_SIZE).getValue()); assertNotNull(thumbnailImage2.getProperty(ThumbnailService.SMALL_SIZE).getValue()); assertNotNull(thumbnailImage3.getProperty(ThumbnailService.SMALL_SIZE).getValue()); } /** * Test method ThumbnailService.getThumbnailNode() * Input: 1.test node * 2. add thumbnail node for test node * Output: 1. thumbnail of test node = null * 2. return thumbnail node of test node * @throws Exception */ public void testGetThumbnailNode() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); Node thumbnail = thumbnailService.getThumbnailNode(test); assertNull(thumbnail); thumbnailService.addThumbnailNode(test); thumbnail = thumbnailService.getThumbnailNode(test); assertNotNull(thumbnail); assertEquals(((NodeImpl)test).getInternalIdentifier(), thumbnail.getName()); } /** * Test method ThumbnailService.processRemoveThumbnail() * Input: test node whether or not thumbnail node exists * Output: Delete thumbnail node of test node if it exists * @throws Exception */ public void testProcessRemoveThumbnail() throws Exception { Node test = session.getRootNode().addNode("test"); session.save(); String identifier = ((NodeImpl)test).getInternalIdentifier(); thumbnailService.processRemoveThumbnail(test); assertFalse(session.itemExists("/" + ThumbnailService.EXO_THUMBNAILS_FOLDER + "/" + identifier)); thumbnailService.addThumbnailNode(test); assertTrue(session.itemExists("/" + ThumbnailService.EXO_THUMBNAILS_FOLDER + "/" + identifier)); thumbnailService.processRemoveThumbnail(test); assertFalse(session.itemExists("/" + ThumbnailService.EXO_THUMBNAILS_FOLDER + "/" + identifier)); } /** * Clean data */ public void tearDown() throws Exception { String[] paths = {"test2", "test", ThumbnailService.EXO_THUMBNAILS_FOLDER}; for (String path : paths) { if (session.getRootNode().hasNode(path)) { session.getRootNode().getNode(path).remove(); session.save(); } } session.logout(); super.tearDown(); } }