r6985 - in dumbhippo/trunk/server: src/com/dumbhippo/persistence src/com/dumbhippo/server src/com/dumbhippo/server/impl src/com/dumbhippo/web/servlets web/javascript/dh



Author: marinaz
Date: 2007-12-06 18:55:37 -0600 (Thu, 06 Dec 2007)
New Revision: 6985

Modified:
   dumbhippo/trunk/server/src/com/dumbhippo/persistence/ExternalAccountType.java
   dumbhippo/trunk/server/src/com/dumbhippo/server/HttpMethods.java
   dumbhippo/trunk/server/src/com/dumbhippo/server/impl/HttpMethodsBean.java
   dumbhippo/trunk/server/src/com/dumbhippo/web/servlets/FacebookServlet.java
   dumbhippo/trunk/server/web/javascript/dh/account.js
Log:
Set account information based on what is submitted in the form from Mugshot application page on Facebook.

Change names of all http methods for setting external accounts to end uniformly with
"Account" instead of "Name", "Url", "Profile", etc. (This allows me to use Method.invoke()
to call them without too many cases.)

Modified: dumbhippo/trunk/server/src/com/dumbhippo/persistence/ExternalAccountType.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/persistence/ExternalAccountType.java	2007-12-06 23:37:29 UTC (rev 6984)
+++ dumbhippo/trunk/server/src/com/dumbhippo/persistence/ExternalAccountType.java	2007-12-07 00:55:37 UTC (rev 6985)
@@ -549,7 +549,7 @@
 	LASTFM("Last.fm")  { // 10
 		@Override
 		public String getDomNodeIdName() {
-			return "Lastfm";
+			return "LastFm";
 		}
 		
 		@Override
@@ -1001,13 +1001,8 @@
 			return "http://www.google.com/reader/view";;
 		}
 	},
-	PICASA("Picasa") { // 17
+	PICASA("Picasa") { // 17		
 		@Override
-		public String getDomNodeIdName() {
-			return "Picasa";
-		}
-		
-		@Override
 		public String getIconName() {
 			return "favicon_picasa.png";
 		}
@@ -1078,13 +1073,8 @@
 			return ExternalAccountCategory.MEDIA;
 		}
 	},
