Package com.alibaba.citrus.service.velocity

Source Code of com.alibaba.citrus.service.velocity.PreloadedResourceLoaderTests

/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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 com.alibaba.citrus.service.velocity;

import static com.alibaba.citrus.test.TestEnvStatic.*;
import static com.alibaba.citrus.test.TestUtil.*;
import static com.alibaba.citrus.util.CollectionUtil.*;
import static org.apache.velocity.runtime.RuntimeConstants.*;
import static org.junit.Assert.*;

import java.io.File;
import java.util.Map;

import com.alibaba.citrus.service.resource.support.context.ResourceLoadingXmlApplicationContext;
import com.alibaba.citrus.service.velocity.impl.PreloadedResourceLoader;
import com.alibaba.citrus.service.velocity.impl.Slf4jLogChute;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.Template;
import org.apache.velocity.runtime.RuntimeInstance;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.resource.Resource;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.FileSystemResource;

public class PreloadedResourceLoaderTests extends AbstractResourceLoaderTests {
    private final Logger log = LoggerFactory.getLogger(getClass());
    private static ApplicationContext      factory;
    private        PreloadedResourceLoader velocityLoader;

    @BeforeClass
    public static void initFactory() {
        factory = new ResourceLoadingXmlApplicationContext(new FileSystemResource(new File(srcdir, "services.xml")));
    }

    @Before
    public void init() throws Exception {
        ExtendedProperties config = new ExtendedProperties();
        RuntimeServices rsvc = new RuntimeInstance();

        config.setProperty("resource.loader", "");
        config.setProperty(PreloadedResourceLoader.PRELOADED_RESOURCES_KEY, preloadingResources());

        rsvc.setConfiguration(config);
        rsvc.setProperty(RUNTIME_LOG_LOGSYSTEM, new Slf4jLogChute(log));

        rsvc.init();

        velocityLoader = new PreloadedResourceLoader();
        velocityLoader.commonInit(rsvc, config);
        velocityLoader.init(config);
    }

    private Map<String, org.springframework.core.io.Resource> preloadingResources() {
        Map<String, org.springframework.core.io.Resource> resources = createHashMap();

        resources.put("macros/a.vm", factory.getResource("templates/test.vm"));
        resources.put("/macros/b.vm", factory.getResource("templates/test.vm"));
        resources.put("/macros/c.vm", factory.getResource("templates/test2.vm"));

        return resources;
    }

    @Test
    public void getResourceStream() throws Exception {
        String text = readText(velocityLoader.getResourceStream("macros/a.vm"));
        assertEquals("test", text);

        text = readText(velocityLoader.getResourceStream("/macros/b.vm"));
        assertEquals("test", text);

        text = readText(velocityLoader.getResourceStream("/macros/c.vm"));
        assertEquals("test2", text);

        // 模板名为空
        try {
            velocityLoader.getResourceStream(null);
            fail();
        } catch (org.apache.velocity.exception.ResourceNotFoundException e) {
            assertThat(e, exception("Need to specify a template name"));
        }

        // 模板不存在
        try {
            velocityLoader.getResourceStream("notExist.vm");
            fail();
        } catch (org.apache.velocity.exception.ResourceNotFoundException e) {
            assertThat(e, exception("PreloadedResourceLoader", "could not find template: notExist.vm"));
        }
    }

    @Test
    public void isSourceModified() throws Exception {
        Resource templateResource = new Template();
        long lastModified = factory.getResource("/templates/test.vm").lastModified();

        // 资源/templates/test.vm支持lastModified,但时间不同
        templateResource.setLastModified(1);
        templateResource.setName("/macros/a.vm");

        assertTrue(lastModified != templateResource.getLastModified());
        assertTrue(velocityLoader.isSourceModified(templateResource));

        // 资源/templates/test.vm支持lastModified,时间相同
        templateResource.setLastModified(lastModified);
        templateResource.setName("/macros/a.vm");

        assertEquals(lastModified, templateResource.getLastModified());
        assertFalse(velocityLoader.isSourceModified(templateResource));

        // 资源/templates/notExist.vm不存在,看作被修改了
        templateResource.setLastModified(1);
        templateResource.setName("/notExist.vm");

        assertFalse(factory.getResource("/templates/notExist.vm").exists());
        assertTrue(velocityLoader.isSourceModified(templateResource));

        // 资源/templates/test2.vm存在,但不支持lastModified,看作未修改
        templateResource.setLastModified(1);
        templateResource.setName("/macros/c.vm");

        lastModified = factory.getResource("/templates/test2.vm").lastModified();

        assertEquals(0, lastModified);
        assertFalse(velocityLoader.isSourceModified(templateResource));

        // 模板名为空
        templateResource.setName(null);

        try {
            velocityLoader.isSourceModified(templateResource);
            fail();
        } catch (org.apache.velocity.exception.ResourceNotFoundException e) {
            assertThat(e, exception("Need to specify a template name"));
        }
    }

    @Test
    public void getLastModified() throws Exception {
        Resource templateResource = new Template();
        long lastModified = factory.getResource("/templates/test.vm").lastModified();

        // 资源/templates/test.vm支持lastModified
        templateResource.setName("/macros/a.vm");
        assertEquals(lastModified, velocityLoader.getLastModified(templateResource));

        // 资源/templates/notExist.vm不存在,返回0
        templateResource.setName("/notExist.vm");
        assertEquals(0, velocityLoader.getLastModified(templateResource));

        // 资源/templates/test2.vm存在,但不支持lastModified,返回0
        templateResource.setName("/macros/c.vm");
        assertEquals(0, velocityLoader.getLastModified(templateResource));

        // 模板名为空
        templateResource.setName(null);

        try {
            velocityLoader.getLastModified(templateResource);
            fail();
        } catch (org.apache.velocity.exception.ResourceNotFoundException e) {
            assertThat(e, exception("Need to specify a template name"));
        }
    }

    @Test
    public void _toString() {
        assertEquals("PreloadedResourceLoader[3 preloaded resources]", velocityLoader.toString());
    }
}
TOP

Related Classes of com.alibaba.citrus.service.velocity.PreloadedResourceLoaderTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.