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; private int itemCursorIndexStart = -1;
boolean handleNonCharKeys = false; boolean handleNonCharKeys = false;
private MultiWordSuggestOracle oracle = new UserOracle(); //by default we use the async version; private MultiWordSuggestOracle oracle;
private int displayIndexSelected; private int displayIndexSelected;
@ -66,6 +66,8 @@ public class PickItemsDialog extends PopupPanel {
private VerticalPanel mainPanel = new VerticalPanel(); private VerticalPanel mainPanel = new VerticalPanel();
private char triggerChar; private char triggerChar;
private ArrayList<ItemBean> beans; private ArrayList<ItemBean> beans;
private String context; //e.g. /gcube/devNext/NextNext
//needed because is selected when it popups //needed because is selected when it popups
private Widget first; 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 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 eventBus the event bus on where the widget will fire the selected user event
* @param widthInPixel the desired width (grater than 199 pixel) * @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) { public PickItemsDialog(char triggerChar, ArrayList<ItemBean> beans, final HandlerManager eventBus, int widthInPixel) {
this(triggerChar, eventBus, widthInPixel); this(triggerChar, eventBus, widthInPixel, null);
this.beans = beans; this.beans = beans;
oracle = new MultiWordSuggestOracle(); //not async version oracle = new MultiWordSuggestOracle(); //not async version
GWT.log("new constructor"); 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 * 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 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 eventBus the event bus on where the widget will fire the selected user event
* @param widthInPixel the desired width (grater than 199 pixel) * @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 context the context (VRE scope e.g. /gcube/devNext/NextNext) from where to load the users and groups
* @param includeTriggerChar true if your suggestions start with the trigger char (e.g. #anHashTag triggered by #) false otherwise
*/ */
public PickItemsDialog(char triggerChar, final HandlerManager eventBus, int widthInPixel) { public PickItemsDialog(char triggerChar, final HandlerManager eventBus, int widthInPixel, String context) {
super(true, false); super(true, false);
if (widthInPixel < 200) { if (widthInPixel < 200) {
throw new IllegalArgumentException("width must be greater than 199"); 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.eventBus = eventBus;
this.triggerChar = triggerChar; this.triggerChar = triggerChar;
this.includeTriggerChar = false; this.includeTriggerChar = false;
@ -167,7 +168,7 @@ public class PickItemsDialog extends PopupPanel {
//just used in devlopment //just used in devlopment
private List<ItemBean> getAllUsers() { private List<ItemBean> getAllUsers() {
List<ItemBean> toReturn = new ArrayList<>(); 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; return toReturn;
} }
/** /**

View File

@ -15,21 +15,20 @@ public class UserOracle extends MultiWordSuggestOracle{
private final PickItemServiceAsync pickuserService = GWT.create(PickItemService.class); private final PickItemServiceAsync pickuserService = GWT.create(PickItemService.class);
private List<ItemBean> contacts = new LinkedList<>(); private List<ItemBean> contacts = new LinkedList<>();
private String context;
public UserOracle(String context) {
this.context = context;
}
public void addContacts(List<ItemBean> users) { public void addContacts(List<ItemBean> users) {
contacts.addAll(users); contacts.addAll(users);
} }
public UserOracle() {
//((ServiceDefTarget) pickuserService).setServiceEntryPoint(Utils.getServiceEntryPoint());
}
@Override @Override
public void requestSuggestions(final Request request, final Callback callback) { public void requestSuggestions(final Request request, final Callback callback) {
GWT.log("UserOracl requestSuggestions");
final Response resp = new Response(); final Response resp = new Response();
if(contacts.isEmpty()){ if(contacts.isEmpty()){
GWT.log("callback.onSuggestionsReady");
callback.onSuggestionsReady(request, resp); callback.onSuggestionsReady(request, resp);
return; return;
} }
@ -37,8 +36,7 @@ public class UserOracle extends MultiWordSuggestOracle{
text = text.toLowerCase(); text = text.toLowerCase();
final List<UserSuggestion> list = new ArrayList<>(); final List<UserSuggestion> list = new ArrayList<>();
GWT.log("calling searchEntities ..." + text); pickuserService.searchEntities(text, context, new AsyncCallback<ArrayList<ItemBean>>() {
pickuserService.searchEntities(text, new AsyncCallback<ArrayList<ItemBean>>() {
@Override @Override
public void onFailure(Throwable arg0) { 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; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("pickItemServlet") @RemoteServiceRelativePath("pickItemServlet")
public interface PickItemService extends RemoteService { 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 { 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.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import org.gcube.portlets.widgets.pickitem.client.rpc.PickItemService; import org.gcube.portlets.widgets.pickitem.client.rpc.PickItemService;
import org.gcube.portlets.widgets.pickitem.shared.ItemBean; 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.UserManagementSystemException;
import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; 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.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.util.ManagementUtils; import org.gcube.vomanagement.usermanagement.util.ManagementUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -15,16 +19,18 @@ import org.slf4j.LoggerFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.liferay.portal.kernel.dao.orm.QueryUtil; 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.OrderByComparator;
import com.liferay.portal.kernel.util.OrderByComparatorFactoryUtil; import com.liferay.portal.kernel.util.OrderByComparatorFactoryUtil;
import com.liferay.portal.model.Team;
import com.liferay.portal.model.User; import com.liferay.portal.model.User;
import com.liferay.portal.service.TeamLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.service.UserLocalServiceUtil;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class PickItemServiceImpl extends RemoteServiceServlet implements PickItemService { public class PickItemServiceImpl extends RemoteServiceServlet implements PickItemService {
private static final Logger _log = LoggerFactory.getLogger(PickItemServiceImpl.class); 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 * @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; 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 @Override
public ArrayList<ItemBean> searchEntities(String keyword) { public ArrayList<ItemBean> searchEntities(String keyword, String context) {
ArrayList<ItemBean> toReturn = new ArrayList<>(); ArrayList<ItemBean> toReturn = new ArrayList<>();
if (isWithinPortal()) { if (isWithinPortal()) {
OrderByComparator comparator = OrderByComparatorFactoryUtil.create("User_", "screenname", true); OrderByComparator comparator = OrderByComparatorFactoryUtil.create("User_", "screenname", true);
try { LinkedHashMap<String, Object> params = new LinkedHashMap<>();
_log.debug("Searching " + keyword); long currentGroupId = getGroupIdFromContext(context);
List<User> lrUsers = UserLocalServiceUtil.search(ManagementUtils.getCompany().getCompanyId(), keyword, 0, null, QueryUtil.ALL_POS, QueryUtil.ALL_POS, comparator); params.put("usersGroups", currentGroupId);
for (User user : lrUsers) { 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()))); 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(); e.printStackTrace();
} }
} else { //development } else { //development
for (int i = 0; i < 10; i++) { 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) if (i % 2 == 0)
toReturn.add(new ItemBean(""+i, "username"+i, "userGetFullname()"+i, "user.getEmail()"+i)); toReturn.add(new ItemBean(""+i, "username"+i, "userGetFullname()"+i, "user.getEmail()"+i));
else else