/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * 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: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.view.internal.container; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; import org.eclipse.skalli.model.Member; import org.eclipse.skalli.model.PropertyName; import org.eclipse.skalli.model.User; import org.eclipse.skalli.services.user.UserService; import org.eclipse.skalli.services.user.UserServices; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.util.IndexedContainer; public class UserContainer extends IndexedContainer implements Serializable { private static final long serialVersionUID = 632503436661743735L; private static UserContainer container; @PropertyName(position = 0) public static final Object PROPERTY_USER = "user"; //$NON-NLS-1$ private UserContainer(Collection<User> users) { super(); addContainerProperty(User.PROPERTY_FIRSTNAME, String.class, null); addContainerProperty(User.PROPERTY_LASTNAME, String.class, null); addContainerProperty(User.PROPERTY_EMAIL, String.class, null); addContainerProperty(User.PROPERTY_DISPLAY_NAME, String.class, null); addContainerProperty(PROPERTY_USER, User.class, null); for (User user : users) { addItem(user); } } private Item addItem(User user) { String userId = user.getUserId(); Item item = getItem(userId); if (item == null) { item = addItem(user.getUserId()); // IndexedContainer#addItem return null, if entry already exists!!! } if (item != null) { item.getItemProperty(User.PROPERTY_FIRSTNAME).setValue(user.getFirstname()); item.getItemProperty(User.PROPERTY_LASTNAME).setValue(user.getLastname()); item.getItemProperty(User.PROPERTY_EMAIL).setValue(user.getEmail()); item.getItemProperty(User.PROPERTY_DISPLAY_NAME).setValue(user.getDisplayName()); item.getItemProperty(PROPERTY_USER).setValue(user); } return item; } public static synchronized UserContainer createWithData() { if (container == null) { List<User> users = Collections.emptyList(); UserService userService = UserServices.getUserService(); if (userService != null) { users = userService.getUsers(); } container = new UserContainer(users); } return container; } public static void refresh() { container = null; } public static User getUser(Object userId) { if (userId instanceof User) { return (User) userId; } Item item = null; if (userId instanceof Property) { Object value = ((Property) userId).getValue(); if (value == null) { return null; } item = searchAndAddUser(value.toString()); } else if (userId instanceof Member) { item = searchAndAddUser(((Member) userId).getUserID()); } else { item = searchAndAddUser(userId.toString()); } if (item != null) { User user = (User) item.getItemProperty(PROPERTY_USER).getValue(); return user; } return null; } public static List<User> findUsers(String searchText) { User user = getUser(searchText); if (user != null) { Collections.singletonList(user); } List<User> users = new ArrayList<User>(); List<Item> items = findAndAddUser(searchText); for (Item item : items) { users.add((User) item.getItemProperty(PROPERTY_USER).getValue()); } return users; } private static Item searchAndAddUser(String userId) { UserContainer container = UserContainer.createWithData(); Item item = container.getItem(userId); if (item == null) { User user = UserServices.getUser(userId.toString()); if (user != null) { item = container.addItem(user); } } return item; } private static List<Item> findAndAddUser(String searchText) { List<Item> items = new ArrayList<Item>(); UserService userService = UserServices.getUserService(); if (userService != null) { List<User> users = userService.findUser(searchText); if (users != null) { for (User user : users) { Item item = container.addItem(user); if (item != null) { items.add(item); } } } } return items; } public static Set<User> getUsers(Set<Member> members) { UserContainer container = UserContainer.createWithData(); Set<User> users = new TreeSet<User>(); Set<String> userIds = new HashSet<String>(); for (Member member : members) { Item item = container.getItem(member.getUserID()); if (item != null) { User user = (User) item.getItemProperty(PROPERTY_USER).getValue(); users.add(user); } else { userIds.add(member.getUserID()); } } if (userIds.size() > 0) { UserService userService = UserServices.getUserService(); if (userService != null) { Set<User> fetchedUsers = userService.getUsersById(userIds); for (User user : fetchedUsers) { container.addItem(user); } users.addAll(fetchedUsers); } else { for (String userId : userIds) { users.add(new User(userId)); } } } return users; } }