package org.codehaus.groovy.grails.commons;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import groovy.lang.GroovyResourceLoader;
import junit.framework.TestCase;

import java.io.File;
import java.io.FileWriter;
import java.net.MalformedURLException;
import java.net.URL;

public class ClassReloadingTests extends TestCase {

	public void testReloadingClasses() throws Exception {
		final GroovyClassLoader cl = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
		cl.setResourceLoader( new GroovyResourceLoader() {
			public URL loadGroovySource(String filename) throws MalformedURLException {
				filename = filename.replace('.', '/') + ".groovy";
				return cl.getResource(filename);
			}				
		}
	);		
		
		File file = new File(cl.getResource("org/codehaus/groovy/grails/commons/TestReload.groovy").getFile());
		
		FileWriter fw = new FileWriter(file);
		try {
			fw.write(  "package org.codehaus.groovy.grails.commons;\n" +
						"class TestReload { \n" +
							"@Property hello = \"hello\"\n" +
						"}");		
			fw.close();
			
			Class groovyClass = cl.loadClass("org.codehaus.groovy.grails.commons.TestReload",true,false);

			
			
			GroovyObject go = (GroovyObject)groovyClass.newInstance();
			
			assertEquals("hello", go.getProperty("hello"));
			
			// change class
			fw = new FileWriter(file);
			fw.write(  "package org.codehaus.groovy.grails.commons;\n" +
					"class TestReload { \n" +
						"@Property hello = \"goodbye\"\n" +
					"}");
            fw.close();

            // reload
			groovyClass = cl.loadClass("org.codehaus.groovy.grails.commons.TestReload",true,false);			
			go = (GroovyObject)groovyClass.newInstance();			
			assertEquals("goodbye", go.getProperty("hello"));			
		}
		finally {
			fw.close();
		}
	}
}
