Skip to content

Commit 8c90d28

Browse files
committed
Automatically import defaultLabels from extractor_info.json
1 parent 25428b1 commit 8c90d28

File tree

8 files changed

+91
-18
lines changed

8 files changed

+91
-18
lines changed

app/api/Extractions.scala

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,26 @@ class Extractions @Inject()(
475475
},
476476
info => {
477477
extractors.updateExtractorInfo(info) match {
478-
case Some(u) => Ok(Json.obj("status" -> "OK", "message" -> ("Extractor info updated. ID = " + u.id)))
478+
case Some(u) => {
479+
// Create/assign any default labels for this extractor
480+
u.defaultLabels.foreach(labelName => {
481+
extractors.getExtractorsLabel(labelName) match {
482+
case None => {
483+
// Label does not exist - create then assign it
484+
val createdLabel = extractors.createExtractorsLabel(labelName, Some("Default"), List[String](u.name))
485+
}
486+
case Some(lbl) => {
487+
// Label already exists, assign it
488+
if (!lbl.extractors.contains(u.name)) {
489+
val label = ExtractorsLabel(lbl.id, lbl.name, lbl.category, lbl.extractors ++ List[String](u.name))
490+
val updatedLabel = extractors.updateExtractorsLabel(label)
491+
}
492+
}
493+
}
494+
})
495+
496+
Ok(Json.obj("status" -> "OK", "message" -> ("Extractor info updated. ID = " + u.id)))
497+
}
479498
case None => BadRequest(Json.obj("status" -> "KO", "message" -> "Error updating extractor info"))
480499
}
481500
}
@@ -691,9 +710,7 @@ class Extractions @Inject()(
691710
Ok(Json.toJson(label))
692711
}
693712
}
694-
695713
}
696-
697714
}
698715

699716
def updateExtractorsLabel(id: UUID) = ServerAdminAction(parse.json) { implicit request =>
@@ -712,15 +729,13 @@ class Extractions @Inject()(
712729
Conflict("Label name is already in use: " + lbl.name)
713730
} else {
714731
// Update the label
715-
val label = ExtractorsLabel(id, name, category, assignedExtractors)
716-
val updatedLabel = extractors.updateExtractorsLabel(label)
732+
val updatedLabel = extractors.updateExtractorsLabel(ExtractorsLabel(id, name, category, assignedExtractors))
717733
Ok(Json.toJson(updatedLabel))
718734
}
719735
}
720736
case None => {
721737
// Update the label
722-
val label = ExtractorsLabel(id, name, category, assignedExtractors)
723-
val updatedLabel = extractors.updateExtractorsLabel(label)
738+
val updatedLabel = extractors.updateExtractorsLabel(ExtractorsLabel(id, name, category, assignedExtractors))
724739
Ok(Json.toJson(updatedLabel))
725740
}
726741
}

