package gw.solr.consistency uses gw.api.system.PLLoggerCategory uses gw.solr.utils.JSONMultiKeyParser uses gw.solr.utils.PLSolrUtils uses org.apache.solr.client.solrj.request.UpdateRequest uses org.json.simple.JSONAware uses org.json.simple.JSONObject uses java.util.Collection @ReadOnly abstract class ConsistencyProcessor { protected var _parser : JSONMultiKeyParser = new JSONMultiKeyParser() protected var _tracker : ConsistencyTracker protected var _msgObj : JSONAware protected var _newMsgObj : JSONAware protected var _urnTag : String protected var _modified : boolean = false construct(msgObj : JSONAware, newMsgObj : JSONAware, urnTag : String, tracker : ConsistencyTracker) { _msgObj = msgObj _newMsgObj = newMsgObj _urnTag = urnTag _tracker = tracker } abstract function children() : Collection abstract function addChild( ur : UpdateRequest, docObj : JSONObject ) function process() : UpdateRequest { var ur : UpdateRequest = null children().each( \ docObj -> { if(docObj typeis JSONObject) { docObj = processDocument( docObj, _urnTag, _parser ) if(docObj != null) { if(ur == null) { ur = new UpdateRequest() } addChild(ur, docObj) } } else { PLLoggerCategory.SOLR_INDEX.error("Expected message document type is JSONObject. Actual was {}", typeof docObj) } }) return ur } function processDocument(docObj : JSONObject, urnTag : String, jsonParser : JSONMultiKeyParser) : JSONObject { var docInfoObj = docObj.get(PLSolrUtils.CONSISTENCY_TAG) as JSONObject if(docInfoObj != null) { if(_tracker.Enabled) { final var origKey = _tracker.createCacheKey(docObj, urnTag) var newKey = origKey var priorInfoObj = _tracker.findConsistencyInfo(origKey, jsonParser) if(priorInfoObj != null) { var newDocObj = _tracker.checkAndUpdateVersion(docObj, docInfoObj, priorInfoObj) if(newDocObj != docObj) { if(newDocObj != null) { updateConsistencyTag(docInfoObj, newDocObj) newKey = _tracker.createCacheKey(docObj, urnTag) } else { newKey = null } docObj = newDocObj } } _tracker.storeConsistencyInfo(origKey, newKey, docInfoObj) } if(docObj != null) { docObj.remove(PLSolrUtils.CONSISTENCY_TAG) } _modified = true } return docObj } function updateConsistencyTag( docInfoObj : JSONObject, newDocObj : JSONObject ) : JSONObject { var newVersionObj = newDocObj.get(PLSolrUtils.VERSIONS_TAG) if(newVersionObj != null) { // Remove any existing tag first, otherwise, we'll get two tags due to the JSONMultiObject support docInfoObj.remove(PLSolrUtils.VERSIONS_TAG) docInfoObj.put(PLSolrUtils.VERSIONS_TAG, newVersionObj) } newDocObj.remove(PLSolrUtils.VERSIONS_TAG) return docInfoObj } }