package org.sharegov.cirm.test; import java.util.HashMap; import java.util.List; import java.util.Map; import org.hypergraphdb.app.owl.versioning.RevisionID; import org.hypergraphdb.app.owl.versioning.VersionedOntology; import org.hypergraphdb.app.owl.versioning.distributed.VDHGDBOntologyRepository; import org.junit.AfterClass; import org.junit.BeforeClass; import org.semanticweb.owlapi.model.IRI; import org.sharegov.cirm.Refs; import org.sharegov.cirm.StartUp; import org.sharegov.cirm.legacy.ServiceCaseManager; /** * Abstract OpenCirm test base class, from which all opencirm test suites and all opencirm tests should inherit. * This ensures, that independently of which class starts a junit test or suite, opencirm is only started once and the server * remains running throughout the test, testsuite or master suite of suites. * * <br> * Usage: * @see package org.sharegov.cirm.test.demo * * @author Thomas Hilpold * */ public abstract class OpenCirmTestBase { static Map<VersionedOntology, RevisionID> vontos2headRevisionID = new HashMap<VersionedOntology, RevisionID>(); @BeforeClass public static void setUpClass() throws Exception { if (!StartUp.isServerStarted()) { System.out.println("Starting openCirm..."); StartUp.main(new String[]{}); if (!StartUp.isServerStarted()) { throw new IllegalStateException("Server did not start up"); } else { System.out.println("Starting openCirm...COMPLETED."); } } rollbackAllOntoPendingChanges(); saveAllOntoHeadRevisions(); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("ServiceCaseManagerTest class completed."); revertAllOntosToSavedHeadRevisions(); } protected static void rollbackAllOntoPendingChanges() { VDHGDBOntologyRepository repo = Refs.owlRepo.resolve().repo(); for (VersionedOntology vo : repo.getVersionControlledOntologies()) { if (!vo.getWorkingSetChanges().isEmpty()) { IRI ontologyIri = vo.getRevisionData(vo.getHeadRevision()).getOntologyID().getOntologyIRI(); int nrOfPendingChanges = vo.getWorkingSetChanges().size(); System.out.println("Rolling back " + nrOfPendingChanges + " pending changes for ontology " + ontologyIri); vo.rollback(); } } } /** * Saves the current ontology head revision id for each versioned ontology in the repository. */ protected static void saveAllOntoHeadRevisions() { VDHGDBOntologyRepository repo = Refs.owlRepo.resolve().repo(); List<VersionedOntology> vontos = repo.getVersionControlledOntologies(); for (VersionedOntology vo : vontos) { RevisionID originalHeadRevisionID = new RevisionID(vo.getHeadRevision().getOntologyUUID(), vo.getHeadRevision().getRevision()); IRI ontologyIri = vo.getRevisionData(vo.getHeadRevision()).getOntologyID().getOntologyIRI(); System.out.println("Saving Versioned Ontology " + ontologyIri + " Head Revision is " + originalHeadRevisionID.getRevision()); vontos2headRevisionID.put(vo, originalHeadRevisionID); } } protected static void revertAllOntosToSavedHeadRevisions() { for (Map.Entry<VersionedOntology, RevisionID> vonto2HeadRevisionIDEntry : vontos2headRevisionID.entrySet()) { VersionedOntology vo = vonto2HeadRevisionIDEntry.getKey(); RevisionID rId = vonto2HeadRevisionIDEntry.getValue(); int currentHeadRevision = vo.getHeadRevision().getRevision(); //Check if we need to revert this versioned ontology to a previous revision if (currentHeadRevision > rId.getRevision()) { IRI ontologyIri = vo.getRevisionData(vo.getHeadRevision()).getOntologyID().getOntologyIRI(); System.out.println("Reverting Versioned Ontology " + ontologyIri + " from " + currentHeadRevision + " to " + rId.getRevision()); vo.revertHeadTo(rId); } } } }