def __messages(self): if self.message_list is not None and len(self.message_list) > 0: msg = JsonConfigHelper() msg.set("oid", self.oid) message = msg.toString() for target in self.message_list: self.utils.sendMessage(target, message)
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
def __init__(self): #print "formData=%s" % formData json = JsonConfigHelper() oid = formData.get("oid") if oid: # TODO access checking on the object json.set("oid", oid) try: object = Services.getStorage().getObject(oid) meta = object.getMetadata() json.setMap("meta", meta) except StorageException, se: json.set("error", "Object '%s' not found!" % oid)
def __activate__(self, context): response = context["response"] json = JsonConfigHelper() auth = context["page"].authentication if auth.is_logged_in(): formData = context["formData"] oid = formData.get("oid") if oid: # TODO check security on object json.set("oid", oid) try: object = context["Services"].storage.getObject(oid) json.setMap("meta", object.getMetadata()) except StorageException: response.setStatus(500) json.set("error", "Object '%s' not found" % oid) else: response.setStatus(500) json.set("error", "An object identifier is required") else: response.setStatus(500) json.set("error", "Only registered users can access this API") writer = response.getPrintWriter("text/plain; charset=UTF-8") writer.println(json.toString()) writer.close()
def __activate__(self, context): self.velocityContext = context #print "formData=%s" % formData json = JsonConfigHelper() oid = self.velocityContext["formData"].get("oid") if oid: # TODO access checking on the object json.set("oid", oid) try: object = Services.getStorage().getObject(oid) meta = object.getMetadata() json.setMap("meta", meta) except StorageException, se: json.set("error", "Object '%s' not found!" % oid)
def getJson(self, state = "open"): title = "%s (%s)" % (self.getName(), self.getCount()) json = JsonConfigHelper() json.set("attributes/id", self.getId()) json.set("attributes/fq", self.getFacetQuery()) json.set("attributes/title", title) json.set("data", title) hasSubFacets = not self.getSubFacets().isEmpty() if hasSubFacets: json.set("state", state) subFacetList = ArrayList() for subFacet in self.getSubFacets(): subFacetList.add(subFacet.getJson("closed")) json.setJsonList("children", subFacetList) return json
def process_tags(self, result): tags = [] tagsDict = {} # Build a dictionary of the tags for doc in result: doc = JsonConfigHelper(doc.get("jsonString")) tag = doc.get("content/literal") locs = doc.getJsonList("annotates/locators").size() if locs == 0: if tag in tagsDict: d = tagsDict[tag] d.set("tagCount", str(int(d.get("tagCount")) + 1)) else: doc.set("tagCount", str(1)) tagsDict[tag] = doc else: tags.append(doc.toString()) for tag in tagsDict: tags.append(tagsDict[tag].toString()) return "[" + ",".join(tags) + "]"
def __activate__(self, context): request = context["request"] response = context["response"] writer = response.getPrintWriter("text/javascript; charset=UTF-8") result = JsonConfigHelper() ## Look for the JSONP callback to use jsonpCallback = request.getParameter("callback") if jsonpCallback is None: jsonpCallback = request.getParameter("jsonp_callback") if jsonpCallback is None: response.setStatus(403) writer.println("Error: This interface only responds to JSONP") writer.close() return if context["page"].authentication.is_logged_in(): result.set("isAuthenticated", "true") else: result.set("isAuthenticated", "false") writer.println(jsonpCallback + "(" + result.toString() + ")") writer.close()
def modify_json(self): #print "**** anotar.py : add_json() : adding json : " + json jsonObj = JsonConfigHelper(self.json) jsonObj.set("id", self.pid) rootUri = jsonObj.get("annotates/rootUri") if rootUri is not None: baseUrl = "http://%s:%s/" % (self.vc("request").serverName, self.vc("serverPort")) myUri = baseUrl + rootUri + "#" + self.pid jsonObj.set("uri", myUri) jsonObj.set("schemaVersionUri", "http://www.purl.org/anotar/schema/0.1") self.json = jsonObj.toString(False)
class ManifestActions: def __init__(self): print "formData=%s" % formData result = "{}" func = formData.get("func") oid = formData.get("oid") if func != "set-package-title": nodeId = formData.get("nodeId") nodePath = self.__getNodePath(formData.get("parents"), nodeId) originalPath = "manifest//%s" % nodeId self.__object = Services.getStorage().getObject(oid) sourceId = self.__object.getSourceId() payload = self.__object.getPayload(sourceId) self.__manifest = JsonConfigHelper(payload.open()) payload.close() if func == "set-package-title": title = formData.get("title") self.__manifest.set("title", StringEscapeUtils.escapeHtml(title)) self.__saveManifest() if func == "rename": title = formData.get("title") self.__manifest.set("%s/title" % nodePath, title) self.__saveManifest() elif func == "move": refNodeId = formData.get("refNodeId") refNodePath = self.__getNodePath(formData.get("refParents"), formData.get("refNodeId")); moveType = formData.get("type") if moveType == "before": self.__manifest.moveBefore(originalPath, refNodePath) elif moveType == "after": self.__manifest.moveAfter(originalPath, refNodePath) elif moveType == "inside": self.__manifest.move(originalPath, nodePath) self.__saveManifest() elif func == "update": title = StringEscapeUtils.escapeHtml(formData.get("title")) hidden = formData.get("hidden") hidden = hidden == "true" self.__manifest.set("%s/title" % nodePath, title) self.__manifest.set("%s/hidden" % nodePath, str(hidden)) #if self.__manifest.get("%s/id" % nodePath) is None: # print "blank node!" self.__saveManifest() result = '{ title: "%s", hidden: "%s" }' % (title, hidden) elif func == "delete": title = self.__manifest.get("%s/title" % nodePath) if title: self.__manifest.removePath(nodePath) self.__saveManifest() else: title = "Untitled" result = '{ title: "%s" }' % title self.__object.close() writer = response.getPrintWriter("text/plain; charset=UTF-8") writer.println(result) writer.close() def __getNodePath(self, parents, nodeId): parents = [p for p in parents.split(",") if p != ""] nodePath = "manifest/%s" % nodeId if len(parents) > 0: nodePath = "" for parent in parents: if nodePath == "": nodePath = "manifest/%s" % parent else: nodePath += "/children/%s" % parent nodePath += "/children/%s" % nodeId return nodePath def __saveManifest(self): manifestStr = String(self.__manifest.toString()) self.__object.updatePayload(self.__object.getSourceId(), ByteArrayInputStream(manifestStr.getBytes("UTF-8")))
def process(self): print " * settings.py: formData=%s" % self.vc("formData") result = "{}" portalManager = Services.getPortalManager() portal = portalManager.get(self.vc("portalId")) func = self.vc("formData").get("func") if func == "view-update": portal.setDescription(self.vc("formData").get("view-description")) portal.setQuery(self.vc("formData").get("view-query")) portal.setSearchQuery(self.vc("formData").get("view-search-query")) portal.setRecordsPerPage(int(self.vc("formData").get("view-records-per-page"))) portal.setFacetCount(int(self.vc("formData").get("view-facet-count"))) portal.setFacetDisplay(int(self.vc("formData").get("view-facet-display"))) portal.setFacetSort(self.vc("formData").get("view-facet-sort") is not None) portalManager.save(portal) elif func == "general-update": config = JsonConfig() email = StringUtils.trimToEmpty(self.vc("formData").get("general-email")) systemEmail = StringUtils.trimToEmpty(config.get("email")) print email, systemEmail if systemEmail != email: config.set("email", self.vc("formData").get("general-email"), True) config.set("configured", "true", True) config.store(NullWriter(), True) # mark restart Services.getHouseKeepingManager().requestUrgentRestart() else: print " * settings.py: email not updated: did not change" self.throw_error("Email address is the same! No change saved.") elif func == "facets-update": portal.removePath("portal/facet-fields") fields = self.vc("formData").getValues("field") labels = self.vc("formData").getValues("label") displays = self.vc("formData").getValues("display") deletes = self.vc("formData").getValues("delete") for i in range(0, len(fields)): field = fields[i] if deletes[i] == "false": portal.set("portal/facet-fields/%s/label" % field, labels[i]) portal.set("portal/facet-fields/%s/display" % field, displays[i]) portalManager.save(portal) elif func == "sort-update": portal.removePath("portal/sort-fields") fields = self.vc("formData").getValues("field") labels = self.vc("formData").getValues("label") deletes = self.vc("formData").getValues("delete") for i in range(0, len(fields)): field = fields[i] if deletes[i] == "false": portal.set("portal/sort-fields/%s" % field, labels[i]) portalManager.save(portal) elif func == "watcher-update": configFile = self.getWatcherFile() if configFile is not None: pathIds = self.vc("formData").get("pathIds").split(",") actives = self.vc("formData").getValues("watcher-active") if actives is None: actives = [] deletes = self.vc("formData").getValues("watcher-delete") if deletes is None: deletes = [] watchDirs = HashMap() for pathId in pathIds: if pathId not in deletes: path = self.vc("formData").get("%s-path" % pathId) stopped = str(pathId not in actives).lower() watchDir = HashMap() watchDir.put("ignoreFileFilter", self.vc("formData").get("%s-file" % pathId)) watchDir.put("ignoreDirectories", self.vc("formData").get("%s-dir" % pathId)) watchDir.put("cxtTags", []) watchDir.put("stopped", stopped) watchDirs.put(path, watchDir) json = JsonConfigHelper(self.getWatcherFile()) json.setMap("watcher/watchDirs", watchDirs) json.store(FileWriter(configFile), True) else: result = "The Watcher is not installed properly." elif func == "restore-default-config": # backup the file JsonConfig.backupSystemFile() # delete the file JsonConfig.getSystemFile().delete() # restore default JsonConfig.getSystemFile() # mark restart Services.getHouseKeepingManager().requestUrgentRestart() elif func == "housekeeping-update": config = JsonConfig() freq = StringUtils.trimToEmpty(self.vc("formData").get("housekeeping-timeout")) systemFreq = StringUtils.trimToEmpty(config.get("portal/houseKeeping/config/frequency")) result = "House Keeper refreshed" if systemFreq != freq: config.set("portal/houseKeeping/config/frequency", freq, True) config.store(NullWriter(), True) result = "Frequency updated, refreshing House Keeper" # Refresh the HouseKeeper message = JsonConfigHelper() message.set("type", "refresh") Services.getHouseKeepingManager().sendMessage(message.toString()) self.writer.println(result) self.writer.close()
def get_image(self): self.type = "http://www.purl.org/anotar/ns/type/0.1#Tag" mediaFragType = "http://www.w3.org/TR/2009/WD-media-frags-20091217" result = '{"result":' + self.search_solr() + '}' if result: imageTagList = [] imageTags = JsonConfigHelper(result).getJsonList("result") for imageTag in imageTags: imageAno = JsonConfigHelper() if imageTag.getJsonList("annotates/locators"): locatorValue = imageTag.getJsonList("annotates/locators").get(0).get("value") locatorType = imageTag.getJsonList("annotates/locators").get(0).get("type") if locatorValue and locatorValue.find("#xywh=")>-1 and locatorType == mediaFragType: _, locatorValue = locatorValue.split("#xywh=") left, top, width, height = locatorValue.split(",") imageAno.set("top", top) imageAno.set("left", left) imageAno.set("width", width) imageAno.set("height", height) imageAno.set("creator", imageTag.get("creator/literal")) imageAno.set("creatorUri", imageTag.get("creator/uri")) imageAno.set("id", imageTag.get("id")) #tagCount = imageTag.get("tagCount") imageAno.set("text", imageTag.get("content/literal")) imageAno.set("editable", "true"); imageTagList.append(imageAno.toString()) result = "[" + ",".join(imageTagList) + "]" return result
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()
# Workflow data WORKFLOW_ID = "workflow1" wfChanged = False customFields = {} try: wfPayload = object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: item_security = stage.getList("visibility") workflow_security = stage.getList("security") # Form processing formData = wfMeta.getJsonList("formData") if formData.size() > 0:
def __init__(self): self.action = formData.get("action") self.rootUri = formData.get("rootUri") self.json = formData.get("json") self.type = formData.get("type") self.rootUriList = formData.getValues("rootUriList") print " * anotar.py : '" + self.action + "' : ", formData # ?? media fragment stuff? if self.rootUri and self.rootUri.find("?ticks") > -1: self.rootUri = self.rootUri[: self.rootUri.find("?ticks")] # Portal path info portalPath = contextPath + "/" + portalId + "/" self.oid = self.rootUri if self.oid and self.oid.startswith(portalPath): self.oid = self.oid[len(portalPath) :] if self.action == "getList": # Repsonse is a list of object (nested) # print "**** anotar.py : GET_SOLR : " + self.rootUri result = self.search_solr() elif self.action == "put": # Response is an ID # print "**** anotar.py : PUT : " + self.rootUri result = self.put() elif self.action == "get-image": self.type = "http://www.purl.org/anotar/ns/type/0.1#Tag" mediaFragType = "http://www.w3.org/TR/2009/WD-media-frags-20091217" result = '{"result":' + self.search_solr() + "}" if result: imageTagList = [] imageTags = JsonConfigHelper(result).getJsonList("result") for imageTag in imageTags: imageAno = JsonConfigHelper() if imageTag.getJsonList("annotates/locators"): locatorValue = imageTag.getJsonList("annotates/locators").get(0).get("value") locatorType = imageTag.getJsonList("annotates/locators").get(0).get("type") if locatorValue and locatorValue.find("#xywh=") > -1 and locatorType == mediaFragType: _, locatorValue = locatorValue.split("#xywh=") left, top, width, height = locatorValue.split(",") imageAno.set("top", top) imageAno.set("left", left) imageAno.set("width", width) imageAno.set("height", height) imageAno.set("creator", imageTag.get("creator/literal")) imageAno.set("creatorUri", imageTag.get("creator/uri")) imageAno.set("id", imageTag.get("id")) # tagCount = imageTag.get("tagCount") imageAno.set("text", imageTag.get("content/literal")) # imageAno.set("editable", Boolean(False).toString()); imageTagList.append(imageAno.toString()) result = "[" + ",".join(imageTagList) + "]" elif self.action == "save-image": jsonTemplate = """ { "clientVersionUri": "http://www.purl.org/anotar/client/0.1", "type" : "http://www.purl.org/anotar/ns/type/0.1#Tag", "title" : { "literal" : null, "uri" : null }, "annotates" : { "uri" : "%s", "rootUri" : "%s", "locators" : [ { "originalContent": null, "type" : "http://www.w3.org/TR/2009/WD-media-frags-20091217", "value" : "%s" } ] }, "creator" : { "literal" : "%s", "uri" : "%s", "email" : { "literal" : null } }, "dateCreated" : { "literal" : "%s", "uri" : null }, "dateModified" : { "literal" : null, "uri" : null }, "content" : { "mimeType" : "text/plain", "literal" : "%s", "formData" : { } }, "contentUri": "", "isPrivate" : false, "lang" : "en" } """ mediaDimension = "xywh=%s,%s,%s,%s" % ( formData.get("left"), formData.get("top"), formData.get("width"), formData.get("height"), ) locatorValue = "%s#%s" % (self.rootUri, mediaDimension) dateCreated = time.strftime("%Y-%m-%dT%H:%M:%SZ") self.json = jsonTemplate % ( self.rootUri, self.rootUri, locatorValue, formData.get("creator"), formData.get("creatorUri"), dateCreated, formData.get("text"), ) result = self.put() writer = response.getPrintWriter("text/plain; charset=UTF-8") writer.println(result) writer.close()
# Workflow data WORKFLOW_ID = "workflow1" wfChanged = False customFields = {} message_list = None try: wfPayload = object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: wfMeta.set("label", stage.get("label")) item_security = stage.getList("visibility") workflow_security = stage.getList("security") if wfChanged == True: message_list = stage.getList("message")
def __workflow(self): # Workflow data WORKFLOW_ID = "packaging" wfChanged = False workflow_security = [] self.message_list = None try: wfPayload = self.object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = self.config.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: wfMeta.set("label", stage.get("label")) self.item_security = stage.getList("visibility") workflow_security = stage.getList("security") if wfChanged == True: self.message_list = stage.getList("message") # Form processing formData = wfMeta.getJsonList("formData") if formData.size() > 0: formData = formData[0] else: formData = None coreFields = ["title", "creator", "contributor", "description", "format", "creationDate"] if formData is not None: # Core fields title = formData.getList("title") if title: self.titleList = title creator = formData.getList("creator") if creator: self.creatorList = creator contributor = formData.getList("contributor") if contributor: self.contributorList = contributor description = formData.getList("description") if description: self.descriptionList = description format = formData.getList("format") if format: self.formatList = format creation = formData.getList("creationDate") if creation: self.creationDate = creation # Non-core fields data = formData.getMap("/") for field in data.keySet(): if field not in coreFields: self.customFields[field] = formData.getList(field) except StorageException, e: # No workflow payload, time to create wfChanged = True wfMeta = JsonConfigHelper() wfMeta.set("id", WORKFLOW_ID) wfMeta.set("step", "pending") wfMeta.set("pageTitle", "Uploaded Files - Management") stages = self.config.getJsonList("stages") for stage in stages: if stage.get("name") == "pending": wfMeta.set("label", stage.get("label")) self.item_security = stage.getList("visibility") workflow_security = stage.getList("security") self.message_list = stage.getList("message")
class ManifestData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context auth = context["page"].authentication if auth.is_logged_in(): self.fd = self.vc("formData").get print "formData=%s" % self.vc("formData") result = "{}" func = self.fd("func") oid = self.fd("oid") if func != "update-package-meta": nodeId = self.fd("nodeId") nodePath = self.__getNodePath(self.fd("parents"), nodeId) originalPath = "manifest//%s" % nodeId self.__object = Services.getStorage().getObject(oid) sourceId = self.__object.getSourceId() payload = self.__object.getPayload(sourceId) self.__manifest = JsonConfigHelper(payload.open()) payload.close() if func == "update-package-meta": print "********* update-package-meta ***************" metaList = list(self.vc("formData").getValues("metaList")) for metaName in metaList: value = self.fd(metaName) self.__manifest.set(metaName, value) #title = formData.get("title") #self.__manifest.set("title", StringEscapeUtils.escapeHtml(title)) self.__saveManifest() if func == "rename": title = self.fd("title") self.__manifest.set("%s/title" % nodePath, title) self.__saveManifest() elif func == "move": refNodeId = self.fd("refNodeId") refNodePath = self.__getNodePath(self.fd("refParents"), self.fd("refNodeId")); moveType = self.fd("type") if moveType == "before": self.__manifest.moveBefore(originalPath, refNodePath) elif moveType == "after": self.__manifest.moveAfter(originalPath, refNodePath) elif moveType == "inside": self.__manifest.move(originalPath, nodePath) self.__saveManifest() elif func == "update": title = StringEscapeUtils.escapeHtml(self.fd("title")) hidden = self.fd("hidden") hidden = hidden == "true" self.__manifest.set("%s/title" % nodePath, title) self.__manifest.set("%s/hidden" % nodePath, str(hidden)) #if self.__manifest.get("%s/id" % nodePath) is None: # print "blank node!" self.__saveManifest() result = '{ title: "%s", hidden: "%s" }' % (title, hidden) elif func == "delete": title = self.__manifest.get("%s/title" % nodePath) if title: self.__manifest.removePath(nodePath) self.__saveManifest() else: title = "Untitled" result = '{ title: "%s" }' % title self.__object.close() else: result = '{ "status": "error", "message": "Only registered users can access this API" }' writer = self.vc("response").getPrintWriter("text/plain; charset=UTF-8") writer.println(result) writer.close() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: log.error("ERROR: Requested context entry '" + index + "' doesn't exist") return None def __getNodePath(self, parents, nodeId): parents = [p for p in parents.split(",") if p != ""] nodePath = "manifest/%s" % nodeId if len(parents) > 0: nodePath = "" for parent in parents: if nodePath == "": nodePath = "manifest/%s" % parent else: nodePath += "/children/%s" % parent nodePath += "/children/%s" % nodeId return nodePath def __saveManifest(self): manifestStr = String(self.__manifest.toString()) self.__object.updatePayload(self.__object.getSourceId(), ByteArrayInputStream(manifestStr.getBytes("UTF-8")))
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)
def __processRequest(self): baseUrl = "http://%s:%s%s/%s" % (request.serverName, serverPort, contextPath, portalId) depositUrl = "%s/sword/deposit.post" % baseUrl sword = SwordSimpleServer(depositUrl) try: p = request.path.split(portalId+"/"+pageName+"/")[1] # portalPath except: p = "" if p=="post": print "\n--- post ---" c = sword.getClient() c.clearProxy() c.clearCredentials() postMsg = sword.getPostMessage(); postMsg.filetype = "application/zip" postMsg.filepath = "/home/ward/Desktop/Test.zip" depositResponse = c.postFile(postMsg) return str(depositResponse) elif p=="servicedocument": #print "\n--- servicedocument ---" sdr = sword.getServiceDocumentRequest() sdr.username = formData.get("username", "test") sdr.password = formData.get("password", "test") if formData.get("test"): depositUrl += "?test=1" sd = sword.doServiceDocument(sdr) # get a serviceDocument out = response.getPrintWriter("text/xml") out.println(str(sd)) out.close() bindings["pageName"] = "-noTemplate-" return sd elif p=="deposit.post": #print "\n--- deposit --- formData='%s'" % str(formData) inputStream = formData.getInputStream() headers = {} for x in formData.getHeaders().entrySet(): headers[x.getKey()] = x.getValue() deposit = sword.getDeposit() noOp = headers.get("X-No-Op") or "false" deposit.noOp = (noOp.lower()=="true") or \ (formData.get("test") is not None) contentDisposition = headers.get("Content-Disposition", "") filename = "" if contentDisposition!="": try: filename = contentDisposition.split("filename=")[1] deposit.filename = filename except: pass slug = headers.get("Slug") if slug is not None and slug!="": deposit.slug = slug #elif filename!="": # deposit.slug = filename deposit.username = "******" deposit.password = deposit.username try: file = File.createTempFile("tmptf", ".zip") file.deleteOnExit() fos = FileOutputStream(file.getAbsolutePath()) IOUtils.copy(inputStream, fos) fos.close() print "copied posted data to '%s'" % file.getAbsolutePath() except Exception, e: print "--- Exception - '%s'" % str(e) deposit.contentDisposition = file.getAbsolutePath() #???? deposit.file = inputStream depositResponse = sword.doDeposit(deposit) id = str(depositResponse.getEntry().id) try: print #imsPlugin = PluginManager.getTransformer("ims") jsonConfig = JsonConfig() #imsPlugin.init(jsonConfig.getSystemFile()) #harvestClient = HarvestClient(jsonConfig.getSystemFile()); storagePlugin = PluginManager.getStorage(jsonConfig.get("storage/type")) #storagePlugin.init(jsonConfig.getSystemFile()) setConfigUri = self.__getPortal().getClass().getResource("/swordRule.json").toURI() configFile = File(setConfigUri) harvestConfig = JsonConfigHelper(configFile); tFile = File.createTempFile("harvest", ".json") tFile.deleteOnExit() harvestConfig.set("configDir", configFile.getParent()) harvestConfig.set("sourceFile", file.getAbsolutePath()) harvestConfig.store(FileWriter(tFile)) zipObject = GenericDigitalObject(id) zipObject.addPayload(FilePayload(file, id)) #digitalObject = imsPlugin.transform(zipObject, file) qStorage = QueueStorage(storagePlugin, tFile) qStorage.init(jsonConfig.getSystemFile()) qStorage.addObject(zipObject) if deposit.noOp: print "-- Testing noOp='true' --" else: # deposit the content pass except Exception, e: print "---" print " -- Exception - '%s'" % str(e) print "---"
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(): services = context["Services"] formData = context["formData"] contextPath = context["contextPath"] sessionState = context["sessionState"] func = formData.get("func") portalManager = services.portalManager if func == "create-view": try: fq = [q for q in sessionState.get("fq") if q != 'item_type:"object"'] id = formData.get("id") description = formData.get("description") print "Creating view '%s': '%s'" % (id, description) portal = Portal(id) portal.setDescription(formData.get("description")) portal.setQuery(" OR ".join(fq)) portal.setSearchQuery(sessionState.get("searchQuery")) portal.setFacetFields(portalManager.default.facetFields) portalManager.add(portal) portalManager.save(portal) result.set("status", "ok") result.set("message", "View '%s' successfully created" % id) result.set("url", "%s/%s/home" % (contextPath, id)) except Exception, e: response.setStatus(500) result.set("message", str(e)) elif func == "delete-view": defaultPortal = context["defaultPortal"] portalId = formData.get("view") if auth.is_admin(): if not portalId: response.setStatus(500) result.set("message", "No view specified to be deleted") elif portalId != defaultPortal: # sanity check: don't delete default portal print "Deleting view '%s'" % portalId try: portalManager.remove(portalId) result.set("status", "ok") result.set("message", "View '%s' successfully removed" % portalId) result.set("url", "%s/%s/home" % (contextPath, defaultPortal)) except Exception, e: result.set("message", str(e)) else: response.setStatus(500) result.set("message", "The default view cannot be deleted") else: response.setStatus(403) result.set("message", "Only administrative users can access this API")
# Workflow data WORKFLOW_ID = "packaging" wfChanged = False customFields = {} message_list = None try: wfPayload = object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: wfMeta.set("label", stage.get("label")) item_security = stage.getList("visibility") workflow_security = stage.getList("security") if wfChanged == True: message_list = stage.getList("message")
# Workflow data WORKFLOW_ID = "packaging" wfChanged = False customFields = {} try: wfPayload = object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: item_security = stage.getList("visibility") workflow_security = stage.getList("security") # Form processing formData = wfMeta.getJsonList("formData") if formData.size() > 0:
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))