org.grails.ide.eclipse.test.gsp.GSPStructuredModelCreationTests.java Source code

Java tutorial

Introduction

Here is the source code for org.grails.ide.eclipse.test.gsp.GSPStructuredModelCreationTests.java

Source

/*******************************************************************************
 * Copyright (c) 2012 VMWare, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     VMWare, Inc. - initial API and implementation
 *******************************************************************************/
package org.grails.ide.eclipse.test.gsp;

import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.grails.ide.eclipse.core.internal.plugins.GrailsCore;

import org.grails.ide.eclipse.editor.gsp.tags.PerProjectTagProvider;

/**
 * Tests that the creation of GSP structured models
 * have their tag libs properly initialized and uninitialized 
 * in response to changes to the project
 * @author Andrew Eisenberg
 * @author Nieraj Singh
 * @created Jan 19, 2010
 */
public class GSPStructuredModelCreationTests extends AbstractGSPTagsTest {

    public void testCreateModel() throws Exception {
        createModel("foo.gsp", "TTT");
        assertFalse("Should have no errors on the log, but had:\n" + logger.getErrorEntriesAsText(),
                logger.hasErrors());

        // should have a connect entry and that's it
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertEquals("Should have found one connect status, but instead found:\n"
                + logger.getSomeEntriesAsText(statuses), 1, statuses.size());
        int i = 0;
        assertConnectStatus(statuses, i++);
    }

    public void testCreateModel2() throws Exception {
        createModel("foo.gsp", "TTT");
        createModel("foo2.gsp", "TTT");
        assertFalse("Should have no errors on the log, but had:\n" + logger.getErrorEntriesAsText(),
                logger.hasErrors());

        // should have a connect entry and that's it
        // the model should be shared between the two 
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertEquals("Should have found one connect status, but instead found:\n"
                + logger.getSomeEntriesAsText(statuses), 2, statuses.size());
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertConnectStatus(statuses, i++);
    }

    public void testCreateModel3() throws Exception {
        IStructuredModel model = createModel("foo.gsp", "TTT");
        model.releaseFromEdit();
        model = reopenModel(model.getBaseLocation());
        assertFalse("Should have no errors on the log, but had:\n" + logger.getErrorEntriesAsText(),
                logger.hasErrors());

        // should have a connect entry and that's it
        // the model should be shared between the two 
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertEquals("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses), 3,
                statuses.size());
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertDisconnectStatus(statuses, i++);
        assertConnectStatus(statuses, i++);
    }

    // test that getting the document for a tag name forces initialization 
    // of tags
    public void testCreateModel4() throws Exception {
        createModel("foo.gsp", "TTT");
        PerProjectTagProvider provider = getTagProvider();
        provider.getDocumentForTagName("nuthin");
        // it looks like on the build server uninitialize can be called twice
        // that will increase the number of statuses from 7 to 9
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertTrue("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses),
                statuses.size() == 3 || statuses.size() == 5);
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        if (statuses.size() == 5) {
            assertUninitializeStatus(statuses, i++);
            assertUninitializeTagTrackersStatus(statuses, i++);
        }
    }

    // Test that touching the classpath will force an uninitialization 
    // of the tag libs
    public void testCreateModel5() throws Exception {
        createModel("foo.gsp", "TTT");
        testProject.getProject().getFile(".classpath").touch(null);

        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertEquals("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses), 3,
                statuses.size());
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertUninitializeStatus(statuses, i++);
        assertUninitializeTagTrackersStatus(statuses, i++);

    }

    // test that getting the document for a tag name forces initialization 
    // of tags and that touching the classpath will force uninitialization
    public void testCreateModel6() throws Exception {
        createModel("foo.gsp", "TTT");
        PerProjectTagProvider provider = getTagProvider();
        provider.getDocumentForTagName("nuthin");
        testProject.getProject().getFile(".classpath").touch(null);
        provider.getDocumentForTagName("nuthin");

        // it looks like on the build server uninitialize can be called twice
        // that will increase the number of statuses from 7 to 9
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertTrue("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses),
                statuses.size() == 7 || statuses.size() == 9);
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        assertUninitializeStatus(statuses, i++);
        assertUninitializeTagTrackersStatus(statuses, i++);
        if (statuses.size() == 9) {
            assertUninitializeStatus(statuses, i++);
            assertUninitializeTagTrackersStatus(statuses, i++);
        }
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
    }

