Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 3441e78

Browse files
committed
Added put method for requirements.
1 parent d063350 commit 3441e78

File tree

4 files changed

+107
-11
lines changed

4 files changed

+107
-11
lines changed

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/DTOs.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ object DTOs {
1212

1313
case class Requirement(uniqueRequirementId: String, name: String, isOptional: Boolean, isSet: Boolean, value: String, targetType: String)
1414

15+
case class RequirementInfo(targetType: String, value: String)
16+
1517
case class Types(pluginTypes: Seq[PluginType], requirementTypes: RequirementTypes, connectorTypes: Seq[String])
1618

1719
case class RequirementTypes(input: Seq[String], output: Seq[String], parameter: Seq[String])

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/plugin/PluginInstanceController.scala

Lines changed: 88 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package org.codeoverflow.chatoverflow.ui.web.rest.plugin
22

33
import org.codeoverflow.chatoverflow.api.io
44
import org.codeoverflow.chatoverflow.api.plugin.configuration
5+
import org.codeoverflow.chatoverflow.configuration.ConfigurationService
56
import org.codeoverflow.chatoverflow.ui.web.JsonServlet
6-
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.{PluginInstance, PluginInstanceRef, Requirement, ResultMessage}
7+
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs._
78
import org.scalatra.swagger.Swagger
89

910
import scala.collection.JavaConverters._
@@ -24,16 +25,74 @@ class PluginInstanceController(implicit val swagger: Swagger) extends JsonServle
2425

2526
get("/:instanceName/requirements", operation(getRequirements)) {
2627
val instanceName = params("instanceName")
27-
val pluginInstance = chatOverflow.pluginInstanceRegistry.getPluginInstance(instanceName)
28-
val requirements = pluginInstance.get.getRequirements.getRequirementMap
2928
val returnSeq = ListBuffer[Requirement]()
29+
val pluginInstance = chatOverflow.pluginInstanceRegistry.getPluginInstance(instanceName)
3030

31-
requirements.forEach((uniqueRequirementID, requirement) => returnSeq += Requirement(uniqueRequirementID,
32-
requirement.getName, requirement.isOptional, requirement.isSet,
33-
requirement.asInstanceOf[configuration.Requirement[io.Serializable]].get().serialize(),
34-
requirement.getTargetType.getName))
31+
if (pluginInstance.isEmpty) {
32+
returnSeq
33+
34+
} else {
35+
val requirements = pluginInstance.get.getRequirements.getRequirementMap
36+
37+
requirements.forEach((uniqueRequirementID, requirement) =>
38+
returnSeq += createRequirement(uniqueRequirementID, requirement))
39+
40+
returnSeq.toList
41+
}
42+
}
43+
44+
get("/:instanceName/requirements/:requirementID", operation(getRequirement)) {
45+
val instanceName = params("instanceName")
46+
val requirementID = params("requirementID")
47+
48+
val pluginInstance = chatOverflow.pluginInstanceRegistry.getPluginInstance(instanceName)
49+
50+
if (pluginInstance.isEmpty) {
51+
Requirement("", "", isOptional = false, isSet = false, "", "")
52+
} else {
53+
val requirement = pluginInstance.get.getRequirements.getRequirementById(requirementID)
54+
55+
if (!requirement.isPresent) {
56+
Requirement("", "", isOptional = false, isSet = false, "", "")
57+
} else {
58+
createRequirement(requirementID, requirement.get)
59+
}
60+
}
61+
}
62+
63+
put("/:instanceName/requirements/:requirementID", operation(putRequirement)) {
64+
parsedAs[RequirementInfo] {
65+
case RequirementInfo(targetType, value) =>
66+
val instanceName = params("instanceName")
67+
val requirementID = params("requirementID")
68+
69+
if (!chatOverflow.isLoaded) {
70+
ResultMessage(success = false, "Framework not loaded.")
71+
72+
} else {
73+
val pluginInstance = chatOverflow.pluginInstanceRegistry.getPluginInstance(instanceName)
74+
75+
if (pluginInstance.isEmpty) {
76+
ResultMessage(success = false, "Plugin instance not found.")
77+
78+
} else if (pluginInstance.get.isRunning) {
79+
ResultMessage(success = false, "Plugin is running.")
80+
81+
} else if (!pluginInstance.get.getRequirements.getRequirementById(requirementID).isPresent) {
82+
ResultMessage(success = false, "Requirement not found.")
83+
} else {
84+
85+
if (!ConfigurationService.fulfillRequirementByDeserializing(instanceName, requirementID, targetType,
86+
value, chatOverflow.pluginInstanceRegistry, chatOverflow.typeRegistry)) {
3587

36-
returnSeq.toList
88+
ResultMessage(success = false, "Unable to set requirement.")
89+
} else {
90+
chatOverflow.save()
91+
ResultMessage(success = true)
92+
}
93+
}
94+
}
95+
}
3796
}
3897

3998
get("/:instanceName/log", operation(getLog)) {
@@ -102,9 +161,29 @@ class PluginInstanceController(implicit val swagger: Swagger) extends JsonServle
102161
}
103162
}
104163

