/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.local; import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.user.server.dao.UserDao; import org.eclipse.che.api.user.server.dao.User; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @Singleton public class LocalUserDaoImpl implements UserDao { private final List<User> users; private final ReadWriteLock lock; @Inject public LocalUserDaoImpl(@Named("codenvy.local.infrastructure.users") Set<User> users) { this.users = new LinkedList<>(); lock = new ReentrantReadWriteLock(); try { for (User user : users) { create(user); } } catch (Exception e) { // fail if can't validate this instance properly throw new RuntimeException(e); } } @Override public boolean authenticate(String alias, String password) throws NotFoundException { lock.readLock().lock(); try { User myUser = null; for (int i = 0, size = users.size(); i < size && myUser == null; i++) { if (users.get(i).getAliases().contains(alias)) { myUser = users.get(i); } } if (myUser == null) { throw new NotFoundException(String.format("User not found %s", alias)); } return password.equals(myUser.getPassword()); } finally { lock.readLock().unlock(); } } @Override public void create(User user) throws ConflictException { lock.writeLock().lock(); try { final String userId = user.getId(); final Set<String> aliases = new HashSet<>(user.getAliases()); for (User u : users) { if (u.getId().equals(userId)) { throw new ConflictException( String.format("Unable create new user '%s'. User id %s is already in use.", user.getEmail(), userId)); } for (String alias : u.getAliases()) { if (aliases.contains(alias)) { throw new ConflictException( String.format("Unable create new user '%s'. User alias %s is already in use.", user.getEmail(), alias)); } } } users.add(doClone(user)); } finally { lock.writeLock().unlock(); } } @Override public void update(User user) throws NotFoundException { lock.writeLock().lock(); try { User myUser = null; for (int i = 0, size = users.size(); i < size && myUser == null; i++) { if (users.get(i).getId().equals(user.getId())) { myUser = users.get(i); } } if (myUser == null) { throw new NotFoundException(String.format("User not found %s", user.getId())); } myUser.getAliases().clear(); myUser.getAliases().addAll(user.getAliases()); myUser.setEmail(user.getEmail()); myUser.setPassword(user.getPassword()); } finally { lock.writeLock().unlock(); } } @Override public void remove(String id) throws NotFoundException { lock.writeLock().lock(); try { User myUser = null; for (int i = 0, size = users.size(); i < size && myUser == null; i++) { if (users.get(i).getId().equals(id)) { myUser = users.get(i); } } if (myUser == null) { throw new NotFoundException(String.format("User not found %s", id)); } users.remove(myUser); } finally { lock.writeLock().unlock(); } } @Override public User getByAlias(String alias) throws NotFoundException { lock.readLock().lock(); try { User user = null; for (int i = 0, size = users.size(); i < size && user == null; i++) { if (users.get(i).getAliases().contains(alias)) { user = users.get(i); } } if (user == null) { throw new NotFoundException(String.format("User not found %s", alias)); } return doClone(user); } finally { lock.readLock().unlock(); } } @Override public User getById(String id) throws NotFoundException { lock.readLock().lock(); try { User user = null; for (int i = 0, size = users.size(); i < size && user == null; i++) { if (users.get(i).getId().equals(id)) { user = users.get(i); } } if (user == null) { throw new NotFoundException(String.format("User not found %s", id)); } return doClone(user); } finally { lock.readLock().unlock(); } } private User doClone(User user) { return new User().withId(user.getId()) .withEmail(user.getEmail()) .withPassword(user.getPassword()) .withAliases(new ArrayList<>(user.getAliases())); } }