app/controllers/Extractors.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ class Extractors @Inject() (extractions: ExtractionService,
6969
request.getQueryString("labelFilter") match {
7070
case None => {}
7171
case Some(lblName) => allLabels.find(lbl => lblName == lbl.name) match {
72-
case Some(label) => runningExtractors = runningExtractors.filter(re => label.extractors.contains(re.name))
7372
case None => {}
73+
case Some(label) => runningExtractors = runningExtractors.filter(re => label.extractors.contains(re.name))
7474
}
7575
}
7676

app/models/Extraction.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ case class ExtractorDetail(
7272
* @param external_services external services used by the extractor
7373
* @param libraries libraries on which the code depends
7474
* @param bibtex bibtext formatted citation of relevant papers
75+
* @param maturity indicates whether this extractor is ready for public consumption
76+
* * For example: "Development" (default), "Staging", or "Production"
77+
* @param defaultLabels the categorization labels that were imported by default
78+
* * For example: "Development" (default), "Staging", or "Production"
7579
* @param process events that should trigger this extractor to process
7680
* @param categories list of categories that apply to the extractor
7781
* @param parameters JSON schema representing allowed parameters
@@ -94,6 +98,7 @@ case class ExtractorInfo(
9498
libraries: List[String],
9599
bibtex: List[String],
96100
maturity: String = "Development",
101+
defaultLabels: List[String] = List[String](),
97102
process: ExtractorProcessTriggers = new ExtractorProcessTriggers(),
98103
categories: List[String] = List[String](ExtractorCategory.EXTRACT.toString),
99104
parameters: JsValue = JsObject(Seq())
@@ -146,6 +151,7 @@ object ExtractorInfo {
146151
(JsPath \ "libraries").read[List[String]].orElse(Reads.pure(List.empty)) and
147152
(JsPath \ "bibtex").read[List[String]].orElse(Reads.pure(List.empty)) and
148153
(JsPath \ "maturity").read[String].orElse(Reads.pure("Development")) and
154+
(JsPath \ "labels").read[List[String]].orElse(Reads.pure(List.empty)) and
149155
(JsPath \ "process").read[ExtractorProcessTriggers].orElse(Reads.pure(new ExtractorProcessTriggers())) and
150156
(JsPath \ "categories").read[List[String]].orElse(Reads.pure(List[String](ExtractorCategory.EXTRACT.toString))) and
151157
(JsPath \ "parameters").read[JsValue].orElse(Reads.pure(JsObject(Seq())))
@@ -208,4 +214,14 @@ object ExtractorsLabel {
208214
(JsPath \ "category").readNullable[String] and
209215
(JsPath \ "extractors").read[List[String]].orElse(Reads.pure(List.empty))
210216
)(ExtractorsLabel.apply _)
217+
}
218+
219+
case class LabelAssignment (
220+
extractorId: UUID,
221+
labelId: UUID
222+
)
223+
224+
object LabelAssignment {
225+
implicit val writes = Json.writes[LabelAssignment]
226+
implicit val reads = Json.reads[LabelAssignment]
211227
}

app/services/ExtractorService.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ trait ExtractorService {
4949

5050
def getExtractorsLabel(id: UUID): Option[ExtractorsLabel]
5151

52-
def createExtractorsLabel(name: String, category: Option[String], extractors: List[String]): ExtractorsLabel
52+
def createExtractorsLabel(name: String, category: Option[String], assignedExtractors:List[String]): ExtractorsLabel
5353

5454
def updateExtractorsLabel(label: ExtractorsLabel): ExtractorsLabel
5555

app/services/RabbitmqPlugin.scala

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,28 @@ class ExtractorsHeartbeats(channel: Channel, queue: String) extends Actor {
12521252
}
12531253
}
12541254
case None => {
1255-
extractorsService.updateExtractorInfo(info)
1255+
extractorsService.updateExtractorInfo(info) match {
1256+
case None => {}
1257+
case Some(eInfo) => {
1258+
// Create (if needed) and assign default labels
1259+
eInfo.defaultLabels.foreach(labelName => {
1260+
extractorsService.getExtractorsLabel(labelName) match {
1261+
case None => {
1262+
// Label does not exist - create then assign it
1263+
val createdLabel = extractorsService.createExtractorsLabel(labelName, Some("Default"), List[String](eInfo.name))
1264+
}
1265+
case Some(lbl) => {
1266+
// Label already exists, assign it
1267+
if (!lbl.extractors.contains(eInfo.name)) {
1268+
val label = ExtractorsLabel(lbl.id, lbl.name, lbl.category, lbl.extractors ++ List[String](eInfo.name))
1269+
val updatedLabel = extractorsService.updateExtractorsLabel(label)
1270+
}
1271+
}
1272+
}
1273+
})
1274+
}
1275+
}
1276+
12561277
Logger.info(s"New extractor ${info.name} registered from heartbeat")
12571278
}
12581279
}

app/services/mongodb/MongoDBExtractorService.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ class MongoDBExtractorService extends ExtractorService {
215215
case None => {
216216
Logger.info("No extractor found with name: " + extractorName)
217217
}
218-
219218
}
220219
}
221220

@@ -246,7 +245,20 @@ class MongoDBExtractorService extends ExtractorService {
246245
}
247246

248247
def getLabelsForExtractor(extractorName: String): List[ExtractorsLabel] = {
249-
ExtractorsLabelDAO.findAll().filter(_.extractors.contains(extractorName)).toList
248+
var results = List[ExtractorsLabel]()
249+
ExtractorInfoDAO.findOne(MongoDBObject("name"->extractorName)) match {
250+
case Some(info) => {
251+
val assignments = LabelAssignmentDAO.find(MongoDBObject("extractorId"->info.id)).toList
252+
for(assignment <- assignments) {
253+
ExtractorsLabelDAO.findOne(MongoDBObject("_id" -> assignment.labelId.stringify)) match {
254+
case Some(label) => {
255+
results = results.::(label)
256+
}
257+
}
258+
}
259+
}
260+
}
261+
results
250262
}
251263
}
252264

@@ -298,6 +310,13 @@ object ExtractorsLabelDAO extends ModelCompanion[ExtractorsLabel, ObjectId] {
298310
}
299311
}
300312

313+
object LabelAssignmentDAO extends ModelCompanion[LabelAssignment, ObjectId] {
314+
val dao = current.plugin[MongoSalatPlugin] match {
315+
case None => throw new RuntimeException("No MongoSalatPlugin");
316+
case Some(x) => new SalatDAO[LabelAssignment, ObjectId](collection = x.collection("extractors.labels.assignments")) {}
317+
}
318+
}
319+
301320
object ExtractorsForInstanceDAO extends ModelCompanion[ExtractorsForInstance, ObjectId] {
302321
val dao = current.plugin[MongoSalatPlugin] match {
303322
case None => throw new RuntimeException("No MongoSalatPlugin");

app/views/extractorLabels.scala.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ <h2>Extractor Labels</h2>
3939
@for(label <- labels) {
4040
<tr>
4141
<td>@label.name</td>
42-
<td>@label.category.getOrElse("")</td>
42+
<td>@label.category.getOrElse("Other")</td>
4343
<td>
4444
<ul>
4545
@for(extractorName <- label.extractors) {

app/views/updateExtractors.scala.html

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,14 +348,16 @@ <h1>Extractor Catalog</h1>
348348
function submitFilters(labelName, context) {
349349
// Grab existing query string values
350350
var currentParams = new URLSearchParams(window.location.search);
351-
var targets = context.formAction.split('@routes.Extractors.selectExtractors()')
351+
var targets = context.formAction.split('@routes.Extractors.selectExtractors()');
352+
353+
// If same filter selected twice, de-select it
354+
var currentLabel = currentParams.get('labelFilter');
355+
var newLabelName = labelName === currentLabel ? null : (labelName || currentLabel);
352356

353357
// Set new query strings parameters based on form value
354358
var newParams = new URLSearchParams(targets[1]);
355-
var newLabelName = labelName || currentParams.get('labelFilter')
356-
if (newLabelName) {
357-
newParams.set('labelFilter', newLabelName);
358-
}
359+
newLabelName ? newParams.set('labelFilter', newLabelName) : newParams.delete('labelFilter');
360+
359361
window.location.search = newParams.toString();
360362
}
361363

0 commit comments

Comments
 (0)