import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Locale;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
import lombok.extern.slf4j.Slf4j;
import org.jvnet.hk2.annotations.Service;
-import org.onap.holmes.common.dmaap.DmaapService;
+import org.onap.holmes.common.dmaap.store.ClosedLoopControlNameCache;
import org.onap.holmes.common.exception.CorrelationException;
import org.onap.holmes.common.utils.ExceptionUtil;
import org.onap.holmes.common.utils.LanguageUtil;
import org.onap.holmes.engine.request.DeployRuleRequest;
import org.onap.holmes.engine.response.CorrelationRuleResponse;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
@Service
@Path("/rule")
@Api(tags = {"Holmes Engine Management"})
@Produces(MediaType.APPLICATION_JSON)
@Slf4j
public class EngineResources {
-
@Inject
DroolsEngine droolsEngine;
+ private Pattern packagePattern = Pattern.compile("package[\\s]+([^;]+)[;\\s]*");
+ private ClosedLoopControlNameCache closedLoopControlNameCache;
+
+ @Inject
+ public void setClosedLoopControlNameCache(ClosedLoopControlNameCache closedLoopControlNameCache) {
+ this.closedLoopControlNameCache = closedLoopControlNameCache;
+ }
@PUT
- @ApiOperation(value = "Deploy a rule into the Drools engine.", response = CorrelationRuleResponse.class)
@Produces(MediaType.APPLICATION_JSON)
@Timed
public CorrelationRuleResponse deployRule(
@ApiParam(value = "The request entity of the HTTP call, which comprises three "
- + "fields: \"content\" , \"loopcontrolname\" and \"engineid\". "
- + "The \"content\" should be a valid Drools rule string and the \"engineid\" "
+ + "fields: \"content\" , \"loopControlName\" and \"engineId\". "
+ + "The \"content\" should be a valid Drools rule string and the \"engineId\" "
+ "has to be \"engine-d\" in the Amsterdam release.", required = true) DeployRuleRequest deployRuleRequest,
@Context HttpServletRequest httpRequest) {
Locale locale = LanguageUtil.getLocale(httpRequest);
try {
String packageName = getPackageName(deployRuleRequest.getContent());
- DmaapService.loopControlNames
+ if(packageName == null) {
+ throw new CorrelationException("Could not find package name in rule: "+deployRuleRequest.getContent());
+ }
+
+ closedLoopControlNameCache
.put(packageName, deployRuleRequest.getLoopControlName());
- String packageNameRet = droolsEngine.deployRule(deployRuleRequest, locale);
+ String packageNameRet = droolsEngine.deployRule(deployRuleRequest);
if (!packageName.equals(packageNameRet)) {
log.info("The parsed package name is different from that returned by the engine.");
- DmaapService.loopControlNames.remove(packageName);
- DmaapService.loopControlNames
+ closedLoopControlNameCache.remove(packageName);
+ closedLoopControlNameCache
.put(packageNameRet, deployRuleRequest.getLoopControlName());
}
- log.info("Rule deployed. Package name: " + packageName);
- crResponse.setPackageName(packageName);
+ log.info("Rule deployed. Package name: " + packageNameRet);
+ crResponse.setPackageName(packageNameRet);
} catch (CorrelationException correlationException) {
log.error(correlationException.getMessage(), correlationException);
}
@DELETE
- @ApiOperation(value = "Undeploy a rule from the Drools engine.")
@Produces(MediaType.APPLICATION_JSON)
@Timed
@Path("/{packageName}")
Locale locale = LanguageUtil.getLocale(httpRequest);
try {
- droolsEngine.undeployRule(packageName, locale);
- DmaapService.loopControlNames.remove(packageName);
+ droolsEngine.undeployRule(packageName);
+ closedLoopControlNameCache.remove(packageName);
} catch (CorrelationException correlationException) {
log.error(correlationException.getMessage(), correlationException);
throw ExceptionUtil.buildExceptionResponse(correlationException.getMessage());
}
+
return true;
}
Locale locale = LanguageUtil.getLocale(httpRequest);
try {
- droolsEngine.compileRule(compileRuleRequest.getContent(), locale);
+ droolsEngine.compileRule(compileRuleRequest.getContent());
} catch (CorrelationException correlationException) {
log.error(correlationException.getMessage(), correlationException);
throw ExceptionUtil.buildExceptionResponse(correlationException.getMessage());
}
return true;
}
-
+
private String getPackageName(String contents){
- String ret = contents.trim();
- ret = ret.substring(7, ret.indexOf("import")).trim();
- return ret.endsWith(";") ? ret.substring(0, ret.length() - 1) : ret;
+ Matcher m = packagePattern.matcher(contents);
+
+ if (m.find( )) {
+ return m.group(1);
+ }else {
+ return null;
+ }
}
}