//$Id$ package org.exist.cluster.journal; import java.io.File; import java.util.ArrayList; import junit.framework.TestCase; import org.exist.cluster.ClusterEvent; import org.exist.cluster.CreateCollectionClusterEvent; import org.exist.cluster.RemoveClusterEvent; import org.exist.cluster.StoreClusterEvent; import org.exist.storage.DBBroker; import org.exist.util.Configuration; /** */ public class JournalManagerTest extends TestCase{ Configuration configuration; protected void setUp() { try { configuration = new Configuration("conf.xml", System.getProperty("exist.home",".") ); File existDir = new File(System.getProperty("exist.home",".")); File temp = new File(existDir,"test"); String[] files = temp.list(); if (files!=null) { for( int i=0; i<files.length; i++) { String fName = files[i]; if( fName.indexOf("jbx") > 0 ) { File f = new File(temp, fName); f.delete(); } } } } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testWriteEventJournal() { saveEvent( new JournalManager( configuration ), 0 ); } public void testWriteRead() { JournalManager journal = new JournalManager( configuration ); saveEvent( journal , 0 ); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test", ((CreateCollectionClusterEvent)ev).getCollectionName()); } public void testMultiShuffleWriteRead() { JournalManager journal = new JournalManager( configuration ); saveEvent( journal , 0 ); saveEvent( journal , "test1", 1 ); saveEvent( journal , "test2", 2 ); saveEvent( journal , "test3", 3 ); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 3 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 3, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test3", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 2 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 2, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test2", ((CreateCollectionClusterEvent)ev).getCollectionName()); } public void testMultiShuffleWriteReadMultiEvents() { JournalManager journal = new JournalManager( configuration ); saveEvent( journal , 0 ); saveEvent( journal , "test1", 1 ); saveEvent( journal , "test2", 2 ); saveEvent( journal , "test3", 3 ); ClusterEvent r = new RemoveClusterEvent("doc","collection"); r.setId(4); saveEvent( journal, r); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 3 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 3, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test3", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 2 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 2, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test2", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 4 ); assertTrue( "Wrong event class", ev instanceof RemoveClusterEvent); assertEquals("Wrong id", 4, ev.getId()); assertEquals("Wrong docNAme value", "doc", ((RemoveClusterEvent)ev).getDocumentName()); assertEquals("Wrong collectionName value", "collection", ((RemoveClusterEvent)ev).getCollectionName()); } public void testMultiShuffleWriteReadStoreDocument() { JournalManager journal = new JournalManager( configuration ); String content = getExternalXML(); StoreClusterEvent s = new StoreClusterEvent( content, "name", "docu"); s.setId( 1 ); saveEvent( journal , s ); saveEvent( journal , "test4", 4 ); saveEvent( journal , "test2", 2 ); saveEvent( journal , "test3", 0 ); s = new StoreClusterEvent( content, "name2", "docu2"); s.setId(3); saveEvent( journal, s); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test3", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 3 ); assertTrue( "Wrong event class " + ev.getClass().getName(), ev instanceof StoreClusterEvent); assertEquals("Wrong id", 3, ev.getId()); assertEquals("Wrong parent value", "docu2", ((StoreClusterEvent)ev).getDocumentName()); assertEquals("Wrong collectionName value", "name2", ((StoreClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 2 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 2, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test2", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 4 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 4, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test4", ((CreateCollectionClusterEvent)ev).getCollectionName()); } public void testMultiShuffleWriteReadWithQueue() { JournalManager journal = new JournalManager( configuration ); saveEvent( journal , 0 ); saveEvent( journal , "test1", 1 ); saveEvent( journal , "test3", 3 ); saveEvent( journal , "test2", 2 ); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 3 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 3, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test3", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 2 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 2, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test2", ((CreateCollectionClusterEvent)ev).getCollectionName()); } public void testMultiShuffleWriteReadWithRotation() { JournalManager journal = new JournalManager( configuration ); String content = getExternalXML(); StoreClusterEvent s = new StoreClusterEvent( content, "name", "docu"); s.setId( 1 ); saveEvent( journal , s ); saveEvent( journal , "test4", 4 ); saveEvent( journal , "test2", 2 ); saveEvent( journal , "test3", 0 ); s = new StoreClusterEvent( content, "name2", "docu2"); s.setId(3); saveEvent( journal, s); s = new StoreClusterEvent( content, "name3", "docu3"); s.setId(JournalIdGenerator.MAX_STORED_INDEX-100); saveEvent( journal, s); s = new StoreClusterEvent( content, "name4", "docu4"); s.setId(2); s.setCounter(2); saveEvent( journal, s); ClusterEvent ev = readEvent( journal, 0 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 0, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test3", ((CreateCollectionClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 3 ); assertTrue( "Wrong event class " + ev.getClass().getName(), ev instanceof StoreClusterEvent); assertEquals("Wrong id", 3, ev.getId()); assertEquals("Wrong parent value", "docu2", ((StoreClusterEvent)ev).getDocumentName()); assertEquals("Wrong collectionName value", "name2", ((StoreClusterEvent)ev).getCollectionName()); ev = readEvent( journal, 2 ); assertTrue( "Wrong event class", ev instanceof StoreClusterEvent); assertEquals("Wrong id", 2, ev.getId()); assertEquals("Wrong parent value", "docu4", ((StoreClusterEvent)ev).getDocumentName()); assertEquals("Wrong collectionName value", "name4", ((StoreClusterEvent)ev).getCollectionName()); assertEquals("Wrong counter",2,ev.getCounter()); ev = readEvent( journal, 4 ); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 4, ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test4", ((CreateCollectionClusterEvent)ev).getCollectionName()); assertEquals("Wrong lastIdSaved",2,journal.getLastIdSaved()); assertEquals("Wrong maxIdSaved",2,journal.getMaxIdSaved()); assertEquals("Wrong counter",2,journal.getCounter()); } public void testRetrieveEvents() { JournalManager journal = new JournalManager( configuration ); saveEvent( journal , 0 ); saveEvent( journal , "test1", 1 ); saveEvent( journal , "test2", 2 ); saveEvent( journal , "test3", 3 ); ArrayList events = journal.getNextEvents( new int[]{0,0,1}, new int[]{3,3,1}, new Integer(-1)); assertNotNull( "Wrong null events", events ); assertEquals("Wrong event size", 1, events.size()); int idR = ((ClusterEvent)events.get(0)).getId(); events = journal.getNextEvents( new int[]{0,0,1}, new int[]{3,3,1}, new Integer(idR)); assertNotNull( "Wrong null events", events ); assertEquals("Wrong event size", 4, events.size()); ClusterEvent ev = (ClusterEvent) events.get(2); assertTrue( "Wrong event class", ev instanceof CreateCollectionClusterEvent); assertEquals("Wrong id", 2 , ev.getId()); assertEquals("Wrong parent value", DBBroker.ROOT_COLLECTION + "/test", ((CreateCollectionClusterEvent)ev).getParent()); assertEquals("Wrong collectionName value", "test2", ((CreateCollectionClusterEvent)ev).getCollectionName()); } public void testRotation() { //TODO: aggiungere test sulla rotazione....... opportuno creare una classe a parte di test. } private void saveEvent(JournalManager journal, int idTest) { saveEvent(journal, "test", idTest); } private void saveEvent(JournalManager journal, String collectionName, int idTest) { CreateCollectionClusterEvent ev = new CreateCollectionClusterEvent( DBBroker.ROOT_COLLECTION + "/test", collectionName); ev.setId(idTest); saveEvent(journal, ev); } private void saveEvent(JournalManager journal, ClusterEvent ev) { try { journal.enqueEvent( ev ); journal.squeueEvent(); } catch (Exception e) { fail(e.getMessage()); } } private ClusterEvent readEvent(JournalManager journal, int i) { return journal.read( i ); } private String getExternalXML() { return "<?xml version=\"1.0\"?>\n" + "\n" + "<!-- This build file sets up the example XML files provided in\n" + " the distribution.\n" + "\n" + " Call it with \n" + " \n" + " build.sh -f example-setup.xml\n" + "\n" + " or\n" + "\n" + " build.bat -f example-setup.xml\n" + "-->\n" + "<project basedir=\".\" default=\"store\" name=\"exist-ant-tasks\">\n" + "\n" + "\t<path id=\"classpath.core\">\n" + "\t\t<fileset dir=\"lib/core\">\n" + "\t\t\t<include name=\"*.jar\"/>\n" + "\t\t</fileset>\n" + " <pathelement path=\"exist.jar\"/>\n" + " <pathelement path=\"exist-optional.jar\"/>\n" + "\t</path>\n" + "\n" + "\t<typedef resource=\"org/exist/ant/antlib.xml\"\n" + "\t\turi=\"http://exist-db.org/ant\">\n" + "\t\t<classpath refid=\"classpath.core\"/>\n" + "\t</typedef>\n" + "\t\n" + "\t<target name=\"store\" xmlns:xmldb=\"http://exist-db.org/ant\">\n" + " <xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc" + DBBroker.ROOT_COLLECTION + "/shakespeare/plays\"\n" + "\t\t\tcreatecollection=\"true\">\n" + " <fileset dir=\"samples/shakespeare\"> \n" + " <include name=\"*.xml\"/>\n" + " <include name=\"*.xsl\"/>\n" + " </fileset>\n" + "\t\t</xmldb:store>\n" + "\n" + " <xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc/" + DBBroker.ROOT_COLLECTION + "/shakespeare/plays\"\n" + "\t\t\ttype=\"binary\">\n" + "\t\t\t<fileset dir=\"samples/shakespeare\">\n" + "\t\t\t\t<include name=\"*.css\"/>\n" + "\t\t\t</fileset>\n" + "\t\t</xmldb:store>\n" + "\t\t\n" + " <xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc/" + DBBroker.ROOT_COLLECTION + "/library\"\n" + "\t\t\tcreatecollection=\"true\">\n" + "\t\t\t<fileset dir=\"samples\" includes=\"biblio.rdf\"/>\n" + "\t\t</xmldb:store>\n" + "\n" + " <xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc"+ DBBroker.ROOT_COLLECTION + "/xinclude\"\n" + "\t\t\tcreatecollection=\"true\">\n" + "\t\t\t<fileset dir=\"samples/xinclude\" includes=\"**.xml\"/>\n" + " </xmldb:store>\n" + "\n" + " <xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc" + DBBroker.ROOT_COLLECTION + "\">\n" + " <fileset dir=\"samples\" includes=\"examples.xml\"/>\n" + " </xmldb:store>\n" + "\n" + "\t\t<xmldb:store uri=\"xmldb:exist://localhost:8080/exist/xmlrpc" + DBBroker.ROOT_COLLECTION + "/mods\">\n" + " <fileset dir=\"mods\" includes=\"**.xml\"/>\n" + " </xmldb:store>\n" + "\t</target>\n" + "</project>"; } }