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
16
17 class UserServiceImpl
18 extends DefaultAsync<UserServiceListener>
19 implements UserServiceInternal
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
32 @Override public final User lookupUserForJointMessage(final Integer osceletonUserId) {
33 return this.users.getForJoint(osceletonUserId, this);
34 }
35
36
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
54 public final User lookupDeadUser(final Integer osceletonUserId) {
55 final User userToDispatch = this.users.remove(osceletonUserId, this);
56
57 for (final UserServiceListener listener : this.getListeners()) {
58 listener.onUserDead(userToDispatch);
59 }
60 return userToDispatch;
61 }
62
63
64 public User lookupProcessingUser(final Integer osceletonUserId) {
65 final User storedUser = this.users.get(osceletonUserId);
66 final User processingUser;
67 if(storedUser == null) {
68
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
91 @Override public final Collection<User> getProcessing() {
92 return this.users.getProcessing();
93 }
94
95
96 @Override public final Collection<User> getWaiting() {
97 return this.users.getWaiting();
98 }
99
100 }