-	AMAZON("Amazon") { // 18
+	AMAZON("Amazon") { // 18	
 		@Override
-		public String getDomNodeIdName() {
-			return "Amazon";
-		}
-		
-		@Override
 		public String getIconName() {
 			return "favicon_amazon.png";
 		}

Modified: dumbhippo/trunk/server/src/com/dumbhippo/server/HttpMethods.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/server/HttpMethods.java	2007-12-06 23:37:29 UTC (rev 6984)
+++ dumbhippo/trunk/server/src/com/dumbhippo/server/HttpMethods.java	2007-12-07 00:55:37 UTC (rev 6985)
@@ -345,63 +345,63 @@
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "name" })
-	public void doSetMySpaceName(XmlBuilder xml, UserViewpoint viewpoint, String name) throws XmlMethodException, RetryException;	
+	public void doSetMySpaceAccount(XmlBuilder xml, UserViewpoint viewpoint, String name) throws XmlMethodException, RetryException;	
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })
-	public void doSetLinkedInProfile(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;
+	public void doSetLinkedInAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })
-	public void doSetYouTubeName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;
+	public void doSetYouTubeAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })	
-	public void doSetLastFmName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;	
+	public void doSetLastFmAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException;	
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })	
-	public void doSetDeliciousName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;	
+	public void doSetDeliciousAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;	
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })	
-	public void doSetTwitterName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;	
+	public void doSetTwitterAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;	
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })	
-	public void doSetDiggName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
+	public void doSetDiggAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })	
-	public void doSetRedditName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
+	public void doSetRedditAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "url" })
-	public void doSetNetflixFeedUrl(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;
+	public void doSetNetflixAccount(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "url" })
-	public void doSetGoogleReaderUrl(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;	
+	public void doSetGoogleReaderAccount(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;	
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrName" })
-	public void doSetPicasaName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
+	public void doSetPicasaAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException;
 
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "urlOrUserId" })
-	public void doSetAmazonUrl(XmlBuilder xml, UserViewpoint viewpoint, String urlOrUserId) throws XmlMethodException;
+	public void doSetAmazonAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrUserId) throws XmlMethodException;
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "url" })
-	public void doSetWebsite(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException;
+	public void doSetWebsiteAccount(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException;
 	
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "url" })
-	public void doSetRhapsodyHistoryFeed(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;
+	public void doSetRhapsodyAccount(XmlBuilder xml, UserViewpoint viewpoint, String url) throws XmlMethodException, RetryException;
     
 	@HttpContentTypes(HttpResponseData.XMLMETHOD)
 	@HttpParams( { "url" })
-	public void doSetBlog(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException, RetryException;	
+	public void doSetBlogAccount(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException, RetryException;	
 	
  	@HttpContentTypes(HttpResponseData.XMLMETHOD)
  	@HttpParams( { "filename" })

Modified: dumbhippo/trunk/server/src/com/dumbhippo/server/impl/HttpMethodsBean.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/server/impl/HttpMethodsBean.java	2007-12-06 23:37:29 UTC (rev 6984)
+++ dumbhippo/trunk/server/src/com/dumbhippo/server/impl/HttpMethodsBean.java	2007-12-07 00:55:37 UTC (rev 6985)
@@ -1493,7 +1493,7 @@
 		feedSystem.removeGroupFeed(viewpoint.getViewer(), group, feed);		
 	}
 
-	public void doSetRhapsodyHistoryFeed(XmlBuilder xml, UserViewpoint viewpoint, String urlOrIdStr) throws XmlMethodException, RetryException {
+	public void doSetRhapsodyAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrIdStr) throws XmlMethodException, RetryException {
 		String urlOrId = urlOrIdStr.trim();
 
 		String rhapUserId = StringUtils.findParamValueInUrl(urlOrId, "rhapUserId");		
@@ -1527,7 +1527,7 @@
 		feed.getAccounts().add(external);
 	}
 	
-	public void doSetNetflixFeedUrl(XmlBuilder xml, UserViewpoint viewpoint, String urlOrIdStr) throws XmlMethodException, RetryException {
+	public void doSetNetflixAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrIdStr) throws XmlMethodException, RetryException {
 		String urlOrId = urlOrIdStr.trim();
 
 		String netflixUserId = StringUtils.findParamValueInUrl(urlOrId, "id");		
@@ -1632,7 +1632,7 @@
 		externalAccountSystem.setSentiment(external, Sentiment.LOVE);
 	}
 	
-	public void doSetMySpaceName(XmlBuilder xml, UserViewpoint viewpoint, String name) throws XmlMethodException, RetryException {
+	public void doSetMySpaceAccount(XmlBuilder xml, UserViewpoint viewpoint, String name) throws XmlMethodException, RetryException {
 		ExternalAccount external = externalAccountSystem.getOrCreateExternalAccount(viewpoint, ExternalAccountType.MYSPACE);		
 		String friendId;		
 		boolean isPrivate;
@@ -1672,7 +1672,7 @@
 		}	
 	}
 
-	public void doSetYouTubeName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
+	public void doSetYouTubeAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
 		// Try to pull youtube name out of either a youtube profile url ("http://www.youtube.com/user/$username"; || "http://www.youtube.com/profile?user=$username";) or 
 		// just try using the thing as a username directly
 		String name = urlOrName.trim();
@@ -1699,7 +1699,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}
 	
-	public void doSetLastFmName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
+	public void doSetLastFmAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
 		String name = urlOrName.trim();
 		String found = StringUtils.findPathElementAfter(name, "/user/");
 		if (found != null)
@@ -1726,7 +1726,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}	
 	
-	public void doSetDeliciousName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
+	public void doSetDeliciousAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
 		String name = urlOrName.trim();
 		// del.icio.us urls are just "http://del.icio.us/myusername";
 		
@@ -1759,7 +1759,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}
 	
-	public void doSetTwitterName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
+	public void doSetTwitterAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
 		String name = urlOrName.trim();
 		
 		// Twitter urls are just "http://twitter.com/myusername";
@@ -1809,7 +1809,7 @@
 	    }
 	}
 
-	public void doSetDiggName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
+	public void doSetDiggAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
 		String name = urlOrName.trim();
 		
 		// Digg urls are "http://digg.com/users/myusername/stuff";
@@ -1843,7 +1843,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}
 
-	public void doSetRedditName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
+	public void doSetRedditAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
 		String name = urlOrName.trim();
 
 		// Reddit urls are "http://reddit.com/user/myusername";
