@@ -2,8 +2,9 @@ package org.codeoverflow.chatoverflow.ui.web.rest.plugin
22
33import org .codeoverflow .chatoverflow .api .io
44import org .codeoverflow .chatoverflow .api .plugin .configuration
5+ import org .codeoverflow .chatoverflow .configuration .ConfigurationService
56import 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 ._
78import org .scalatra .swagger .Swagger
89
910import 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}
0 commit comments