View Javadoc

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   * @since 0.4
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  		// dont assume user has yet set proper direction, therefore assume Z, as it is the least restrictive one
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  }