/*
 * #%L
 * Alfresco Repository
 * %%
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 * %%
 * This file is part of the Alfresco software. 
 * If the software was purchased under a paid Alfresco license, the terms of 
 * the paid license agreement will prevail.  Otherwise, the software is 
 * provided under the following open source license terms:
 * 
 * Alfresco is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Alfresco 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 Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Alfresco. If not, see .
 * #L%
 */
package org.alfresco.repo.virtual.template;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.virtual.VirtualizationIntegrationTest;
import org.alfresco.repo.virtual.ref.NewVirtualReferenceMethod;
import org.alfresco.repo.virtual.ref.Protocols;
import org.alfresco.repo.virtual.ref.Reference;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchParameters;
import org.junit.Test;
public class ApplyTemplateMethodTest extends VirtualizationIntegrationTest
{
    @Test
    public void testExecute_vanillaISO9075ActualPath() throws Exception
    {
        ChildAssociationRef iso9075FolderAssoc = createFolder(testRootFolder.getNodeRef(),
                                                              "Acutal ISO9075 Node");
        NodeRef iso9075Folder = iso9075FolderAssoc.getChildRef();
        NewVirtualReferenceMethod newVirtualReferenceMethod = new NewVirtualReferenceMethod(TEST_TEMPLATE_5_JSON_SYS_PATH,
                                                                                            "/",
                                                                                            iso9075Folder,
                                                                                            VANILLA_PROCESSOR_JS_CLASSPATH);
        ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
        Reference ref = Protocols.VANILLA.protocol.dispatch(newVirtualReferenceMethod,
                                                            null);
        VirtualFolderDefinition structure = ref.execute(applyTemplateMethod);
        VirtualFolderDefinition sfp5 = structure.findChildByName("SpecialFilingPath5");
        VirtualQuery query = sfp5.getQuery();
        assertEquals("(PATH:'/app:company_home/cm:TestFolder/cm:Acutal_x0020_ISO9075_x0020_Node/cm:Space_x0020_Sub_x0020_Folder/*')  and =cm:description:'SpecialFilingPath_5'",
                     query.getQueryString());
        ChildAssociationRef iso9075SubFolderAssoc = createFolder(iso9075Folder,
                                                                 "Space Sub Folder");
        ChildAssociationRef someContentAssoc = createContent(iso9075SubFolderAssoc.getChildRef(),
                                                             "someContent");
        nodeService.setProperty(someContentAssoc.getChildRef(),
                                ContentModel.PROP_DESCRIPTION,
                                "SpecialFilingPath_5");
        // check query for validity
        SearchParameters searchParameters = new SearchParameters();
        
        searchParameters.setQuery(query.getQueryString());
        searchParameters.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
        searchParameters.setLanguage(query.getLanguage());
        ResultSet qresult = searchService.query(searchParameters);
        assertEquals(1,
                     qresult.getNumberFound());
    }
    @Test
    public void testExecute_virtualSysClasspath() throws Exception
    {
        ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
        NewVirtualReferenceMethod newVirtualReferenceMethod = new NewVirtualReferenceMethod(TEST_TEMPLATE_1_JS_SYS_PATH,
                                                                                            "/",
                                                                                            rootNodeRef,
                                                                                            null);
        Reference ref = Protocols.VIRTUAL.protocol.dispatch(newVirtualReferenceMethod,
                                                            null);
        VirtualFolderDefinition structure = ref.execute(applyTemplateMethod);
        String templateName = structure.getName();
        assertEquals("template1_name",
                     templateName);
        List children = structure.getChildren();
        assertEquals(3,
                     children.size());
        VirtualFolderDefinition child1 = structure.findChildByName("My Documents");
        assertTrue(child1 != null);
        VirtualFolderDefinition child2 = structure.findChildByName("Recent Documents");
        assertTrue(child2 != null);
        VirtualFolderDefinition child3 = structure.findChildByName("Other Documents");
        assertTrue(child3 != null);
    }
    @Test
    public void testExecute_vanillaRepositoryJSON() throws Exception
    {
        ChildAssociationRef templateAssoc = createContent(testRootFolder.getNodeRef(),
                                                          "template1.json",
                                                          ApplyTemplateMethodTest.class
                                                                      .getResourceAsStream(TEST_TEMPLATE_1_JSON_NAME),
                                                          MimetypeMap.MIMETYPE_JSON,
                                                          StandardCharsets.UTF_8.name());
        ApplyTemplateMethod applyTemplateMethod = new ApplyTemplateMethod(environment);
        NewVirtualReferenceMethod newVirtualReferenceMethod = new NewVirtualReferenceMethod(templateAssoc.getChildRef(),
                                                                                            "/",
                                                                                            virtualFolder1NodeRef,
                                                                                            VANILLA_PROCESSOR_JS_CLASSPATH);
        Reference ref = Protocols.VANILLA.protocol.dispatch(newVirtualReferenceMethod,
                                                            null);
        VirtualFolderDefinition structure = ref.execute(applyTemplateMethod);
        String templateName = structure.getName();
        assertEquals("Test",
                     templateName);
        List children = structure.getChildren();
        assertEquals(2,
                     children.size());
        VirtualFolderDefinition child1 = structure.findChildByName("Node1");
        assertTrue(child1 != null);
        VirtualFolderDefinition child2 = structure.findChildByName("Node2");
        assertTrue(child2 != null);
    }
    @Test
    public void testExecuteRepositoryJS() throws Exception
    {
        // TODO:
    }
}