package de.twenty11.skysail.server.ext.facebook.resources; import java.net.URL; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.restlet.data.Form; import org.restlet.data.Parameter; import org.restlet.resource.Get; import org.restlet.resource.ResourceException; import de.twenty11.skysail.common.responses.SkysailResponse; import de.twenty11.skysail.server.core.restlet.UniqueResultServerResource2; import de.twenty11.skysail.server.ext.facebook.FacebookApplication; import de.twenty11.skysail.server.ext.facebook.domain.FacebookUser; import de.twenty11.skysail.server.ext.facebook.links.LoginLink; import de.twenty11.skysail.server.ext.facebook.links.LogoutLink; import de.twenty11.skysail.server.ext.facebook.util.FacebookStringUtils; import de.twenty11.skysail.server.ext.facebook.util.LinkUtils; /** * A resource representing "me" as a facebook user. * * Handles login to facebook as well. * */ public class MeResource extends UniqueResultServerResource2<FacebookUser> { private ObjectMapper mapper = new ObjectMapper(); private String meOnFacebookUrl; private FacebookApplication facebookApp; private String currentUser; @Override protected void doInit() throws ResourceException { facebookApp = (FacebookApplication) getApplication(); currentUser = getRequest().getChallengeResponse().getIdentifier(); meOnFacebookUrl = "https://graph.facebook.com/1395451850"; getTokenInCaseOfLoginRequest(); } @Override @Get("html|json") public SkysailResponse<FacebookUser> getEntity() { registerLinkedPage(new LoginLink(facebookApp, currentUser)); registerLinkedPage(new LogoutLink(facebookApp, currentUser)); return getEntity("Me on Facebook"); } @Override protected FacebookUser getData() { JsonNode jsonRootNode; try { jsonRootNode = mapper.readTree(new URL(meOnFacebookUrl)); return new FacebookUser(jsonRootNode, facebookApp.getAccessToken(currentUser)); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } private void getTokenInCaseOfLoginRequest() { Parameter code = getRequest().getResourceRef().getQueryAsForm().getFirst("code"); if (code == null) { return; } if (code.getValue().equals("logout")) { facebookApp.logoutUser(currentUser); } else { String appSecret = facebookApp.getConfigForKey("facebookAppSecret"); String strContainingToken = LinkUtils.queryForFacebookAccessToken(code.getValue(), appSecret); if (strContainingToken != null) { String token = FacebookStringUtils.extractAccessTokenFromFbResponse(strContainingToken); if (token != null && currentUser != null) { facebookApp.setAccessToken(currentUser, token); } } } } @Override public FacebookUser getData(Form form) { // TODO Auto-generated method stub return null; } @Override public SkysailResponse<?> addEntity(FacebookUser entity) { // TODO Auto-generated method stub return null; } }