Skip to content

Commit

Permalink
Ontology model now with required ownerName entry instead of optional …
Browse files Browse the repository at this point in the history
…orgName.
  • Loading branch information
carueda committed May 13, 2016
1 parent 001bf26 commit 826a3ad
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 53 deletions.
5 changes: 5 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
## change log ##

* 2016-05-12: 0.3.1:
- Ontology model now with required ownerName entry instead of optional orgName.
The syntax for this string: `ownerName ::= <orgName> | ~<userName>`.
So now we accept submissions to be owned by the submitting user when no
organization is specified in the POST /ont request.

- for OntologyVersion.author get the first value obtained in this order:
- contact_name from AquaImporter
- omvmmi.hasContentCreator
Expand Down
69 changes: 30 additions & 39 deletions src/main/scala/org/mmisw/orr/ont/app/OntController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,12 @@ class OntController(implicit setup: Setup,
val uri = requireParam("uri")
val originalUriOpt = getParam("originalUri") // for fully-hosted mode
val name = requireParam("name")
val orgName = requireParam("orgName")
val orgNameOpt = getParam("orgName")
val user = verifyUser(getParam("userName"))

// TODO allow absent orgName so user can submit on her own behalf?

orgsDAO.findOneById(orgName) match {
case None =>
error(400, s"'$orgName' invalid organization")

case Some(org) =>
verifyIsUserOrAdminOrExtra(org.members)
val ownerName = orgNameOpt match {
case Some(orgName) => verifyOrgName(orgName)
case None => "~" + user.userName
}

// TODO capture version_status from parameter
Expand All @@ -95,7 +90,7 @@ class OntController(implicit setup: Setup,
val ontFileWriter = getOntFileWriter(user)

Created(createOntology(uri, originalUriOpt, name, version,
version_status, date, ontFileWriter, orgName))
version_status, date, ontFileWriter, ownerName))
}

