\r
import java.io.Serializable;\r
import java.io.StringReader;\r
+import java.util.HashSet;\r
import java.util.List;\r
import java.util.Locale;\r
+import java.util.Set;\r
import javax.annotation.PostConstruct;\r
import javax.inject.Inject;\r
import javax.jms.Connection;\r
public class DroolsEngine {\r
\r
private final static int ENABLE = 1;\r
-\r
+ private final Set<String> packageNames = new HashSet<String>();\r
@Inject\r
private RuleMgtWrapper ruleMgtWrapper;\r
-\r
private KnowledgeBase kbase;\r
-\r
private KnowledgeBaseConfiguration kconf;\r
-\r
private StatefulKnowledgeSession ksession;\r
-\r
- private KnowledgeBuilder kbuilder;\r
-\r
@Inject\r
private IterableProvider<MQConfig> mqConfigProvider;\r
-\r
private ConnectionFactory connectionFactory;\r
\r
@PostConstruct\r
\r
private void registerAlarmTopicListener() {\r
String brokerURL =\r
- "tcp://" + mqConfigProvider.get().brokerIp + ":" + mqConfigProvider.get().brokerPort;\r
+ "tcp://" + mqConfigProvider.get().brokerIp + ":" + mqConfigProvider.get().brokerPort;\r
connectionFactory = new ActiveMQConnectionFactory(mqConfigProvider.get().brokerUsername,\r
- mqConfigProvider.get().brokerPassword, brokerURL);\r
+ mqConfigProvider.get().brokerPassword, brokerURL);\r
\r
AlarmMqMessageListener listener = new AlarmMqMessageListener();\r
listener.receive();\r
\r
this.kconf.setProperty("drools.assertBehaviour", "equality");\r
\r
- this.kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
-\r
this.kbase = KnowledgeBaseFactory.newKnowledgeBase("D-ENGINE", this.kconf);\r
\r
this.ksession = kbase.newStatefulKnowledgeSession();\r
StringReader reader = new StringReader(ruleContent);\r
Resource res = ResourceFactory.newReaderResource(reader);\r
\r
- kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
\r
kbuilder.add(res, ResourceType.DRL);\r
\r
}\r
\r
public synchronized String deployRule(DeployRuleRequest rule, Locale locale)\r
- throws CorrelationException {\r
+ throws CorrelationException {\r
StringReader reader = new StringReader(rule.getContent());\r
Resource res = ResourceFactory.newReaderResource(reader);\r
\r
- kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
\r
kbuilder.add(res, ResourceType.DRL);\r
\r
- if (kbuilder.hasErrors()) {\r
-\r
- String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
- I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
- new String[]{kbuilder.getErrors().toString()});\r
- throw new CorrelationException(errorMsg);\r
- }\r
-\r
- KnowledgePackage kpackage = kbuilder.getKnowledgePackages().iterator().next();\r
+ judgeRuleContent(locale, kbuilder);\r
\r
- if (kbase.getKnowledgePackages().contains(kpackage)) {\r
-\r
- String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
- I18nProxy.ENGINE_CONTENT_ILLEGALITY, new String[]{\r
- I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_CONTAINS_PACKAGE)});\r
-\r
- throw new CorrelationException(errorMsg);\r
- }\r
+ String packageName = kbuilder.getKnowledgePackages().iterator().next().getName();\r
try {\r
-\r
+ packageNames.add(packageName);\r
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());\r
} catch (Exception e) {\r
\r
String errorMsg =\r
- I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_DEPLOY_RULE_FAILED);\r
+ I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_DEPLOY_RULE_FAILED);\r
throw new CorrelationException(errorMsg, e);\r
}\r
\r
ksession.fireAllRules();\r
- return kpackage.getName();\r
+ return packageName;\r
}\r
\r
public synchronized void undeployRule(String packageName, Locale locale)\r
- throws CorrelationException {\r
+ throws CorrelationException {\r
\r
KnowledgePackage pkg = kbase.getKnowledgePackage(packageName);\r
\r
if (null == pkg) {\r
String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
- I18nProxy.ENGINE_DELETE_RULE_NULL,\r
- new String[]{packageName});\r
+ I18nProxy.ENGINE_DELETE_RULE_NULL,\r
+ new String[]{packageName});\r
throw new CorrelationException(errorMsg);\r
}\r
\r
kbase.removeKnowledgePackage(pkg.getName());\r
} catch (Exception e) {\r
String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
- I18nProxy.ENGINE_DELETE_RULE_FAILED, new String[]{packageName});\r
+ I18nProxy.ENGINE_DELETE_RULE_FAILED, new String[]{packageName});\r
throw new CorrelationException(errorMsg, e);\r
}\r
}\r
\r
public void compileRule(String content, Locale locale)\r
- throws CorrelationException {\r
+ throws CorrelationException {\r
StringReader reader = new StringReader(content);\r
Resource res = ResourceFactory.newReaderResource(reader);\r
\r
- kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
\r
kbuilder.add(res, ResourceType.DRL);\r
\r
+ judgeRuleContent(locale, kbuilder);\r
+ }\r
+\r
+ private void judgeRuleContent(Locale locale, KnowledgeBuilder kbuilder)\r
+ throws CorrelationException {\r
if (kbuilder.hasErrors()) {\r
String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
- I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
- new String[]{kbuilder.getErrors().toString()});\r
+ I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
+ new String[]{kbuilder.getErrors().toString()});\r
log.error(errorMsg);\r
throw new CorrelationException(errorMsg);\r
}\r
+\r
+ String packageName = kbuilder.getKnowledgePackages().iterator().next().getName();\r
+\r
+ if (packageNames.contains(packageName)) {\r
+ String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
+ I18nProxy.ENGINE_CONTENT_ILLEGALITY, new String[]{\r
+ I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_CONTAINS_PACKAGE)});\r
+\r
+ throw new CorrelationException(errorMsg);\r
+ }\r
}\r
\r
public void putRaisedIntoStream(Alarm raiseAlarm) {\r
\r
import java.lang.reflect.Method;\r
import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
import java.util.List;\r
import java.util.Locale;\r
import javax.jms.Connection;\r
import org.apache.activemq.command.ActiveMQObjectMessage;\r
import org.drools.KnowledgeBase;\r
import org.drools.KnowledgeBaseConfiguration;\r
-import org.drools.builder.KnowledgeBuilder;\r
-import org.drools.builder.KnowledgeBuilderErrors;\r
-import org.drools.builder.ResourceType;\r
-import org.drools.definition.KnowledgePackage;\r
-import org.drools.io.Resource;\r
+import org.drools.KnowledgeBaseFactory;\r
+import org.drools.conf.EventProcessingOption;\r
import org.drools.runtime.StatefulKnowledgeSession;\r
-import org.drools.runtime.rule.FactHandle;\r
import org.easymock.EasyMock;\r
import org.glassfish.hk2.api.IterableProvider;\r
import org.junit.Before;\r
import org.openo.holmes.common.api.entity.CorrelationRule;\r
import org.openo.holmes.common.api.stat.Alarm;\r
import org.openo.holmes.common.config.MQConfig;\r
+import org.openo.holmes.common.constant.AlarmConst;\r
import org.openo.holmes.common.exception.CorrelationException;\r
import org.openo.holmes.engine.request.DeployRuleRequest;\r
import org.openo.holmes.engine.wrapper.RuleMgtWrapper;\r
\r
private StatefulKnowledgeSession ksession;\r
\r
- private KnowledgeBuilder kbuilder;\r
-\r
private IterableProvider<MQConfig> mqConfigProvider;\r
\r
private ConnectionFactory connectionFactory;\r
public void setUp() {\r
droolsEngine = new DroolsEngine();\r
\r
+ this.kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();\r
+ this.kconf.setOption(EventProcessingOption.STREAM);\r
+ this.kconf.setProperty("drools.assertBehaviour", "equality");\r
+ this.kbase = KnowledgeBaseFactory.newKnowledgeBase("D-ENGINE", this.kconf);\r
+ this.ksession = kbase.newStatefulKnowledgeSession();\r
+\r
ruleMgtWrapper = PowerMock.createMock(RuleMgtWrapper.class);\r
- kbase = PowerMock.createMock(KnowledgeBase.class);\r
- kconf = PowerMock.createMock(KnowledgeBaseConfiguration.class);\r
- ksession = PowerMock.createMock(StatefulKnowledgeSession.class);\r
- kbuilder = PowerMock.createMock(KnowledgeBuilder.class);\r
mqConfigProvider = PowerMock.createMock(IterableProvider.class);\r
connectionFactory = PowerMock.createMock(ConnectionFactory.class);\r
\r
Whitebox.setInternalState(droolsEngine, "ruleMgtWrapper", ruleMgtWrapper);\r
- Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
+ Whitebox.setInternalState(droolsEngine, "mqConfigProvider", mqConfigProvider);\r
Whitebox.setInternalState(droolsEngine, "kconf", kconf);\r
+ Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
Whitebox.setInternalState(droolsEngine, "ksession", ksession);\r
- Whitebox.setInternalState(droolsEngine, "kbuilder", kbuilder);\r
- Whitebox.setInternalState(droolsEngine, "mqConfigProvider", mqConfigProvider);\r
Whitebox.setInternalState(droolsEngine, "connectionFactory", connectionFactory);\r
\r
PowerMock.resetAll();\r
\r
@Test\r
public void deployRule_kbuilder_has_errors() throws CorrelationException {\r
- DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
- Locale locale = PowerMock.createMock(Locale.class);\r
+ DeployRuleRequest rule = new DeployRuleRequest();\r
+ rule.setContent("rule123");\r
+ Locale locale = new Locale(AlarmConst.I18N_EN);\r
\r
thrown.expect(CorrelationException.class);\r
\r
- KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
- expect(rule.getContent()).andReturn("rule");\r
- kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
- expect(kbuilder.hasErrors()).andReturn(true);\r
- expect(kbuilder.getErrors()).andReturn(errors);\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.deployRule(rule, locale);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
@Test\r
- public void deployRule_kbase_knowledgePackages_contains_package() throws CorrelationException {\r
- DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
- Locale locale = PowerMock.createMock(Locale.class);\r
+ public void deployRule_package_name_repeat() throws CorrelationException {\r
+ DeployRuleRequest rule = new DeployRuleRequest();\r
+ rule.setContent("package rule123");\r
+ Locale locale = new Locale(AlarmConst.I18N_EN);\r
\r
thrown.expect(CorrelationException.class);\r
\r
- KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
- Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
- Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
- Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
- baseColl.add(kPackage);\r
- expect(rule.getContent()).andReturn("rule");\r
- expect(kbuilder.hasErrors()).andReturn(false);\r
- kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
- expect(kbuilder.getKnowledgePackages()).andReturn(builderColl);\r
- expect(builderColl.iterator()).andReturn(iterator);\r
- expect(iterator.next()).andReturn(kPackage);\r
- expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.deployRule(rule, locale);\r
-\r
- PowerMock.verifyAll();\r
- }\r
-\r
- @Test\r
- public void deployRule_add_knowledge_packages_exception() throws CorrelationException {\r
- DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
- Locale locale = PowerMock.createMock(Locale.class);\r
-\r
- thrown.expect(CorrelationException.class);\r
-\r
- KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
- Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
- Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
- Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
- expect(rule.getContent()).andReturn("rule");\r
- expect(kbuilder.hasErrors()).andReturn(false);\r
- kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
- expect(kbuilder.getKnowledgePackages()).andReturn(builderColl).times(2);\r
- expect(builderColl.iterator()).andReturn(iterator);\r
- expect(iterator.next()).andReturn(kPackage);\r
- expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
- kbase.addKnowledgePackages(anyObject(Collection.class));\r
- EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.deployRule(rule, locale);\r
-\r
- PowerMock.verifyAll();\r
- }\r
-\r
- @Test\r
- public void undeployRule_knowledgepackage_is_null() throws CorrelationException {\r
- String packageName = "packageName";\r
- Locale locale = PowerMock.createMock(Locale.class);\r
-\r
- thrown.expect(CorrelationException.class);\r
-\r
- expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(null);\r
-\r
- PowerMock.replayAll();\r
-\r
- droolsEngine.undeployRule(packageName, locale);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
@Test\r
- public void undeployRule_remove_knowledge_package_exception() throws CorrelationException {\r
- String packageName = "packageName";\r
- Locale locale = PowerMock.createMock(Locale.class);\r
+ public void undeployRule_package_name_is_null() throws CorrelationException {\r
+ String packageName = null;\r
+ Locale locale = new Locale(AlarmConst.I18N_EN);\r
\r
thrown.expect(CorrelationException.class);\r
\r
- KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
- expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
- expect(pkg.getName()).andReturn("");\r
- kbase.removeKnowledgePackage(anyObject(String.class));\r
- EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.undeployRule(packageName, locale);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
@Test\r
public void undeployRule_normal() throws CorrelationException {\r
- String packageName = "packageName";\r
- Locale locale = PowerMock.createMock(Locale.class);\r
+ Locale locale = new Locale(AlarmConst.I18N_EN);\r
\r
- KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
- expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
- expect(pkg.getName()).andReturn("");\r
- kbase.removeKnowledgePackage(anyObject(String.class));\r
+ DeployRuleRequest rule = new DeployRuleRequest();\r
+ rule.setContent("package rule123");\r
+ droolsEngine.deployRule(rule, locale);\r
\r
- PowerMock.replayAll();\r
+ String packageName = "rule123";\r
\r
droolsEngine.undeployRule(packageName, locale);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
@Test\r
public void compileRule_kbuilder_has_errors() throws CorrelationException {\r
- String content = "content";\r
- Locale locale = PowerMock.createMock(Locale.class);\r
+ String content = "have error content";\r
+ Locale locale = new Locale(AlarmConst.I18N_EN);\r
\r
thrown.expect(CorrelationException.class);\r
\r
- KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
- kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
- expect(kbuilder.hasErrors()).andReturn(true);\r
- expect(kbuilder.getErrors()).andReturn(errors);\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.compileRule(content, locale);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
+\r
@Test\r
public void putRaisedIntoStream_facthandle_is_null() {\r
- expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(null);\r
- expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
- expect(ksession.fireAllRules()).andReturn(0);\r
-\r
- PowerMock.replayAll();\r
-\r
- droolsEngine.putRaisedIntoStream(new Alarm());\r
-\r
- PowerMock.verifyAll();\r
+ Alarm raiseAlarm = new Alarm();\r
+ droolsEngine.putRaisedIntoStream(raiseAlarm);\r
+ droolsEngine.putRaisedIntoStream(raiseAlarm);\r
}\r
\r
@Test\r
public void putRaisedIntoStream_factHandle_is_not_null() {\r
- FactHandle factHandle = PowerMock.createMock(FactHandle.class);\r
- expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(factHandle);\r
- ksession.retract(anyObject(FactHandle.class));\r
- expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
- expect(ksession.fireAllRules()).andReturn(0);\r
-\r
- PowerMock.replayAll();\r
-\r
droolsEngine.putRaisedIntoStream(new Alarm());\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
\r
ActiveMQObjectMessage objectMessage = new ActiveMQObjectMessage();\r
objectMessage.setObject(alarm);\r
\r
- expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(null);\r
-\r
- expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
- expect(ksession.fireAllRules()).andReturn(1);\r
-\r
- PowerMock.replayAll();\r
-\r
listener.onMessage(objectMessage);\r
-\r
- PowerMock.verifyAll();\r
}\r
\r
@Test\r