package org.gcube.portlets.user.socialprofile.client; import net.eliasbalasis.tibcopagebus4gwt.client.PageBusAdapter; import net.eliasbalasis.tibcopagebus4gwt.client.PageBusAdapterException; import net.eliasbalasis.tibcopagebus4gwt.testsubscriber.client.Person; import net.eliasbalasis.tibcopagebus4gwt.testsubscriber.client.PersonJsonizer; import org.gcube.social_networking.socialnetworking.model.client.GCubeSocialNetworking; import org.gcube.social_networking.socialnetworking.model.client.util.Encoder; import org.gcube.portlets.user.socialprofile.client.ui.DisplayProfile; import org.gcube.portlets.user.socialprofile.client.ui.DisplaySummary; import org.gcube.portlets.user.socialprofile.client.ui.ErrorAlert; import org.gcube.portlets.user.socialprofile.client.ui.OkAlert; import org.gcube.portlets.user.socialprofile.shared.UserContext; import org.jsonmaker.gwt.client.Jsonizer; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window.Location; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalPanel; /** * Entry point classes define onModuleLoad(). */ public class SocialProfile implements EntryPoint { private final SocialServiceAsync socialService = GWT.create(SocialService.class); private final PageBusAdapter pageBusAdapter = new PageBusAdapter(); private VerticalPanel mainPanel = new VerticalPanel(); private DisplayProfile dispProfile = new DisplayProfile(); private DisplaySummary summary = new DisplaySummary(); public void onModuleLoad() { // set main panel width mainPanel.setWidth("100%"); if (isUserAuthZFromLinkedIn()) { String authorizationCode = checkLinkedInAuthZ(); if (authorizationCode != null) { mainPanel.add(new OkAlert("Authorization OK! Please wait while we import from LinkedIn ... ", false)); socialService.fetchUserProfile(authorizationCode, DisplayProfile.getRedirectURI(), new AsyncCallback() { @Override public void onSuccess(String result) { if (result == null) { mainPanel.clear(); mainPanel.add(new ErrorAlert("Something went wrong while parsing your professional summary from LinkedIn, please report the issue.", true)); displayProfile(); } else { mainPanel.clear(); mainPanel.add(new OkAlert("Picture retrieved, please note that your professional summary could not due to recent changes in LinkedIn API. Please use Edit Profile Manually.", true)); displayProfile(); // //result contain the publicProfileLinkedInUrl // sendRefreshClientEvent(result); // // force refresh to reload updated content // setUrlBase(); } } @Override public void onFailure(Throwable caught) { mainPanel.clear(); mainPanel.add(new ErrorAlert("Something went wrong while communicating with LinkedIn service, please report us the issue.", true)); displayProfile(); } }); } } else { displayProfile(); } RootPanel.get("SocialProfileDiv").add(mainPanel); } protected void sendRefreshClientEvent(String inPublicProfileURL) { //create the Contact bean data Person person = new Person(); person.setName(inPublicProfileURL); // publish a message with Contact bean data try { pageBusAdapter.PageBusPublish("net.eliasbalasis.tibcopagebus4gwt.testsubscriber.client.Person", person, (Jsonizer)GWT.create(PersonJsonizer.class)); } catch (PageBusAdapterException e) { e.printStackTrace(); } } /** * display the profile of the user */ private void displayProfile() { socialService.getUserContext(getUserToShowId(true), new AsyncCallback() { @Override public void onSuccess(UserContext result) { mainPanel.add(dispProfile); dispProfile.show(result); if (result.getSummary() != null && result.getSummary().compareTo("") != 0) { summary.setSummary(result.getSummary()); } mainPanel.add(summary); dispProfile.setDisplaySummarySibling(summary); } @Override public void onFailure(Throwable caught) { mainPanel.add(dispProfile); // dispProfile.showError(caught.getMessage()); } }); } /** * Removes any get parameter (such as code, state) */ private void setUrlBase() { String baseUrl = Window.Location.getHref().split("\\?")[0]; GWT.log(baseUrl); Location.assign(baseUrl); } /** * * @return the token if everything goers ok, null otherwise */ private String checkLinkedInAuthZ() { if (Window.Location.getParameter("error") != null) { mainPanel.add(new ErrorAlert("it seems you denied our request to import your professional summary from LinkedIn.", true)); return null; } String code = Window.Location.getParameter("code"); String controlSequence = Window.Location.getParameter("state"); String cSeq2Compare = Cookies.getCookie(DisplayProfile.CONTROL_SEQUENCE_COOKIE); if (controlSequence.compareTo(cSeq2Compare) != 0) { mainPanel.add(new ErrorAlert("Something went wrong when importing your professional summary from LinkedIn, please try again.", true)); return null; } GWT.log("key="+code+" state="+controlSequence); GWT.log("state="+controlSequence); return code; } /** * decode the userid from the location param * @return the decoded (base64) userid */ public static String getUserToShowId(boolean decode) { String encodedOid = Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID); if (Window.Location.getParameter(encodedOid) == null) return null; String encodedUserId = Window.Location.getParameter(encodedOid); return decode ? Encoder.decode(encodedUserId) : encodedUserId; } /** * * @return true if the user has clicked import from LinkedIn */ private boolean isUserAuthZFromLinkedIn() { if (Window.Location.getParameter("error") != null || Window.Location.getParameter("code") != null) return true; return false; } }