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 }