View Javadoc

1   package net.sf.josceleton.connection.impl.service.user;
2   
3   import java.util.Collection;
4   
5   import net.sf.josceleton.connection.api.service.user.UserServiceListener;
6   import net.sf.josceleton.core.api.entity.User;
7   import net.sf.josceleton.core.api.entity.UserState;
8   import net.sf.josceleton.core.api.entity.UserStateFunction;
9   import net.sf.josceleton.core.impl.async.DefaultAsync;
10  import net.sf.josceleton.core.impl.entity.UserFactory;
11  
12  import com.google.inject.Inject;
13  
14  /**
15   * @since 0.3
16   */
17  class UserServiceImpl
18  	extends DefaultAsync<UserServiceListener>
19  	implements UserServiceInternal /* == { UserService, UserStore, UsersCollectionResponder } */ {
20  	
21  	private final UserServiceCollection users;
22  	
23  	private final UserFactory factory;
24  	
25  	
26  	@Inject UserServiceImpl(final UserServiceCollection users, final UserFactory factory) {
27  		this.users = users;
28  		this.factory = factory;
29  	}
30  
31  	/** {@inheritDoc} from {@link UserStore} */
32  	@Override public final User lookupUserForJointMessage(final Integer osceletonUserId) {
33  		return this.users.getForJoint(osceletonUserId, this);
34  	}
35  
36  	/** {@inheritDoc} from {@link UserStore} */
37  	@SuppressWarnings("synthetic-access")
38  	@Override public final User lookupUserForUserMessage(final Integer osceletonUserId, final UserState userState) {
39  		return userState.callback(new UserStateFunction<User>() {
40  			@Override public User onStateWaiting() {
41  				UserServiceImpl.this.users.checkIfYetRegistered(osceletonUserId, UserServiceImpl.this);
42  				return UserServiceImpl.this.newWaitingUser(osceletonUserId);
43  			}
44  			@Override public User onStateProcessing() {
45  				return UserServiceImpl.this.lookupProcessingUser(osceletonUserId);
46  			}
47  			@Override public User onStateDead() {
48  				return UserServiceImpl.this.lookupDeadUser(osceletonUserId);
49  			}
50  		});
51  	}
52  
53  	/** {@inheritDoc} from {@link UserServiceCollectionResponder} */
54  	public final User lookupDeadUser(final Integer osceletonUserId) {
55  		final User userToDispatch = this.users.remove(osceletonUserId, this);
56  		// userToDispatch can be null if entered in a running session
57  		for (final UserServiceListener listener : this.getListeners()) {
58  			listener.onUserDead(userToDispatch);
59  		}
60  		return userToDispatch;
61  	}
62  
63  	/** {@inheritDoc} from {@link UserServiceCollectionResponder} */
64  	public User lookupProcessingUser(final Integer osceletonUserId) {
65  		final User storedUser = this.users.get(osceletonUserId);
66  		final User processingUser;
67  		if(storedUser == null) {
68  			// artificially invoke one state step before
69  			processingUser = this.newWaitingUser(osceletonUserId);
70  		} else {
71  			processingUser = storedUser;
72  		}
73  		
74  		this.users.moveToProcessing(processingUser);
75  		for (final UserServiceListener listener : this.getListeners()) {
76  			listener.onUserProcessing(processingUser);
77  		}
78  		return processingUser;
79  	}
80  
81  	private User newWaitingUser(final Integer osceletonUserId) {
82  		final User newUser = this.factory.create(osceletonUserId.intValue());
83  		this.users.add(newUser);
84  		for (final UserServiceListener listener : this.getListeners()) {
85  			listener.onUserWaiting(newUser);
86  		}
87  		return newUser;
88  	}
89  
90  	/** {@inheritDoc} from {@link AvailableUsersCollection} */
91  	@Override public final Collection<User> getProcessing() {
92  		return this.users.getProcessing();
93  	}
94  
95  	/** {@inheritDoc} from {@link AvailableUsersCollection} */
96  	@Override public final Collection<User> getWaiting() {
97  		return this.users.getWaiting();
98  	}
99  	
100 }