    // test that getting the document for a tag name forces initialization 
    // of tags and that touching the classpath will force uninitialization
    // checks the above, but with 2 models
    public void testCreateModel7() throws Exception {
        createModel("foo.gsp", "TTT");
        createModel("foo2.gsp", "TTT");
        PerProjectTagProvider provider = getTagProvider();
        provider.getDocumentForTagName("nuthin");
        testProject.getProject().getFile(".classpath").touch(null);
        provider.getDocumentForTagName("nuthin");

        // it looks like on the build server uninitialize can be called twice
        // that will increase the number of statuses from 11 to 14
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertTrue("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses),
                statuses.size() == 11 || statuses.size() == 14);
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertConnectStatus(statuses, i++);
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        assertUninitializeStatus(statuses, i++);
        assertUninitializeTagTrackersStatus(statuses, i++);
        assertUninitializeTagTrackersStatus(statuses, i++);
        if (statuses.size() == 14) {
            assertUninitializeStatus(statuses, i++);
            assertUninitializeTagTrackersStatus(statuses, i++);
            assertUninitializeTagTrackersStatus(statuses, i++);
        }
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
    }

    // test that a change to a custom tag lib forces a reinitialize
    public void testCreateModel8() throws Exception {
        // create this first so it doesn't force a second uninitialize
        IPackageFragmentRoot root = testProject.createSourceFolder("grails-app/taglib", null);
        IPackageFragment pack = root.createPackageFragment("nuthin", true, null);

        createModel("foo.gsp", "TTT");
        PerProjectTagProvider provider = getTagProvider();
        provider.getDocumentForTagName("nuthin");

        testProject.createGroovyType(pack, "NuthinTagLib.groovy", "class NuthinTagLib { }");

        provider.getDocumentForTagName("nuthin");

        // it looks like on the build server uninitialize can be called twice
        // that will increase the number of statuses from 7 to 9
        List<IStatus> statuses = logger.getAllEntriesWithPrefix("PerProjectTagProvider");
        assertTrue("Found wrong number of statuses:\n" + logger.getSomeEntriesAsText(statuses),
                statuses.size() == 7 || statuses.size() == 9);
        int i = 0;
        assertConnectStatus(statuses, i++);
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
        assertUninitializeStatus(statuses, i++);
        assertUninitializeTagTrackersStatus(statuses, i++);
        if (statuses.size() == 9) {
            assertUninitializeStatus(statuses, i++);
            assertUninitializeTagTrackersStatus(statuses, i++);
        }
        assertInitializeStatus(statuses, i++);
        assertInitializeTagTrackersStatus(statuses, i++);
    }

    private void assertConnectStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found connect status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.connect()"));
    }

    private void assertDisconnectStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found disconnect status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.disconnect()"));
    }

    private void assertInitializeStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found initialize status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.initialize()"));
    }

    private void assertUninitializeStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found uninitialize status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.uninitialize()"));
    }

    private void assertInitializeTagTrackersStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found initialize tag tracker status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.initializeTagTrackers()"));
    }

    private void assertUninitializeTagTrackersStatus(List<IStatus> statuses, int index) {
        assertTrue(
                "Should have found uninitialize tag tracker status at " + index + " , but instead found:\n"
                        + logger.getSomeEntriesAsText(statuses),
                statuses.get(index).getMessage().startsWith("PerProjectTagProvider.uninitializeTagTrackers()"));
    }

    private PerProjectTagProvider getTagProvider() {
        PerProjectTagProvider provider = null;
        int count = 0;
        while (provider == null) {
            if (count >= 25) {
                fail("could not get tag provider for project " + testProject.getProject());
            }
            if (count > 0) {
                synchronized (this) {
                    try {
                        System.out.println("Could not find provider...waiting 1s and retrying");
                        wait(1000);
                    } catch (InterruptedException e) {
                    }
                }
            }
            count++;
            provider = GrailsCore.get().connect(testProject.getProject(), PerProjectTagProvider.class);
        }
        return provider;
    }

}