/******************************************************************************* * Copyright 2014 Miami-Dade County * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.sharegov.cirm.rest; import static mjson.Json.array; import static mjson.Json.object; import static org.sharegov.cirm.OWL.individual; import static org.sharegov.cirm.utils.GenUtils.ko; import static org.sharegov.cirm.utils.GenUtils.ok; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import org.hypergraphdb.app.owl.HGDBOntology; import org.hypergraphdb.app.owl.versioning.Revision; import org.hypergraphdb.app.owl.versioning.RevisionID; import org.hypergraphdb.app.owl.versioning.VersionedOntology; import org.hypergraphdb.app.owl.versioning.VersionedOntologyComparator.RevisionCompareOutcome; import org.hypergraphdb.app.owl.versioning.VersionedOntologyComparator.RevisionComparisonResult; import org.hypergraphdb.app.owl.versioning.VersionedOntologyComparator.VersionedOntologyComparisonResult; import org.hypergraphdb.app.owl.versioning.distributed.ClientCentralizedOntology; import org.hypergraphdb.app.owl.versioning.distributed.DistributedOntology; import org.hypergraphdb.app.owl.versioning.distributed.VDHGDBOntologyRepository; import org.hypergraphdb.app.owl.versioning.distributed.activity.PullActivity; import org.hypergraphdb.app.owl.versioning.distributed.activity.PushActivity; import org.hypergraphdb.peer.HGPeerIdentity; import org.hypergraphdb.peer.workflow.ActivityResult; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLNamedIndividual; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyChange; import org.semanticweb.owlapi.model.OWLOntologyManager; import org.semanticweb.owlapi.reasoner.OWLReasoner; import org.sharegov.cirm.OWL; import org.sharegov.cirm.OntologyChangesRepo; import org.sharegov.cirm.Refs; import org.sharegov.cirm.StartUp; import org.sharegov.cirm.event.EventDispatcher; import org.sharegov.cirm.owl.CachedReasoner; import org.sharegov.cirm.owl.SynchronizedOWLOntologyManager; import org.sharegov.cirm.utils.GenUtils; import org.sharegov.cirm.utils.OntoChangesReference; import org.sharegov.cirm.utils.OntologyCommit; import org.sharegov.cirm.utils.ThreadLocalStopwatch; import mjson.Json; import uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl; //import com.clarkparsia.pellet.owlapiv3.PelletReasoner; @Path("ontadmin") @Produces("application/json") public class OntoAdmin extends RestService { public enum REPOACTION {PULL, REVERT, NOTHING}; public final String CACHED_REASONER_RESDIR = "/src/resources/cachedReasoner/"; public final String CACHED_REASONER_POPULATE_GET_INSTANCES_CACHE_FILE = CACHED_REASONER_RESDIR + "populateGetInstancesCache.json"; public static int ACTIVITY_TIMEOUT_SECS = 180; public final String[] SERIAL_PRECACHE_IND_QUERIES = new String[] { "legacy:Status", "legacy:Priority", "legacy:IntakeMethod", "legacy:IntakeMethodList", "State__U.S._", "Miami_Dade_City or County", "Direction", "Street_Type", "GeoLayerAttribute", "legacy:ServiceCase" }; protected VDHGDBOntologyRepository repo() { return Refs.owlRepo.resolve().repo(); } private void notifyOntoChange(String ontologyIri) { Set<OWLNamedIndividual> S = OWL.reasoner().getInstances(OWL.hasData("hasOntologyIRI", OWL.literal(ontologyIri)), false).getFlattened(); if (!S.isEmpty()) EventDispatcher.get().dispatch(S.iterator().next(), individual("BO_Update")); } @GET @Path("/list") public Json listOntologies() { VDHGDBOntologyRepository repo = repo(); Json A = array(); for (HGDBOntology O : repo.getOntologies()) { Json x = object() .set("iri", O.getOntologyID().getOntologyIRI().toString()) .set("versionIRI", O.getOntologyID().getVersionIRI() == null ? null : O.getOntologyID().getVersionIRI().toString()) .set("documentIRI", O.getDocumentIRI() == null ? null : O.getDocumentIRI().toString()) .set("imports", array()); for (OWLOntology io : O.getImports()) x.at("imports").add(io.getOntologyID().getOntologyIRI().toString()); A.add(x); } return A; } @GET @Path("/listAll") public Json listAllOntologies() { Json A = array(); for (OWLOntology O : OWL.manager().getOntologies()) { Json x = object() .set("iri", O.getOntologyID().getOntologyIRI().toString()) .set("versionIRI", O.getOntologyID().getVersionIRI() == null ? null : O.getOntologyID().getVersionIRI().toString()) .set("documentIRI", OWL.manager().getOntologyDocumentIRI(O).toString()) .set("imports", array()); for (OWLOntology io : O.getImports()) x.at("imports").add(io.getOntologyID().getOntologyIRI().toString()); A.add(x); } return A; } @GET @Path("/currentVersion/{iri}") public Json getCurrentVersion(@PathParam("iri") String iri) { VDHGDBOntologyRepository repo = repo(); try { OWLOntology O = OWL.manager().getOntology(IRI.create(iri)); if (O == null) return ko("Ontology not found: " + iri); //repo.printAllOntologies(); VersionedOntology vo = repo.getVersionControlledOntology(O); return ok().set("version", vo.getHeadRevision().getRevision()) .set("comment", vo.getHeadRevision().getRevisionComment()) .set("timestamp", vo.getHeadRevision().getTimeStamp().getTime()) .set("user", vo.getHeadRevision().getUser()); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } @POST @Path("/revert/{iri}") public Json revert(@PathParam("iri") String iri) { VDHGDBOntologyRepository repo = repo(); try { Refs.owlRepo.resolve().ensurePeerStarted(); OWLOntology O = OWL.manager().getOntology(IRI.create(iri)); if (O == null) return ko("Ontology not found: " + iri); VersionedOntology vo = repo.getVersionControlledOntology(O); if (vo.getNrOfRevisions() <= 1) return ko("Already at first revision."); vo.revertHeadTo(vo.getRevisions().get(vo.getNrOfRevisions() - 2)); OWL.reasoner().flush(); notifyOntoChange(iri); return ok(); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } @POST @Path("/synchTo/{iri}/{version}") public Json pullTo(@PathParam("iri") String iri, @PathParam("version") String version) { try { Refs.owlRepo.resolve().ensurePeerStarted(); OWLOntology O = OWL.manager().getOntology(IRI.create(iri)); if (O == null) return ko("Ontology not found: " + iri); OWL.reasoner().flush(); notifyOntoChange(iri); return ko("Operation not supported yet."); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } @POST @Path("/synchToLatest/{iri}") public Json pull(@PathParam("iri") String iri) { VDHGDBOntologyRepository repo = repo(); try { Refs.owlRepo.resolve().ensurePeerStarted(); OWLOntology O = OWL.manager().getOntology(IRI.create(iri)); if (O == null) return ko("Ontology not found: " + iri); DistributedOntology vo = repo.getDistributedOntology(O); PullActivity pull = repo.pull(vo, Refs.owlRepo.resolve().getDefaultPeer()); pull.getFuture().get(); OWL.reasoner().flush(); notifyOntoChange(iri); return ok().set("message", pull.getCompletedMessage()); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } @POST @Path("/pushLatest/{iri}") public Json push(@PathParam("iri") String iri) { VDHGDBOntologyRepository repo = repo(); try { Refs.owlRepo.resolve().ensurePeerStarted(); OWLOntology O = OWL.manager().getOntology(IRI.create(iri)); if (O == null) return ko("Ontology not found: " + iri); DistributedOntology vo = repo.getDistributedOntology(O); PullActivity pull = repo.pull(vo, Refs.owlRepo.resolve().getDefaultPeer()); pull.getFuture().get(); OWL.reasoner().flush(); notifyOntoChange(iri); return ok().set("message", pull.getCompletedMessage()); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } public Json pushALL() { VDHGDBOntologyRepository repo = repo(); try { Refs.owlRepo.resolve().ensurePeerStarted(); String messages = ""; System.out.println("Checking for Conflicts/Updates before commiting."); for (OWLOntology o : OWL.ontologies()) { VersionedOntology vo = repo.getVersionControlledOntology(o); DistributedOntology dOnto = repo.getDistributedOntology(o); HGPeerIdentity server = Refs.owlRepo.resolve().getDefaultPeer(); switch (getBeforeCommitPushAction(dOnto, server)) { case REVERT: System.out.println("Server revision conflicts with local."); System.out.println("We must revert..."); int lastMatchingRevision = revertToLastMatch (vo, dOnto, server); System.out.println("Done reverting."); System.out.println("Pulling last revision..."); pullFromServer(dOnto, server); System.out.println("Done pulling."); System.out.println("Re-Applying previuos changes..."); applyChangesSinceRevision (o, lastMatchingRevision); System.out.println("Done re-applying changes."); break; case PULL: System.out.println("Server revision is newer."); System.out.println("Pulling last revision..."); pullFromServer(dOnto, server); System.out.println("Done pulling."); break; case NOTHING: System.out.println("Server revision is identical, Nothing to do."); break; default: throw new RuntimeException ("Cannot commit this time."); } PushActivity push = repo.push(dOnto, server); push.getFuture().get(); messages += push.getCompletedMessage() + ", "; } OntologyChangesRepo.getInstance().clearAll(); return ok().set("message", messages); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } protected boolean commit(String userName, String comment, List <OWLOntologyChange> changes) throws RuntimeException { long commitTimeStamp = new Date().getTime(); VDHGDBOntologyRepository repo = repo(); try { Refs.owlRepo.resolve().ensurePeerStarted(); OWLOntologyManager manager = OWL.manager(); HGPeerIdentity server = Refs.owlRepo.resolve().getDefaultPeer(); // resolve conflicts before commit for (OWLOntology o : OWL.ontologies()) { VersionedOntology vo = repo.getVersionControlledOntology(o); DistributedOntology dOnto = repo.getDistributedOntology(o); if (vo == null || dOnto == null) { throw new RuntimeException ("Ontology found, but not versioned or distributed: " + o.getOntologyID()); } switch (getBeforeCommitPushAction(dOnto, server)) { case REVERT: System.out.println("Server revision conflicts with local."); System.out.println("We must revert..."); int lastMatchingRevision = revertToLastMatch (vo, dOnto, server); System.out.println("Done reverting."); System.out.println("Pulling last revision..."); pullFromServer(dOnto, server); System.out.println("Done pulling."); System.out.println("Re-Applying previuos changes..."); applyChangesSinceRevision (o, lastMatchingRevision); System.out.println("Done re-applying changes."); break; case PULL: System.out.println("Server revision is newer."); System.out.println("Pulling last revision..."); pullFromServer(dOnto, server); System.out.println("Done pulling."); break; case NOTHING: System.out.println("Server revision is identical, Nothing to do."); break; default: throw new RuntimeException ("Cannot commit this time."); } } manager.applyChanges(changes); int committedOntologyCount = 0; for (OWLOntology o : OWL.ontologies()) { VersionedOntology vo = repo.getVersionControlledOntology(o); if (vo == null) { throw new RuntimeException ("Ontology found, but not versioned: " + o.getOntologyID()); } int nrOfCommittableChanges = vo.getNrOfCommittableChanges(); if (nrOfCommittableChanges == 0) { int conflicts = vo.getWorkingSetConflicts().size(); if (conflicts > 0) { throw new RuntimeException ("All " + conflicts + " pending changes in Ontology " + o.getOntologyID() + " are conflicts, " + "which will be removed automatically on commit, so there is no single change to commit.."); } else { //do nothing } } else { vo.commit(userName, comment); committedOntologyCount++; int revision = vo.getHeadRevision().getRevision(); OntologyChangesRepo.getInstance().setOntoRevisionChanges(o.getOntologyID().toString(), revision, userName, comment, changes, commitTimeStamp); } } return committedOntologyCount > 0; } catch (Throwable t) { t.printStackTrace(System.err); throw new RuntimeException(t.toString()); } } private int revertToRevision (int revisionNumber, VersionedOntology vo){ RevisionID rID = new RevisionID(repo().getOntologyUUID(vo.getWorkingSetData()), revisionNumber); vo.revertHeadTo(rID, true); OWL.reasoner().flush(); return revisionNumber; } private boolean isPossibleToRollBack (List<Integer> revisions){ if (revisions.size() < 1) return false; for (int rnx: revisions){ boolean rf = false; for (OWLOntology o : OWL.ontologies()){ if (OntologyChangesRepo.getInstance().getOntoRevisionChanges(o.getOntologyID().toString(), rnx) != null) rf = true; } if (!rf) return false; } return true; } private List<Long> resolveCommitTimeStamps (List<Integer> revisions){ List <Long> result = new ArrayList<>(); for (OWLOntology o : OWL.ontologies()){ for (int rvx: revisions){ OntologyCommit ocx = OntologyChangesRepo.getInstance().getOntoRevisionChanges(o.getOntologyID().toString(), rvx); if (ocx != null) result.add(ocx.getTimeStamp()); } } return result; } protected boolean rollBackRevisions (List<Integer> revisions){ if (!isPossibleToRollBack (revisions)) return false; System.out.println("Roll Back Started."); HGPeerIdentity server = Refs.owlRepo.resolve().getDefaultPeer(); List <Long> timeStamps = resolveCommitTimeStamps(revisions); try { List<OntoChangesReference> toDelete = new ArrayList<>(); List<OntoChangesReference> toAdd = new ArrayList<>(); for (OWLOntology o : OWL.ontologies()){ System.out.println("Working on: " + o.getOntologyID().toString()); VersionedOntology vo = repo().getVersionControlledOntology(o); DistributedOntology dOnto = repo().getDistributedOntology(o); if (vo == null || dOnto == null) { throw new RuntimeException ("Ontology found, but not versioned or distributed: " + o.getOntologyID()); } System.out.println("Revert to last common revision number"); int baseRevision = revertToLastMatch(vo, dOnto, server); System.out.println("Done reverting."); System.out.println("Pulling last revision..."); pullFromServer(dOnto, server); System.out.println("Done pulling."); System.out.println("Re-Applying changes skipping selected revisions..."); applyChangesExcludingRevisions (o, baseRevision, revisions, timeStamps, toDelete, toAdd); System.out.println("Done re-applying changes."); } System.out.println("Updating changes repo..."); updateOntologyChangesRepo (toDelete, toAdd); System.out.println("Done updating changes repo."); System.out.println("Revisions roll back was successfull."); return true; } catch (Throwable t){ System.out.println("Error found while performing ontology roll back."); System.out.println("Revisions roll back failed."); System.out.println(t.getMessage()); System.out.println("Re-Applying all removed changes."); for (OWLOntology o : OWL.ontologies()){ System.out.println("Working on: " + o.getOntologyID().toString()); VersionedOntology vo = repo().getVersionControlledOntology(o); DistributedOntology dOnto = repo().getDistributedOntology(o); if (vo == null || dOnto == null) { throw new RuntimeException ("Ontology found, but not versioned or distributed: " + o.getOntologyID()); } System.out.println("Revert to last common revision number"); int baseRevision = revertToLastMatch(vo, dOnto, server); System.out.println("Done reverting."); System.out.println("Re-Applying previuos changes..."); applyChangesSinceRevision (o, baseRevision); System.out.println("Done re-applying changes."); System.out.println("Done with: " + o.getOntologyID().toString()); } System.out.println("Ontology successfully set to pre-rollback state."); OWL.reasoner().flush(); return false; } } private void updateOntologyChangesRepo (List<OntoChangesReference> toDelete, List<OntoChangesReference> toAdd){ for (int i = 0; i < toDelete.size(); i++){ OntologyChangesRepo.getInstance().deleteOntoRevisionChanges(toDelete.get(i).getOnto(), toDelete.get(i).getRevision()); OntologyChangesRepo.getInstance().setOntoRevisionChanges(toAdd.get(i).getOnto(), toAdd.get(i).getRevision(), toAdd.get(i).getValue()); } } private void applyChangesExcludingRevisions (OWLOntology o, int baseRevision, List<Integer> excludedRevisions, List<Long> excludedTimeStamps, List<OntoChangesReference> toDelete, List<OntoChangesReference> toAdd){ Map<Integer, OntologyCommit> changes = OntologyChangesRepo.getInstance().getAllRevisionChangesForOnto(o.getOntologyID().toString()); if (changes != null && !changes.isEmpty()) { VersionedOntology vo = repo().getVersionControlledOntology(o); if (vo == null) { throw new RuntimeException ("Ontology found, but not versioned: " + o.getOntologyID()); } for (Map.Entry<Integer, OntologyCommit> rx: changes.entrySet()){ if (rx.getKey().intValue() > baseRevision && excludedRevisions.indexOf(rx.getKey().intValue()) < 0 && excludedTimeStamps.indexOf(rx.getValue().getTimeStamp()) < 0){ OWL.manager().applyChanges(rx.getValue().getChanges()); vo.commit(rx.getValue().getUserName(), rx.getValue().getComment()); int newRevision = vo.getHeadRevision().getRevision(); toDelete.add(new OntoChangesReference(o.getOntologyID().toString(), rx.getKey().intValue(), null)); toAdd.add(new OntoChangesReference(o.getOntologyID().toString(), newRevision, rx.getValue())); } } } else System.out.println("No previous changes saved for: " + o.getOntologyID().toString()); } private int revertToLastMatch (VersionedOntology vo, DistributedOntology dOnto, HGPeerIdentity server){ VersionedOntologyComparisonResult compare = null; try { compare = repo().compareOntologyToRemote(dOnto, server, ACTIVITY_TIMEOUT_SECS); } catch (Throwable t) { throw new RuntimeException("System error while comparing to remote"); } int result = compare.getRevisionResults().get(compare.getLastMatchingRevisionIndex()).getTarget().getRevision(); RevisionID rID = new RevisionID(repo().getOntologyUUID(vo.getWorkingSetData()), result); vo.revertHeadTo(rID, true); OWL.reasoner().flush(); return result; } private void applyChangesSinceRevision (OWLOntology o, int revision){ Map<Integer, OntologyCommit> changes = OntologyChangesRepo.getInstance().getAllRevisionChangesForOnto(o.getOntologyID().toString()); if (changes != null && !changes.isEmpty()) { VersionedOntology vo = repo().getVersionControlledOntology(o); if (vo == null) { throw new RuntimeException ("Ontology found, but not versioned: " + o.getOntologyID()); } for (Map.Entry<Integer, OntologyCommit> rx: changes.entrySet()){ if (rx.getKey().intValue() > revision){ OWL.manager().applyChanges(rx.getValue().getChanges()); vo.commit(rx.getValue().getUserName(), rx.getValue().getComment()); int newRevision = vo.getHeadRevision().getRevision(); OntologyChangesRepo.getInstance().deleteOntoRevisionChanges(o.getOntologyID().toString(), rx.getKey().intValue()); OntologyChangesRepo.getInstance().setOntoRevisionChanges(o.getOntologyID().toString(), newRevision, rx.getValue()); } } } else System.out.println("No previous changes saved for: " + o.getOntologyID().toString()); } @POST @Path("/reloadFileBased/{iri}") public Json reload(@PathParam("iri") String iri) { try { OWLOntologyManager manager = OWL.manager(); OWLOntology ont = manager.getOntology(IRI.create(iri)); if (ont == null) return ko("Ontology not found: " + iri); IRI ontologyDocumentIRI = OWL.manager().getOntologyDocumentIRI(ont); // System.out.print("loading " + iri + " from " + ontologyDocumentIRI + "..."); synchronized(OWL.reasoner()) { manager.removeOntology(ont); try { ont = manager.loadOntologyFromOntologyDocument(ontologyDocumentIRI); System.out.println("done."); System.out.print("flushing reasoner" + OWL.reasoner() + "..."); //TODO maybe check OWL.reasoner().getBufferingMode(), so no flush might be needed. OWL.reasoner().flush(); System.out.println("done."); } catch (Throwable t) { if (manager instanceof SynchronizedOWLOntologyManager) { manager = ((SynchronizedOWLOntologyManager)manager).getWrappedOWLOntologyManager(); } ((OWLOntologyManagerImpl) manager).ontologyCreated(ont); // put it back - a hack but it works manager.setOntologyDocumentIRI(ont, ontologyDocumentIRI); String msg = "reload of " + iri + " from " + ontologyDocumentIRI + " failed with exception " + t.toString(); System.err.println(msg); return ko(msg); } } // notifyOntoChange(iri); return ok().set("message", "reload successful for " + iri + " from " + ontologyDocumentIRI); } catch (Throwable t) { t.printStackTrace(System.err); return ko(t.toString()); } } /** * Gets the total number of cache entries in the cached reasoner. * @return a json containing a long value; -1 if not a cached reasoner. */ @GET @Path("/cachedReasonerTotalEntryCount") public Json cachedReasonerTotalEntryCount() { OWLReasoner r = OWL.reasoner(); if (r instanceof CachedReasoner) { CachedReasoner cr = (CachedReasoner)r; return Json.make(cr.getTotalCacheEntryCount()); } else return Json.make(-1); } @GET @Path("/cachedReasonerStats") public Json cachedReasonerStats() { OWLReasoner r = OWL.reasoner(); if (r instanceof CachedReasoner) { CachedReasoner cr = (CachedReasoner)r; return Json.make(cr.getCacheStatus()); } else return Json.make("Reasoner is not a CachedReasoner instance."); } @GET @Path("/nrOfCachedReasoners") public Json nrOfCachedReasoners() { return Json.object("nrOfCachedReasoners", OWL.loader().getNrOfCachedReasoners()); } @GET @Path("/cachedReasonerQ1") public Json cachedReasonerQ1() { OWLReasoner r = OWL.reasoner(); if (r instanceof CachedReasoner) { CachedReasoner cr = (CachedReasoner)r; return cr.getInstancesCacheRequests(); } else return Json.make("Reasoner is not a CachedReasoner instance."); } @GET @Path("/cachedReasonerQ1Populate") public Json cachedReasonerQ1Populate() { String fileStr = StartUp.getConfig().at("workingDir").asString() + CACHED_REASONER_POPULATE_GET_INSTANCES_CACHE_FILE; File f = new File(fileStr); if (!f.exists()) return GenUtils.ko("Cannot populate: no file at :" + CACHED_REASONER_POPULATE_GET_INSTANCES_CACHE_FILE); OWLReasoner r = OWL.reasoner(); if (r instanceof CachedReasoner) { Json queries = Json.read(GenUtils.readTextFile(f)); CachedReasoner cr = (CachedReasoner)r; return cr.populateGetInstancesCache(queries); } else return Json.make("Reasoner is not a CachedReasoner instance."); } public synchronized Json compare(String ontologyName){ Refs.owlRepo.resolve().ensurePeerStarted(); VDHGDBOntologyRepository repo = repo(); // VDHGDBOntologyRepository repo = owlRepo.repo(); Json json = Json.array(); String iri = null; iri = "hgdb://www.miamidade.gov/cirm/" + ontologyName; HGDBOntology activeOnto = repo().getOntologyByDocumentIRI(IRI.create(iri)); //HGDBOntology activeOnto = repo.getOntologyByDocumentIRI(OWL.fullIri("http://www.miamidade.gov/cirm/legacy")); DistributedOntology distributedOnto = repo.getDistributedOntology(activeOnto); HGPeerIdentity server; ClientCentralizedOntology centralO = (ClientCentralizedOntology)distributedOnto; server = centralO.getServerPeer(); //if(server == null || distributedOnto == null || repo == null) // return json; VersionedOntologyComparisonResult result = repo.compareOntologyToRemote(distributedOnto, server, 180); Revision source = null; Revision target = null; for(RevisionComparisonResult r : result.getRevisionResults()){ RevisionCompareOutcome revisionOutcome = r.getOutcome(); source = r.getSource(); target = r.getTarget(); if(!revisionOutcome.name().equals("MATCH")) { Json outcome = Json.object().set("name", revisionOutcome.name()); Json sourceJson = Json.object(); if(source != null) { sourceJson.set("revision", source.getRevision()) .set("comment", source.getRevisionComment()) .set("date", source.getTimeStamp().getTime()) .set("user", source.getUser()); } else sourceJson = Json.nil(); Json targetJson = Json.object(); if(target != null){ targetJson.set("revision", target.getRevision()) .set("comment", target.getRevisionComment()) .set("date", target.getTimeStamp().getTime()) .set("user", target.getUser()); } else targetJson = Json.nil(); Json obj = Json.object().set("outcome", outcome) .set("source", sourceJson) .set("target", targetJson); json.add(obj); } } return json; } /** * Higher level cache population of the serial entity cache by running common login queries and * caching fully resolved Json objects. e.g. for each SR. * This leads to ~7x faster login performance after a server restart. * */ public void populateIndividualSerialEntityCache() { RestService.forceClientExempt.set(true); ThreadLocalStopwatch.start("START populateIndividualSerialEntityCache"); OWLIndividuals oind = new OWLIndividuals(); for (int i = 0; i < SERIAL_PRECACHE_IND_QUERIES.length; i++) { ThreadLocalStopwatch.start("START query " + i + " of " + SERIAL_PRECACHE_IND_QUERIES.length + " q=" + SERIAL_PRECACHE_IND_QUERIES[i]); oind.doQuery(SERIAL_PRECACHE_IND_QUERIES[i]); ThreadLocalStopwatch.start("DONE query"); } ThreadLocalStopwatch.start("END populateIndividualSerialEntityCache"); } public static void main(String[]args) { OntoAdmin admin = new OntoAdmin(); try { Refs.owlRepo.resolve().ensurePeerStarted(); Thread.sleep(10000); for (HGPeerIdentity id : admin.repo().getPeer().getConnectedPeers()) { System.out.println(id.toString() + " -- " + admin.repo().getPeer().getNetworkTarget(id)); System.out.println("dev:" + admin.repo().getPeer().getIdentity("cirmdevelopmentontology")); } } catch (Throwable t) { t.printStackTrace(); } finally { admin.repo().getPeer().stop(); } } /** * Checks if local pending changes may be committed and sent to the server based on a comparison. * Will open explanatory dialogs if a reason is found that would prevent a commit. * * @param dOnto * @param server * @return */ public REPOACTION getBeforeCommitPushAction(DistributedOntology dOnto, HGPeerIdentity server) { VersionedOntologyComparisonResult result = null; try { result = repo().compareOntologyToRemote(dOnto, server, ACTIVITY_TIMEOUT_SECS); } catch (Throwable t) { throw new RuntimeException("System error while comparing to remote"); } if (result != null) { if (result.isConflict()) { return REPOACTION.REVERT; } else if (result.isTargetNewer()) { return REPOACTION.PULL; } else { return REPOACTION.NOTHING; } } else { throw new RuntimeException("Cannot commit: There was a problem comparing the local history to the server's ontology. This might mean that the server was not available or a timeout occured. "); } } /** * pull from repo * */ public boolean pullFromServer (DistributedOntology dOnto, HGPeerIdentity server){ PullActivity pa = repo().pull(dOnto, server); try { ActivityResult paa = pa.getFuture().get(ACTIVITY_TIMEOUT_SECS, TimeUnit.SECONDS); if (paa.getException() != null) { throw new RuntimeException(paa.getException().getMessage()); } } catch (Throwable e) { throw new RuntimeException("Transaction timed out while pulling from the server."); } OWL.reasoner().flush(); return true; } }