105-
private def pluginInstanceToDTO(pluginInstance: org.codeoverflow.chatoverflow.instance.PluginInstance) = {
164+
private def pluginInstanceToDTO(pluginInstance: org.codeoverflow.chatoverflow.instance.PluginInstance)
165+
166+
= {
106167
PluginInstance(pluginInstance.instanceName, pluginInstance.getPluginTypeName,
107168
pluginInstance.getPluginTypeAuthor, pluginInstance.isRunning,
108169
pluginInstance.getRequirements.getRequirementMap.keySet().asScala.toList)
109170
}
171+
172+
private def createRequirement(requirementID: String, requirement: configuration.Requirement[_ <: io.Serializable]): Requirement
173+
174+
= {
175+
Requirement(requirementID,
176+
requirement.getName, requirement.isOptional, requirement.isSet,
177+
{
178+
// Can be null if the requirement was freshly created in this run
179+
val requirementContent = requirement.asInstanceOf[configuration.Requirement[io.Serializable]].get()
180+
181+
if (requirementContent == null) {
182+
""
183+
} else {
184+
requirementContent.serialize()
185+
}
186+
},
187+
requirement.getTargetType.getName)
188+
}
110189
}

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/plugin/PluginInstanceControllerDefinition.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.codeoverflow.chatoverflow.ui.web.rest.plugin
22

3-
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.{PluginInstance, PluginInstanceRef, Requirement, ResultMessage}
3+
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs._
44
import org.scalatra.swagger.SwaggerSupport
55
import org.scalatra.swagger.SwaggerSupportSyntax.OperationBuilder
66

@@ -23,6 +23,21 @@ trait PluginInstanceControllerDefinition extends SwaggerSupport {
2323
description "Shows state, name and type of all requirements of a specified plugin instance."
2424
parameter pathParam[String]("instanceName").description("The name of the plugin instance."))
2525

26+
val getRequirement: OperationBuilder =
27+
(apiOperation[Requirement]("getRequirement")
28+
summary "Shows a specific requirement of a plugin instance."
29+
description "Shows state, name and type of one specific requirement of a specified plugin instance."
30+
parameter pathParam[String]("instanceName").description("The name of the plugin instance.")
31+
parameter pathParam[String]("requirementID").description("The unique id of the requirement."))
32+
33+
val putRequirement: OperationBuilder =
34+
(apiOperation[ResultMessage]("putRequirement")
35+
summary "Changes the value and type of a specific requirement."
36+
description "Changes the value (serialized content) and the target type of a requirement of one instance."
37+
parameter pathParam[String]("instanceName").description("The name of the plugin instance.")
38+
parameter pathParam[String]("requirementID").description("The unique id of the requirement.")
39+
parameter bodyParam[RequirementInfo]("body").description("Requires target type and serialized content."))
40+
2641
val getLog: OperationBuilder =
2742
(apiOperation[List[String]]("getLog")
2843
summary "Shows the log of a plugin instance."

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/types/TypesControllerDefinition.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ trait TypesControllerDefinition extends SwaggerSupport {
1212
description "Shows name, author, api version and state of all possible plugin types.")
1313

1414
val getRequirementType: OperationBuilder =
15-
(apiOperation[RequirementTypes]("getRequirement")
15+
(apiOperation[RequirementTypes]("getRequirementType")
1616
summary "Shows all possible requirement types."
1717
description "Shows the fully qualified api type strings of all requirement types, grouped by input/output/parameter.")
1818

0 commit comments

Comments
 (0)