/** * Copyright (C) 2010-2017 Structr GmbH * * This file is part of Structr <http://structr.org>. * * Structr 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. * * Structr 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Structr. If not, see <http://www.gnu.org/licenses/>. */ package org.structr.web.entity.dom; import java.util.List; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.fail; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.structr.core.app.StructrApp; import org.structr.core.entity.AbstractNode; import org.structr.core.graph.CreateRelationshipCommand; import org.structr.core.graph.NodeInterface; import org.structr.core.graph.Tx; import org.structr.core.property.PropertyMap; import org.structr.dynamic.File; import org.structr.web.advanced.DOMTest; import org.structr.web.common.RenderContext; import org.structr.web.entity.FileBase; import org.structr.web.entity.Folder; import org.structr.web.entity.User; import org.structr.web.entity.relation.RenderNode; import org.w3c.dom.Element; /** * Test to render data mixed with markup * * */ public class RenderDataTest extends DOMTest { private static final Logger logger = LoggerFactory.getLogger(RenderDataTest.class.getName()); @Test public void testRenderFolderTree() { String name = null; try (final Tx tx = app.tx()) { final List<Folder> folders = createTestNodes(Folder.class, 7); final List<File> files = createTestNodes(File.class, 7); final Page doc = (Page) getDocument(); name = doc.getName(); assertEquals(7, folders.size()); Folder rootNode = folders.get(0); rootNode.setProperties(rootNode.getSecurityContext(), new PropertyMap(AbstractNode.name, "rootNode")); Folder folderA = folders.get(1); folderA.setProperties(folderA.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderA")); Folder folderB = folders.get(2); folderB.setProperties(folderB.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderB")); Folder folderC = folders.get(3); folderC.setProperties(folderC.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderC")); Folder folderD = folders.get(4); folderD.setProperties(folderD.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderD")); Folder folderE = folders.get(5); folderE.setProperties(folderE.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderE")); Folder folderF = folders.get(6); folderF.setProperties(folderF.getSecurityContext(), new PropertyMap(AbstractNode.name, "folderF")); FileBase file1 = files.get(0); file1.setProperties(file1.getSecurityContext(), new PropertyMap(AbstractNode.name, "file1")); FileBase file2 = files.get(1); file2.setProperties(file2.getSecurityContext(), new PropertyMap(AbstractNode.name, "file2")); FileBase file3 = files.get(2); file3.setProperties(file3.getSecurityContext(), new PropertyMap(AbstractNode.name, "file3")); FileBase file4 = files.get(3); file4.setProperties(file4.getSecurityContext(), new PropertyMap(AbstractNode.name, "file4")); FileBase file5 = files.get(4); file5.setProperties(file5.getSecurityContext(), new PropertyMap(AbstractNode.name, "file5")); FileBase file6 = files.get(5); file6.setProperties(file6.getSecurityContext(), new PropertyMap(AbstractNode.name, "file6")); FileBase file7 = files.get(6); file7.setProperties(file7.getSecurityContext(), new PropertyMap(AbstractNode.name, "file7")); rootNode.treeAppendChild(folderA); rootNode.treeAppendChild(folderB); rootNode.treeAppendChild(file1); rootNode.treeAppendChild(file2); folderA.treeAppendChild(folderC); folderA.treeAppendChild(folderD); folderA.treeAppendChild(file3); folderA.treeAppendChild(file4); folderB.treeAppendChild(folderE); folderB.treeAppendChild(folderF); folderB.treeAppendChild(file5); folderB.treeAppendChild(file6); makePublic(rootNode, folderA, folderB, folderC, folderD, folderE, folderF); makePublic(file1, file2, file3, file4, file5, file6, file7); // create dom tree Element html = doc.createElement("html"); doc.appendChild(html); Element body = doc.createElement("body"); html.appendChild(body); final Element div = doc.createElement("div"); body.appendChild(div); Content rootNameContent = (Content) doc.createTextNode("${root.name}"); div.appendChild(rootNameContent); final Element ul1 = doc.createElement("ul"); div.appendChild(ul1); final Element li1 = doc.createElement("li"); ul1.appendChild(li1); Content foldersNameContent = (Content) doc.createTextNode("${folders.name}"); li1.appendChild(foldersNameContent); final Element li2 = doc.createElement("li"); ul1.appendChild(li2); Content filesNameContent = (Content) doc.createTextNode("${files.name}"); li2.appendChild(filesNameContent); final Element ul2 = doc.createElement("ul"); li1.appendChild(ul2); final Element li3 = doc.createElement("li"); ul2.appendChild(li3); Content files2NameContent = (Content) doc.createTextNode("${files.name}"); li3.appendChild(files2NameContent); final Element li4 = doc.createElement("li"); ul2.appendChild(li4); Content folders2NameContent = (Content) doc.createTextNode("${folders.name}"); li4.appendChild(folders2NameContent); makePublic(rootNameContent, foldersNameContent, filesNameContent, files2NameContent, folders2NameContent); // create RENDER_NODE relationship between first ul and rootNode PropertyMap properties = new PropertyMap(); //properties.put(LinkedListNode.keyProperty, key); StructrApp.getInstance(securityContext).command(CreateRelationshipCommand.class).execute((DOMElement) div, (NodeInterface) rootNode, RenderNode.class, properties); ((DOMElement) div).setProperties(((DOMElement) div).getSecurityContext(), new PropertyMap(DOMElement.dataKey, "root")); ((DOMElement) li1).setProperties(((DOMElement) li1).getSecurityContext(), new PropertyMap(DOMElement.dataKey, "folders")); ((DOMElement) li2).setProperties(((DOMElement) li2).getSecurityContext(), new PropertyMap(DOMElement.dataKey, "files")); ((DOMElement) li3).setProperties(((DOMElement) li3).getSecurityContext(), new PropertyMap(DOMElement.dataKey, "files")); ((DOMElement) li4).setProperties(((DOMElement) li4).getSecurityContext(), new PropertyMap(DOMElement.dataKey, "folders")); makePublic(doc, html, body, div, ul1, ul2, li1, li2, li3, li4); tx.success(); } catch (Exception ex) { logger.warn("", ex); fail("Unexpected exception"); } try (final Tx tx = app.tx()) { org.jsoup.nodes.Document parsedDocument = Jsoup.connect(baseUri + name).get(); System.out.println(parsedDocument); assertEquals("rootNode", parsedDocument.select("html > body > div").get(0).ownText()); assertEquals("folderA", parsedDocument.select("html > body > div > ul > li").get(0).ownText()); assertEquals("folderB", parsedDocument.select("html > body > div > ul > li").get(1).ownText()); assertEquals("file1", parsedDocument.select("html > body > div > ul > li").get(2).ownText()); assertEquals("file2", parsedDocument.select("html > body > div > ul > li").get(3).ownText()); assertEquals("file3", parsedDocument.select("html > body > div > ul > li > ul > li").get(0).ownText()); assertEquals("file4", parsedDocument.select("html > body > div > ul > li > ul > li").get(1).ownText()); assertEquals("folderC", parsedDocument.select("html > body > div > ul > li > ul > li").get(2).ownText()); assertEquals("folderD", parsedDocument.select("html > body > div > ul > li > ul > li").get(3).ownText()); assertEquals("file5", parsedDocument.select("html > body > div > ul > li").get(1).child(0).child(0).ownText()); assertEquals("file6", parsedDocument.select("html > body > div > ul > li").get(1).child(0).child(1).ownText()); assertEquals("folderE", parsedDocument.select("html > body > div > ul > li").get(1).child(0).child(2).ownText()); assertEquals("folderF", parsedDocument.select("html > body > div > ul > li").get(1).child(0).child(3).ownText()); tx.success(); } catch (Exception ex) { logger.warn("", ex); fail("unexpected exception"); } } @Test public void testRenderListFromRestQuery() { String name = null; try (final Tx tx = app.tx()) { final Page doc = (Page) getDocument(); name = doc.getName(); final List<User> users = createTestNodes(User.class, 3); assertEquals(3, users.size()); User user1 = users.get(0); user1.setProperties(user1.getSecurityContext(), new PropertyMap(AbstractNode.name, "user1")); User user2 = users.get(1); user2.setProperties(user2.getSecurityContext(), new PropertyMap(AbstractNode.name, "user2")); User user3 = users.get(2); user3.setProperties(user3.getSecurityContext(), new PropertyMap(AbstractNode.name, "user3")); final List<File> files = createTestNodes(File.class, 6); assertEquals(6, files.size()); FileBase nodeA = files.get(0); nodeA.setProperties(nodeA.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileA")); FileBase nodeB = files.get(1); nodeB.setProperties(nodeB.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileB")); FileBase nodeC = files.get(2); nodeC.setProperties(nodeC.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileC")); FileBase nodeD = files.get(3); nodeD.setProperties(nodeD.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileD")); FileBase nodeE = files.get(4); nodeE.setProperties(nodeE.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileE")); FileBase nodeF = files.get(5); nodeF.setProperties(nodeF.getSecurityContext(), new PropertyMap(AbstractNode.name, "fileF")); // create dom tree Element html = doc.createElement("html"); Element body = doc.createElement("body"); Element b = doc.createElement("b"); final Element p1 = doc.createElement("p"); final PropertyMap p1Properties = new PropertyMap(); p1Properties.put(DOMElement.restQuery, "users?sort=name"); p1Properties.put(DOMElement.dataKey, "user"); ((DOMElement) p1).setProperties(((DOMElement) p1).getSecurityContext(), p1Properties); Content userNameContentNode = (Content) doc.createTextNode("${user.name}"); p1.appendChild(userNameContentNode); Element div = doc.createElement("div"); final Element p2 = doc.createElement("p"); final PropertyMap p2Properties = new PropertyMap(); p2Properties.put(DOMElement.restQuery, "files?sort=name"); p2Properties.put(DOMElement.dataKey, "file"); ((DOMElement) p2).setProperties(((DOMElement) p2).getSecurityContext(), p2Properties); Content fileNameContentNode = (Content) doc.createTextNode("${file.name}"); p2.appendChild(fileNameContentNode); doc.appendChild(html); html.appendChild(body); body.appendChild(b); body.appendChild(div); b.appendChild(p1); div.appendChild(p2); makePublic(doc, html, body, div, b, p1, p2, fileNameContentNode, userNameContentNode, nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, user1, user2, user3); System.out.println(doc.getContent(RenderContext.EditMode.CONTENT)); tx.success(); } catch (Exception ex) { logger.warn("", ex); fail("Unexpected exception"); } try (final Tx tx = app.tx()) { Document parsedDocument = Jsoup.connect(baseUri + name).get(); System.out.println(parsedDocument.outerHtml()); assertEquals("user1", parsedDocument.select("html > body > b > p").get(0).ownText()); assertEquals("user2", parsedDocument.select("html > body > b > p").get(1).ownText()); assertEquals("user3", parsedDocument.select("html > body > b > p").get(2).ownText()); assertEquals("fileA", parsedDocument.select("html > body > div > p").get(0).ownText()); assertEquals("fileB", parsedDocument.select("html > body > div > p").get(1).ownText()); assertEquals("fileC", parsedDocument.select("html > body > div > p").get(2).ownText()); assertEquals("fileD", parsedDocument.select("html > body > div > p").get(3).ownText()); assertEquals("fileE", parsedDocument.select("html > body > div > p").get(4).ownText()); assertEquals("fileF", parsedDocument.select("html > body > div > p").get(5).ownText()); tx.success(); } catch (Exception ex) { logger.warn("", ex); fail("unexpected exception"); } } }