1 package net.sf.josceleton.motion.impl.gesture.hitwall;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.HashSet;
6
7 import net.sf.josceleton.commons.exception.InvalidArgumentException;
8 import net.sf.josceleton.core.api.entity.CoordinateUtil;
9 import net.sf.josceleton.core.api.entity.XyzDirection;
10 import net.sf.josceleton.core.api.entity.joint.Joint;
11 import net.sf.josceleton.core.api.entity.joint.Joints;
12 import net.sf.josceleton.motion.api.gesture.hitwall.HitWallBuilder;
13 import net.sf.josceleton.motion.api.gesture.hitwall.HitWallConfig;
14 import net.sf.josceleton.motion.api.gesture.hitwall.HitWallGesture;
15 import net.sf.josceleton.motion.api.gesture.hitwall.HitWallListener;
16 import net.sf.josceleton.motion.impl.gesture.AbstractJointableGestureBuilder;
17
18 import com.google.inject.Inject;
19
20
21
22
23 class HitWallBuilderImpl
24 extends AbstractJointableGestureBuilder<
25 HitWallBuilder,
26 HitWallGesture,
27 HitWallConfig,
28 HitWallListener>
29 implements HitWallBuilder {
30
31 private static final Collection<Joint> DEFAULT_RELEVANT_JOINTS;
32 static {
33 final Collection<Joint> tmp = new HashSet<Joint>();
34 tmp.add(Joints.HAND().RIGHT());
35 DEFAULT_RELEVANT_JOINTS = Collections.unmodifiableCollection(tmp);
36 }
37
38 private static final XyzDirection DEFAULT_DIRECTION = XyzDirection.Y;
39
40 private static final float DEFAULT_COORDINATE = 0.6F;
41
42 private static final boolean DEFAULT_LOWER = true;
43
44
45 private XyzDirection pDirection = DEFAULT_DIRECTION;
46
47 private float pCoordinate = DEFAULT_COORDINATE;
48
49 private boolean pTriggerOnLower = DEFAULT_LOWER;
50
51 private final HitWallGestureFactory gestureFactory;
52
53 private final HitWallConfigFactory configFactory;
54
55
56 @Inject HitWallBuilderImpl(final HitWallGestureFactory gestureFactory, final HitWallConfigFactory configFactory) {
57 this.gestureFactory = gestureFactory;
58 this.configFactory = configFactory;
59 }
60
61 @Override public final HitWallGesture build() {
62 final Collection<Joint> relevantJoints;
63 final Collection<Joint> configuredAttachedJoints = this.getPAttachedJoints();
64 if(configuredAttachedJoints != null) {
65 relevantJoints = configuredAttachedJoints;
66 } else {
67 relevantJoints = DEFAULT_RELEVANT_JOINTS;
68 }
69 final HitWallConfig config = this.configFactory.create(
70 relevantJoints, this.pCoordinate, this.pDirection, this.pTriggerOnLower);
71 return this.gestureFactory.create(config);
72 }
73
74 @Override public final HitWallBuilder direction(final XyzDirection direction) {
75 if(direction == null) {
76 throw InvalidArgumentException.newNotNull("direction");
77 }
78 this.pDirection = direction;
79 return this;
80 }
81
82 @Override public final HitWallBuilder coordinate(final float coordinateValue) {
83
84 if(CoordinateUtil.isCorrectValue(coordinateValue, XyzDirection.Z) == false) {
85 throw InvalidArgumentException.newInstance("coordinateValue", Float.valueOf(coordinateValue),
86 "coordinateValue must be within a valid range!");
87 }
88
89 this.pCoordinate = coordinateValue;
90 return this;
91 }
92
93 @Override public final HitWallBuilder triggerOnLower(final boolean triggerOnLower) {
94 this.pTriggerOnLower = triggerOnLower;
95 return this;
96 }
97
98 }