package com.constellio.data.dao.services.bigVault.solr; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.params.SolrParams; @SuppressWarnings("serial") public class BigVaultException extends Exception { private BigVaultException(String message) { super(message); } private BigVaultException(String message, Throwable t) { super(message, t); } public static class CouldNotExecuteQuery extends BigVaultException { public CouldNotExecuteQuery(String query, Throwable t) { super("Could not execute " + query, t); } public CouldNotExecuteQuery(String query, SolrParams params, Throwable t) { super("Could not execute " + query + " with params : " + SolrUtils.toString(params), t); } public CouldNotExecuteQuery(String query, SolrInputDocument document, Throwable t) { super("Could not execute " + query + " with document : " + SolrUtils.toIdString(document), t); } } public static class NoResult extends BigVaultException { public NoResult(SolrParams params) { super("No result for query '" + SolrUtils.toString(params) + "'"); } } public static class NonUniqueResult extends BigVaultException { public NonUniqueResult(SolrParams params, SolrDocumentList list) { super("Non unique result for query '" + SolrUtils.toString(params) + "'. Found results : " + SolrUtils.toIdString(list)); } } public static class PreviousChangesCouldNotBeCommitted extends BigVaultException { public PreviousChangesCouldNotBeCommitted(Throwable t) { super("Previous changes could not be committed", t); } } public static class OptimisticLocking extends BigVaultException { final String id; final long version; public OptimisticLocking(Throwable t) { this(retreiveId(t.getMessage()), retreiveVersion(t.getMessage()), t); } public OptimisticLocking(String id, Long version, Throwable t) { super(getMessage(id, version), t); this.id = id; this.version = version; } private static String getMessage(String id, Long version) { return "Optimistic locking while saving solr document with id '" + id + "' in version '" + version + "'"; } public static Long retreiveVersion(String solrMessage) { if (checkIfDocNotFound(solrMessage) != null) { return 1L; } String phraseBefore = " expected="; String phraseAfter = " actual="; int idBeginIndex = solrMessage.indexOf(phraseBefore) + phraseBefore.length(); int idEndIndex = solrMessage.indexOf(phraseAfter); return Long.valueOf(solrMessage.substring(idBeginIndex, idEndIndex)); } public static String retreiveId(String solrMessage) { String errMsg = checkIfDocNotFound(solrMessage); if (errMsg != null) return errMsg; String phraseBefore = "version conflict for "; String phraseAfter = " expected="; int idBeginIndex = solrMessage.indexOf(phraseBefore) + phraseBefore.length(); int idEndIndex = solrMessage.indexOf(phraseAfter); return solrMessage.substring(idBeginIndex, idEndIndex); } private static String checkIfDocNotFound(String solrMessage) { int docNotFoundIdx = -1; String docNotFoundMsg = "Document not found for update. id="; if ((docNotFoundIdx = solrMessage.indexOf(docNotFoundMsg)) != -1) { return solrMessage.substring(docNotFoundIdx + docNotFoundMsg.length()); } return null; } public String getId() { return id; } public long getVersion() { return version; } } }