/** * This file is part of the JCROM project. * Copyright (C) 2008-2014 - All rights reserved. * Authors: Olafur Gauti Gudmundsson, Nicolas Dos Santos * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jcrom.jackrabbit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.SimpleCredentials; import org.jcrom.JcrFile; import org.jcrom.Jcrom; import org.jcrom.SessionFactory; import org.jcrom.SessionFactoryImpl; import org.jcrom.dao.TreeDAO; import org.jcrom.entities.DynamicObject; import org.jcrom.entities.LazyInterface; import org.jcrom.entities.LazyObject; import org.jcrom.entities.Tree; import org.jcrom.entities.TreeNode; import org.junit.Test; /** * * @author Olafur Gauti Gudmundsson * @author Nicolas Dos Santos */ public class TestLazyLoading extends TestAbstract { @Test public void testLazyLoading() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(Tree.class).map(LazyObject.class); TreeNode homeNode = new TreeNode(); homeNode.setName("home"); TreeNode newsNode = new TreeNode(); newsNode.setName("news"); TreeNode productsNode = new TreeNode(); productsNode.setName("products"); TreeNode templateNode = new TreeNode(); templateNode.setName("template"); homeNode.addChild(newsNode); homeNode.addChild(productsNode); LazyInterface lazyObject1 = new LazyObject(); lazyObject1.setName("one"); lazyObject1.setString("a"); LazyInterface lazyObject2 = new LazyObject(); lazyObject2.setName("two"); lazyObject2.setString("b"); Tree tree = new Tree(); tree.setName("Tree"); tree.setPath("/"); tree.addChild(homeNode); tree.setTemplateNode(templateNode); tree.setLazyObject(lazyObject1); tree.addLazyObject(lazyObject1); tree.addLazyObject(lazyObject2); Node treeRootNode = jcrom.addNode(session.getRootNode(), tree); Tree fromNode = jcrom.fromNode(Tree.class, treeRootNode); assertEquals(tree.getChildren().size(), fromNode.getChildren().size()); assertEquals(lazyObject1.getString(), fromNode.getLazyObject().getString()); assertEquals(tree.getLazyObjects().size(), fromNode.getLazyObjects().size()); assertEquals(lazyObject2.getString(), fromNode.getLazyObjects().get(1).getString()); assertNull(fromNode.getStartNode()); TreeNode homeFromNode = fromNode.getChildren().get(0); assertTrue(homeFromNode.getChildren().size() == homeNode.getChildren().size()); assertTrue(homeFromNode.getChildren().get(0).getName().equals(newsNode.getName())); // add references fromNode.addFavourite(newsNode); fromNode.setStartNode(productsNode); jcrom.updateNode(treeRootNode, fromNode); Tree modifiedFromNode = jcrom.fromNode(Tree.class, treeRootNode); assertTrue(modifiedFromNode.getFavourites().size() == fromNode.getFavourites().size()); assertTrue(modifiedFromNode.getStartNode().getName().equals(productsNode.getName())); assertTrue(modifiedFromNode.getStartNode().getChildren().size() == productsNode.getChildren().size()); // Additional test for Issue 94 // Delete favorites modifiedFromNode.setFavourites(null); jcrom.updateNode(treeRootNode, modifiedFromNode); Tree remodifiedFromNode = jcrom.fromNode(Tree.class, treeRootNode); assertTrue(remodifiedFromNode.getFavourites().isEmpty()); } @Test public void testDynamicMaps() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(DynamicObject.class).map(TreeNode.class); TreeNode node1 = new TreeNode("node1"); TreeNode node2 = new TreeNode("node2"); List<Object> treeNodes = new ArrayList<Object>(); treeNodes.add(new TreeNode("multiNode1")); treeNodes.add(new TreeNode("multiNode2")); JcrFile file1 = TestMapping.createFile("file1.jpg"); JcrFile file2 = TestMapping.createFile("file2.jpg"); List<JcrFile> files = new ArrayList<JcrFile>(); files.add(TestMapping.createFile("multifile1.jpg")); files.add(TestMapping.createFile("multifile2.jpg")); DynamicObject dynamicObj = new DynamicObject(); dynamicObj.setName("dynamic"); String myNode1Name = "my_" + node1.getName(); dynamicObj.putSingleValueChild(myNode1Name, node1); String myNode2Name = "my_" + node2.getName(); dynamicObj.putSingleValueChild(myNode2Name, node2); dynamicObj.putMultiValueChild("many", treeNodes); dynamicObj.putSingleFile(file1.getName(), file1); dynamicObj.putSingleFile(file2.getName(), file2); dynamicObj.putMultiFile("manyFiles", files); Node newNode = jcrom.addNode(session.getRootNode(), dynamicObj); DynamicObject fromNode = jcrom.fromNode(DynamicObject.class, newNode); assertTrue(fromNode.getSingleValueChildren().size() == dynamicObj.getSingleValueChildren().size()); assertTrue(fromNode.getMultiValueChildren().size() == dynamicObj.getMultiValueChildren().size()); TreeNode node1FromList = (TreeNode) fromNode.getMultiValueChildren().get("many").get(0); assertEquals("multiNode1", node1FromList.getName()); TreeNode node2FromList = (TreeNode) fromNode.getMultiValueChildren().get("many").get(1); assertEquals("multiNode2", node2FromList.getName()); TreeNode node1FromNode = (TreeNode) fromNode.getSingleValueChildren().get(myNode1Name); assertTrue(node1FromNode.getName().equals(node1.getName())); TreeNode node2FromNode = (TreeNode) fromNode.getSingleValueChildren().get(myNode2Name); assertTrue(node2FromNode.getName().equals(node2.getName())); assertTrue(fromNode.getSingleFiles().size() == dynamicObj.getSingleFiles().size()); assertTrue(fromNode.getMultiFiles().size() == dynamicObj.getMultiFiles().size()); assertTrue(fromNode.getSingleFiles().get(file1.getName()).getMimeType().equals(file1.getMimeType())); assertTrue(fromNode.getSingleFiles().get(file2.getName()).getMimeType().equals(file2.getMimeType())); assertTrue(fromNode.getMultiFiles().get("manyFiles").get(0).getName().equals("multifile1.jpg")); assertTrue(fromNode.getMultiFiles().get("manyFiles").get(1).getName().equals("multifile2.jpg")); fromNode.getSingleFiles().get(file1.getName()).getDataProvider().getInputStream().available(); fromNode.getSingleFiles().get(file2.getName()).getDataProvider().getInputStream().available(); TreeNode ref1 = new TreeNode("ref1"); TreeNode ref2 = new TreeNode("ref2"); jcrom.addNode(session.getRootNode(), ref1); jcrom.addNode(session.getRootNode(), ref2); List<Object> multiRefs = new ArrayList<Object>(); multiRefs.add(ref1); multiRefs.add(ref2); fromNode.putSingleReference(ref1.getName(), ref1); fromNode.putSingleReference(ref2.getName(), ref2); fromNode.putMultiReference("manyRefs", multiRefs); jcrom.updateNode(newNode, fromNode); session.save(); DynamicObject updatedNode = jcrom.fromNode(DynamicObject.class, newNode); assertTrue(updatedNode.getSingleReferences().size() == fromNode.getSingleReferences().size()); assertTrue(updatedNode.getMultiReferences().size() == fromNode.getMultiReferences().size()); TreeNode ref1FromList = (TreeNode) updatedNode.getMultiReferences().get("manyRefs").get(0); assertTrue(ref1FromList.getName().equals(ref1.getName())); TreeNode ref2FromList = (TreeNode) updatedNode.getMultiReferences().get("manyRefs").get(1); assertTrue(ref2FromList.getName().equals(ref2.getName())); TreeNode ref1FromNode = (TreeNode) updatedNode.getSingleReferences().get(ref1.getName()); assertTrue(ref1FromNode.getName().equals(ref1.getName())); TreeNode ref2FromNode = (TreeNode) updatedNode.getSingleReferences().get(ref2.getName()); assertTrue(ref2FromNode.getName().equals(ref2.getName())); } @Test public void testLazyLoadingWithSessionFactory() throws Exception { SessionFactory sessionFactory = new SessionFactoryImpl(repo, new SimpleCredentials(userID, password)); Jcrom jcrom = new Jcrom(true, true); jcrom.map(Tree.class).map(LazyObject.class); jcrom.setSessionFactory(sessionFactory); TreeDAO dao = new TreeDAO(jcrom); TreeNode homeNode = new TreeNode(); homeNode.setName("home"); TreeNode newsNode = new TreeNode(); newsNode.setName("news"); TreeNode productsNode = new TreeNode(); productsNode.setName("products"); TreeNode templateNode = new TreeNode(); templateNode.setName("template"); homeNode.addChild(newsNode); homeNode.addChild(productsNode); LazyInterface lazyObject1 = new LazyObject(); lazyObject1.setName("one"); lazyObject1.setString("a"); LazyInterface lazyObject2 = new LazyObject(); lazyObject2.setName("two"); lazyObject2.setString("b"); Tree tree = new Tree(); tree.setName("Tree"); tree.setPath("/"); tree.addChild(homeNode); tree.setTemplateNode(templateNode); tree.setLazyObject(lazyObject1); tree.addLazyObject(lazyObject1); tree.addLazyObject(lazyObject2); Tree createdTree = dao.create(tree); //Node treeRootNode = jcrom.addNode(session.getRootNode(), tree); Tree loadedTree = dao.loadById(createdTree.getUuid()); //Tree fromNode = jcrom.fromNode(Tree.class, treeRootNode); assertEquals(tree.getChildren().size(), loadedTree.getChildren().size()); assertEquals(lazyObject1.getString(), loadedTree.getLazyObject().getString()); assertEquals(tree.getLazyObjects().size(), loadedTree.getLazyObjects().size()); assertEquals(lazyObject2.getString(), loadedTree.getLazyObjects().get(1).getString()); assertNull(loadedTree.getStartNode()); TreeNode homeFromNode = loadedTree.getChildren().get(0); assertTrue(homeFromNode.getChildren().size() == homeNode.getChildren().size()); assertTrue(homeFromNode.getChildren().get(0).getName().equals(newsNode.getName())); // add references loadedTree.addFavourite(newsNode); loadedTree.setStartNode(productsNode); loadedTree = dao.update(loadedTree); //jcrom.updateNode(treeRootNode, fromNode); Tree modifiedTree = dao.loadById(createdTree.getUuid()); //Tree modifiedFromNode = jcrom.fromNode(Tree.class, treeRootNode); assertTrue(modifiedTree.getFavourites().size() == loadedTree.getFavourites().size()); assertTrue(modifiedTree.getStartNode().getName().equals(productsNode.getName())); assertTrue(modifiedTree.getStartNode().getChildren().size() == productsNode.getChildren().size()); } }