def __getStorageId(self, oid): req = SearchRequest('id:"%s"' % oid) req.addParam("fl", "storage_id") out = ByteArrayOutputStream() Services.indexer.search(req, out) json = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) return json.getList("response/docs").get(0).get("storage_id")
def test(self): s = "data " json = JsonConfigHelper() try: l = json.getList("test") s += str(l.size()) s += " '%s' " % json.get("test1") except Exception, e: s += "Error '%s'" % str(e)
def __activate__(self, context): response = context["response"] writer = response.getPrintWriter("text/plain; charset=UTF-8") auth = context["page"].authentication result = JsonConfigHelper() result.set("status", "error") result.set("message", "An unknown error has occurred") if auth.is_logged_in() and auth.is_admin(): services = context["Services"] formData = context["formData"] func = formData.get("func") oid = formData.get("oid") portalId = formData.get("portalId") portalManager = services.portalManager if func == "reharvest": if oid: print "Reharvesting object '%s'" % oid portalManager.reharvest("oid") result.set("status", "ok") result.set("message", "Object '%s' queued for reharvest") elif portalId: print " Reharvesting view '%s'" % portalId # TODO security filter # TODO this should loop through the whole portal, # not just the first page of results portal = portalManager.get(portalId) req = SearchRequest(portal.query) req.setParam("fq", 'item_type:"object"') out = ByteArrayOutputStream(); services.indexer.search(req, out) json = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) objectIds = json.getList("response/docs//id") if not objectIds.isEmpty(): portalManager.reharvest(objectIds) result.set("status", "ok") result.set("message", "Objects in '%s' queued for reharvest" % portalId) else: response.setStatus(500) result.set("message", "No object or view specified for reharvest") elif func == "reindex": if oid: print "Reindexing object '%s'" % oid services.indexer.index(oid) services.indexer.commit() result.set("status", "ok") result.set("message", "Objects in '%s' queued for reharvest" % portalId) else: response.setStatus(500) result.set("message", "No object specified to reindex") else: response.setStatus(500) result.set("message", "Unknown action '%s'" % func) else: response.setStatus(500) result.set("message", "Only administrative users can access this API") writer.println(result.toString()) writer.close()
def __getNavDataUnedited(self): query = self.sessionState.get("query") if query == "": query = "*:*" req = SearchRequest(query) req.setParam("fl", "id dc_title") req.setParam("sort", "f_dc_title asc") req.setParam("rows", "10000") pq = self.services.portalManager.get(self.portalId).query req.setParam("fq", pq) req.addParam("fq", 'item_type:"object"') req.addParam("fq", "workflow_modified:false") fq = self.sessionState.get("fq") if fq: for q in fq: req.addParam("fq", q) out = ByteArrayOutputStream() self.__indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) oidList = result.getList("response/docs/id") nameList = result.getList("response/docs/dc_title") return oidList, nameList
def __getNavData(self): query = self.sessionState.get("query") if query == "": query = "*:*" req = SearchRequest(query) req.setParam("fl", "id dc_title") req.setParam("sort", "f_dc_title asc") req.setParam("rows", "10000") ## TODO there could be more than this req.setParam("facet", "true") req.addParam("facet.field", "workflow_step") req.setParam("facet.sort", "false") pq = self.services.portalManager.get(self.portalId).query req.setParam("fq", pq) req.addParam("fq", 'item_type:"object"') fq = self.sessionState.get("fq") if fq: for q in fq: req.addParam("fq", q) out = ByteArrayOutputStream() self.__indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) oidList = result.getList("response/docs/id") nameList = result.getList("response/docs/dc_title") wfStep = result.getList("facet_counts/facet_fields/workflow_step") self.pending = 0 self.confirmed = 0 for i in range(len(wfStep)): if wfStep[i] == "pending": self.pending = wfStep[i+1] if wfStep[i] == "live": self.confirmed = wfStep[i+1] self.total = self.pending + self.confirmed return oidList, nameList
def __search(self, searchField): indexer = self.services.getIndexer() portalQuery = self.services.getPortalManager().get(self.portal.getName()).getQuery() portalSearchQuery = self.services.getPortalManager().get(self.portal.getName()).getSearchQuery() # Security prep work current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" startRow = 0 numPerPage = 25 numFound = 0 req = SearchRequest(searchField) if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) if not self.page.authentication.is_admin(): req.addParam("fq", security_query) objectIdList = [] while True: req.addParam("fq", 'item_type:"object"') req.addParam("rows", str(numPerPage)) req.addParam("start", str(startRow)) out = ByteArrayOutputStream() indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) docs = result.getList("response/docs/storage_id") objectIdList.extend(docs) startRow += numPerPage numFound = int(result.get("response/numFound")) if startRow > numFound: break return objectIdList
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() portalSearchQuery = Services.getPortalManager().get(portalId).getSearchQuery() # Security prep work current_user = page.authentication.get_username() security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' owner_query = 'owner:"' + current_user + '"' req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
class SearchData: def __init__(self): self.__portal = Services.portalManager.get(portalId) self.__result = JsonConfigHelper() self.__pageNum = sessionState.get("pageNum", 1) self.__selected = [] self.__search() def getPortalName(self): return self.__portal.getDescription() def encode(self, url): return URLEncoder.encode(url, "UTF-8") def __search(self): recordsPerPage = self.__portal.recordsPerPage uri = URLDecoder.decode(request.getAttribute("RequestURI")) query = None pagePath = portalId + "/" + pageName if uri != pagePath: query = uri[len(pagePath)+1:] if query is None or query == "": query = formData.get("query") if query is None or query == "": query = "*:*" if query == "*:*": self.__query = "" else: self.__query = query sessionState.set("query", self.__query) # find objects with annotations matching the query if query != "*:*": anotarQuery = self.__query annoReq = SearchRequest(anotarQuery) annoReq.setParam("facet", "false") annoReq.setParam("rows", str(99999)) annoReq.setParam("sort", "dateCreated asc") annoReq.setParam("start", str(0)) anotarOut = ByteArrayOutputStream() Services.indexer.annotateSearch(annoReq, anotarOut) resultForAnotar = JsonConfigHelper(ByteArrayInputStream(anotarOut.toByteArray())) resultForAnotar = resultForAnotar.getJsonList("response/docs") ids = HashSet() for annoDoc in resultForAnotar: annotatesUri = annoDoc.get("annotatesUri") ids.add(annotatesUri) print "Found annotation for %s" % annotatesUri # add annotation ids to query query += ' OR id:("' + '" OR "'.join(ids) + '")' portalSearchQuery = self.__portal.searchQuery if portalSearchQuery == "": portalSearchQuery = query else: if query != "*:*": query += " AND " + portalSearchQuery else: query = portalSearchQuery req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("verb") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = list(req.getParams("fq")) sessionState.set("fq", self.__selected) sessionState.set("searchQuery", portalSearchQuery) sessionState.set("pageNum", self.__pageNum) # Make sure 'fq' has already been set in the session if not page.authentication.is_admin(): security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' current_user = page.authentication.get_username() owner_query = 'owner:"' + current_user + '"' req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def canManage(self, wfSecurity): user_roles = page.authentication.get_roles_list() for role in user_roles: if role in wfSecurity: return True return False def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and \ not (self.__portal.query in self.__selected and len(self.__selected) == 2) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.splitext(os.path.basename(path))[0] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getMimeTypeIcon(self, format): # check for specific icon iconPath = "images/icons/mimetype/%s/icon.png" % format resource = Services.getPageService().resourceExists(portalId, iconPath) if resource is not None: return iconPath elif format.find("/") != -1: # check for major type return self.getMimeTypeIcon(format[:format.find("/")]) # use default icon return "images/icons/mimetype/icon.png" def getActiveManifestTitle(self): return self.__getActiveManifest().get("title") def getActiveManifestId(self): return sessionState.get("package/active/id") def getSelectedItemsCount(self): return self.__getActiveManifest().getList("manifest//id").size() def isSelectedForPackage(self, oid): return self.__getActiveManifest().get("manifest//node-%s" % oid) is not None def getManifestItemTitle(self, oid, defaultValue): return self.__getActiveManifest().get("manifest//node-%s/title" % oid, defaultValue) def __getActiveManifest(self): activeManifest = sessionState.get("package/active") if not activeManifest: activeManifest = JsonConfigHelper() activeManifest.set("title", "New package") activeManifest.set("viewId", portalId) sessionState.set("package/active", activeManifest) return activeManifest
class OrganiseData: def __init__(self): self.__portal = Services.portalManager.get(portalId) self.__result = JsonConfigHelper() self.__pageNum = sessionState.get("pageNum", 1) self.__selected = [] self.__storage = Services.storage uri = URLDecoder.decode(request.getAttribute("RequestURI")) basePath = portalId + "/" + pageName self.__oid = uri[len(basePath) + 1 :] slash = self.__oid.rfind("/") self.__pid = self.__oid[slash + 1 :] print "uri='%s' oid='%s' pid='%s'" % (uri, self.__oid, self.__pid) payload = None if self.__oid is not None and self.__oid != "": payload = self.__storage.getPayload(self.__oid, self.__pid) if payload is not None: self.__mimeType = payload.contentType else: self.__mimeType = "application/octet-stream" self.__metadata = JsonConfigHelper() print " * single.py: uri='%s' oid='%s' pid='%s' mimeType='%s'" % (uri, self.__oid, self.__pid, self.__mimeType) self.__search() def getManifestItem(self): hashId = md5.new(self.__oid).hexdigest() return self.getPortal().getMap("manifest//node-%s" % hashId) def getMimeType(self): return self.__mimeType def __search(self): req = SearchRequest('id:"%s"' % self.__oid) out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__json = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) self.__metadata = SolrDoc(self.__json) def getManifest(self): return self.getPortal().getJsonMap("manifest") def getContent(self): content = "" return content def getPortal(self): return Services.portalManager.get(portalId) def getPortalName(self): return Services.portalManager.get(portalId).description def __search(self): recordsPerPage = self.__portal.recordsPerPage query = None if query is None or query == "": query = formData.get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", "1000") req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("verb") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = req.getParams("fq") sessionState.set("fq", self.__selected) sessionState.set("pageNum", self.__pageNum) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * single.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination( self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage ) print " * single.py: updating manifest..." portal = self.getPortal() manifest = portal.getJsonMap("manifest") # add new items from search for doc in self.__result.getList("response/docs"): hashId = md5.new(doc.get("id")).hexdigest() node = portal.get("manifest//node-%s" % hashId) if node is None: portal.set("manifest/node-%s/title" % hashId, doc.get("dc_title").get(0)) portal.set("manifest/node-%s/id" % hashId, doc.get("id")) # remove manifest items missing from search result # print manifest for key in manifest.keySet(): item = manifest.get(key) id = item.get("id") doc = self.__result.getList('response/docs[@id="%s"]' % id) if len(doc) == 0: portal.removePath("manifest//%s" % key) Services.getPortalManager().save(portal) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0 def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0, len(valueList), 2): name = valueList[i] count = valueList[i + 1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and not ( self.__portal.query in self.__selected and len(self.__selected) == 2 ) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.split(path)[1] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getThumbnail(self, oid): ext = os.path.splitext(oid)[1] url = oid[oid.rfind("/") + 1 : -len(ext)] + ".thumb.jpg" if Services.getStorage().getPayload(oid, url): return url return None def getPayloadContent(self): mimeType = self.__mimeType print " * single.py: payload content mimeType=%s" % mimeType contentStr = "" if mimeType.startswith("text/"): if mimeType == "text/html": contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s"></iframe>' % ( contextPath, portalId, self.__oid, ) else: pid = self.__oid[self.__oid.rfind("/") + 1 :] payload = self.__storage.getPayload(self.__oid, pid) print " * single.py: pid=%s payload=%s" % (pid, payload) if payload is not None: sw = StringWriter() sw.write("<pre>") IOUtils.copy(payload.getInputStream(), sw) sw.write("</pre>") sw.flush() contentStr = sw.toString() elif ( mimeType == "application/pdf" or mimeType.find("vnd.ms") > -1 or mimeType.find("vnd.oasis.opendocument.") > -1 ): # get the html version if exist... pid = os.path.splitext(self.__pid)[0] + ".htm" print " * single.py: pid=%s" % pid # contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s/%s"></iframe>' % \ # (contextPath, portalId, self.__oid, pid) payload = self.__storage.getPayload(self.__oid, pid) saxReader = SAXReader(Boolean.parseBoolean("false")) try: document = saxReader.read(payload.getInputStream()) slideNode = document.selectSingleNode("//*[local-name()='body']") # linkNodes = slideNode.selectNodes("//img") # contentStr = slideNode.asXML(); # encode character entities correctly slideNode.setName("div") out = ByteArrayOutputStream() format = OutputFormat.createPrettyPrint() format.setSuppressDeclaration(True) format.setExpandEmptyElements(True) writer = XMLWriter(out, format) writer.write(slideNode) writer.close() contentStr = out.toString("UTF-8") except: traceback.print_exc() contentStr = '<p class="error">No preview available</p>' elif mimeType.startswith("image/"): src = "%s/%s" % (self.__oid, self.__pid) contentStr = ( '<a class="image" href="%(src)s" style="max-width:98%%">' '<img src="%(src)s" style="max-width:100%%" /></a>' % {"src": self.__pid} ) return contentStr def getOid(self): return self.__oid
class SearchData: def __init__(self): self.lastPortalId = "" def __activate__(self, context): self.services = context["Services"] self.page = context["page"] self.formData = context["formData"] self.sessionState = context["sessionState"] self.request = context["request"] self.pageName = context["pageName"] self.__portal = context["page"].getPortal() sessionNav = self.__portal.get("portal/use-session-navigation", "true") self.__useSessionNavigation = Boolean.parseBoolean(sessionNav) self.__result = JsonConfigHelper() if self.__useSessionNavigation: self.__pageNum = self.sessionState.get("pageNum", 1) else: self.__pageNum = 1 self.__selected = ArrayList() self.__fqParts = [] self.__searchField = self.formData.get("searchField", "full_text") if self.__portal.getName() != self.lastPortalId: self.sessionState.remove("fq") self.sessionState.remove("pageNum") self.__pageNum = 1 self.lastPortalId = self.__portal.getName() self.__search() def usingSessionNavigation(self): return self.__restful def getPortalName(self): return self.__portal.getDescription() def getSearchField(self): return self.__searchField def __search(self): recordsPerPage = self.__portal.recordsPerPage uri = URLDecoder.decode(self.request.getAttribute("RequestURI")) query = None pagePath = self.__portal.getName() + "/" + self.pageName if query is None or query == "": query = self.formData.get("query") if query is None or query == "": query = "*:*" if query == "*:*": self.__query = "" else: self.__query = query query = "%s:%s" % (self.__searchField, query) self.sessionState.set("query", self.__query) # find objects with annotations matching the query if query != "*:*": anotarQuery = self.__query annoReq = SearchRequest(anotarQuery) annoReq.setParam("facet", "false") annoReq.setParam("rows", str(99999)) annoReq.setParam("sort", "dateCreated asc") annoReq.setParam("start", str(0)) anotarOut = ByteArrayOutputStream() self.services.indexer.annotateSearch(annoReq, anotarOut) resultForAnotar = JsonConfigHelper(ByteArrayInputStream(anotarOut.toByteArray())) resultForAnotar = resultForAnotar.getJsonList("response/docs") ids = HashSet() for annoDoc in resultForAnotar: annotatesUri = annoDoc.get("annotatesUri") ids.add(annotatesUri) print "Found annotation for %s" % annotatesUri # add annotation ids to query query += ' OR id:("' + '" OR "'.join(ids) + '")' portalSearchQuery = self.__portal.searchQuery if portalSearchQuery == "": portalSearchQuery = query else: if query != "*:*": query += " AND " + portalSearchQuery else: query = portalSearchQuery req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", str(self.__portal.getFacetSort())) req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets if self.__useSessionNavigation: action = self.formData.get("verb") value = self.formData.get("value") fq = self.sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) else: navUri = uri[len(pagePath):] self.__pageNum, fq, self.__fqParts = self.__parseUri(navUri) savedfq = self.sessionState.get("savedfq") limits = [] if savedfq: limits.extend(savedfq) if fq: limits.extend(fq) self.sessionState.set("savedfq", limits) for q in fq: req.addParam("fq", URLDecoder.decode(q, "UTF-8")) portalQuery = self.__portal.query if portalQuery: req.addParam("fq", portalQuery) req.addParam("fq", 'item_type:"object"') if req.getParams("fq"): self.__selected = ArrayList(req.getParams("fq")) if self.__useSessionNavigation: self.sessionState.set("fq", self.__selected) self.sessionState.set("searchQuery", portalSearchQuery) self.sessionState.set("pageNum", self.__pageNum) # Make sure 'fq' has already been set in the session if not self.page.authentication.is_admin(): current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" req.addParam("fq", security_query) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() self.services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if (name.find("/") == -1 or self.hasSelectedFacets()) and count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and \ not (self.__portal.query in self.__selected and len(self.__selected) == 2) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.splitext(os.path.basename(path))[0] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) # Packaging support def getActiveManifestTitle(self): return self.__getActiveManifest().get("title") def getActiveManifestId(self): return self.sessionState.get("package/active/id") def getSelectedItemsCount(self): return self.__getActiveManifest().getList("manifest//id").size() def isSelectedForPackage(self, oid): return self.__getActiveManifest().get("manifest//node-%s" % oid) is not None def getManifestItemTitle(self, oid, defaultValue): return self.__getActiveManifest().get("manifest//node-%s/title" % oid, defaultValue) def __getActiveManifest(self): activeManifest = self.sessionState.get("package/active") if not activeManifest: activeManifest = JsonConfigHelper() activeManifest.set("title", "New package") activeManifest.set("viewId", self.__portal.getName()) self.sessionState.set("package/active", activeManifest) return activeManifest def isSelectableForPackage(self, oid): return oid != self.getActiveManifestId() # RESTful style URL support methods def getPageQuery(self, page): prefix = "" if self.__fqParts: prefix = "/" + "/".join(self.__fqParts) suffix = "" if page > 1: suffix = "/page/%s" % page return prefix + suffix def getFacetQueryUri(self, name, value): return "%s/%s" % (name, value) def getFacetValue(self, facetValue): return facetValue.split("/")[-1] def getLimitQueryWith(self, fq): limits = ArrayList(self.__fqParts) limits.add("category/" + fq) return "/".join(limits) def getFacetIndent(self, facetValue): return len(facetValue.split("/")) def getLimitQueryWithout(self, fq): limits = ArrayList(self.__fqParts) limits.remove("category/" + fq) if limits.isEmpty(): return "" return "/".join(limits) def __parseUri(self, uri): page = 1 fq = [] fqParts = [] if uri != "": parts = uri.split("/") partType = None facetKey = None facetValues = None for part in parts: if partType == "page": facetKey = None page = int(part) elif partType == "category": partType = "category-value" facetValues = None facetKey = part elif partType == "category-value": if facetValues is None: facetValues = [] if part in ["page", "category"]: partType = part facetQuery = '%s:"%s"' % (facetKey, "/".join(facetValues)) fq.append(facetQuery) fqParts.append("category/%s/%s" % (facetKey, "/".join(facetValues))) facetKey = None facetValues = None else: facetValues.append(URLDecoder.decode(part)) else: partType = part if partType == "category-value": facetQuery = '%s:"%s"' % (facetKey, "/".join(facetValues)) fq.append(facetQuery) fqParts.append("category/%s/%s" % (facetKey, "/".join(facetValues))) return page, fq, fqParts
class HomeData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context action = self.vc("formData").get("verb") portalName = self.vc("formData").get("value") self.vc("sessionState").remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: print "ERROR: Requested context entry '" + index + "' doesn't exist" return None def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(self.vc("portalId")).getQuery() portalSearchQuery = Services.getPortalManager().get(self.vc("portalId")).getSearchQuery() # Security prep work current_user = self.vc("page").authentication.get_username() security_roles = self.vc("page").authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" isAdmin = self.vc("page").authentication.is_admin() req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.vc("sessionState").set("fq", 'item_type:"object"') # sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
def __getSolrData(self): prefix = self.getSearchTerms() print "prefix='%s'" % prefix if prefix: query = "dc_title:%(prefix)s OR dc_title:%(prefix)s*" % {"prefix": prefix} query += " OR f_dc_identifier:%(ns)s%(prefix)s OR f_dc_identifier:%(ns)s%(prefix)s*" % { "prefix": prefix, "ns": "http\://example.com/arc/", } else: query = "*:*" portal = self.services.portalManager.get(self.portalId) if portal.searchQuery != "*:*" and portal.searchQuery != "": query = query + " AND " + portal.searchQuery req = SearchRequest(query) req.setParam("fq", 'item_type:"object"') if portal.query: req.addParam("fq", portal.query) req.setParam("fl", "score") req.setParam("sort", "score desc") req.setParam("start", self.getStartIndex()) req.setParam("rows", self.getItemsPerPage()) req.setParam("facet", "true") req.setParam("facet.field", "repository_name") req.setParam("facet.mincount", "1") ns = self.getNamespace() level = self.getFormData("level", None) if level and level != "top": req.addParam("fq", 'repository_name:"%s"' % level.replace(ns, "")) try: out = ByteArrayOutputStream() indexer = self.services.getIndexer() indexer.search(req, out) results = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if level == "top": narrowerMap = {} for doc in results.getJsonList("response/docs"): value = doc.getList("repository_name").get(0) hash = md5.md5(value).hexdigest() if not narrowerMap.has_key(hash): # print value, hash narrowerMap[hash] = [] narrowerMap[hash].append(doc.get("id")) docs = ArrayList() facets = results.getList("facet_counts/facet_fields/repository_name") for i in range(0, len(facets), 2): value = facets[i] hash = md5.md5(value).hexdigest() # print value,hash doc = JsonConfigHelper() doc.set("score", "1") doc.set("dc_identifier", "%s%s" % (ns, value)) doc.set("skos_inScheme", ns) doc.set("skos_broader", "%s%s" % (ns, value)) doc.set("skos_narrower", '", "'.join(narrowerMap[hash])) doc.set("skos_prefLabel", value) docs.add(doc) results.removePath("response/docs") results.setJsonList("response/docs", docs) return results except Exception, e: self.log.error("Failed to lookup '{}': {}", prefix, str(e))
class SearchData: def __init__(self): self.__result = JsonConfigHelper() self.__portal = Services.getPortalManager().get(portalId) pageNum = sessionState.get("pageNum") if pageNum is None: self.__pageNum = 1 else: self.__pageNum = int(pageNum) self.__search() def __search(self): recordsPerPage = self.__portal.recordsPerPage query = formData.get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("action") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = req.getParams("fq") sessionState.set("fq", self.__selected) sessionState.set("pageNum", self.__pageNum) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetName(self, key): return self.__portal.facetFields.get(key) def getFacetCounts(self, key): values = HashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return self.__selected is not None and self.__selected.size() > 1 def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.split(path)[1] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getThumbnail(self, oid): ext = os.path.splitext(oid)[1] url = oid[oid.rfind("/")+1:-len(ext)] + ".thumb" + ext return url
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) if action == "backup-portal": print "Backing up: ", portalName backupPath = "" email = "" portal = Services.portalManager.get(portalName) if portal: email = portal.email if portal.backupPaths: for key in portal.backupPaths: if portal.backupPaths[key]=="default": backupPath = key portalQuery = portal.getQuery() #print " ***** portalQuery: ", portalQuery #print " ***** backupPath: ", backupPath #print " ***** email: ", email #print " ***** description: ", description if backupPath is None: " ** Default backup path configured in system-config.json will be used " Services.portalManager.backup(email, backupPath, portalQuery) self.__latest = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) req.addParam("fq", "") req.setParam("rows", "0") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) if action == "backup-portal": print "Backing up: ", portalName backupPath = "" email = "" portal = Services.portalManager.get(portalName) if portal: email = portal.email if portal.backupPaths: for key in portal.backupPaths: if portal.backupPaths[key]=="default": backupPath = key portalQuery = portal.getQuery() #print " ***** portalQuery: ", portalQuery #print " ***** backupPath: ", backupPath #print " ***** email: ", email #print " ***** description: ", description if backupPath is None: " ** Default backup path configured in system-config.json will be used " Services.portalManager.backup(email, backupPath, portalQuery) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() portalSearchQuery = Services.getPortalManager().get(portalId).getSearchQuery() # Security prep work current_user = page.authentication.get_username() security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' owner_query = 'owner:"' + current_user + '"' req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
class DetailData: def __init__(self): self.userAgreement = AgreementData(bindings) def __activate__(self, context): self.velocityContext = context self.services = context["Services"] self.request = context["request"] self.response = context["response"] self.contextPath = context["contextPath"] self.formData = context["formData"] self.page = context["page"] self.uaActivated = False useDownload = Boolean.parseBoolean(self.formData.get("download", "true")) self.__isPreview = Boolean.parseBoolean(self.formData.get("preview", "false")) self.__previewPid = None self.__hasPid = False uri = URLDecoder.decode(self.request.getAttribute("RequestURI")) matches = re.match("^(.*?)/(.*?)/(?:(.*?)/)?(.*)$", uri) if matches and matches.group(3): oid = matches.group(3) pid = matches.group(4) self.__metadata = JsonConfigHelper() self.__object = self.__getObject(oid) self.__oid = oid # If we have a PID if pid: self.__hasPid = True if useDownload: # Download the payload to support relative links download = DownloadData() download.__activate__(context) else: # Render the detail screen with the alternative preview self.__readMetadata(oid) self.__previewPid = pid # Otherwise, render the detail screen else: self.__readMetadata(oid) self.__previewPid = self.getPreview() if self.__previewPid: self.__previewPid = URLEncoder.encode(self.__previewPid, "UTF-8") else: # require trailing slash for relative paths q = "" if self.__isPreview: q = "?preview=true" self.response.sendRedirect("%s/%s/%s" % (self.contextPath, uri, q)) def getAllowedRoles(self): metadata = self.getMetadata() if metadata is not None: return metadata.getList("security_filter") else: return [] def getAllPreviews(self): list = self.getAltPreviews() preview = self.getPreview() if not list.contains(preview): list.add(preview) return list def getAltPreviews(self): return self.__metadata.getList("altpreview") def getFileName(self): return self.getObject().getSourceId() def getFileNameSplit(self, index): return os.path.splitext(self.getFileName())[index] def getFriendlyName(self, name): if name.startswith("dc_"): name = name[3:] if name.startswith("meta_"): name = name[5:] return name.replace("_", " ").capitalize() def getMetadata(self): return self.__metadata def getMetadataMap(self): return self.__metadataMap def getObject(self): return self.__object def getOid(self): return self.__oid def getPreview(self): return self.__metadata.get("preview") def getPreviewPid(self): return self.__previewPid def getProperty(self, field): return self.getObject().getMetadata().getProperty(field) def getUserAgreement(self): if not self.uaActivated: self.userAgreement.__activate__(self.velocityContext, self.getMetadata()) self.uaActivated = True return self.userAgreement def hasLocalFile(self): # get original file.path from object properties filePath = self.getProperty("file.path") return filePath and os.path.exists(filePath) def hasPid(self): return self.__hasPid def isAccessDenied(self): myRoles = self.page.authentication.get_roles_list() allowedRoles = self.getAllowedRoles() for role in myRoles: if role in allowedRoles: return False return True def isDetail(self): return not (self.request.isXHR() or self.__isPreview) def isIndexed(self): return self.__getNumFound() == 1 def isPending(self): meta = self.getObject().getMetadata() status = meta.get("render-pending") return Boolean.parseBoolean(status) def setStatus(self, status): self.response.setStatus(status) def __getNumFound(self): return int(self.__solrData.get("response/numFound")) def __getObject(self, oid): obj = None try: storage = self.services.getStorage() try: obj = storage.getObject(oid) except StorageException: sid = self.__getStorageId(oid) if sid is not None: obj = storage.getObject(sid) print "Object not found: oid='%s', trying sid='%s'" % (oid, sid) except StorageException: print "Object not found: oid='%s'" % oid return obj def __getStorageId(self, oid): return self.__metadata.get("storage_id") def __loadSolrData(self, oid): portal = self.page.getPortal() query = 'id:"%s"' % oid if self.isDetail() and portal.getSearchQuery(): query += " AND " + portal.getSearchQuery() req = SearchRequest(query) req.addParam("fq", 'item_type:"object"') if self.isDetail(): req.addParam("fq", portal.getQuery()) out = ByteArrayOutputStream() self.services.getIndexer().search(req, out) self.__solrData = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def __readMetadata(self, oid): self.__loadSolrData(oid) if self.isIndexed(): self.__metadata = self.__solrData.getJsonList("response/docs").get(0) if self.__object is None: # Try again, indexed records might have a special storage_id self.__object = self.__getObject(oid) # Just a more usable instance of metadata self.__json = JsonConfigHelper(self.__solrData.getList("response/docs").get(0)) self.__metadataMap = TreeMap(self.__json.getMap("/")) else: self.__metadata.set("id", oid)