Package org.onebusaway.users.impl

Source Code of org.onebusaway.users.impl.CurrentUserServiceImpl

/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.users.impl;

import java.util.List;

import org.onebusaway.users.client.model.UserBean;
import org.onebusaway.users.model.IndexedUserDetails;
import org.onebusaway.users.model.User;
import org.onebusaway.users.model.UserIndex;
import org.onebusaway.users.model.UserIndexKey;
import org.onebusaway.users.model.properties.RouteFilter;
import org.onebusaway.users.services.CurrentUserService;
import org.onebusaway.users.services.StandardAuthoritiesService;
import org.onebusaway.users.services.UserPropertiesService;
import org.onebusaway.users.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CurrentUserServiceImpl implements CurrentUserService {

  private enum Mode {
    LOGIN, REGISTRATION, ADD_ACCOUNT
  };

  private UserService _userService;

  private UserPropertiesService _userPropertiesService;

  private StandardAuthoritiesService _authoritiesService;

  private CurrentUserStrategy _currentUserStrategy;

  @Autowired
  public void setUserService(UserService service) {
    _userService = service;
  }

  @Autowired
  public void setUserPropertiesService(
      UserPropertiesService userPropertiesService) {
    _userPropertiesService = userPropertiesService;
  }

  @Autowired
  public void setAuthoritiesService(
      StandardAuthoritiesService authoritiesService) {
    _authoritiesService = authoritiesService;
  }

  @Autowired
  public void setCurrentUserStrategy(CurrentUserStrategy currentUserStrategy) {
    _currentUserStrategy = currentUserStrategy;
  }

  /****
   * {@link CurrentUserService} Interface
   ****/

  @Override
  public boolean isCurrentUserAnonymous() {
    IndexedUserDetails details = _currentUserStrategy.getCurrentUserDetails(false);
    if (details == null)
      return true;
    return details.isAnonymous();
  }

  @Override
  public boolean isCurrentUserAdmin() {
    IndexedUserDetails details = _currentUserStrategy.getCurrentUserDetails(false);
    if (details == null)
      return false;
    return details.isAdmin();
  }

  @Override
  public IndexedUserDetails getCurrentUserDetails() {
    return _currentUserStrategy.getCurrentUserDetails(false);
  }

  @Override
  public UserBean getCurrentUser() {
    return getCurrentUser(false);
  }

  @Override
  public UserBean getCurrentUser(boolean createUserIfAppropriate) {
    UserIndex userIndex = _currentUserStrategy.getCurrentUserIndex(createUserIfAppropriate);
    if (userIndex == null)
      return null;
    return _userService.getUserAsBean(userIndex.getUser());
  }

  @Override
  public UserIndex getCurrentUserAsUserIndex() {
    return _currentUserStrategy.getCurrentUserIndex(false);
  }

  @Override
  public UserBean getAnonymousUser() {
    return _userService.getAnonymousUser();
  }

  @Override
  public IndexedUserDetails handleUserAction(String type, String id,
      String credentials, boolean isAnonymous, String mode) {
    Mode m = getModeForRequest(mode);
    switch (m) {
      case LOGIN:
        return handleLogin(type, id, credentials, isAnonymous, true);
      case REGISTRATION:
        return handleRegistration(type, id, credentials, isAnonymous);
      case ADD_ACCOUNT:
        return handleAddAccount(type, id, credentials, isAnonymous);
    }
    throw new IllegalStateException("unknown mode: " + mode + " " + m);
  }

  @Override
  public IndexedUserDetails handleLogin(String type, String id,
      String credentials, boolean isAnonymous, boolean registerIfNewUser) {

    UserIndexKey key = new UserIndexKey(type, id);
    UserIndex index = _userService.getUserIndexForId(key);
    boolean exists = index != null;

    // New user?
    if (!exists) {

      if (!registerIfNewUser)
        return null;

      index = _userService.getOrCreateUserForIndexKey(key, credentials, false);
      User newUser = index.getUser();

      User oldUser = _currentUserStrategy.getCurrentUser(false);
      if (oldUser != null && _userService.isAnonymous(oldUser))
        _userService.mergeUsers(oldUser, newUser);
    }

    return new IndexedUserDetailsImpl(_authoritiesService, index);
  }

  @Override
  public IndexedUserDetails handleRegistration(String type, String id,
      String credentials, boolean isAnonymous) {

    UserIndexKey key = new UserIndexKey(type, id);
    UserIndex index = _userService.getOrCreateUserForIndexKey(key, credentials,
        isAnonymous);

    User oldUser = _currentUserStrategy.getCurrentUser(false);
    if (oldUser != null && _userService.isAnonymous(oldUser))
      _userService.mergeUsers(oldUser, index.getUser());

    return new IndexedUserDetailsImpl(_authoritiesService, index);
  }

  @Override
  public IndexedUserDetails handleAddAccount(String type, String id,
      String credentials, boolean isAnonymous) {

    User currentUser = _currentUserStrategy.getCurrentUser(false);

    UserIndexKey key = new UserIndexKey(type, id);
    UserIndex index = _userService.getUserIndexForId(key);
    boolean exists = index != null;

    // New user?
    if (exists) {
      if (currentUser != null) {
        User existingUser = index.getUser();
        _userService.mergeUsers(existingUser, currentUser);
      }
    } else {
      if (currentUser != null)
        index = _userService.addUserIndexToUser(currentUser, key, credentials);
      else
        index = _userService.getOrCreateUserForIndexKey(key, credentials,
            isAnonymous);
    }

    return new IndexedUserDetailsImpl(_authoritiesService, index);
  }

  @Override
  public void setDefaultLocation(String locationName, double lat, double lon) {

    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return;
    _userPropertiesService.setDefaultLocation(user, locationName, lat, lon);
  }

  @Override
  public void clearDefaultLocation() {
    User user = _currentUserStrategy.getCurrentUser(false);
    if (user == null)
      return;
    _userPropertiesService.clearDefaultLocation(user);
  }

  @Override
  public int addStopBookmark(String name, List<String> stopIds,
      RouteFilter filter) {
    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return -1;
    return _userPropertiesService.addStopBookmark(user, name, stopIds, filter);
  }

  @Override
  public void updateStopBookmark(int id, String name, List<String> stopIds,
      RouteFilter routeFilter) {

    User user = _currentUserStrategy.getCurrentUser(false);
    if (user == null)
      return;
    _userPropertiesService.updateStopBookmark(user, id, name, stopIds,
        routeFilter);
  }

  @Override
  public void deleteStopBookmarks(int index) {
    User user = _currentUserStrategy.getCurrentUser(false);
    if (user == null)
      return;
    _userPropertiesService.deleteStopBookmarks(user, index);
  }

  @Override
  public void setLastSelectedStopIds(List<String> stopIds) {
    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return;
    _userPropertiesService.setLastSelectedStopIds(user, stopIds);
  }

  @Override
  public void setRememberUserPreferencesEnabled(
      boolean rememberPreferencesEnabled) {
    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return;
    _userPropertiesService.setRememberUserPreferencesEnabled(user,
        rememberPreferencesEnabled);
  }

  @Override
  public String registerPhoneNumber(String phoneNumber) {
    User user = _currentUserStrategy.getCurrentUser(true);
    return _userService.registerPhoneNumber(user, phoneNumber);
  }

  @Override
  public boolean hasPhoneNumberRegistration() {
    IndexedUserDetails details = _currentUserStrategy.getCurrentUserDetails(false);
    if (details == null)
      return false;
    return _userService.hasPhoneNumberRegistration(details.getUserIndexKey());
  }

  @Override
  public boolean completePhoneNumberRegistration(String registrationCode) {

    UserIndex userIndex = _currentUserStrategy.getCurrentUserIndex(false);
    if (userIndex == null)
      return false;

    userIndex = _userService.completePhoneNumberRegistration(userIndex,
        registrationCode);

    if (userIndex == null)
      return false;

    _currentUserStrategy.setCurrentUser(userIndex);

    return true;
  }

  @Override
  public void clearPhoneNumberRegistration() {
    IndexedUserDetails details = _currentUserStrategy.getCurrentUserDetails(false);
    if (details == null)
      return;
    _userService.clearPhoneNumberRegistration(details.getUserIndexKey());
  }

  @Override
  public void markServiceAlertAsRead(String situationId, long time,
      boolean isRead) {
    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return;
    _userPropertiesService.markServiceAlertAsRead(user, situationId, time,
        isRead);
  }

  @Override
  public void enableAdminRole() {
    User user = _currentUserStrategy.getCurrentUser(true);
    if (user == null)
      return;
    _userService.enableAdminRoleForUser(user, true);
    _currentUserStrategy.clearCurrentUser();
  }

  @Override
  public void removeUserIndex(UserIndexKey key) {
    UserIndex index = _currentUserStrategy.getCurrentUserIndex(false);
    if (index == null)
      return;
    boolean removingCurrentUserIndex = index.getId().equals(key);
    _userService.removeUserIndexForUser(index.getUser(), key);
    if (removingCurrentUserIndex)
      _currentUserStrategy.clearCurrentUser();
  }

  @Override
  public void deleteCurrentUser() {
    User user = _currentUserStrategy.getCurrentUser(false);
    if (user == null)
      return;
    _userService.deleteUser(user);

    _currentUserStrategy.clearCurrentUser();
  }

  public void resetCurrentUser() {
    User user = _currentUserStrategy.getCurrentUser(false);
    if (user == null)
      return;

    _userService.resetUser(user);
    _currentUserStrategy.clearCurrentUser();
  }

  /****
   * Private Methods
   ****/

  private Mode getModeForRequest(String mode) {
    if (mode == null)
      return Mode.LOGIN;
    if (mode.equals(MODE_REGISTRATION))
      return Mode.REGISTRATION;
    if (mode.equals(MODE_ADD_ACCOUNT))
      return Mode.ADD_ACCOUNT;
    return Mode.LOGIN;
  }

}
TOP

Related Classes of org.onebusaway.users.impl.CurrentUserServiceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.