def __init__(self): responseType = "text/html; charset=UTF-8" responseMsg = "" func = formData.get("func") if func == "url-history": responseType = "text/plain; charset=UTF-8" responseMsg = "\n".join(self.getUrls()) else: try: url = formData.get("url") title = formData.get("title") username = formData.get("username") password = formData.get("password") try: auth = ProxyBasicAuthStrategy(username, password, url) self.__service = AtomClientFactory.getAtomService(url, auth) oid = formData.get("oid") if oid is not None: self.__object = Services.getStorage().getObject(oid) sourceId = self.__object.getSourceId() payload = self.__object.getPayload(sourceId) print "payload=%s,%s" % (payload, payload.getContentType()) # FIXME see https://fascinator.usq.edu.au/trac/ticket/647 if payload and sourceId.endswith(".tfpackage"): #payload.getContentType() == "application/x-fascinator-package": jsonManifest = JsonConfigHelper(payload.open()) print jsonManifest.toString() content = self.__getManifestContent(jsonManifest) payload.close() else: content = self.__getContent(oid) self.__object.close() else: content = "<div>Object not found!</div>" success, value = self.__post(title, content) except Exception, e: e.printStackTrace() success = False value = e.getMessage() if success: altLinks = value.getAlternateLinks() if altLinks is not None: self.saveUrl(url) responseMsg = "<p>Success! Visit the <a href='%s' target='_blank'>blog post</a>.</p>" % altLinks[0].href else: responseMsg = "<p class='warning'>The server did not return a valid link!</p>" else: responseMsg = "<p class='error'>%s</p>" % value except Exception, e: print "Failed to post: %s" % e.getMessage() responseMsg = "<p class='error'>%s</p>" % e.getMessage()
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"] 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 __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 __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 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)
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()
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 __getRvtManifest(self, manifest): rvtMap = HashMap() rvtMap.put("title", self.__manifest.get("title")) rvtMap.put("toc", self.__getRvtNodes(manifest)) rvtManifest = JsonConfigHelper(rvtMap) return rvtManifest.toString()
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()
organizations = organizations.findall(ns+"organization") organizations = [o for o in organizations if o.attrib.get("identifier")==defaultName] organization = organizations[0] title = organization.find(ns+"title").text rvtMap.put("title", title) items = organization.findall(ns+"item") rvtMap.put("toc", self.__getJsonItems(ns, items, resources)) except Exception, e: data["error"] = "Error - %s" % str(e) print data["error"] object.close() except StorageException, e: data["DEBUG"] = str(e.getMessage()) rvtManifest = JsonConfigHelper(rvtMap) return rvtManifest.toString() def __getJsonItems(self, ns, items, resources): rvtNodes = ArrayList() for item in items: attr = item.attrib isvisible = attr.get("isvisible") == "true" idref = attr.get("identifierref") id = resources.get(idref) title = item.find(ns+"title").text if isvisible and id and id.endswith(".htm"): rvtNode = HashMap() rvtNode.put("visible", True) rvtNode.put("relPath", id) rvtNode.put("title", title) rvtNode.put("children", self.__getJsonItems(ns, item.findall(ns+"item"), resources))
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()
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")))
status, reply = self.__post(self.__baseUrl, rdf) try: url = reply.split(':about="')[1].split('"', 1)[0] except: url = "" d = {"url": url, "status":status} elif method=="test": return "Testing" else: d = {"error": "Unknown method '%s'" % method, "data":[]} except Exception, e: d = {"error": "Exception '%s'" % repr(e)} #return "('Annotation test data', '%s')" % repr(s) j = JsonConfigHelper(d) return j.toString() #return repr(d) # --- Private Methods --- def __getJsonFromRdf(self, rdfStr): # selfUrl, commentType, annotates, context, title, creator, # bodyUrl/body, created, rootUrl, inReplyTo # d = {} dataList = [] try: dom = self.saxReader.read(StringReader(rdfStr)) for descNode in dom.selectNodes("//rdf:Description"): def st(xpath): n = descNode.selectSingleNode(xpath)
except StorageException, e: # No workflow payload, time to create wfChanged = True wfMeta = JsonConfigHelper() wfMeta.set("id", WORKFLOW_ID) wfMeta.set("step", "pending") stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == "pending": item_security = stage.getList("visibility") workflow_security = stage.getList("security") # Has the workflow metadata changed? if wfChanged == True: jsonString = String(wfMeta.toString()) inStream = ByteArrayInputStream(jsonString.getBytes("UTF-8")) try: StorageUtils.createOrUpdatePayload(object, "workflow.metadata", inStream) except StorageException, e: print " * workflow-harvester.py : Error updating workflow payload" rules.add(AddField("workflow_id", wfMeta.get("id"))) rules.add(AddField("workflow_step", wfMeta.get("step"))) for group in workflow_security: rules.add(AddField("workflow_security", group)) # some defaults if the above failed if titleList == []: #use object's source id (i.e. most likely a filename) titleList.append(object.getSourceId())
wfChanged = True wfMeta = JsonConfigHelper() wfMeta.set("id", WORKFLOW_ID) wfMeta.set("step", "pending") wfMeta.set("pageTitle", "Organiser") stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == "pending": wfMeta.set("label", stage.get("label")) item_security = stage.getList("visibility") workflow_security = stage.getList("security") message_list = stage.getList("message") # Has the workflow metadata changed? if wfChanged == True: jsonString = String(wfMeta.toString()) inStream = ByteArrayInputStream(jsonString.getBytes("UTF-8")) try: StorageUtils.createOrUpdatePayload(object, "workflow.metadata", inStream) except StorageException, e: print " * packaging-rules.py : Error updating workflow payload" rules.add(AddField("workflow_id", wfMeta.get("id"))) rules.add(AddField("workflow_step", wfMeta.get("step"))) rules.add(AddField("workflow_step_label", wfMeta.get("label"))) for group in workflow_security: rules.add(AddField("workflow_security", group)) # Index our metadata finally indexList("dc_title", titleList) indexList("dc_creator", creatorList) #no dc_author in schema.xml, need to check