@@ -1909,7 +1909,7 @@
 	    }
 	}
 	
-	public void doSetLinkedInProfile(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
+	public void doSetLinkedInAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException {
 		// Try to pull linked in name out of either a linked in profile url ("http://www.linkedin.com/in/username";) or 
 		// just try using the thing as a username directly
 		String name = urlOrName.trim();
@@ -1933,7 +1933,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}
 
-	public void doSetPicasaName(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
+	public void doSetPicasaAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrName) throws XmlMethodException, RetryException {
 		String name = urlOrName.trim();
 		
 		// Picasa public urls are http://picasaweb.google.com/username
@@ -1971,7 +1971,7 @@
 		xml.appendTextNode("username", external.getHandle());
 	}
 	
-	public void doSetAmazonUrl(XmlBuilder xml, UserViewpoint viewpoint, String urlOrUserIdStr) throws XmlMethodException {		
+	public void doSetAmazonAccount(XmlBuilder xml, UserViewpoint viewpoint, String urlOrUserIdStr) throws XmlMethodException {		
 		String urlOrUserId = urlOrUserIdStr.trim();
 
 		String amazonUserId = StringUtils.findPathElementAfter(urlOrUserId, "/profile/");
@@ -2022,7 +2022,7 @@
 		xml.closeElement();
 	}
 	
-	public void doSetWebsite(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException {
+	public void doSetWebsiteAccount(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException {
 		// DO NOT cut and paste this block into similar external account methods. It's only here because
 		// we don't use the "love hate" widget on /account for the website, and the javascript glue 
 		// for the plain entries assumes this works.
@@ -2050,7 +2050,7 @@
 		externalAccountSystem.setSentiment(external, Sentiment.LOVE);
 	}
 
-	public void doSetBlog(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException, RetryException {
+	public void doSetBlogAccount(XmlBuilder xml, UserViewpoint viewpoint, URL url) throws XmlMethodException, RetryException {
 		
 		// DO NOT cut and paste this block into similar external account methods. It's only here because
 		// we don't use the "love hate" widget on /account for the website, and the javascript glue 
@@ -2084,7 +2084,7 @@
 		feed.getAccounts().add(external);
 	}
 	
-	public void doSetGoogleReaderUrl(XmlBuilder xml, UserViewpoint viewpoint, String feedOrPageUrl) throws XmlMethodException, RetryException {
+	public void doSetGoogleReaderAccount(XmlBuilder xml, UserViewpoint viewpoint, String feedOrPageUrl) throws XmlMethodException, RetryException {
 		feedOrPageUrl = feedOrPageUrl.trim();
 		
 		if (feedOrPageUrl.startsWith("https://";))

Modified: dumbhippo/trunk/server/src/com/dumbhippo/web/servlets/FacebookServlet.java
===================================================================
--- dumbhippo/trunk/server/src/com/dumbhippo/web/servlets/FacebookServlet.java	2007-12-06 23:37:29 UTC (rev 6984)
+++ dumbhippo/trunk/server/src/com/dumbhippo/web/servlets/FacebookServlet.java	2007-12-07 00:55:37 UTC (rev 6985)
@@ -1,15 +1,26 @@
 package com.dumbhippo.web.servlets;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
 
 import org.slf4j.Logger;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
 
 import com.dumbhippo.ExternalAccountCategory;
 import com.dumbhippo.GlobalSetup;
@@ -17,15 +28,18 @@
 import com.dumbhippo.XmlBuilder;
 import com.dumbhippo.persistence.ExternalAccount;
 import com.dumbhippo.persistence.ExternalAccountType;
+import com.dumbhippo.persistence.Sentiment;
 import com.dumbhippo.persistence.User;
 import com.dumbhippo.server.Configuration;
 import com.dumbhippo.server.ExternalAccountSystem;
 import com.dumbhippo.server.FacebookSystemException;
 import com.dumbhippo.server.FacebookTracker;
 import com.dumbhippo.server.HippoProperty;
+import com.dumbhippo.server.HttpMethods;
 import com.dumbhippo.server.HumanVisibleException;
 import com.dumbhippo.server.IdentitySpider;
 import com.dumbhippo.server.NotFoundException;
+import com.dumbhippo.server.XmlMethodException;
 import com.dumbhippo.server.Configuration.PropertyNotFoundException;
 import com.dumbhippo.server.views.ExternalAccountView;
 import com.dumbhippo.server.views.SystemViewpoint;
@@ -73,6 +87,7 @@
 		
 		String errorMessage = null;
 		User user = null;
+		UserViewpoint userViewpoint = null;
 		if (secret == null) {
 			errorMessage = "We could not verify Facebook information due to a missing secret key we should share with Facebook.";   
 			logger.warn("Facebook secret is not set, can't verify requests from Facebook.");
@@ -89,15 +104,19 @@
 	        	    user = identitySpider.lookupUserByFacebookUserId(SystemViewpoint.getInstance(), facebookUserId);
 			        if (user != null) {
 	    	            try {
-	    	            FacebookTracker facebookTracker = WebEJBUtil.defaultLookup(FacebookTracker.class);
-	    	        	// TODO: can change this into updateExistingFacebookAccount
-	    	            facebookTracker.updateOrCreateFacebookAccount(new UserViewpoint(user, Site.MUGSHOT), sessionKey, facebookUserId, true);
+		    	            FacebookTracker facebookTracker = WebEJBUtil.defaultLookup(FacebookTracker.class);
+		    	            userViewpoint = new UserViewpoint(user, Site.MUGSHOT);
+		    	        	// TODO: can change this into updateExistingFacebookAccount
+		    	            facebookTracker.updateOrCreateFacebookAccount(userViewpoint, sessionKey, facebookUserId, true);		    	            
 	    	            } catch (FacebookSystemException e) {
 	                        errorMessage = e.getMessage();		
 	    	            }
+			        } else {
+			        	// TODO: create FacebookResource based on the facebookUserId and a user that is claiming this resource
 			        }
 		        } catch (NotFoundException e) {
-		        	//nothing to do
+		        	// nothing to do
+		        	// TODO: check in which case NotFoundException is thrown as opposed to the user being null
 		        }
 	        }
 		}
@@ -110,6 +129,77 @@
         xml.appendTextNode("div", "Mugshot allows you and your friends to see your activity from lots of other sites on the internet and automatically puts that in your profile and news feed.",
                            "style", "margin-left:45px; margin-bottom:10px;");
 		if (user != null && errorMessage == null) {
+			// check if there are mugshot params, process them, and display an appropriate message
+	        @SuppressWarnings("unchecked")
+	        Map<ExternalAccountType, CharSequence> mugshotParams = extractMugshotParamsFromArray(request.getParameterMap());
+	        ExternalAccountSystem externalAccounts = WebEJBUtil.defaultLookup(ExternalAccountSystem.class);
+	        HttpMethods httpMethods =  WebEJBUtil.defaultLookup(HttpMethods.class);
+    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    		factory.setNamespaceAware(true);
+	        for (Map.Entry<ExternalAccountType, CharSequence> entry : mugshotParams.entrySet()) {          
+	        	String entryValue = entry.getValue().toString().trim(); 
+			    if (entryValue.length() > 0) {
+			    	try {
+			    		// we could check if the account already exists that has the same info set and is loved,
+			    		// but since we might be updating certain things when the user resets the info (like looking up
+			    		// all Amazon wish lists again), let's just reset all the accounts		
+			    		// if it seems too slow for a user who has a lot of accounts and is just changing one, 
+			    		// we can change this
+				    	if (entry.getKey().equals(ExternalAccountType.FLICKR)) {
+				    		XmlBuilder xmlForFlickr = new XmlBuilder();
+				    		httpMethods.doFindFlickrAccount(xmlForFlickr, userViewpoint, entryValue);
+				    		Document doc = factory.newDocumentBuilder().parse(xmlForFlickr.toString());
+				    		XPath xpath = XPathFactory.newInstance().newXPath();
+				    		String nsid = xpath.evaluate("/flickrUser/nsid", doc, XPathConstants.NODE).toString();
+				    		logger.debug("Got nsid {} when setting Flickr account", nsid);
+				    		httpMethods.doSetFlickrAccount(new XmlBuilder(), userViewpoint, nsid, entryValue);
+				    	} else {
+				    		Method setAccount = httpMethods.getClass().getMethod("doSet" + entry.getKey().getDomNodeIdName() + "Account");	
+				    		XmlBuilder resultXml = new XmlBuilder();
+				    		setAccount.invoke(resultXml, userViewpoint, entryValue);
+				    		// we have messages telling the user about certain limitations of their account
+				    		// for MySpace, Twitter, Reddit, and Amazon
+				    		try {
+				    		    Document doc = factory.newDocumentBuilder().parse(resultXml.toString());
+				    		    XPath xpath = XPathFactory.newInstance().newXPath();
+				    		    String message = xpath.evaluate("/message", doc, XPathConstants.NODE).toString();
+				    		    if (message.trim().length() > 0) {
+				    		    	// TODO: display it as a message
+				    		    }
+				    		} catch (XPathExpressionException e) {
+					        	// that's fine, means there was no message
+					        }
+				    	}
+			    	} catch (XmlMethodException e) {
+			    		// TODO: create a return error message with all the exceptions			    		
+			    	} catch (ParserConfigurationException e) {
+				        // TODO: same as above
+			        } catch (SAXException e) {
+			        	// TODO: same as above
+			        } catch (XPathExpressionException e) {
+			        	// TODO: same as above
+			        } catch (NoSuchMethodException e) {
+			        	// TODO: same as above
+			        } catch (InvocationTargetException e) {
+			        	// TODO: same as above
+			        } catch (IllegalAccessException e) {
+			        	// TODO: same as above
+			        }
+			    } else {
+			    	try {
+			    	    // do not unset "hate" because we don't have that concept on Facebook application page
+			    		// interface, so "hated" accounts are not populated with values to begin with; only unset "love"
+			    	    ExternalAccount externalAccount = externalAccounts.lookupExternalAccount(userViewpoint, user, entry.getKey());
+			    	    if (externalAccount.getSentiment().equals(Sentiment.LOVE)) {
+			    	    	externalAccounts.setSentiment(externalAccount, Sentiment.INDIFFERENT);
+			    	    }
+			    	} catch (NotFoundException e) {
+			    		// this account did not exist, nothing to do
+			    	}
+			    }
+		    	
+		    }
+						
 			xml.appendTextNode("span", "Updates to the information below will be reflected in ",
 					           "style", "margin-left:15px;");
 		    xml.appendTextNode("a", "your Mugshot account", "href",
@@ -121,15 +211,15 @@
 		    	if (currentCategory == null || !currentCategory.equals(externalAccount.getExternalAccountType().getCategory())) {
 				    currentCategory = externalAccount.getExternalAccountType().getCategory();
 		    		xml.openElement("fb:editor-custom");
-				    xml.appendTextNode("h3", currentCategory.getCategoryName(), "style", "margin-left:-185px;" );		    	
+				    xml.appendTextNode("h3", currentCategory.getCategoryName(), "style", "margin-left:-225px;" );		    	
 				    xml.closeElement();
 		    	}
 			    xml.openElement("fb:editor-custom", "label", externalAccount.getSiteName());
 			    
 			    if (externalAccount.getExternalAccount() != null && externalAccount.getExternalAccount().isLovedAndEnabled()) {
-			        xml.appendEmptyNode("input", "name", externalAccount.getDomNodeIdName(), "value", externalAccount.getExternalAccount().getAccountInfo());
+			        xml.appendEmptyNode("input", "name", "mugshot_" + externalAccount.getExternalAccountType().name(), "value", externalAccount.getExternalAccount().getAccountInfo());
 			    } else {
-			    	xml.appendEmptyNode("input", "name", externalAccount.getDomNodeIdName());
+			    	xml.appendEmptyNode("input", "name", "mugshot_" + externalAccount.getExternalAccountType().name());
 			    }
 			    xml.appendEmptyNode("br");
 			    
@@ -225,4 +315,20 @@
 	protected boolean requiresTransaction(HttpServletRequest request) {
 		return true;
 	}
+	
+	private static Map<ExternalAccountType, CharSequence> extractMugshotParamsFromArray(Map<CharSequence, CharSequence[]> reqParams) {
+	    if (null == reqParams)
+	        return null;
+	    String mugshotParamPart = "mugshot_";
+	    Map<ExternalAccountType, CharSequence> result = new HashMap<ExternalAccountType, CharSequence>(reqParams.size());
+	    for (Map.Entry<CharSequence, CharSequence[]> entry : reqParams.entrySet()) {
+	        String key = entry.getKey().toString();
+	        if (key.startsWith(mugshotParamPart)) {
+	          // we want to preserve the parameter even if entry.getValue()[0] is empty, because that might mean we want to
+	          // unset the external account information
+	          result.put(ExternalAccountType.valueOf(key.substring(mugshotParamPart.length())), entry.getValue()[0]);
+	        }  
+	    }
+	    return result;
+	}    
 }

Modified: dumbhippo/trunk/server/web/javascript/dh/account.js
===================================================================
--- dumbhippo/trunk/server/web/javascript/dh/account.js	2007-12-06 23:37:29 UTC (rev 6984)
+++ dumbhippo/trunk/server/web/javascript/dh/account.js	2007-12-07 00:55:37 UTC (rev 6985)
@@ -190,69 +190,69 @@
 				     	loadFunc, errorFunc);
 }
 dh.account.setLinkedInProfile = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setlinkedinprofile",
+   	dh.server.doXmlMethod("setlinkedinaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setMyspaceName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setmyspacename",
+   	dh.server.doXmlMethod("setmyspaceaccount",
 				     { "name" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setYouTubeName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setyoutubename",
+   	dh.server.doXmlMethod("setyoutubeaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setLastFmName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setlastfmname",
+   	dh.server.doXmlMethod("setlastfmaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setDeliciousName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setdeliciousname",
+   	dh.server.doXmlMethod("setdeliciousaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setTwitterName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("settwittername",
+   	dh.server.doXmlMethod("settwitteraccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setDiggName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setdiggname",
+   	dh.server.doXmlMethod("setdiggaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setRedditName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setredditname",
+   	dh.server.doXmlMethod("setredditaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 dh.account.setRhapsodyUrl = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setrhapsodyhistoryfeed",
+   	dh.server.doXmlMethod("setrhapsodyaccount",
    	                      { "url" : name },
    	                      loadFunc, errorFunc);
 }
 dh.account.setNetflixUrl = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setnetflixfeedurl",
+   	dh.server.doXmlMethod("setnetflixaccount",
    	                      { "url" : name },
    	                      loadFunc, errorFunc);
 }
  
 dh.account.setGoogleReaderUrl = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setGoogleReaderUrl",
+   	dh.server.doXmlMethod("setgooglereaderaccount",
    	                      { "url" : name },
    	                      loadFunc, errorFunc);
 }
 dh.account.setPicasaName = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setPicasaName",
+   	dh.server.doXmlMethod("setpicasaaccount",
 				     { "urlOrName" : name },
 						loadFunc, errorFunc);
 }
 
 dh.account.setAmazonUrl = function(name, loadFunc, errorFunc) {
-   	dh.server.doXmlMethod("setAmazonUrl",
+   	dh.server.doXmlMethod("setamazonaccount",
 				          { "urlOrUserId" : name },
 						  loadFunc, errorFunc);
 }
@@ -712,7 +712,7 @@
 }
 
 dh.account.createLastFmEntry = function() {	
-	dh.account.lastFmEntry = new dh.lovehate.Entry('dhLastfm', 'Last.fm username', dh.account.initialLastFmName,
+	dh.account.lastFmEntry = new dh.lovehate.Entry('dhLastFm', 'Last.fm username', dh.account.initialLastFmName,
 					'Uhh...what\'s Last.fm?', dh.account.initialLastFmHateQuip, 'Your friends see what music you\'re listening to.');
 	dh.account.lastFmEntry.onLoveSaved = dh.account.onLastFmLoveSaved;
 	dh.account.lastFmEntry.onHateSaved = dh.account.createExternalAccountOnHateSavedFunc(dh.account.lastFmEntry, 'LASTFM');
@@ -838,13 +838,13 @@
 	if (exists('dhWebsiteEntry')) {
 		var websiteEntry = new dh.formtable.ExpandableTextInput('dhWebsiteEntry', 'Your website URL');
 		websiteEntry.setDescription("Your website will be linked from your Mugshot page.");
-		websiteEntry.setChangedXmlMethod('setwebsite', 'url');
+		websiteEntry.setChangedXmlMethod('setwebsiteaccount', 'url');
 	}
 	
 	if (exists('dhBlogEntry')) {
 		var blogEntry = new dh.formtable.ExpandableTextInput('dhBlogEntry', 'Your blog URL');
 		blogEntry.setDescription("Your friends will get updates when you post to your blog.")
-		blogEntry.setChangedXmlMethod('setblog', 'url');
+		blogEntry.setChangedXmlMethod('setblogaccount', 'url');
 	}
 	
 	// add some event handlers on the file input



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]