This commit is contained in:
Massimiliano Assante 2018-06-11 16:14:37 +00:00
parent bcc5f729ae
commit 7115d7675e
5 changed files with 58 additions and 31 deletions

View File

@ -58,7 +58,7 @@ public class PickItemsDialog extends PopupPanel {
private int itemCursorIndexStart = -1;
boolean handleNonCharKeys = false;
private MultiWordSuggestOracle oracle = new UserOracle(); //by default we use the async version;
private MultiWordSuggestOracle oracle;
private int displayIndexSelected;
@ -66,6 +66,8 @@ public class PickItemsDialog extends PopupPanel {
private VerticalPanel mainPanel = new VerticalPanel();
private char triggerChar;
private ArrayList<ItemBean> beans;
private String context; //e.g. /gcube/devNext/NextNext
//needed because is selected when it popups
private Widget first;
@ -80,14 +82,12 @@ public class PickItemsDialog extends PopupPanel {
/**
* @param triggerChar the 'single char' used to trigger the items list show, e.g. '@', '#' ....
* @param the list of user to pick
* @param the list of user to pick as {@link ArrayList} of {@link ItemBean}
* @param eventBus the event bus on where the widget will fire the selected user event
* @param widthInPixel the desired width (grater than 199 pixel)
* @param hasPhoto tell of you have want to show photo for the item or not
* @param includeTriggerChar true if your suggestions start with the trigger char (e.g. #anHashTag triggered by #) false otherwise
*/
public PickItemsDialog(char triggerChar, ArrayList<ItemBean> beans, final HandlerManager eventBus, int widthInPixel) {
this(triggerChar, eventBus, widthInPixel);
this(triggerChar, eventBus, widthInPixel, null);
this.beans = beans;
oracle = new MultiWordSuggestOracle(); //not async version
GWT.log("new constructor");
@ -103,19 +103,20 @@ public class PickItemsDialog extends PopupPanel {
}
/**
* Use this constructor for users, the list of the users is automatically loaded form the VRE members if in a VRE or from the union of the current's user VRE members if at root level
* Use this constructor for users, the list of the users is automatically loaded from the VRE passed in the context param
* Note that you must declare the pick item widget servlet in this case
* @param triggerChar the 'single char' used to trigger the items list show, e.g. '@', '#' ....
* @param eventBus the event bus on where the widget will fire the selected user event
* @param widthInPixel the desired width (grater than 199 pixel)
* @param hasPhoto tell of you have want to show photo for the item or not
* @param includeTriggerChar true if your suggestions start with the trigger char (e.g. #anHashTag triggered by #) false otherwise
* @param context the context (VRE scope e.g. /gcube/devNext/NextNext) from where to load the users and groups
*/
public PickItemsDialog(char triggerChar, final HandlerManager eventBus, int widthInPixel) {
public PickItemsDialog(char triggerChar, final HandlerManager eventBus, int widthInPixel, String context) {
super(true, false);
if (widthInPixel < 200) {
throw new IllegalArgumentException("width must be greater than 199");
}
this.context = context;
oracle = new UserOracle(context); //by default we use the async version;
this.eventBus = eventBus;
this.triggerChar = triggerChar;
this.includeTriggerChar = false;
@ -167,7 +168,7 @@ public class PickItemsDialog extends PopupPanel {
//just used in devlopment
private List<ItemBean> getAllUsers() {
List<ItemBean> toReturn = new ArrayList<>();
toReturn.add(new ItemBean("andrea.rossi", "andrea.rossi", "Andrea Rossi", "m.assante@gmail.com"));
toReturn.add(new ItemBean("id", "username", "Andrea Rossi Dev", "email"));
return toReturn;
}
/**

View File

@ -15,21 +15,20 @@ public class UserOracle extends MultiWordSuggestOracle{
private final PickItemServiceAsync pickuserService = GWT.create(PickItemService.class);
private List<ItemBean> contacts = new LinkedList<>();
private String context;
public UserOracle(String context) {
this.context = context;
}
public void addContacts(List<ItemBean> users) {
contacts.addAll(users);
}
public UserOracle() {
//((ServiceDefTarget) pickuserService).setServiceEntryPoint(Utils.getServiceEntryPoint());
}
@Override
public void requestSuggestions(final Request request, final Callback callback) {
GWT.log("UserOracl requestSuggestions");
final Response resp = new Response();
if(contacts.isEmpty()){
GWT.log("callback.onSuggestionsReady");
callback.onSuggestionsReady(request, resp);
return;
}
@ -37,8 +36,7 @@ public class UserOracle extends MultiWordSuggestOracle{
text = text.toLowerCase();
final List<UserSuggestion> list = new ArrayList<>();
GWT.log("calling searchEntities ..." + text);
pickuserService.searchEntities(text, new AsyncCallback<ArrayList<ItemBean>>() {
pickuserService.searchEntities(text, context, new AsyncCallback<ArrayList<ItemBean>>() {
@Override
public void onFailure(Throwable arg0) {

View File

@ -8,5 +8,5 @@ import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("pickItemServlet")
public interface PickItemService extends RemoteService {
ArrayList<ItemBean> searchEntities(String keyword);
ArrayList<ItemBean> searchEntities(String keyword, String vreContext);
}

View File

@ -8,6 +8,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
public interface PickItemServiceAsync {
void searchEntities(String keyword, AsyncCallback<ArrayList<ItemBean>> callback);
void searchEntities(String keyword, String vreContext, AsyncCallback<ArrayList<ItemBean>> callback);
}

View File

@ -2,12 +2,16 @@ package org.gcube.portlets.widgets.pickitem.server;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import org.gcube.portlets.widgets.pickitem.client.rpc.PickItemService;
import org.gcube.portlets.widgets.pickitem.shared.ItemBean;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.util.ManagementUtils;
import org.slf4j.Logger;
@ -15,16 +19,18 @@ import org.slf4j.LoggerFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.OrderByComparatorFactoryUtil;
import com.liferay.portal.model.Team;
import com.liferay.portal.model.User;
import com.liferay.portal.service.TeamLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil;
@SuppressWarnings("serial")
public class PickItemServiceImpl extends RemoteServiceServlet implements PickItemService {
private static final Logger _log = LoggerFactory.getLogger(PickItemServiceImpl.class);
//this map is used as cache containing the association between a context and a GroupId so that we don't ask everytime.
private static HashMap<String, Long> contextToGroupIdMap = new HashMap<>();
/**
*
* @return true if you're running into the portal, false if in development
@ -39,25 +45,47 @@ public class PickItemServiceImpl extends RemoteServiceServlet implements PickIte
return false;
}
}
//TODO: Questo metodo lunedì va modificato per fargli cercare non tutti gli utenti ma dipdende dallo scope i VRE Members oppure l'unione se è root, e poi vanno gestiti i gruppi stessa cosa.
//anzi dovresti farti passare come parametro la VRE dove è stato postato il post allora sarebbe semplicissimo, niente union non serve
private long getGroupIdFromContext(String context) {
if (contextToGroupIdMap.containsKey(context))
return contextToGroupIdMap.get(context);
try {
long groupId = new LiferayGroupManager().getGroupIdFromInfrastructureScope(context);
contextToGroupIdMap.put(context, new Long(groupId));
return groupId;
} catch (IllegalArgumentException | UserManagementSystemException | GroupRetrievalFault e) {
e.printStackTrace();
}
return -1;
}
@Override
public ArrayList<ItemBean> searchEntities(String keyword) {
public ArrayList<ItemBean> searchEntities(String keyword, String context) {
ArrayList<ItemBean> toReturn = new ArrayList<>();
if (isWithinPortal()) {
OrderByComparator comparator = OrderByComparatorFactoryUtil.create("User_", "screenname", true);
try {
_log.debug("Searching " + keyword);
List<User> lrUsers = UserLocalServiceUtil.search(ManagementUtils.getCompany().getCompanyId(), keyword, 0, null, QueryUtil.ALL_POS, QueryUtil.ALL_POS, comparator);
for (User user : lrUsers) {
LinkedHashMap<String, Object> params = new LinkedHashMap<>();
long currentGroupId = getGroupIdFromContext(context);
params.put("usersGroups", currentGroupId);
try {
_log.debug("Searching " + keyword + " on " + context);
List<User> usersByGroup = UserLocalServiceUtil.search(
ManagementUtils.getCompany().getCompanyId(), keyword, 0, params, QueryUtil.ALL_POS, QueryUtil.ALL_POS, comparator);
for (User user : usersByGroup) {
toReturn.add(new ItemBean(""+user.getUserId(), user.getScreenName(), user.getFullName(), getUserImagePortraitUrlLocal(user.getScreenName())));
}
} catch (SystemException | PortalException e) {
OrderByComparator teamComparator = OrderByComparatorFactoryUtil.create("team", "name", true);
List<Team> teams = TeamLocalServiceUtil.search(currentGroupId, keyword, "", null, QueryUtil.ALL_POS, QueryUtil.ALL_POS, teamComparator);
for (Team team : teams) {
toReturn.add(new ItemBean(team.getTeamId()+"", team.getName()));
}
} catch (Exception e) {
e.printStackTrace();
}
} else { //development
for (int i = 0; i < 10; i++) {
toReturn.add(new ItemBean("andrea.rossi", "andrea.rossi", "Andrea Rossi", "m.assante@gmail.com"));
toReturn.add(new ItemBean("id", "andrea.rossi", "Andrea Rossi", "email"));
if (i % 2 == 0)
toReturn.add(new ItemBean(""+i, "username"+i, "userGetFullname()"+i, "user.getEmail()"+i));
else