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    }