001    /*
002    @license.text@
003     */
004    package com.hammurapi.eventbus.tests.familyties.rules;
005    
006    import com.hammurapi.eventbus.Handler;
007    import com.hammurapi.eventbus.tests.familyties.FamilyTiesEventDispatchContext;
008    import com.hammurapi.eventbus.tests.familyties.model.Aunt;
009    import com.hammurapi.eventbus.tests.familyties.model.Brother;
010    import com.hammurapi.eventbus.tests.familyties.model.Child;
011    import com.hammurapi.eventbus.tests.familyties.model.Cousin;
012    import com.hammurapi.eventbus.tests.familyties.model.Daughter;
013    import com.hammurapi.eventbus.tests.familyties.model.Husband;
014    import com.hammurapi.eventbus.tests.familyties.model.Nephew;
015    import com.hammurapi.eventbus.tests.familyties.model.Niece;
016    import com.hammurapi.eventbus.tests.familyties.model.Parent;
017    import com.hammurapi.eventbus.tests.familyties.model.Sibling;
018    import com.hammurapi.eventbus.tests.familyties.model.Sister;
019    import com.hammurapi.eventbus.tests.familyties.model.Son;
020    import com.hammurapi.eventbus.tests.familyties.model.Uncle;
021    import com.hammurapi.eventbus.tests.familyties.model.Wife;
022    
023    /**
024     * Infers aunt, uncle, cousin, niece, nephew
025     * @author Pavel Vlasov
026     * @revision $Revision$
027     */
028    public class SecondaryRules extends FamilyTiesRules {
029            
030            /**
031             * Infers cousin as a child or parent's sibling.
032             */
033            @Handler(posts=Cousin.class)
034            public void infer(FamilyTiesEventDispatchContext dispatchContext, Child child1, Child child2, Sibling sibling) {
035                    if (child1.getObject().equals(sibling.getSubject()) && child2.getObject().equals(sibling.getObject())) {
036                            dispatchContext.post(new Cousin(child1.getSubject(), child2.getSubject()));
037                    }
038            }
039            
040            /**
041             * If A is a cousin of B then B is a cousin of A
042             * @param cousin
043             * @return
044             */
045            @Handler        
046            public Cousin infer(Cousin cousin) {
047                    return new Cousin(cousin.getObject(), cousin.getSubject());
048            }
049            
050            /**
051             * Another way to infer cousin to demonstrate mutiple derivations
052             * @param aunt
053             * @param child
054             */
055            @Handler("aunt.getSubject().equals(parent.getSubject())")
056    //      @Handler("args[0].getSubject().equals(args[1].getSubject())")
057            public Cousin infer(Aunt aunt, Parent parent) {
058                    return new Cousin(aunt.getObject(), parent.getObject());
059            }
060            
061            /**
062             * Another way to infer cousin to demonstrate mutiple derivations
063             * @param uncle
064             * @param child
065             */
066            @Handler        
067            public Cousin infer(Uncle uncle, Parent parent) {
068                    if (uncle.getSubject().equals(parent.getSubject())) {
069                            return new Cousin(uncle.getObject(), parent.getObject());
070                    }
071                    return null;
072            }
073            
074            /**
075             * Sister of parent is aunt.
076             * @param sister
077             * @param parent
078             */
079            @Handler        
080            public Aunt infer(Sister sister, Parent parent) {
081                    return sister.getObject().equals(parent.getSubject()) ? new Aunt(sister.getSubject(), parent.getObject()) : null;
082            }
083            
084            /**
085             * Wife of uncle is aunt.
086             * @param sister
087             * @param parent
088             */
089            @Handler        
090            public Aunt infer(Wife wife, Uncle uncle) {
091                    return wife.getObject().equals(uncle.getSubject()) ? new Aunt(wife.getSubject(), uncle.getObject()) : null;
092            }
093            
094            /**
095             * Brother of parent is uncle.
096             * @param sister
097             * @param parent
098             */
099            @Handler        
100            public Uncle infer(Brother brother, Parent parent) {
101                    return brother.getObject().equals(parent.getSubject()) ? new Uncle(brother.getSubject(), parent.getObject()) : null;
102            }
103            
104            /**
105             * Husband of aunt is uncle.
106             * @param sister
107             * @param parent
108             */
109            @Handler        
110            public Uncle infer(Husband husband, Aunt aunt) {
111                    return husband.getObject().equals(aunt.getSubject()) ? new Uncle(husband.getSubject(), aunt.getObject()) : null;
112            }
113            
114            /**
115             * Daughter of sibling is niece.
116             */
117            @Handler("java(daughter, sibling)://daughter.getObject().equals(sibling.getSubject())") 
118            public Niece infer(Daughter daughter, Sibling sibling) {
119                    return new Niece(daughter.getSubject(), sibling.getObject());
120            }
121            
122            // TODO Implement: Spouse's niece is my niece.
123            
124            /**
125             * Son of sibling is nephew.
126             */
127            @Handler("java(son,sibling)://son.getObject().equals(sibling.getSubject())")    
128            public Nephew infer(Son son, Sibling sibling) {
129                    return new Nephew(son.getSubject(), sibling.getObject());
130            }
131            
132            // TODO Implement: Spouse's nephew is my nephew.
133                    
134    }