REPO-1110 - Apply patch provided in ALF-21632 (FreeMarker performance improvement)

ALF-21632 - FreeMarker API node.childByNamePath can be very slow
- Added test cases

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@132561 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Stefan Kopf
2016-11-08 13:29:33 +00:00
parent c6f82e5489
commit 2a37b4e180
2 changed files with 73 additions and 28 deletions

View File

@@ -25,31 +25,36 @@
*/ */
package org.alfresco.repo.template; package org.alfresco.repo.template;
import java.io.InputStream; import java.io.InputStream;
import java.io.StringWriter; import java.io.Serializable;
import java.util.HashMap; import java.io.StringWriter;
import java.util.Map; import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import junit.framework.TestCase;
import org.alfresco.repo.dictionary.DictionaryComponent;
import org.alfresco.repo.dictionary.DictionaryDAO; import org.alfresco.model.ContentModel;
import org.alfresco.repo.dictionary.M2Model; import org.alfresco.repo.dictionary.DictionaryComponent;
import org.alfresco.repo.node.BaseNodeServiceTest; import org.alfresco.repo.dictionary.DictionaryDAO;
import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.dictionary.M2Model;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.repo.node.BaseNodeServiceTest;
import org.alfresco.service.ServiceRegistry; import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.TemplateException; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.TemplateService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.transaction.TransactionService; import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.test_category.OwnJVMTestsCategory; import org.alfresco.service.cmr.repository.TemplateException;
import org.alfresco.util.ApplicationContextHelper; import org.alfresco.service.cmr.repository.TemplateService;
import org.junit.experimental.categories.Category; import org.alfresco.service.namespace.NamespaceService;
import org.springframework.context.ApplicationContext; import org.alfresco.service.namespace.QName;
import org.springframework.extensions.surf.util.I18NUtil; import org.alfresco.service.transaction.TransactionService;
import org.alfresco.test_category.OwnJVMTestsCategory;
import org.alfresco.util.ApplicationContextHelper;
import org.junit.experimental.categories.Category;
import org.springframework.context.ApplicationContext;
import org.springframework.extensions.surf.util.I18NUtil;
/** /**
* @author Kevin Roast * @author Kevin Roast
@@ -62,7 +67,7 @@ public class TemplateServiceImplTest extends TestCase
private NodeRef root_node; private NodeRef root_node;
private TemplateService templateService; private TemplateService templateService;
private NodeService nodeService; private NodeService nodeService;
private TransactionService transactionService; private TransactionService transactionService;
private ServiceRegistry serviceRegistry; private ServiceRegistry serviceRegistry;
private AuthenticationComponent authenticationComponent; private AuthenticationComponent authenticationComponent;
@@ -108,7 +113,29 @@ public class TemplateServiceImplTest extends TestCase
public Object execute() throws Exception public Object execute() throws Exception
{ {
StoreRef store = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "template_" + System.currentTimeMillis()); StoreRef store = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "template_" + System.currentTimeMillis());
root_node = nodeService.getRootNode(store); root_node = nodeService.getRootNode(store);
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(11);
properties.put(ContentModel.PROP_NAME, (Serializable) "subFolder");
NodeRef subFolderRef = nodeService.createNode(
root_node,
ContentModel.ASSOC_CHILDREN,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,QName.createValidLocalName("subFolder")),
ContentModel.TYPE_FOLDER,
properties).getChildRef();
properties.put(ContentModel.PROP_NAME, (Serializable) "subSubFolder");
NodeRef subSubFolderRef =nodeService.createNode(
subFolderRef,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,QName.createValidLocalName("subSubFolder")),
ContentModel.TYPE_FOLDER,
properties).getChildRef();
properties.put(ContentModel.PROP_NAME, (Serializable) "subSubSubFolder");
nodeService.createNode(
subSubFolderRef,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,QName.createValidLocalName("subSubSubFolder")),
ContentModel.TYPE_FOLDER,
properties);
BaseNodeServiceTest.buildNodeGraph(nodeService, root_node); BaseNodeServiceTest.buildNodeGraph(nodeService, root_node);
return null; return null;
} }
@@ -139,7 +166,11 @@ public class TemplateServiceImplTest extends TestCase
String output = templateService.processTemplate("freemarker", TEMPLATE_1, model); String output = templateService.processTemplate("freemarker", TEMPLATE_1, model);
// check template contains the expected output // check template contains the expected output
assertTrue( (output.indexOf(root_node.getId()) != -1) ); assertTrue("Cannot find root-node-id", (output.indexOf(root_node.getId()) != -1) );
assertTrue("Cannot resolve subFolder properly", (output.indexOf("root.childByNamePath[\"subFolder\"].name=subFolder") != -1) );
assertTrue("Cannot resolve subSubFolder properly", (output.indexOf("root.childByNamePath[\"subFolder/subSubFolder\"].name=subSubFolder") != -1) );
assertTrue("Cannot resolve subSubSubFolder properly", (output.indexOf("root.childByNamePath[\"subFolder/subSubFolder/subSubSubFolder\"].name=subSubSubFolder") != -1) );
assertTrue("Cannot resolve subSubSubFolder with enhancement properly", (output.indexOf("root.childByNamePath[\"subFolder\"].childByNamePath[\"subSubFolder/subSubSubFolder\"].name=subSubSubFolder") != -1) );
return null; return null;
} }

View File

@@ -51,4 +51,18 @@ ${root.icon32}<br>
${child.name} ${child.name}
</#list> </#list>
<#-- Test childByNamePath -->
root.childByNamePath["subFolder"].name=${root.childByNamePath["subFolder"].name}
root.childByNamePath["/subFolder"].name=${root.childByNamePath["/subFolder"].name}
root.childByNamePath["subFolder/"].name=${root.childByNamePath["subFolder/"].name}
root.childByNamePath["/subFolder/"].name=${root.childByNamePath["/subFolder/"].name}
root.childByNamePath["subFolder/subSubFolder"].name=${root.childByNamePath["subFolder/subSubFolder"].name}
root.childByNamePath["/subFolder/subSubFolder"].name=${root.childByNamePath["/subFolder/subSubFolder"].name}
root.childByNamePath["subFolder/subSubFolder/"].name=${root.childByNamePath["subFolder/subSubFolder/"].name}
root.childByNamePath["/subFolder/subSubFolder/"].name=${root.childByNamePath["/subFolder/subSubFolder/"].name}
root.childByNamePath["subFolder/subSubFolder/subSubSubFolder"].name=${root.childByNamePath["subFolder/subSubFolder/subSubSubFolder"].name}
root.childByNamePath["subFolder"].childByNamePath["subSubFolder"].name=${root.childByNamePath["subFolder"].childByNamePath["subSubFolder"].name}
root.childByNamePath["subFolder"].childByNamePath["subSubFolder/subSubSubFolder"].name=${root.childByNamePath["subFolder"].childByNamePath["subSubFolder/subSubSubFolder"].name}
root.childByNamePath["subFolder/subSubFolder"].childByNamePath["subSubSubFolder"].name=${root.childByNamePath["subFolder/subSubFolder"].childByNamePath["subSubSubFolder"].name}
<h6>End Test Template 1</h6> <h6>End Test Template 1</h6>