package org.drools.agent;
import junit.framework.TestCase;
import org.drools.core.util.FileManager;
import org.drools.core.util.StringUtils;
import org.drools.io.impl.UrlResource;
import org.drools.io.impl.ResourceChangeScannerImpl;
import org.drools.io.impl.ResourceChangeNotifierImpl;
import org.drools.io.ResourceFactory;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.ResourceHandler;
import java.io.File;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
/**
* @author Michael Neale
*/
public class UrlResourceTest extends TestCase {
private FileManager fileManager;
private Server server;
@Override
protected void setUp() throws Exception {
super.setUp();
fileManager = new FileManager();
fileManager.setUp();
((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
ResourceFactory.getResourceChangeNotifierService().start();
ResourceFactory.getResourceChangeScannerService().start();
this.server = new Server(0);
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase( fileManager.getRootDirectory().getPath() );
System.out.println("root : " + fileManager.getRootDirectory().getPath() );
server.setHandler( resourceHandler );
server.start();
}
private int getPort(){
return this.server.getConnectors()[0].getLocalPort();
}
@Override
protected void tearDown() throws Exception {
fileManager.tearDown();
ResourceFactory.getResourceChangeNotifierService().stop();
ResourceFactory.getResourceChangeScannerService().stop();
((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
server.stop();
}
public void testWithCache() throws Exception {
URL url = new URL("http://localhost:"+this.getPort()+"/rule1.drl");
UrlResource ur = new UrlResource(url);
UrlResource.CACHE_DIR = new File(".");
File f1 = fileManager.newFile( "rule1.drl" );
System.err.println("target file: " + f1.getAbsolutePath());
Writer output = new BufferedWriter( new FileWriter( f1 ) );
output.write( "Some data" );
output.close();
long lm = ur.getLastModified();
assertTrue(lm > 0);
InputStream ins = ur.getInputStream();
assertNotNull(ins);
server.stop();
assertNotNull(ur.getInputStream());
assertTrue(ur.getLastModified() > 0);
assertTrue(ur.getInputStream() instanceof FileInputStream);
//now write some more stuff
Thread.sleep(1000);
f1.delete();
output = new BufferedWriter( new FileWriter( f1 ) );
output.write( "More data..." );
output.close();
server.start();
url = new URL("http://localhost:"+this.getPort()+"/rule1.drl");
ur = new UrlResource(url);
assertNotNull(ur.getInputStream());
assertFalse(ur.getInputStream() instanceof FileInputStream);
long lm_ = ur.getLastModified();
System.err.println("lm_ : " + lm_ + " lm : " + lm );
assertTrue(lm_ > lm);
InputStream in_= ur.getInputStream();
BufferedReader rdr = new BufferedReader(new InputStreamReader(in_));
String line = rdr.readLine();
assertEquals("More data...", line);
server.stop();
Thread.sleep(1000);
f1.delete();
output = new BufferedWriter( new FileWriter( f1 ) );
output.write( "Finally.." );
output.close();
//now it should be cached, so using old copy still... (server has stopped serving it up)
ur = new UrlResource(url);
in_= ur.getInputStream();
rdr = new BufferedReader(new InputStreamReader(in_));
line = rdr.readLine();
assertEquals("More data...", line);
Thread.sleep(1000);
server.start();
url = new URL("http://localhost:"+this.getPort()+"/rule1.drl");
ur = new UrlResource(url);
ur = new UrlResource(url);
//server is started, so should have latest...
in_= ur.getInputStream();
rdr = new BufferedReader(new InputStreamReader(in_));
line = rdr.readLine();
assertEquals("Finally..", line);
}
public void testWithoutCache() throws Exception {
UrlResource ur = new UrlResource(new URL("http://localhost:"+this.getPort()+"/rule1.drl"));
UrlResource.CACHE_DIR = null;
File f1 = fileManager.newFile( "rule1.drl" );
System.err.println("target file: " + f1.getAbsolutePath());
Writer output = new BufferedWriter( new FileWriter( f1 ) );
output.write( "Some data" );
output.close();
long lm = ur.getLastModified();
assertTrue(lm > 0);
InputStream ins = ur.getInputStream();
assertNotNull(ins);
server.stop();
assertEquals(0, ur.getLastModified());
}
}