/*
Expand All @@ -109,19 +104,7 @@ class OntController(implicit setup: Setup,

val (ont, _, _) = resolveOntology(uri, versionOpt)

ont.orgName match {
case Some(orgName) =>
orgsDAO.findOneById(orgName) match {
case None =>
bug(s"org '$orgName' should exist")

case Some(org) =>
verifyIsUserOrAdminOrExtra(org.members)
}

case None =>
bug(s"currently I expect registered ont to have org associated")
}
verifyOwnerName(ont.ownerName)

val ontFileWriterOpt: Option[OntFileWriter] = getOntFileWriterOpt(user) orElse {
getParam("metadata") map (getOntFileWriterWithMetadata(uri, versionOpt, _))
Expand All @@ -141,6 +124,23 @@ class OntController(implicit setup: Setup,
}
}

private def verifyOwnerName(ownerName: String): Unit = {
OntOwner(ownerName) match {
case OrgOntOwner(orgName) => verifyOrgName(orgName)
case UserOntOwner(userName) => verifyIsUserOrAdminOrExtra(Set(userName))
}
}

private def verifyOrgName(orgName: String): String = {
orgsDAO.findOneById(orgName) match {
case Some(org) =>
verifyIsUserOrAdminOrExtra(org.members)
orgName

case None => bug(s"org '$orgName' should exist")
}
}

/*
* Deletes a particular version or the whole ontology entry.
*/
Expand All @@ -151,17 +151,7 @@ class OntController(implicit setup: Setup,

val (ont, _, _) = resolveOntology(uri, versionOpt)

ont.orgName match {
case Some(orgName) =>
orgsDAO.findOneById(orgName) match {
case None => bug(s"org '$orgName' should exist")

case Some(org) => verifyIsUserOrAdminOrExtra(org.members)
}

case None =>
bug(s"currently I expect registered ont to have org associated")
}
verifyOwnerName(ont.ownerName)

val doVerifyOwner = false // already verified above

Expand Down Expand Up @@ -235,7 +225,7 @@ class OntController(implicit setup: Setup,
version_status: Option[String],
date: String,
ontFileWriter: OntFileWriter,
orgName: String
ownerName: String
) = {
val user = requireAuthenticatedUser
logger.debug(s"""
Expand All @@ -247,12 +237,12 @@ class OntController(implicit setup: Setup,
| version: $version
| version_status: $version_status
| date: $date
| orgName: $orgName
| ownerName: $ownerName
| ontFileWriter.format: ${ontFileWriter.format}
|""".stripMargin)

Try(ontService.createOntology(uri, originalUriOpt, name, version, version_status,
date, user.userName, orgName, ontFileWriter)) match {
date, user.userName, ownerName, ontFileWriter)) match {
case Success(ontologyResult) =>
loadOntologyInTripleStore(uri, reload = false)
ontologyResult
Expand All @@ -267,7 +257,8 @@ class OntController(implicit setup: Setup,

/**
* Preliminary mapping from given parameters to a query for filtering purposes
* @param keys keys to be considered
*
* @param keys keys to be considered
* @return MongoDBObject
*/
/*
Expand All @@ -277,7 +268,7 @@ class OntController(implicit setup: Setup,
*/
private def getQueryFromParams(keys: Set[String]): MongoDBObject = {
var query = MongoDBObject()
if (keys.size > 0) {
if (keys.nonEmpty) {
keys foreach (key => query = query.updated(key, params.get(key).get))
logger.debug(s"GET query=$query")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class SelfHostedOntController(implicit setup: Setup, ontService: OntService) ext
uri = ont.uri,
version = version,
name = ontVersion.name,
orgName = ont.orgName,
ownerName = Some(ont.ownerName),
metadata = Some(ontUtil.toOntMdMap(ontVersion.metadata)),
versions = Some(ont.sortedVersionKeys),
format = Option(ontVersion.format)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/org/mmisw/orr/ont/db/models.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.novus.salat.annotations._

case class Ontology(
@Key("_id") uri: String,
orgName: Option[String],
ownerName: String, // <orgName> | ~<userName>
versions: Map[String, OntologyVersion] = Map.empty) {

lazy val sortedVersionKeys = versions.keys.toList.sorted(Ordering[String].reverse)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/org/mmisw/orr/ont/results.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ case class OntologySummaryResult(
version: String,
name: String,
submitter: Option[String] = None,
orgName: Option[String] = None,
ownerName: Option[String] = None, // | <orgName> | ~<userName>
author: Option[String] = None,
status: Option[String] = None,
metadata: Option[Map[String, AnyRef]] = None,
Expand Down
38 changes: 30 additions & 8 deletions src/main/scala/org/mmisw/orr/ont/service/OntService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,26 @@ case class UploadedFileInfo(userName: String,
possibleOntologyUris: Map[String, PossibleOntologyInfo])


sealed abstract class OntOwner
case class OrgOntOwner(orgName: String) extends OntOwner
case class UserOntOwner(userName: String) extends OntOwner

object OntOwner {
val ownerNamePattern = "(~?)(.*)".r

def apply(ownerName: String): OntOwner = {
ownerName match {
case ownerNamePattern("", orgName) => OrgOntOwner(orgName)
case ownerNamePattern("~", userName) => UserOntOwner(userName)
}
}

def unapply(arg: OntOwner): String = arg match {
case OrgOntOwner(orgName) => orgName
case UserOntOwner(userName) => "~" + userName
}
}

/**
* Ontology service
*/
Expand Down Expand Up @@ -87,7 +107,7 @@ class OntService(implicit setup: Setup) extends BaseService(setup) with Logging
version = version,
name = ontVersion.name,
submitter = if (privileged) Some(ontVersion.userName) else None,
orgName = ont.orgName,
ownerName = Some(ont.ownerName),
author = ontVersion.author,
status = ontVersion.status,
metadata = if (includeMetadata) Some(ontUtil.toOntMdMap(ontVersion.metadata)) else None,
Expand Down Expand Up @@ -185,7 +205,7 @@ class OntService(implicit setup: Setup) extends BaseService(setup) with Logging
version_status: Option[String],
date: String,
userName: String,
orgName: String,
ownerName: String,
ontFileWriter: OntFileWriter,
contact_name: Option[String] = None // for AquaImporter
) = {
Expand All @@ -212,7 +232,7 @@ class OntService(implicit setup: Setup) extends BaseService(setup) with Logging
ontologyType = ontologyTypeOpt,
resourceType = resourceTypeOpt)

val ont = Ontology(uri, Some(orgName), versions = Map(version -> ontVersion))
val ont = Ontology(uri, ownerName, versions = Map(version -> ontVersion))

Try(ontDAO.insert(ont, WriteConcern.Safe)) match {
case Success(_) =>
Expand Down Expand Up @@ -360,11 +380,9 @@ class OntService(implicit setup: Setup) extends BaseService(setup) with Logging
* Verifies the user can make changes or removals wrt to the given ont.
*/
private def verifyOwner(userName: String, ont: Ontology): Unit = {
ont.orgName match {
case Some(orgName) => verifyOrgAndUser(orgName, userName)

case None => // TODO handle no-organization case
throw Bug(s"currently I expect registered ont to have org associated")
OntOwner(ont.ownerName) match {
case OrgOntOwner(orgName) => verifyOrgAndUser(orgName, userName)
case UserOntOwner(ownerUserName) => verifyUserIsOwner(ownerUserName, userName)
}
}

Expand All @@ -380,6 +398,10 @@ class OntService(implicit setup: Setup) extends BaseService(setup) with Logging
}
}

private def verifyUserIsOwner(ownerUserName: String, userName: String): Unit = {
if (ownerUserName != userName) throw NotOntOwner(userName)
}

private def validateUri(uri: String) {
try new URI(uri)
catch {
Expand Down
3 changes: 3 additions & 0 deletions src/main/scala/org/mmisw/orr/ont/service/errors.scala
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ case class OntologyAlreadyRegistered(uri: String)
case class NotAMember(userName: String, orgName: String)
extends Invalid("userName" -> userName, "orgName" -> orgName, "error" -> "User is not a member of the organization")

case class NotOntOwner(userName: String)
extends Invalid("userName" -> userName, "error" -> "User is not the owner of the ontology")

case class InvalidUserName(userName: String)
extends Invalid("userName" -> userName, "error" -> "Invalid userName")

Expand Down
6 changes: 3 additions & 3 deletions src/test/scala/org/mmisw/orr/ont/app/SequenceSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -608,14 +608,14 @@ class SequenceSpec extends MutableScalatraSpec with BaseSpec with Mockito with L
// </FORMATS>
}

"Get onts with some filter parameters (GET /ont?orgName=nn)" should {
"Get onts with some filter parameters (GET /ont?ownerName=nn)" should {
"return list containing submission above" in {
val map = Map("orgName" -> orgName)
val map = Map("ownerName" -> orgName)
logger.info(s"get: $map")
get("/ont", map) {
status must_== 200
val res = parse(body).extract[List[OntologySummaryResult]]
res.exists(_.orgName == Some(orgName)) must beTrue
res.exists(_.ownerName == Some(orgName)) must beTrue
}
}
}
Expand Down

0 comments on commit 826a3ad

Please sign in to comment.