001 package com.hammurapi.eventbus.tests.familyties;
002
003 import java.util.concurrent.ExecutorService;
004 import java.util.concurrent.Executors;
005
006 import com.hammurapi.eventbus.InferencePolicy;
007 import com.hammurapi.eventbus.tests.familyties.model.Child;
008 import com.hammurapi.eventbus.tests.familyties.model.Person;
009 import com.hammurapi.eventbus.tests.familyties.model.Relative;
010 import com.hammurapi.eventbus.tests.familyties.model.Spouse;
011 import com.hammurapi.eventbus.tests.familyties.rules.DaughterRule;
012 import com.hammurapi.eventbus.tests.familyties.rules.DaughterRuleJavaBinder;
013 import com.hammurapi.eventbus.tests.familyties.rules.GrandRules;
014 import com.hammurapi.eventbus.tests.familyties.rules.GrandRulesJavaBinder;
015 import com.hammurapi.eventbus.tests.familyties.rules.ParentChildRules;
016 import com.hammurapi.eventbus.tests.familyties.rules.ParentChildRulesJavaBinder;
017 import com.hammurapi.eventbus.tests.familyties.rules.ParentRules;
018 import com.hammurapi.eventbus.tests.familyties.rules.ParentRulesJavaBinder;
019 import com.hammurapi.eventbus.tests.familyties.rules.SecondaryRules;
020 import com.hammurapi.eventbus.tests.familyties.rules.SecondaryRulesJavaBinder;
021 import com.hammurapi.eventbus.tests.familyties.rules.SiblingRules;
022 import com.hammurapi.eventbus.tests.familyties.rules.SiblingRulesJavaBinder;
023 import com.hammurapi.eventbus.tests.familyties.rules.SonRule;
024 import com.hammurapi.eventbus.tests.familyties.rules.SonRuleJavaBinder;
025 import com.hammurapi.eventbus.tests.familyties.rules.SpouseRules;
026 import com.hammurapi.eventbus.tests.familyties.rules.SpouseRulesJavaBinder;
027
028 public class FamilyTiesApp {
029
030 /**
031 * @param args
032 */
033 public static String infer() throws Exception {
034 ExecutorService executorService = Executors.newFixedThreadPool(2);
035
036 // Create bus
037 FamilyTiesEventStoreImpl.Config storeConfig = new FamilyTiesEventStoreImpl.Config();
038 storeConfig.setExecutorService(executorService);
039 FamilyTiesEventStore eventStore = new FamilyTiesEventStoreImpl(storeConfig);
040
041 FamilyTiesEventBus.Config busConfig = new FamilyTiesEventBus.Config();
042 busConfig.setStore(eventStore);
043 busConfig.setExecutorService(executorService);
044
045 busConfig.setInferencePolicy(InferencePolicy.EXCLUSIVE);
046
047 FamilyTiesEventBus bus = new FamilyTiesEventBus(busConfig);
048
049 // Bind rules.
050 new DaughterRuleJavaBinder().bind(new DaughterRule(), bus);
051 new GrandRulesJavaBinder().bind(new GrandRules(), bus);
052 new ParentChildRulesJavaBinder().bind(new ParentChildRules(), bus);
053 new ParentRulesJavaBinder().bind(new ParentRules(), bus);
054 new SecondaryRulesJavaBinder().bind(new SecondaryRules(), bus);
055 new SiblingRulesJavaBinder().bind(new SiblingRules(), bus);
056 new SonRuleJavaBinder().bind(new SonRule(), bus);
057 new SpouseRulesJavaBinder().bind(new SpouseRules(), bus);
058
059 long start = System.currentTimeMillis();
060
061 // Post seed relationships
062 Person kate = new Person("Kate", 58, false);
063 Person victor = new Person("Victor", 63, true);
064 bus.post(new Spouse(kate, victor));
065
066 Person peter = new Person("Peter", 37, true);
067 bus.post(new Child(peter, kate));
068 bus.post(new Child(peter, victor));
069
070 Person alison = new Person("Alison", 36, false);
071 bus.post(new Spouse(peter, alison));
072
073 Person lucy = new Person("Lucy", 17, false);
074 bus.post(new Child(lucy, alison));
075
076 Person nancy = new Person("Nancy", 14, false);
077 bus.post(new Child(nancy, peter));
078
079 Person dan = new Person("Dan", 7, true);
080 bus.post(new Child(dan, peter));
081 bus.post(new Child(dan, alison));
082
083 Person audrey = new Person("Audrey", 4, false);
084 bus.post(new Child(audrey, peter));
085 bus.post(new Child(audrey, alison));
086
087 Person tanya = new Person("Tanya", 31, false);
088 Person max = new Person("Max", 32, true);
089 bus.post(new Spouse(tanya, max));
090 bus.post(new Child(tanya, kate));
091 bus.post(new Child(tanya, victor));
092
093 Person vilma = new Person("Vilma", 14, false);
094 bus.post(new Child(vilma, tanya));
095
096 Person george = new Person("George", 10, true);
097 bus.post(new Child(george, tanya));
098
099 Person lisa = new Person("Lisa", 5, false);
100 bus.post(new Child(lisa, tanya));
101 bus.post(new Child(lisa, max));
102
103 bus.join();
104
105 StringBuilder sb = new StringBuilder();
106 sb.append("Inference time (ms): "+(System.currentTimeMillis()-start)+"\n");
107 for (Relative relative: bus.getStore().getRelatives(lisa)) {
108 sb.append(relative+"\n");
109 }
110 executorService.shutdown();
111 return sb.toString();
112 }
113
114 public static void main(String[] args) throws Exception {
115 // Thread.sleep(60000);
116 System.out.println(infer());
117 }
118
119 }