484fb5f05ff20e8687e798c17215bc14242ac0be
[holmes/rule-management.git] / rulemgt / src / main / java / org / onap / holmes / rulemgt / wrapper / RuleMgtWrapper.java
1 /**\r
2  * Copyright 2017 ZTE Corporation.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 package org.onap.holmes.rulemgt.wrapper;\r
17 \r
18 import java.util.ArrayList;\r
19 import java.util.Date;\r
20 import java.util.List;\r
21 import javax.annotation.PostConstruct;\r
22 import javax.inject.Inject;\r
23 import javax.inject.Singleton;\r
24 import lombok.extern.slf4j.Slf4j;\r
25 import org.jvnet.hk2.annotations.Service;\r
26 import org.onap.holmes.common.dmaap.DmaapService;\r
27 import org.onap.holmes.rulemgt.bean.request.CorrelationCheckRule4Engine;\r
28 import org.onap.holmes.rulemgt.bean.response.RuleResult4API;\r
29 import org.onap.holmes.rulemgt.constant.RuleMgtConstant;\r
30 import org.onap.holmes.rulemgt.db.CorrelationRuleDao;\r
31 import org.onap.holmes.common.api.entity.CorrelationRule;\r
32 import org.onap.holmes.common.exception.CorrelationException;\r
33 import org.onap.holmes.common.utils.DbDaoUtil;\r
34 import org.onap.holmes.rulemgt.bean.request.CorrelationDeployRule4Engine;\r
35 import org.onap.holmes.rulemgt.bean.request.RuleCreateRequest;\r
36 import org.onap.holmes.rulemgt.bean.request.RuleDeleteRequest;\r
37 import org.onap.holmes.rulemgt.bean.request.RuleQueryCondition;\r
38 import org.onap.holmes.rulemgt.bean.request.RuleUpdateRequest;\r
39 import org.onap.holmes.rulemgt.bean.response.RuleAddAndUpdateResponse;\r
40 import org.onap.holmes.rulemgt.bean.response.RuleQueryListResponse;\r
41 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;\r
42 import org.onap.holmes.rulemgt.db.CorrelationRuleQueryDao;\r
43 \r
44 \r
45 @Service\r
46 @Singleton\r
47 @Slf4j\r
48 public class RuleMgtWrapper {\r
49 \r
50     @Inject\r
51     private CorrelationRuleQueryDao correlationRuleQueryDao;\r
52     @Inject\r
53     private EngineWrapper engineWarpper;\r
54     @Inject\r
55     private DbDaoUtil daoUtil;\r
56 \r
57     private CorrelationRuleDao correlationRuleDao;\r
58 \r
59     @PostConstruct\r
60     public void initDaoUtil() {\r
61         correlationRuleDao = daoUtil.getJdbiDaoByOnDemand(CorrelationRuleDao.class);\r
62     }\r
63 \r
64     public RuleAddAndUpdateResponse addCorrelationRule(String creator, RuleCreateRequest ruleCreateRequest)\r
65             throws CorrelationException {\r
66         if (ruleCreateRequest == null) {\r
67             throw new CorrelationException("The request object can not be empty!");\r
68         }\r
69         CorrelationRule correlationRule = convertCreateRequest2Rule(creator,\r
70                 ruleCreateRequest);\r
71         checkCorrelation(correlationRule);\r
72         CorrelationRule ruleTemp = correlationRuleDao.queryRuleByRuleName(correlationRule.getName());\r
73         if (ruleTemp != null) {\r
74             throw new CorrelationException("A rule with the same name already exists.");\r
75         }\r
76         String packageName = deployRule2Engine(correlationRule);\r
77         correlationRule.setPackageName(packageName);\r
78         CorrelationRule result = null;\r
79         try {\r
80             result = correlationRuleDao.saveRule(correlationRule);\r
81         } catch (CorrelationException e) {\r
82             engineWarpper.deleteRuleFromEngine(packageName);\r
83             throw new CorrelationException(e.getMessage(), e);\r
84         }\r
85         RuleAddAndUpdateResponse ruleAddAndUpdateResponse = new RuleAddAndUpdateResponse();\r
86         ruleAddAndUpdateResponse.setRuleId(result.getRid());\r
87         return ruleAddAndUpdateResponse;\r
88     }\r
89 \r
90     public RuleAddAndUpdateResponse updateCorrelationRule(String modifier, RuleUpdateRequest ruleUpdateRequest)\r
91             throws CorrelationException {\r
92         if (ruleUpdateRequest == null) {\r
93             throw new CorrelationException("The request object can not be empty!");\r
94         }\r
95         CorrelationRule oldCorrelationRule = correlationRuleDao.queryRuleByRid(ruleUpdateRequest.getRuleId());\r
96         if (oldCorrelationRule == null) {\r
97             throw new CorrelationException("You're trying to update a rule which does not exist in the system.");\r
98         }\r
99         CorrelationRule newCorrelationRule = convertRuleUpdateRequest2CorrelationRule(modifier,\r
100                 ruleUpdateRequest, oldCorrelationRule.getName());\r
101         checkCorrelation(newCorrelationRule);\r
102         RuleAddAndUpdateResponse ruleChangeResponse = new RuleAddAndUpdateResponse();\r
103         ruleChangeResponse.setRuleId(newCorrelationRule.getRid());\r
104         if (!haveChange(newCorrelationRule, oldCorrelationRule)) {\r
105             return ruleChangeResponse;\r
106         }\r
107         if (oldCorrelationRule.getEnabled() == RuleMgtConstant.STATUS_RULE_OPEN) {\r
108             engineWarpper.deleteRuleFromEngine(oldCorrelationRule.getPackageName());\r
109         }\r
110         newCorrelationRule.setPackageName(deployRule2Engine(newCorrelationRule));\r
111         correlationRuleDao.updateRule(newCorrelationRule);\r
112         return ruleChangeResponse;\r
113     }\r
114 \r
115     private void checkCorrelation(CorrelationRule correlationRule) throws CorrelationException {\r
116         int enabled = correlationRule.getEnabled();\r
117         String ruleName = correlationRule.getName() == null ? "" : correlationRule.getName().trim();\r
118         String content = correlationRule.getContent() == null ? "" : correlationRule.getContent().trim();\r
119         if ("".equals(content)) {\r
120             throw new CorrelationException("The contents of the rule can not be empty!");\r
121         }\r
122         if (enabled != RuleMgtConstant.STATUS_RULE_CLOSE\r
123                 && enabled != RuleMgtConstant.STATUS_RULE_OPEN) {\r
124             throw new CorrelationException("Invalid rule status. Only 0 (disabled) and 1 (enabled) are allowed.");\r
125         }\r
126         if ("".equals(ruleName)) {\r
127             throw new CorrelationException("The name of the rule can not be empty.");\r
128         }\r
129     }\r
130 \r
131     private boolean haveChange(CorrelationRule newCorrelationRule, CorrelationRule oldCorrelationRule) {\r
132         String newContent = newCorrelationRule.getContent();\r
133         String oldContent = oldCorrelationRule.getContent();\r
134         int newEnabled = newCorrelationRule.getEnabled();\r
135         int oldEnabled = oldCorrelationRule.getEnabled();\r
136         String newDes = newCorrelationRule.getDescription();\r
137         String oldDes = oldCorrelationRule.getDescription();\r
138         String oldControlLoop = oldCorrelationRule.getClosedControlLoopName();\r
139         String newControlLoop = newCorrelationRule.getClosedControlLoopName();\r
140         if (newContent.equals(oldContent) && newEnabled == oldEnabled\r
141                 && newDes.equals(oldDes) && newControlLoop.equals(oldControlLoop)) {\r
142             return false;\r
143         }\r
144         return true;\r
145     }\r
146 \r
147     public void deleteCorrelationRule(RuleDeleteRequest ruleDeleteRequest)\r
148             throws CorrelationException {\r
149         if (ruleDeleteRequest == null) {\r
150             throw new CorrelationException("The request object can not be empty!");\r
151         }\r
152         CorrelationRule correlationRule = correlationRuleDao.queryRuleByRid(ruleDeleteRequest.getRuleId());\r
153         if (correlationRule == null) {\r
154             log.warn("the rule:rule id=" + ruleDeleteRequest.getRuleId() + " does not exist the database.");\r
155             throw new CorrelationException("You're trying to delete a rule which does not exist in the system.");\r
156         }\r
157         if (correlationRule.getEnabled() == RuleMgtConstant.STATUS_RULE_OPEN) {\r
158             engineWarpper.deleteRuleFromEngine(correlationRule.getPackageName());\r
159         }\r
160         correlationRuleDao.deleteRule(correlationRule);\r
161     }\r
162 \r
163     private CorrelationRule convertCreateRequest2Rule(String userName,\r
164             RuleCreateRequest ruleCreateRequest) throws CorrelationException {\r
165         String tempContent = ruleCreateRequest.getContent();\r
166         CorrelationRule correlationRule = new CorrelationRule();\r
167         String ruleId = "rule_" + System.currentTimeMillis();\r
168         String description = ruleCreateRequest.getDescription() == null ? "" : ruleCreateRequest.getDescription();\r
169         correlationRule.setRid(ruleId);\r
170         if (tempContent != null) {\r
171             correlationRule.setContent(tempContent.trim());\r
172         }\r
173         correlationRule.setDescription(description);\r
174         correlationRule.setCreateTime(new Date());\r
175         correlationRule.setUpdateTime(new Date());\r
176         correlationRule.setName(ruleCreateRequest.getRuleName());\r
177         correlationRule.setEngineID("correlation-d");\r
178         correlationRule.setEngineType("");\r
179         correlationRule.setTemplateID(0);\r
180         correlationRule.setVendor("");\r
181         correlationRule.setCreator(userName);\r
182         correlationRule.setModifier(userName);\r
183         correlationRule.setEnabled(ruleCreateRequest.getEnabled());\r
184         correlationRule.setClosedControlLoopName(ruleCreateRequest.getLoopControlName());\r
185         return correlationRule;\r
186     }\r
187 \r
188     private CorrelationRule convertRuleUpdateRequest2CorrelationRule(String modifier,\r
189             RuleUpdateRequest ruleUpdateRequest, String ruleName) throws CorrelationException {\r
190         CorrelationRule correlationRule = new CorrelationRule();\r
191         String description = ruleUpdateRequest.getDescription() == null ? "" : ruleUpdateRequest.getDescription();\r
192         correlationRule.setRid(ruleUpdateRequest.getRuleId());\r
193         correlationRule.setContent(ruleUpdateRequest.getContent());\r
194         correlationRule.setDescription(description);\r
195         correlationRule.setEnabled(ruleUpdateRequest.getEnabled());\r
196         correlationRule.setUpdateTime(new Date());\r
197         correlationRule.setModifier(modifier);\r
198         correlationRule.setName(ruleName);\r
199         correlationRule.setClosedControlLoopName(ruleUpdateRequest.getLoopControlName());\r
200         return correlationRule;\r
201     }\r
202 \r
203     private String deployRule2Engine(CorrelationRule correlationRule)\r
204             throws CorrelationException {\r
205         if (engineWarpper.checkRuleFromEngine(correlationRules2CheckRule(correlationRule)) && (\r
206                 correlationRule.getEnabled() == RuleMgtConstant.STATUS_RULE_OPEN)) {\r
207             return engineWarpper.deployEngine(correlationRules2DeployRule(correlationRule));\r
208         }\r
209         return "";\r
210     }\r
211 \r
212     public RuleQueryListResponse getCorrelationRuleByCondition(\r
213             RuleQueryCondition ruleQueryCondition) throws CorrelationException {\r
214         List<CorrelationRule> correlationRule = correlationRuleQueryDao\r
215                 .getCorrelationRulesByCondition(ruleQueryCondition);\r
216         RuleQueryListResponse ruleQueryListResponse = new RuleQueryListResponse();\r
217         ruleQueryListResponse.setTotalCount(correlationRule.size());\r
218         ruleQueryListResponse\r
219                 .setCorrelationRules(correlationRules2RuleResult4APIs(correlationRule));\r
220         return ruleQueryListResponse;\r
221     }\r
222 \r
223     private List<RuleResult4API> correlationRules2RuleResult4APIs(\r
224             List<CorrelationRule> correlationRules) {\r
225         List<RuleResult4API> ruleResult4APIs = new ArrayList<RuleResult4API>();\r
226         for (CorrelationRule correlationRule : correlationRules) {\r
227             RuleResult4API ruleResult4API = new RuleResult4API();\r
228             String description = correlationRule.getDescription() == null ? "" : correlationRule.getDescription();\r
229             ruleResult4API.setRuleId(correlationRule.getRid());\r
230             ruleResult4API.setRuleName(correlationRule.getName());\r
231             ruleResult4API.setDescription(description);\r
232             ruleResult4API.setContent(correlationRule.getContent());\r
233             ruleResult4API.setCreateTime(correlationRule.getCreateTime());\r
234             ruleResult4API.setCreator(correlationRule.getCreator());\r
235             ruleResult4API.setUpdateTime(correlationRule.getUpdateTime());\r
236             ruleResult4API.setModifier(correlationRule.getModifier());\r
237             ruleResult4API.setEnabled(correlationRule.getEnabled());\r
238             ruleResult4API.setLoopControlName(correlationRule.getClosedControlLoopName());\r
239             ruleResult4APIs.add(ruleResult4API);\r
240         }\r
241         return ruleResult4APIs;\r
242     }\r
243 \r
244     private CorrelationDeployRule4Engine correlationRules2DeployRule(\r
245             CorrelationRule correlationRule) {\r
246         CorrelationDeployRule4Engine correlationDeployRule4Engine = new CorrelationDeployRule4Engine();\r
247         correlationDeployRule4Engine.setContent(correlationRule.getContent());\r
248         correlationDeployRule4Engine.setEngineId(correlationRule.getEngineID());\r
249         correlationDeployRule4Engine.setLoopControlName(correlationRule.getClosedControlLoopName());\r
250         return correlationDeployRule4Engine;\r
251     }\r
252 \r
253     private CorrelationCheckRule4Engine correlationRules2CheckRule(\r
254             CorrelationRule correlationRule) {\r
255         CorrelationCheckRule4Engine correlationCheckRule4Engine = new CorrelationCheckRule4Engine();\r
256         correlationCheckRule4Engine.setContent(correlationRule.getContent());\r
257         return correlationCheckRule4Engine;\r
258     }\r
259 }\r