<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0ADSHgyfyp7ImA9WhRaEEg.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909</id><updated>2012-02-12T20:46:19.697+05:30</updated><category term="mobile" /><category term="fastapexxmldom" /><category term="yui" /><category term="apex" /><category term="PushTopics" /><category term="javascript" /><category term="charting" /><category term="WSC" /><category term="Tolerado" /><category term="seesmic" /><category term="flows" /><category term="wsdl" /><category term="Apex Testing" /><category term="J2ee" /><category term="salesforce" /><category term="cookie" /><category term="governorlimits" /><category term="jquery-Mobile" /><category term="Sobject" /><category term="win7" /><category term="git" /><category term="opensource" /><category term="Axis" /><category term="richvisualforceeditor" /><category term="Tips n Tricks" /><category term="ideaexchange" /><category term="windows" /><category term="yuicomboservice" /><category term="aws" /><category term="64 bit" /><category term="location_glimpse" /><category term="sharing" /><category term="xml" /><category term="esapi" /><category term="ant" /><category term="reports" /><category term="soap" /><category term="java" /><category term="ajax" /><category term="security" /><category term="marketo" /><category term="Streaming API" /><category term="winter'11" /><category term="web services" /><category term="visualforce" /><category term="log4j" /><category term="Remoting" /><category term="jquery" /><category term="approvals" /><category term="android" /><category term="appengine" /><category term="chatter" /><category term="Eclipse" /><category term="winter'12" /><category term="IE" /><category term="Cross Side Scripting" /><category term="collections" /><category term="XSS" /><category term="json" /><title>&lt;Tech&gt; Germ</title><subtitle type="html">Blog about cloud computing i.e. Salesforce, Amazon, Google, etc...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.tgerm.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.tgerm.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>145</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TechnologyGerm" /><feedburner:info uri="technologygerm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>TechnologyGerm</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;A0ADSHk7cSp7ImA9WhRaEEg.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-1384971650185579670</id><published>2012-02-12T20:33:00.001+05:30</published><updated>2012-02-12T20:46:19.709+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-12T20:46:19.709+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PushTopics" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><category scheme="http://www.blogger.com/atom/ns#" term="Streaming API" /><title>Force.com streaming API and Chrome desktop notifications</title><content type="html">&lt;p&gt;I like&lt;a href="http://lh5.ggpht.com/-WZzIohdw-LE/TzfUqo_zrJI/AAAAAAAAJHk/wBrEKLj0VSY/s1600-h/image19.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 8px 4px 13px 11px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/-cLdwZO-sj2c/TzfUsA_2xwI/AAAAAAAAJHs/t8B1XRb78CY/image_thumb9.png?imgmax=800" width="269" height="192" /&gt;&lt;/a&gt; &lt;a href="http://code.google.com/chrome/extensions/notifications.html" target="_blank"&gt;chrome desktop notifications&lt;/a&gt; a lot, they specially help me with gmail running in browser always and keeping me updated about new mails/chats without keeping the gmail tab open. I also like the way &lt;a href="http://gmailblog.blogspot.in/2011/01/desktop-notifications-for-emails-and.html" target="_blank"&gt;gmail desktop notifications&lt;/a&gt; in chrome take to the email related with the notification, again saves time and clicks. &lt;/p&gt;  &lt;h3&gt;Force.com PushTopic Desktop Notifications &lt;/h3&gt;  &lt;p&gt;I wanted something similar with &lt;a href="http://wiki.developerforce.com/page/Streaming_API" target="_blank"&gt;Force.com Streaming API&lt;/a&gt; or the PushTopic notifications. If you are working on a crucial Campaign, Account, Lead or Opportunity, then instead of waiting for chat/email/phone for updates, one can setup PushTopics and get updated in close to real time using “&lt;a href="http://code.google.com/chrome/extensions/notifications.html" target="_blank"&gt;chrome desktop notifications&lt;/a&gt;”. Something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-QrLPUXBCAnM/TzfUtzR1shI/AAAAAAAAJHw/5kZQdt3SOOc/s1600-h/image36.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-33vH9vTIJqE/TzfUvGKmlII/AAAAAAAAJH8/OQd9tZxusy0/image_thumb16.png?imgmax=800" width="278" height="69" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3 align="left"&gt;Notifications experiment !&lt;/h3&gt;  &lt;p align="left"&gt;Regarding the same, I tried a small experiment to use &lt;a href="http://wiki.developerforce.com/page/Streaming_API" target="_blank"&gt;Force.com streaming API&lt;/a&gt; (PushTopics) with &lt;a href="http://code.google.com/chrome/extensions/notifications.html" target="_blank"&gt;Chrome Desktop Notifications.&lt;/a&gt; The initial fixture I created was clone of &lt;a href="http://www.salesforce.com/us/developer/docs/api_streaming/Content/code_sample_vfp_intro.htm" target="_blank"&gt;visualforce code sample&lt;/a&gt; available in &lt;a href="http://www.salesforce.com/us/developer/docs/api_streaming/index_Left.htm" target="_blank"&gt;streaming api docs&lt;/a&gt;. &lt;/p&gt;  &lt;p align="left"&gt;Here is a demo video that shows the force.com desktop notifications in action (Watch it Full Screen for better visibility)&lt;/p&gt;  &lt;p align="left"&gt;&lt;iframe height="315" src="http://www.youtube.com/embed/JRoMGnq6uso" frameborder="0" width="560" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="https://gist.github.com/1808548" target="_blank"&gt;&lt;strong&gt;Here is the full source&lt;/strong&gt;&lt;/a&gt; of the visualforce page “&lt;strong&gt;streamingnotifications&lt;/strong&gt;” : &lt;a title="https://gist.github.com/1808548" href="https://gist.github.com/1808548"&gt;https://gist.github.com/1808548&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;You will also need to &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="left"&gt;download and setup comet static resources as indicated in the &lt;a href="http://www.salesforce.com/us/developer/docs/api_streaming/Content/code_sample_vfp_intro.htm" target="_blank"&gt;Streaming API guide.&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;replace the images being served from my dropbox folder with yours.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;This page is designed keeping Account sobject notifications in mind, so please setup PushTopics as required. The one I used was created using this apex code        &lt;pre class="brush:java"&gt;PushTopic pushTopic = new PushTopic();
pushTopic.Name = 'AccountUpdates';
pushtopic.Query = 'SELECT Id, Name, Phone, Fax  FROM Account'; 
pushTopic.ApiVersion = 24.0;
pushTopic.NotifyForOperations = 'All';
pushTopic.NotifyForFields = 'Referenced';
insert pushTopic;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 align="left"&gt;Possibilities Streaming PushTopics &amp;amp; Chrome Desktop notifications ?&lt;/h3&gt;

&lt;p align="left"&gt;One can use chrome desktop notifications in very interesting ways. Few ideas I can think of are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;Embed this visualforce page and embed it into the home page layout, so that user doesn’t need to browse anywhere. &lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;Show list of PushTopics available in the VF page to user, and let user select the ones he is interested in. Notifications would be shown only for those PushTopics. This page should also have option to stop notifications about a particular topic. &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="left"&gt;What other PushTopics can be helpful ?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;Chatter : Create a push topic with query on required Feed like NewsFeed, so that anything relevant to chatter is also showed in desktop notifications.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;Leads/Opps : If team is working on same lead/opp they don’t need to refresh the page, or wait for email/call/chat to know about the important changes.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 align="left"&gt;Note about PushTopics security &amp;amp; Limits&lt;/h3&gt;

&lt;p align="left"&gt;Security is well implemented on PushTopics, but its important to understand before setting up the expectations. &lt;/p&gt;

&lt;p align="left"&gt;Here is what I found from the&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://www.salesforce.com/us/developer/docs/api_streaming/Content/security_pushtopic_query.htm" target="_blank"&gt;&lt;strong&gt;Streaming API developer guide about Security&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Subscribers receive notifications about any create or update to a record if they have: 
      &lt;br /&gt;• Field-level security access to the fields specified in the WHERE clause 

      &lt;br /&gt;• Read access on the object in the query 

      &lt;br /&gt;• Visibility of the new or modified record based on sharing rules 

      &lt;br /&gt;If the subscriber doesn’t have access to specific fields referenced in the query SELECT clause, then those fields aren’t included in the notification. If the subscriber doesn’t have access to all fields referenced in the query WHERE clause, then they will not receive the notification.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p align="left"&gt;Equally important is to know the &lt;a href="http://www.salesforce.com/us/developer/docs/api_streaming/Content/limits.htm" target="_blank"&gt;&lt;strong&gt;Limits of Streaming API.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="left"&gt;&lt;a href="http://lh5.ggpht.com/-6CHUaKreDG4/TzfUxd2cFFI/AAAAAAAAJIE/dJx2bS3iEXo/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-0Pnp-dlX_SQ/TzfUzXELLkI/AAAAAAAAJIM/twZg_88hb3U/image_thumb%25255B1%25255D.png?imgmax=800" width="614" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-1384971650185579670?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O_LP8nom6SK2mUyikmaq78ybosU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O_LP8nom6SK2mUyikmaq78ybosU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O_LP8nom6SK2mUyikmaq78ybosU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O_LP8nom6SK2mUyikmaq78ybosU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nEjGUeOwx0U:nJ4WgFnA-9Q:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nEjGUeOwx0U:nJ4WgFnA-9Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nEjGUeOwx0U:nJ4WgFnA-9Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nEjGUeOwx0U:nJ4WgFnA-9Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nEjGUeOwx0U:nJ4WgFnA-9Q:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/nEjGUeOwx0U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/1384971650185579670/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=1384971650185579670" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1384971650185579670?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1384971650185579670?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/nEjGUeOwx0U/forcecom-streaming-api-notifications.html" title="Force.com streaming API and Chrome desktop notifications" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-cLdwZO-sj2c/TzfUsA_2xwI/AAAAAAAAJHs/t8B1XRb78CY/s72-c/image_thumb9.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/02/forcecom-streaming-api-notifications.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGRns9fSp7ImA9WhRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-7061451022058108940</id><published>2012-02-10T22:28:00.000+05:30</published><updated>2012-02-11T00:00:27.565+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-11T00:00:27.565+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Tip: Using Decimal class with Strings in Apex</title><content type="html">&lt;p&gt;Today I came across an interesting problem that reminded me of my Java days. A piece of Apex code written by some other developer was broken, when I did my fixes. &lt;/p&gt;  &lt;p&gt;Here is some background about the broken code, lets say the file name is “&lt;strong&gt;ScaryMovie.cls&lt;/strong&gt;”&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;ul&gt;   &lt;li&gt;It tries to query a Number(18, 0) field from Sobject, lets say sobject is &lt;strong&gt;Mock__c&lt;/strong&gt;, and number field is “&lt;strong&gt;Counter__c&lt;/strong&gt;” &lt;/li&gt;    &lt;li&gt;Appends the number field to a String to create a URL, for ex      &lt;pre class="brush:java"&gt;Mock__c mock = [Select Counter__c from Mock__c where Name = 'Demo'];
String url = 'http://mycooldomain.com/'+ mock.counter__c;
System.debug ('Generated URL :' + url);&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The apex class was an old class, i.e. of 16.0 API version. When executed, with Counter__c value of “1.0”, this code generates URL as shown below:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://mycooldomain.com/1.0"&gt;&lt;strong&gt;http://mycooldomain.com/1.0&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;How things got broken ?&lt;/h3&gt;

&lt;p&gt;For my fixes I was using some newer features of Apex, and have to upgrade the API version of class to latest one. This API version change broke the previously working code !! The URL is now generating as&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&lt;strong&gt;&lt;a href="http://mycooldomain.com/1"&gt;http://mycooldomain.com/1&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any guess what could be the reason of this show stopper ? &lt;/p&gt;

&lt;h3&gt;Why this happened ?&lt;/h3&gt;

&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;em&gt;&lt;strong&gt;Update&lt;/strong&gt; : Thanks to &lt;/em&gt;&lt;/font&gt;&lt;a href="https://twitter.com/#!/rich_unger" target="_blank"&gt;&lt;font color="#ff0000"&gt;&lt;em&gt;@rich_unger&lt;/em&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#ff0000"&gt;&lt;em&gt; for suggesting the correct cause of the problem. I was previously thinking the problem was because of change in toString() method implementation in v16.0 to v23.0 of API. But its Double class that is used in v16 API, that’s been upgraded to Decimal class in later versions for more precision.&lt;/em&gt;&amp;#160; &lt;/font&gt;&lt;/p&gt;

&lt;p&gt;So to again get back to the same Double in Apex, we can change the code as shown below:&lt;/p&gt;

&lt;pre class="brush:java"&gt;Mock__c mock = [Select Counter__c from Mock__c where Name = 'Demo'];
Double dblValue = mock.Counter__c .doubleValue();
String url = 'http://mycooldomain.com/'+ dblValue;
System.debug ('Generated URL :' + url);&lt;/pre&gt;

&lt;h3&gt;Ideal practice &lt;/h3&gt;

&lt;p&gt;Instead of directly appending any queried number field to the String, try storing it as a specific Type(Decimal) in a local variable. This will save you from any accidental code API version upgrade from breaking the existing code. &lt;/p&gt;

&lt;h3&gt;Your feedback ?&lt;/h3&gt;

&lt;p&gt;Love to hear back.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-7061451022058108940?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iL5j9RUPZ10pEeqvQktGQFAf3Zw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iL5j9RUPZ10pEeqvQktGQFAf3Zw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iL5j9RUPZ10pEeqvQktGQFAf3Zw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iL5j9RUPZ10pEeqvQktGQFAf3Zw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=jlrAQNdM4-Y:4I7hRa4fFGY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=jlrAQNdM4-Y:4I7hRa4fFGY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=jlrAQNdM4-Y:4I7hRa4fFGY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=jlrAQNdM4-Y:4I7hRa4fFGY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=jlrAQNdM4-Y:4I7hRa4fFGY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/jlrAQNdM4-Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/7061451022058108940/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=7061451022058108940" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/7061451022058108940?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/7061451022058108940?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/jlrAQNdM4-Y/apex-integer-decimal-tostring-issue.html" title="Tip: Using Decimal class with Strings in Apex" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://www.tgerm.com/2012/02/apex-integer-decimal-tostring-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMMRHw9fyp7ImA9WhRbGEo.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-1255762339747073492</id><published>2012-02-09T17:25:00.001+05:30</published><updated>2012-02-10T18:24:45.267+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-10T18:24:45.267+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="Remoting" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery-Mobile" /><title>jQuery-Mobile, HTML5, Javascript Remoting and Visualforce in Cooking !</title><content type="html">&lt;p&gt;For fun of cooking a mobile application, my peer developer &lt;a href="http://www.linkedin.com/profile/view?id=130060013" target="_blank"&gt;Jagdeep&lt;/a&gt; developed a jQuery mobile based app prototype using Visualforce pages and Javascript Remoting on Force.com.&lt;/p&gt;  &lt;p&gt; Here is a quick demo video of this application.&lt;/p&gt; &lt;iframe height="315" src="http://www.youtube.com/embed/9LNz2cWksLw" frameborder="0" width="620" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;p&gt;We’re happy about this small experiment because of a few reasons&lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Speed&lt;/strong&gt;: The application was developed and demoable in 2 days, that includes learning jQuery mobile. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Fun: &lt;/strong&gt;Apart from usual touch support and CSS styling for mobile, the application was supporting gestures and orientation(portrait and landscape), this is fun to do and learn. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Integrity&lt;/strong&gt;: Solution was working like charm in Android and iPhone browsers, all using force.com technologies like &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;Sobjects: &lt;/strong&gt;For storing attendance records.&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Visualforce: &lt;/strong&gt;The application container that holds jQuery mobile and everything else.&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Javascript Remoting&lt;/strong&gt;: It helped us a lot, JSON was used for querying, creating and updating the records. We played easily with JSON using the remoting, both Sobjects and custom Apex types are easily transferred back and forth between Javascript and Apex. &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;What’s next ?&lt;/h3&gt;  &lt;p&gt;We are planning to create another version of this app, using&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PhoneGap&lt;/li&gt;    &lt;li&gt;Use same Sobejct Data Model with Apex REST webservices and Java(Heroku)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mobile is fun for sure :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-1255762339747073492?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TJ4eE7moB-Y_FOZ1OY_J_gJ2UtY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TJ4eE7moB-Y_FOZ1OY_J_gJ2UtY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TJ4eE7moB-Y_FOZ1OY_J_gJ2UtY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TJ4eE7moB-Y_FOZ1OY_J_gJ2UtY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=LaDFuqggzYI:ULuV1t51b8E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=LaDFuqggzYI:ULuV1t51b8E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=LaDFuqggzYI:ULuV1t51b8E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=LaDFuqggzYI:ULuV1t51b8E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=LaDFuqggzYI:ULuV1t51b8E:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/LaDFuqggzYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/1255762339747073492/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=1255762339747073492" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1255762339747073492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1255762339747073492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/LaDFuqggzYI/jquery-mobile-html-5-100-native.html" title="jQuery-Mobile, HTML5, Javascript Remoting and Visualforce in Cooking !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/9LNz2cWksLw/default.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.tgerm.com/2012/02/jquery-mobile-html-5-100-native.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08ERH4yeip7ImA9WhRbEEQ.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-2160202569106441724</id><published>2012-02-01T18:00:00.001+05:30</published><updated>2012-02-01T18:06:45.092+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-01T18:06:45.092+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><category scheme="http://www.blogger.com/atom/ns#" term="ideaexchange" /><title>New Idea, Getting Field ID in Apex Describe Information !</title><content type="html">&lt;p&gt;If you are planning to default input field values in an edit page for an Sobject, then you need to use something cryptic, like &lt;a href="http://boards.developerforce.com/t5/General-Development/Redirct-back-to-parent-object/m-p/76698" target="_blank"&gt;LKID hack&lt;/a&gt;. This hack requires you to pass field’s IDs as URL query params with default values for each, like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a title="https://na1.salesforce.com/a02/e?CF00N30000001cYtG={!Case.CaseNumber}&amp;amp;CF00N30000001cYtG_lkid={!Case.Id}&amp;amp;retURL=%2F{!Case.Id}&amp;amp;saveURL=%2F{!Case.Id}" href="https://na1.salesforce.com/a02/e?CF00N30000001cYtG={!Case.CaseNumber}&amp;amp;CF00N30000001cYtG_lkid={!Case.Id}&amp;amp;retURL=%2F{!Case.Id}&amp;amp;saveURL=%2F{!Case.Id}"&gt;https://na1.salesforce.com/a02/e?CF00N30000001cYtG={!Case.CaseNumber}&amp;amp;&lt;strong&gt;&lt;font size="4"&gt;CF00N30000001cYtG_lkid&lt;/font&gt;&lt;/strong&gt;={!Case.Id}&amp;amp;retURL=%2F{!Case.Id}&amp;amp;saveURL=%2F{!Case.Id}&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This solution is really a hack, as there is no way in &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dynamic_describe_objects_understanding.htm" target="_blank"&gt;Apex describe information&lt;/a&gt; to know ID for a given sobject field. This makes your app or solution tough to port across the orgs, developers try to use custom settings to declare all such LKID fields, each one of them must be correctly updated by Admin post app installation.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;One hack, and the easiest solution so far !&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://force201.wordpress.com" target="_blank"&gt;Keith Clarke&lt;/a&gt; has done a great job to solve this problem in best possible way as of now on platform. Here are few posts and thoughts from Keith about the same:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Long time back post on how to use LKID for populating the screen with field values : &lt;a title="http://force201.wordpress.com/2010/03/14/new-child-object-default-ui-page-via-urlfor/" href="http://force201.wordpress.com/2010/03/14/new-child-object-default-ui-page-via-urlfor/"&gt;http://force201.wordpress.com/2010/03/14/new-child-object-default-ui-page-via-urlfor/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Idea to make this LKID hack more documented : &lt;a title="http://force201.wordpress.com/2010/03/27/lkid-hack-value-is-fragile/" href="http://force201.wordpress.com/2010/03/27/lkid-hack-value-is-fragile/"&gt;http://force201.wordpress.com/2010/03/27/lkid-hack-value-is-fragile/&lt;/a&gt;, link to the idea (&lt;a title="http://success.salesforce.com/ideaView?id=08730000000Gt4QAAS" href="http://success.salesforce.com/ideaView?id=08730000000Gt4QAAS"&gt;http://success.salesforce.com/ideaView?id=08730000000Gt4QAAS&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;A solution that makes it possible to know field ids : &lt;/strong&gt;&lt;a title="http://force201.wordpress.com/2012/01/23/outputting-a-url-that-has-keys-that-only-differ-by-case/" href="http://force201.wordpress.com/2012/01/23/outputting-a-url-that-has-keys-that-only-differ-by-case/"&gt;http://force201.wordpress.com/2012/01/23/outputting-a-url-that-has-keys-that-only-differ-by-case/&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;IdeaExchange - Field ID needed in Apex Describe Info !&lt;/h3&gt;  &lt;p&gt;I appreciate efforts and the solution from &lt;a href="http://force201.wordpress.com" target="_blank"&gt;Keith Clarke&lt;/a&gt;, but the approaches we still have are hacky and prone to failures. It would make our life much simpler, if &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dynamic_describe_objects_understanding.htm" target="_blank"&gt;Apex describe information&lt;/a&gt; includes information about the field ID also. For ex. &lt;/p&gt;  &lt;pre class="brush:java"&gt;Schema.DescribeFieldResult f = Schema.sObjectType.Account.fields.Name;
// This new method is very much required
Id fieldId = f.getId();&lt;/pre&gt;

&lt;p&gt;I am posting the same as an Idea, please promote it to make developer’s life easier in future. Here is the link to the idea : &lt;a title="https://sites.secure.force.com/success/ideaView?id=08730000000gM7mAAE" href="https://sites.secure.force.com/success/ideaView?id=08730000000gM7mAAE"&gt;https://sites.secure.force.com/success/ideaView?id=08730000000gM7mAAE&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-2160202569106441724?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/p4MuQsPcyrGepsXfuAP2uRlFOqo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4MuQsPcyrGepsXfuAP2uRlFOqo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/p4MuQsPcyrGepsXfuAP2uRlFOqo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4MuQsPcyrGepsXfuAP2uRlFOqo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=wtjR-Kjzfoo:1tNu3iLZNLo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=wtjR-Kjzfoo:1tNu3iLZNLo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=wtjR-Kjzfoo:1tNu3iLZNLo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=wtjR-Kjzfoo:1tNu3iLZNLo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=wtjR-Kjzfoo:1tNu3iLZNLo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/wtjR-Kjzfoo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/2160202569106441724/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=2160202569106441724" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2160202569106441724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2160202569106441724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/wtjR-Kjzfoo/field-id-lkid-describe.html" title="New Idea, Getting Field ID in Apex Describe Information !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/02/field-id-lkid-describe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMHQHo_fSp7ImA9WhRbEE8.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-1186156392630770913</id><published>2012-01-31T22:14:00.001+05:30</published><updated>2012-01-31T22:17:11.445+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-31T22:17:11.445+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><title>Force.com Developer Console Navigation Trick</title><content type="html">&lt;p&gt;I never thought that working in browser can be more fun than Eclipse IDE. But my thinking is changing these days, first &lt;a title="http://jsfiddle.net/" href="http://jsfiddle.net/"&gt;http://jsfiddle.net/&lt;/a&gt; became my favorite playground for any HTML/Javascript research and now I felt Developer Console is way more convenient and faster to work as compared to Eclipse, reasons:&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;ol&gt;   &lt;li&gt;No need to checkout project and wait for metadata download to start. &lt;/li&gt;    &lt;li&gt;No need to update/sync the project, you are always working on latest copy. &lt;/li&gt;    &lt;li&gt;Save is pretty fast too, and thankfully “CTRL + S” works here also. &lt;/li&gt;    &lt;li&gt;Developer console remembers the last opened files, when launched again.&lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;The Trick !&lt;/h3&gt;  &lt;p&gt;Apart from the above, I figured a small trick that makes it even more easier to work with Developer Console. Here is a video that shows the trick in action&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;iframe height="315" src="http://www.youtube.com/embed/7ZzkHnyBxFA" frameborder="0" width="560" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;h3&gt;Your views &lt;/h3&gt;  &lt;p&gt;Always looking forward to those.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-1186156392630770913?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YXPPb_5cfqNLHWjwMXbAIf--FfQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YXPPb_5cfqNLHWjwMXbAIf--FfQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YXPPb_5cfqNLHWjwMXbAIf--FfQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YXPPb_5cfqNLHWjwMXbAIf--FfQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nnLOcSV5rbI:EQMpSCx2DIY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nnLOcSV5rbI:EQMpSCx2DIY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nnLOcSV5rbI:EQMpSCx2DIY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=nnLOcSV5rbI:EQMpSCx2DIY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=nnLOcSV5rbI:EQMpSCx2DIY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/nnLOcSV5rbI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/1186156392630770913/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=1186156392630770913" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1186156392630770913?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1186156392630770913?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/nnLOcSV5rbI/forcecom-developer-console-navigation.html" title="Force.com Developer Console Navigation Trick" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/7ZzkHnyBxFA/default.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/forcecom-developer-console-navigation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYNQH45cCp7ImA9WhRUGUg.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-974995932186316002</id><published>2012-01-31T01:14:00.001+05:30</published><updated>2012-01-31T01:39:51.028+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-31T01:39:51.028+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Describing picklist values for Sobject with multiple RecordTypes !</title><content type="html">&lt;p&gt;I recently came across an interesting problem mentioned in &lt;a href="http://bobbuzzard.blogspot.com/2012/01/record-type-picklist-values.html" target="_blank"&gt;this post&lt;/a&gt; by&amp;#160; Mr. Keir Bowden(&lt;a href="https://twitter.com/#!/bob_buzzard" target="_blank"&gt;@bob_buzzard&lt;/a&gt;), solution mentioned in this post was cool and it excited me to try an alternate one that started drawing in my mind, while I was reading his post. &lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;The Alternate Solution (or generic API)&lt;/h3&gt;  &lt;p&gt;Using the same approach used by Keir, my goal was to come up with an API that can work with any Sobject and picklist field. The client code requiring a picklist describe needs to deal with only one class&amp;#160; named “&lt;strong&gt;&lt;a href="https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer/blob/master/classes/PicklistDescriber.cls" target="_blank"&gt;PicklistDescriber&lt;/a&gt;&lt;/strong&gt;” and use one of the 3 describe() calls as explained below:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When you have the record id      &lt;pre class="brush:java"&gt;// Query or Load the Account as required
Id accountId = [Select Id from Account Where Name = 'Most Paying Customer'];
// Here is the Describe call, the resultant List&amp;lt;string&amp;gt; is all picklist values
List&amp;lt;string&amp;gt; options = PicklistDescriber.describe(accountId, 'Industry');&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;When you know the sobjectType and recordType name 
    &lt;pre class="brush:java"&gt;// 'Record_Type_1' is a sample record type name on Account
List&amp;lt;string&amp;gt; options = PicklistDescriber.describe('Account', 'Record_Type_1', 'Industry'));&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;When you know the sobjectType and recordTypeId 
    &lt;pre class="brush:java"&gt;// 'Record_Type_2' is a sample record type name on Account
Id recType2Id = [Select Id from RecordType Where SobjectType = 'Account' 
                                            AND DeveloperName like 'Record_Type_2'].Id;
List&amp;lt;string&amp;gt; options = PicklistDescriber.describe('Account', recType2Id, 'Industry');&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can copy the required metadata from &lt;a href="https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer" target="_blank"&gt;this github project&lt;/a&gt;, if you are interested in internals about this API. All the required setup and usage information is mentioned in the README markdown file at the project home page.&lt;/p&gt;

&lt;p&gt;If, you are interested in internals, please continue reading below.&lt;/p&gt;

&lt;h3&gt;How this works ? &lt;/h3&gt;

&lt;p&gt;The key ingredients to my approach were&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Keir’s approach to render picklist values in a visualforce page, i.e. use VF intelligence for rendering the picklist values based on record type correctly. &lt;/li&gt;

  &lt;li&gt;Use Dynamic Visualforce bindings, to make it work for any sobject. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below diagram describes the communication between the components. Please refer &lt;a href="https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer" target="_blank"&gt;this github repository&lt;/a&gt; for source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please click on this image for bigger picture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/drawings/pub?id=1IUDkz6ug1lxX3AjTVrarwhr1oJg9HVjJ6IL63ABCpSQ&amp;amp;w=1431&amp;amp;h=770" target="_blank"&gt;&lt;img src="https://docs.google.com/drawings/pub?id=1IUDkz6ug1lxX3AjTVrarwhr1oJg9HVjJ6IL63ABCpSQ&amp;amp;w=477&amp;amp;h=257" /&gt; &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Your views and thoughts &lt;/h3&gt;

&lt;p&gt;Will be happy to discuss and looking forward for the same.&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;@bob_buzzard’s post for original idea: &lt;a title="http://bobbuzzard.blogspot.com/2012/01/record-type-picklist-values.html" href="http://bobbuzzard.blogspot.com/2012/01/record-type-picklist-values.html"&gt;http://bobbuzzard.blogspot.com/2012/01/record-type-picklist-values.html&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;Github repository for my approach : &lt;a title="https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer" href="https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer"&gt;https://github.com/abhinavguptas/Multi-RecordType-Sobject-Picklist-Describer&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-974995932186316002?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/K81CU1zeVmi_iSNoLPahujnBFIo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K81CU1zeVmi_iSNoLPahujnBFIo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/K81CU1zeVmi_iSNoLPahujnBFIo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K81CU1zeVmi_iSNoLPahujnBFIo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I_15fwT0B3k:VndNCnzYWWE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I_15fwT0B3k:VndNCnzYWWE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I_15fwT0B3k:VndNCnzYWWE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I_15fwT0B3k:VndNCnzYWWE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I_15fwT0B3k:VndNCnzYWWE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/I_15fwT0B3k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/974995932186316002/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=974995932186316002" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/974995932186316002?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/974995932186316002?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/I_15fwT0B3k/recordtype-specific-picklist-values.html" title="Describing picklist values for Sobject with multiple RecordTypes !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8EQHw9eCp7ImA9WhRUGEw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-6258834754698450738</id><published>2012-01-29T11:50:00.001+05:30</published><updated>2012-01-29T12:03:21.260+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-29T12:03:21.260+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Salesforce Email Services - Where is "Delete" button ?</title><content type="html">&lt;p&gt;Deletion of email services is interesting, recently one of my team member approached me about, why “DELETE” button is not coming on configured Email Services ? &lt;/p&gt;  &lt;p&gt;Same is indicated in screenshot below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-zxpkD5zlXi4/TyTk5xIU4AI/AAAAAAAAJGE/IOCakpXDkTQ/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Salesforce email service no delete button visisble" border="0" alt="Salesforce email service no delete button visisble" src="http://lh3.ggpht.com/-1K0FqETqh3I/TyTk7sc8x3I/AAAAAAAAJGM/qqKvR0GefPA/image_thumb%25255B3%25255D.png?imgmax=800" width="425" height="255" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;p&gt;I initially thought how come this is possible, that you can only “Activate” or “Deactivate” email services post creation. &lt;/p&gt;  &lt;p&gt;On some RnD it came out that you need to delete all the associated email addresses with the service. So the prerequisite for email service deletion is &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Go to Setup area. &lt;/li&gt;    &lt;li&gt;Dive into “Develop &amp;gt; Email Services”, and select the email service you want to delete from here. As shown in screen shot below:&lt;a href="http://lh3.ggpht.com/-lTZ4ZoH0BIU/TyTk9EjmgJI/AAAAAAAAJGU/KWgL_pY8mEY/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 9px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Salesforce Setup &amp;gt; Develop &amp;gt; Email Services menu" border="0" alt="Salesforce Setup &amp;gt; Develop &amp;gt; Email Services menu" src="http://lh5.ggpht.com/-73lVJ7rpbFc/TyTk-4HBTcI/AAAAAAAAJGc/G7Nkt3xeihc/image_thumb%25255B5%25255D.png?imgmax=800" width="575" height="173" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;On the email service detail page, go to the “Email Addresses” related list, and delete all of the email addresses configured here. Screen shot below indicates this:&lt;a href="http://lh3.ggpht.com/-MbqyR14-YTY/TyTlAlu41iI/AAAAAAAAJGk/Ei9jzcnKAJU/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 8px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Email Service, addresses related list" border="0" alt="Email Service, addresses related list" src="http://lh3.ggpht.com/-JVeVJSsCOKY/TyTlCnoU-II/AAAAAAAAJGs/FuBfFSPypnw/image_thumb%25255B8%25255D.png?imgmax=800" width="511" height="413" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Once all the associated email addresses are deleted, you will see the delete button automatically on the email service detail page, as indicated in screen shot below: &lt;a href="http://lh5.ggpht.com/-EX8fnJro3kw/TyTlDxOFSLI/AAAAAAAAJG0/iC0Abmg_HVg/s1600-h/image%25255B20%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 7px 0px 0px 14px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Delete button for email services" border="0" alt="Delete button for email services" src="http://lh6.ggpht.com/-ekI4zyPwpt8/TyTlFUUMHOI/AAAAAAAAJG8/R9vsq-jadlo/image_thumb%25255B10%25255D.png?imgmax=800" width="447" height="185" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Your Views ?&lt;/h1&gt;  &lt;p&gt;This post is for absolute beginners, still its fun to discuss on force.com topics, so looking forward for your thoughts. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-6258834754698450738?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mQaGE8bVpWL9mShl528ZYQp0CAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQaGE8bVpWL9mShl528ZYQp0CAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mQaGE8bVpWL9mShl528ZYQp0CAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQaGE8bVpWL9mShl528ZYQp0CAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=MhhfpU_s-iM:9eSj_gw69ok:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=MhhfpU_s-iM:9eSj_gw69ok:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=MhhfpU_s-iM:9eSj_gw69ok:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=MhhfpU_s-iM:9eSj_gw69ok:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=MhhfpU_s-iM:9eSj_gw69ok:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/MhhfpU_s-iM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/6258834754698450738/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=6258834754698450738" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/6258834754698450738?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/6258834754698450738?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/MhhfpU_s-iM/remove-delete-email-service-salesforce.html" title="Salesforce Email Services - Where is &amp;quot;Delete&amp;quot; button ?" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-1K0FqETqh3I/TyTk7sc8x3I/AAAAAAAAJGM/qqKvR0GefPA/s72-c/image_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/remove-delete-email-service-salesforce.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMBRXgzfyp7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-5607021138090940255</id><published>2012-01-18T16:39:00.001+05:30</published><updated>2012-01-25T22:24:14.687+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T22:24:14.687+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Crowd sourced getting started guide for Force.com developers.</title><content type="html">&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-ISbHOMbOGFo/TxawfC51UUI/AAAAAAAAJEU/b2TLSoGC2eQ/s1600-h/Screen%252520Shot%2525202012-01-18%252520at%2525205.11.38%252520PM%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Screen Shot 2012-01-18 at 5.11.38 PM" border="0" alt="Screen Shot 2012-01-18 at 5.11.38 PM" align="right" src="http://lh5.ggpht.com/-bzl_2DSvvo8/Txawg_TfwPI/AAAAAAAAJEc/CPKYWE--BnA/Screen%252520Shot%2525202012-01-18%252520at%2525205.11.38%252520PM_thumb%25255B2%25255D.png?imgmax=800" width="222" height="196" /&gt;&lt;/a&gt;Getting started with force.com platform is an interesting roller coaster ride for developers of any experience level. I tried bringing some of those newbie experiences in this post, and then a guide that can help newbie’s to get up to speed quickly with platform.&lt;/p&gt;  &lt;h1&gt;the force.com newbie story !&lt;/h1&gt;  &lt;p&gt;Fresh graduates mostly compare it with C/C++ and try searching out similar fun out here. &lt;/p&gt;  &lt;p&gt;For experienced it’s a different sort of comparison from various degrees and angles :) I was from Java/J2EE background for me it was a huge change in mindset, i.e. I was missing &lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;ul&gt;   &lt;li&gt;control and power &lt;/li&gt;    &lt;li&gt;command prompt. &lt;/li&gt;    &lt;li&gt;those ANT and Maven builds. &lt;/li&gt;    &lt;li&gt;fun of starting servers like jboss, tomcat, resin etc. &lt;/li&gt;    &lt;li&gt;debugging in Eclipse &lt;/li&gt;    &lt;li&gt;habit to setup env. variables and fun of writing shell/batch scripts. &lt;/li&gt;    &lt;li&gt;and many other things &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I was hating&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Coding in browsers &lt;/li&gt;    &lt;li&gt;Eclipse plugin for Force.com, is not as rich as Java. &lt;/li&gt;    &lt;li&gt;Governor limits, why I can’t just do this and that, urghh &lt;a href="mailto:$@#$$"&gt;$@#$$&lt;/a&gt;#^ &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;But it didn’t took me much to become a different guy altogether, I realized this when I have to work back in some force.com J2EE integration. I was hating Java for why its requiring me so much to just create something small, I was feeling panic to setup env variables and finding right JAR files for the purpose :) &lt;/p&gt;  &lt;p&gt;So the point is, you will fell in love with platform and will soon start appreciating the power, ease of development and why governor if not really an enemy and makes you a good programmer. It’s a mindset change to work in a multitenant environment, it would be fun if you will try learning it from open mindset. As said in this lovely quote &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Only open heart receive love, Only open mind receive wisdom, Only open hand receive gifts !&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h1&gt;Guide : Getting started with force.com platform !&lt;/h1&gt;  &lt;p&gt;Newbie’s ride is not very straight forward for everyone, specially if you don’t have any good mentor to guide. So a newbie needs a good “Getting Started Guide for Developers”, that can provide them correct pointers to get up to the speed with platform. I googled similar guides, but can’t find one that covers the areas I wanted. So I tried creating one, with few goals in mind &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It should be groomed and maintained via crowdsourcing, i.e. open for community to add and update, as force.com is continuously changing &amp;amp; evolving platform. So keeping one isolated guide updated is not possible for a single guy. &lt;/li&gt;    &lt;li&gt;It should have pointers about how to easily      &lt;ul&gt;       &lt;li&gt;troubleshoot issues, that mostly comes out with developers who are starting up. &lt;/li&gt;        &lt;li&gt;get answers to your questions, via twitter and forums. &lt;/li&gt;        &lt;li&gt;stay tuned to latest updates and happenings in community in form of blogs, open source etc. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Crowd sourced guide on GitHub&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Keeping the above goals in mind, I created a guide on &lt;u&gt;GITHUB&lt;/u&gt; as a repository, its available out here:&lt;/font&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/abhinavguptas/Getting-Started-with-Force.com-Development" href="https://github.com/abhinavguptas/Getting-Started-with-Force.com-Development"&gt;&lt;strong&gt;https://github.com/abhinavguptas/Getting-Started-with-Force.com-Development&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Your suggestions ?&lt;/h3&gt;  &lt;p&gt;This is first draft of the guide, so I am looking forward for your suggestion to make it more simple and easy for a newbie to get up to speed with force.com platform.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-5607021138090940255?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GWvdbi0mBrXVrrLvIpdiKVCuSns/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GWvdbi0mBrXVrrLvIpdiKVCuSns/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GWvdbi0mBrXVrrLvIpdiKVCuSns/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GWvdbi0mBrXVrrLvIpdiKVCuSns/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3aiz1fC2IJI:BOXnJtpe7ng:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3aiz1fC2IJI:BOXnJtpe7ng:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3aiz1fC2IJI:BOXnJtpe7ng:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3aiz1fC2IJI:BOXnJtpe7ng:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3aiz1fC2IJI:BOXnJtpe7ng:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/3aiz1fC2IJI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/5607021138090940255/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=5607021138090940255" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5607021138090940255?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5607021138090940255?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/3aiz1fC2IJI/learn-salesforce-apex-visualforce.html" title="Crowd sourced getting started guide for Force.com developers." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-bzl_2DSvvo8/Txawg_TfwPI/AAAAAAAAJEc/CPKYWE--BnA/s72-c/Screen%252520Shot%2525202012-01-18%252520at%2525205.11.38%252520PM_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/learn-salesforce-apex-visualforce.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIFRXg8eyp7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-7413045100270468651</id><published>2012-01-16T17:21:00.001+05:30</published><updated>2012-01-25T22:25:14.673+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T22:25:14.673+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Multiselect picklist jquery plugin for iPad and Desktop browsers</title><content type="html">&lt;p&gt;We recently came across a problem, we have to develop a multi-row/multiselect picklist that looks similar in both desktop and iPad browser. &lt;/p&gt;  &lt;p&gt;We could have easily used the usual Visualforce tag i.e. &amp;lt;apex:selectList …/&amp;gt; for the purpose, like this&lt;/p&gt;  &lt;pre class="brush:xml"&gt;&amp;lt;apex:selectList id=&amp;quot;contactPickList&amp;quot; value=&amp;quot;{!selectedContactIds}&amp;quot;  multiselect=&amp;quot;true&amp;quot; size=&amp;quot;4&amp;quot;&amp;gt;
   &amp;lt;apex:selectOptions value=&amp;quot;{!contactOptions}&amp;quot;/&amp;gt;
 &amp;lt;/apex:selectList&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;But iPad doesn’t supports “size” attribute on HTML &amp;lt;select&amp;gt; tag, and to save real state on page it always shows picklists in one line. Picklist options are shown in popup on click. &lt;/u&gt;&lt;/p&gt;

&lt;p&gt;We are troubled by this difference, as the UI was looking very different in iPad and desktop. You can assume that we are developing UI having Salesforce “Customize you tabs” type interface, here is the difference&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-k0ZH0s9iHVA/TxQPSEOSgZI/AAAAAAAAJD0/Q7yts1mvKVQ/s1600-h/image9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="iPad Multiselect picklist" border="0" alt="iPad Multiselect picklist" src="http://lh3.ggpht.com/-4MvzaaX5r_Q/TxQPTU3hTxI/AAAAAAAAJD8/kid52H8kFCo/image_thumb5.png?imgmax=800" width="443" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iPad view of “Customize my tabs”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-MZKvEoEUoko/TxQPUkiscjI/AAAAAAAAJEE/mDjEvDyk4Xg/s1600-h/image8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 7px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-9mFZdmZ9gxY/TxQPVx80e0I/AAAAAAAAJEM/R93JWwHv1Io/image_thumb4.png?imgmax=800" width="440" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;desktop view of “Customize my tabs”&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Desired Solution&lt;/h1&gt;

&lt;p&gt;We need a UI component, with few core requirements.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It should be pluggable to any visualforce multiselect pick list with minimal lines of javascript code. &lt;/li&gt;

  &lt;li&gt;It should work on top of existing visualforce goodness i.e. &amp;lt;apex:SelectList /&amp;gt; tag. Developer should create a normal apex multi select list, the plugin will not add any complexity to that. &lt;/li&gt;

  &lt;li&gt;It should optionally support searching within the list, because selecting few items among thousands is not friendly in HTML pick lists. &lt;/li&gt;

  &lt;li&gt;It should give clear idea, what items are selected on both desktop and iPad. Our specific requirement was to design something to show a “customize my tabs” like split view for “Available” and “Selected” items. &lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;Solution &lt;/h1&gt;

&lt;p&gt;A jQuery plugin was developed named “twinBoxMultiSelectList” was created. This plugin transforms any HTML select list to a two box “Customize my tabs” style interface. This plugin works on top of CSS selector for a HTML select list and requires only few inputs to render i.e. &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;availableList &lt;/strong&gt;: CSS selector of DIV/SPAN/TD etc, where the Available items list should be drawn. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;selectedList&lt;/strong&gt; : CSS selector of DIV/SPAN/TD etc, where the Selected items list should be drawn. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;searchBox&lt;/strong&gt; : CSS selector of input text box, this will be used for feeding the search text. This is OPTIONAL. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;styles : &lt;/strong&gt;OPTIONAL CSS styles to change look and feel of the component. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Here is a quick demo video of this plugin &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IRtnTTGkINE?version=3&amp;amp;feature=player_detailpage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/IRtnTTGkINE?version=3&amp;amp;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is another video that shows how to configure this plugin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rioH85PpaXI?version=3&amp;amp;feature=player_detailpage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/rioH85PpaXI?version=3&amp;amp;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"&gt;&lt;/object&gt;&lt;/p&gt;

&lt;h1&gt;Trying this out &lt;/h1&gt;

&lt;p&gt;If you want to try it on your desktop, iPad or Android tablet. Please feel free to do it from here : &lt;a title="http://tgerm-developer-edition.na14.force.com/twinBoxMultiSelectListDemo" href="http://tgerm-developer-edition.na14.force.com/twinBoxMultiSelectListDemo"&gt;http://tgerm-developer-edition.na14.force.com/twinBoxMultiSelectListDemo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the link to gist, to create resources for plugin includes : &lt;a title="https://gist.github.com/1553837" href="https://gist.github.com/1553837"&gt;https://gist.github.com/1553837&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the gist full source code of demo visualforce page : &lt;a title="https://gist.github.com/1620745" href="https://gist.github.com/1620745"&gt;https://gist.github.com/1620745&lt;/a&gt;, code snippets embedded below for reference&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visualforce Page&lt;/strong&gt;&lt;/p&gt;
&lt;script src="https://gist.github.com/1620745.js?file=twinBoxMultiSelectList.page.html"&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Apex Controller&lt;/strong&gt;&lt;/p&gt;
&lt;script src="https://gist.github.com/1620745.js?file=twinBoxMultiSelectList_Ctlr.cls.java"&gt;&lt;/script&gt;

&lt;h1&gt;Your views ?&lt;/h1&gt;

&lt;p&gt;Looking forward to those :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-7413045100270468651?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_Qb6nrEfmvwdtCJecx7mEuOiOJY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Qb6nrEfmvwdtCJecx7mEuOiOJY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_Qb6nrEfmvwdtCJecx7mEuOiOJY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_Qb6nrEfmvwdtCJecx7mEuOiOJY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=dLlJuLMSin8:TopFtRlNT6E:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=dLlJuLMSin8:TopFtRlNT6E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=dLlJuLMSin8:TopFtRlNT6E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=dLlJuLMSin8:TopFtRlNT6E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=dLlJuLMSin8:TopFtRlNT6E:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/dLlJuLMSin8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/7413045100270468651/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=7413045100270468651" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/7413045100270468651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/7413045100270468651?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/dLlJuLMSin8/ipad-multiselect-picklist-jquery-plugin.html" title="Multiselect picklist jquery plugin for iPad and Desktop browsers" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-4MvzaaX5r_Q/TxQPTU3hTxI/AAAAAAAAJD8/kid52H8kFCo/s72-c/image_thumb5.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/ipad-multiselect-picklist-jquery-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGR385eip7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-4229914679608819311</id><published>2012-01-14T16:23:00.001+05:30</published><updated>2012-01-25T22:27:06.122+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T22:27:06.122+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharing" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Resolved : “Field is not writeable: Sobject__Share.RowCause” !</title><content type="html">&lt;p&gt;This post is about an issue that comes with Apex managed sharing, i.e. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;System.SObjectException: Field is not writeable: Sobject__Share.RowCause&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We faced this problem recently, and tried searching for this problem on force.com boards, but no solution was available, I just found few open questions like &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://boards.developerforce.com/t5/Apex-Code-Development/Urgent-help-migration-error-quot-RowCause-filed-not-writable/td-p/137271" href="http://boards.developerforce.com/t5/Apex-Code-Development/Urgent-help-migration-error-quot-RowCause-filed-not-writable/td-p/137271"&gt;http://boards.developerforce.com/t5/Apex-Code-Development/Urgent-help-migration-error-quot-RowCause-filed-not-writable/td-p/137271&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://boards.developerforce.com/t5/Apex-Code-Development/Can-Apex-Managed-Sharing-be-used-in-a-Class-declared-with-quot/td-p/164916" href="http://boards.developerforce.com/t5/Apex-Code-Development/Can-Apex-Managed-Sharing-be-used-in-a-Class-declared-with-quot/td-p/164916"&gt;http://boards.developerforce.com/t5/Apex-Code-Development/Can-Apex-Managed-Sharing-be-used-in-a-Class-declared-with-quot/td-p/164916&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;p&gt;On debugging, we found that the cause of this error was update of RowCause field on “SObject__share” record. We are not changing RowCause, but accidently coping back the same value.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;So the fix is to never try to update RowCause field once created the SObject__share record&lt;/strong&gt;&lt;/u&gt;. If you need to change the RowCause field in Sobject__Share record, then delete it and create new one.&lt;/p&gt;  &lt;p&gt;Here is a minimalistic apex test case that reproduces this issue :&lt;/p&gt;  &lt;pre class="brush:java"&gt; public static testmethod void testShareRecordUpdate() {
      // A custom standard user profile with required access on the custom object Specimen__c 
        Profile p = [SELECT Id FROM profile WHERE name='Cust Standard User'];
        // mock user for the same
        User mockUser = new User(alias = 'newUser', email='newuser@tgerm.com',
                  emailencodingkey='UTF-8', lastname='Testing', 
                  languagelocalekey='en_US', localesidkey='en_US', profileid = p.Id,
                  timezonesidkey='America/Los_Angeles', username='newuser@tgerm.com' + System.now().getTime());
        // Custom sobject with no special fields, just for sake of testing 
        Specimen__c specimen = new Specimen__c();
        
        system.runAs(mockUser) {
            insert specimen;
        }
        
        // Create an edit share
        Specimen__share readShare = new Specimen__share(
               AccessLevel = 'Edit',
               RowCause = Schema.Specimen__share.RowCause.Reason1__c,
               UserOrGroupId = Userinfo.getUserId(),
               ParentId = specimen.id
            );
        insert readShare;
        
        // One can assume some other flow, queries the same Share record and attemps the update
        Specimen__share editShare = [Select AccessLevel,RowCause from Specimen__share 
                                        where UserOrGroupId = :Userinfo.getUserId() 
                                        AND ParentId =:specimen.id 
                                        AND RowCause = :Schema.Specimen__share.RowCause.Reason1__c                         
                                        ];
        
        // Comment this line to get rid of 
        // this error : &amp;quot;Field is not writeable: Specimen__Share.RowCause&amp;quot;
        editShare.RowCause = Schema.Specimen__share.RowCause.Reason1__c;
        editShare.AccessLevel = 'Read';
        update editShare;
    }&lt;/pre&gt;

&lt;p&gt;I would say this error should be something else, as the field “RowCause” is writable on record creation but not updatable.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-4229914679608819311?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WXJthqL8OqxX5557acONU2kE6kw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WXJthqL8OqxX5557acONU2kE6kw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WXJthqL8OqxX5557acONU2kE6kw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WXJthqL8OqxX5557acONU2kE6kw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Xf7B4qCFBys:57V63MLqUos:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Xf7B4qCFBys:57V63MLqUos:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Xf7B4qCFBys:57V63MLqUos:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Xf7B4qCFBys:57V63MLqUos:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Xf7B4qCFBys:57V63MLqUos:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/Xf7B4qCFBys" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/4229914679608819311/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=4229914679608819311" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4229914679608819311?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4229914679608819311?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/Xf7B4qCFBys/field-is-not-writeable-sharerowcause.html" title="Resolved : “Field is not writeable: Sobject__Share.RowCause” !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/field-is-not-writeable-sharerowcause.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAEQ3c7eip7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-1633868847269713502</id><published>2012-01-02T15:23:00.001+05:30</published><updated>2012-01-25T22:28:22.902+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T22:28:22.902+05:30</app:edited><title>Yet another Apex Trigger Template !</title><content type="html">&lt;p&gt;I know Trigger templates are previously discussed also in great detail. We have excellent posts available by Steve Andersen(&lt;a href="https://twitter.com/#!/gokubi" target="_blank"&gt;Gokubi&lt;/a&gt;) and &lt;a href="https://twitter.com/#!/dlog" target="_blank"&gt;Mike Leach&lt;/a&gt; on the same. Here is my small journey on Triggers&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I started developing on force.com, I used bare bone approach as mentioned in Apex developer guide. &lt;/li&gt;    &lt;li&gt;After sometime I was&amp;#160; using something similar to what &lt;a href="http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers" target="_blank"&gt;Steve mentioned in his blog&lt;/a&gt;, I was happy to see that Steve suggested a similar practice. &lt;/li&gt;    &lt;li&gt;Eventually tried something that is similar to what &lt;a href="http://www.embracingthecloud.com/2010/07/08/ASimpleTriggerTemplateForSalesforce.aspx" target="_blank"&gt;Mike suggested in his blog&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;After trying all of the above trigger templates, I was still not happy when working solo or when working with a big team of engineers on the same project. I wanted something simple to adopt easily with flexibility to extend/add as required.&lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;p&gt; So, I started working on a new trigger templates with these motives in mind&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Framework/Base template code to start writing a new trigger should be minimal or none. &lt;/li&gt;    &lt;li&gt;It should allow any complex and reusable trigger code to be written. &lt;/li&gt;    &lt;li&gt;It should allow easy fixes other commonly visible problems, like trigger firing twice, as explained by &lt;a href="http://raydehler.com/cloud/clod/prevent-an-apex-trigger-from-executing-twice.html" target="_blank"&gt;Ray Dehler&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Optionally create handlers with @future support. &lt;/li&gt;    &lt;li&gt;Ability to easily order and add multiple handlers on a single trigger event. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Yet Another Trigger Template !&lt;/h3&gt;  &lt;p&gt;“&lt;strong&gt;Triggers.cls&lt;/strong&gt;” is the new Trigger template. This class doesn’t needs to be copied per sobject trigger and will be reused throughout the org. Here is the code snippet for it&lt;/p&gt; &lt;script src="https://gist.github.com/1550055.js?file=Triggers.java"&gt;&lt;/script&gt;  &lt;h3&gt;Using the template&lt;/h3&gt;  &lt;p&gt;We will again follow the same one trigger per Sobject rule and just write handlers for each event like before insert, after update etc. Handlers can be created by implementing interface “&lt;strong&gt;Triggers.Handler&lt;/strong&gt;”, only contract of this interface is to write all the trigger logic using the Trigger context variables as and when required. Here are a few sample handlers(these handlers can be nested into one big class to avoid too many classes)&lt;/p&gt; &lt;script src="https://gist.github.com/1550055.js?file=TaskAfterInsertHandler.java"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1550055.js?file=TaskBeforeInsertHandler.java"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1550055.js?file=TaskAfterUpdateHandler.java"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1550055.js?file=TaskBeforeInsertHandler2.java"&gt;&lt;/script&gt;  &lt;p&gt;Now the actual Task trigger will be as follows&lt;/p&gt; &lt;script src="https://gist.github.com/1550055.js?file=TaskTrigger.java"&gt;&lt;/script&gt;  &lt;h3&gt;Feedback &lt;/h3&gt;  &lt;p&gt;Looking forward for your views and thoughts on the same. I’m sure it’s a good topic to discuss and debate on.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-1633868847269713502?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A_dzzS3Tfo5dnCGVuR_d7gu3LaA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A_dzzS3Tfo5dnCGVuR_d7gu3LaA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A_dzzS3Tfo5dnCGVuR_d7gu3LaA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A_dzzS3Tfo5dnCGVuR_d7gu3LaA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=IbK7mAjNL2A:0SOkoa2R7rg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=IbK7mAjNL2A:0SOkoa2R7rg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=IbK7mAjNL2A:0SOkoa2R7rg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=IbK7mAjNL2A:0SOkoa2R7rg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=IbK7mAjNL2A:0SOkoa2R7rg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/IbK7mAjNL2A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/1633868847269713502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=1633868847269713502" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1633868847269713502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/1633868847269713502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/IbK7mAjNL2A/salesforce-apex-trigger-template.html" title="Yet another Apex Trigger Template !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>8</thr:total><feedburner:origLink>http://www.tgerm.com/2012/01/salesforce-apex-trigger-template.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANSHY-fyp7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-6054217469315581562</id><published>2011-12-12T15:47:00.001+05:30</published><updated>2012-01-25T22:29:59.857+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T22:29:59.857+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Expecting more Java goodness in Apex?</title><content type="html">&lt;p&gt;&lt;a href="http://blogs.developerforce.com/developer-relations/2011/12/apex-runtime-update-for-de-orgs.html" target="_blank"&gt;Apex Runtime Update&lt;/a&gt; for Developer Edition Orgs complies Apex code to Java byte code. This change is awesome from performance improvements standpoint, but shall we expect more Java into Apex also ?&lt;/p&gt;  &lt;p&gt;Few of the following Java features would be a nice addition to Apex: &lt;/p&gt; &lt;a name='more'&gt;&lt;/a&gt; &lt;h3&gt;1. Diamond operator &lt;/h3&gt;  &lt;p&gt;Why declare same Type information on both LHS and RHS with Generics. For ex. here is a redundant declaration for creating a Map&lt;/p&gt;  &lt;pre class="brush:java"&gt;Map&amp;lt;String, Set&amp;lt;Integer&amp;gt;&amp;gt; numbersByKey = new HashMap&amp;lt;String, Set&amp;lt;Integer&amp;gt;&amp;gt;();&lt;/pre&gt;

&lt;p&gt;With Java 7, the same could be done simply by only specifying type information on LHS, as shown below. This would be a really nice feature to have in Apex also.&lt;/p&gt;

&lt;pre class="brush:java"&gt;Map&amp;lt;String, Set&amp;lt;Integer&amp;gt;&amp;gt; numbersByKey = new HashMap&amp;lt;&amp;gt;();&lt;/pre&gt;

&lt;p&gt;Posted the same as Idea : &lt;a title="https://sites.secure.force.com/success/ideaView?id=08730000000bZ0bAAE" href="https://sites.secure.force.com/success/ideaView?id=08730000000bZ0bAAE"&gt;https://sites.secure.force.com/success/ideaView?id=08730000000bZ0bAAE&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;2. Support for Switch Case statement &lt;/h3&gt;

&lt;p&gt;Community is demanding this a lot, for more than a year. Please promote this idea on IdeaExchange &lt;a title="http://success.salesforce.com/ideaView?id=08730000000BrSIAA0" href="http://success.salesforce.com/ideaView?id=08730000000BrSIAA0"&gt;http://success.salesforce.com/ideaView?id=08730000000BrSIAA0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently Java 7, also added support for Strings apart from other primitives to Switch case, that could be a huge ease for Apex programmers too. &lt;/p&gt;

&lt;h3&gt;3. Have Generics support in Apex Language&lt;/h3&gt;

&lt;p&gt;Generics are partially supported in Apex, you must be using them with Collections and Batch Apex. But you can’t declare your own classes to have similar support like&lt;/p&gt;

&lt;pre class="brush:java"&gt;/**
 * Generic version of the Box class.
 * @param &amp;lt;T&amp;gt; the type of value being boxed
 */

public class Box&amp;lt;T&amp;gt; {

    private T t; // T stands for &amp;quot;Type&amp;quot;

    public void add(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}&lt;/pre&gt;

&lt;p&gt;For more details about Generics please check : &lt;a title="http://docs.oracle.com/javase/1.5.0/docs/guide/language/generics.html" href="http://docs.oracle.com/javase/1.5.0/docs/guide/language/generics.html"&gt;http://docs.oracle.com/javase/1.5.0/docs/guide/language/generics.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again found an Idea posted for the same : &lt;a title="http://success.salesforce.com/ideaView?id=08730000000aDnYAAU" href="http://success.salesforce.com/ideaView?id=08730000000aDnYAAU"&gt;http://success.salesforce.com/ideaView?id=08730000000aDnYAAU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;4. Support for Reflection &lt;/h3&gt;

&lt;p&gt;Reflection API in Java is the key to so many rich frameworks and open source good ness. Apex partially supports some of that via giving good describe information on Sobjects. If the same could be made available for apex classes, that would open many possibilities for richer APIs and frameworks on Apex.&lt;/p&gt;

&lt;p&gt;For more details about reflection please check this WIKI article : &lt;a title="http://en.wikipedia.org/wiki/Reflection_(computer_science)" href="http://en.wikipedia.org/wiki/Reflection_(computer_science)"&gt;http://en.wikipedia.org/wiki/Reflection_(computer_science)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, idea already posted on App Exchange for the same : &lt;a title="http://success.salesforce.com/ideaView?id=08730000000BrVaAAK" href="http://success.salesforce.com/ideaView?id=08730000000BrVaAAK"&gt;http://success.salesforce.com/ideaView?id=08730000000BrVaAAK&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Your views ? &lt;/h3&gt;

&lt;p&gt;Want to make Apex even more awesome, please post ideas and share your views ?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-6054217469315581562?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6QHjhDpaLrIT5smk3E1VY2Eb6hU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6QHjhDpaLrIT5smk3E1VY2Eb6hU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6QHjhDpaLrIT5smk3E1VY2Eb6hU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6QHjhDpaLrIT5smk3E1VY2Eb6hU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=99VAosr9SuQ:2zgL39h4-ac:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=99VAosr9SuQ:2zgL39h4-ac:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=99VAosr9SuQ:2zgL39h4-ac:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=99VAosr9SuQ:2zgL39h4-ac:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=99VAosr9SuQ:2zgL39h4-ac:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/99VAosr9SuQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/6054217469315581562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=6054217469315581562" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/6054217469315581562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/6054217469315581562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/99VAosr9SuQ/java-features-in-salesforce-apex.html" title="Expecting more Java goodness in Apex?" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.tgerm.com/2011/12/java-features-in-salesforce-apex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UHQ3czeip7ImA9WhRQFUU.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-4734813088457363081</id><published>2011-12-11T10:54:00.001+05:30</published><updated>2011-12-11T10:57:12.982+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-11T10:57:12.982+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="Remoting" /><category scheme="http://www.blogger.com/atom/ns#" term="charting" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Easy Visualforce charts with Javascript Remoting &amp; Google Charts API.</title><content type="html">&lt;p&gt;We all know &lt;a href="http://blogs.developerforce.com/tech-pubs/2011/09/introducing-visualforce-charting.html" target="_blank"&gt;native visualforce charting&lt;/a&gt; is coming soon to the platform. Still, we have to cater customer requirements and can’t wait for this PILOT feature to become GA. So here is a quick and simplistic example to render charts at blazing fast speeds using &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_js_remoting.htm" target="_blank"&gt;Javascript remoting&lt;/a&gt; and &lt;a href="http://code.google.com/apis/chart/" target="_blank"&gt;Google Charts API&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Code for both Apex and Visualforce is kept minimal and simplistic to be self explanatory. &lt;/p&gt;  &lt;h3&gt;Apex Global Controller&lt;/h3&gt;  &lt;p&gt;Apex controller is a global class with @RemoteAction. It loads most recent 10 opps in the remote method.&lt;/p&gt;  &lt;pre class="brush:java"&gt;global with sharing class GoogleChartsController {
    
    /**
      Loads most recent 10 Opportunities
    */
    @RemoteAction    
    global static Opportunity[] loadOpps() {
        return [select Id, Name, ExpectedRevenue, Amount from Opportunity order by CreatedDate DESC limit 10];
    }   

}&lt;/pre&gt;

&lt;h3&gt;Visualforce page&lt;/h3&gt;

&lt;p&gt;Added decent comments in code itself to make it easier to relate and explain.&lt;/p&gt;

&lt;pre class="brush:xml"&gt;&amp;lt;apex:page controller=&amp;quot;GoogleChartsController&amp;quot; sidebar=&amp;quot;false&amp;quot;&amp;gt; 
    &amp;lt;!-- Google API inclusion --&amp;gt;
    &amp;lt;apex:includeScript id=&amp;quot;a&amp;quot; value=&amp;quot;https://www.google.com/jsapi&amp;quot; /&amp;gt;
    
    &amp;lt;apex:sectionHeader title=&amp;quot;Google Charts + Javascript Remoting&amp;quot; subtitle=&amp;quot;Demoing - Opportunities by Exepected Revenue&amp;quot;/&amp;gt;

    &amp;lt;!-- Google Charts will be drawn in this DIV --&amp;gt;
    &amp;lt;div id=&amp;quot;chartBlock&amp;quot; /&amp;gt;
    
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
        // Load the Visualization API and the piechart package.
        google.load('visualization', '1.0', {'packages':['corechart']});
      
        // Set a callback to run when the Google Visualization API is loaded.
        google.setOnLoadCallback(initCharts);
  
        function initCharts() {         
          // Following the usual Remoting syntax
          // [&amp;lt;namespace&amp;gt;.]&amp;lt;controller&amp;gt;.&amp;lt;method&amp;gt;([params...,] &amp;lt;callbackFunction&amp;gt;(result, event) {...}
          // namespace : abhinav
          // controller : GoogleChartsController
          // method : loadOpps
          abhinav.GoogleChartsController.loadOpps( 
                 function(result, event){  
                     // load Column chart
                     var visualization = new google.visualization.ColumnChart(document.getElementById('chartBlock'));
                     // Prepare table model for chart with columns
                     var data = new google.visualization.DataTable();
                     data.addColumn('string', 'Opportunity');
                     data.addColumn('number', 'Expected Revenue');
                     data.addColumn('number', 'Amount');    
                     // add rows from the remoting results
                     for(var i =0; i&amp;lt;result.length;i++){
                        var r = result[i];
                        data.addRow([r.Name, r.ExpectedRevenue, r.Amount]); 
                      }
                    // all done, lets draw the chart with some options to make it look nice.
                    visualization.draw(data, {legend : {position: 'top', textStyle: {color: 'blue', fontSize: 10}}, width:window.innerWidth,vAxis:{textStyle:{fontSize: 10}},hAxis:{textStyle:{fontSize: 10},showTextEvery:1,slantedText:false}});
              }, {escape:true});
          } 
    &amp;lt;/script&amp;gt;
&amp;lt;/apex:page&amp;gt;&lt;/pre&gt;

&lt;h3&gt;&amp;#160;&lt;/h3&gt;

&lt;h3&gt;Output &lt;/h3&gt;

&lt;p&gt;Here is how it comes out in visualforce page. Try this demo by directly copy pasting the above code snippets above, you will for sure enjoy the fast rendering speed of page and charts.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-4teUhO9vzaI/TuQ-a6G3vAI/AAAAAAAAIek/PPov8qoJotg/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-iPOPREcK2zU/TuQ-crqiftI/AAAAAAAAIes/0m9sIZsY-7U/image_thumb%25255B2%25255D.png?imgmax=800" width="634" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;&lt;font size="4"&gt;Using Native Visualforce charting with Javascript remoting &lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;I really liked the way native Visualforce charting is designed, its having variety of ways to accept data source both server and client side i.e. here are the few ways (clicking on hyperlinks below will take you to relevant Visualforce developer guide sections)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;With &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_charting_overview.htm#pages_charting_simple_example" target="_blank"&gt;pure Apex data source in form of custom apex classes like PieWedgeData&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;With &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_charting_overview.htm#pages_charting_providing_data_via_controller" target="_blank"&gt;Sobjects and an expression that represents a controller method reference&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;With &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_charting_overview.htm#pages_charting_providing_data_via_js_function" target="_blank"&gt;a string representing a JavaScript function, that can optionally use Javascript Remoting also.&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;With &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_charting_overview.htm#pages_charting_chart_data_via_javascript"&gt;a string representing a JavaScript array&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Though its important to understand the native visualforce charting limitations also, please check &lt;a href="http://www.salesforce.com/us/developer/docs/pages/Content/pages_charting_limitations.htm" target="_blank"&gt;this link for details.&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-4734813088457363081?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SDpcTA85Z6kUzz2gS8Mo9ND3Sh4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SDpcTA85Z6kUzz2gS8Mo9ND3Sh4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SDpcTA85Z6kUzz2gS8Mo9ND3Sh4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SDpcTA85Z6kUzz2gS8Mo9ND3Sh4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=l5_mQJWKtRU:ephGws8PBaE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=l5_mQJWKtRU:ephGws8PBaE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=l5_mQJWKtRU:ephGws8PBaE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=l5_mQJWKtRU:ephGws8PBaE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=l5_mQJWKtRU:ephGws8PBaE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/l5_mQJWKtRU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/4734813088457363081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=4734813088457363081" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4734813088457363081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4734813088457363081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/l5_mQJWKtRU/apex-javascript-remoting-google-charts.html" title="Easy Visualforce charts with Javascript Remoting &amp;amp; Google Charts API." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-iPOPREcK2zU/TuQ-crqiftI/AAAAAAAAIes/0m9sIZsY-7U/s72-c/image_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2011/12/apex-javascript-remoting-google-charts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMRnwyeCp7ImA9WhRSFkQ.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-498281220420181307</id><published>2011-11-19T14:23:00.001+05:30</published><updated>2011-11-19T14:38:07.290+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-19T14:38:07.290+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="collections" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="opensource" /><title>XCollections - Use Custom Apex Classes in Map &amp; Set.</title><content type="html">&lt;p&gt;Apex currently doesn’t supports User defined Classes/Types(UDT) to be used in Map and Set classes. This is a very hurting limitation in some scenarios. &lt;/p&gt;  &lt;p&gt;To overcome this limitation, “XCollections” Apex API project was started few weeks back as an independent project on github. This API as of now has two major classes called XMap and XSet that allows use of UDTs. &lt;/p&gt;  &lt;p&gt;Regarding XCollections, I had a discussion with two very respected and well known guys in force.com community( brief intros added below, to help my new force.com peers)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://twitter.com/#!/richardvanhook" target="_blank"&gt;Richard Vanhook&lt;/a&gt;(Force.com MVP &amp;amp; Tech. Sol Architect @ Salesforce.com) &lt;/li&gt;    &lt;li&gt;&amp;#160;&lt;a href="https://twitter.com/#!/fractastical" target="_blank"&gt;Joel Dietz&lt;/a&gt;(Force.com MVP &amp;amp; Tech Architect @T’quilla Ltd) about XCollections. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We decided that better place for this API is in a sub repository named “&lt;a href="https://github.com/apex-commons/collections" target="_blank"&gt;collections&lt;/a&gt;” under very popular &lt;a href="https://github.com/apex-commons" target="_blank"&gt;apex-commons&lt;/a&gt; framework. So going forward XCollections will be available as “&lt;a href="https://github.com/apex-commons/collections" target="_blank"&gt;collections&lt;/a&gt;” in apex-commons. &lt;/p&gt;  &lt;p&gt;Today, I wrapped up long time pending tasks like &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Code clean up &lt;/li&gt;    &lt;li&gt;Readme.md in github flavored markdown. &lt;/li&gt;    &lt;li&gt;Test cases &lt;/li&gt;    &lt;li&gt;And final push and pull requests for apex-commons :) (waiting for the merge) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can find complete details about this project and how to use the API here : &lt;a title="https://github.com/abhinavguptas/collections" href="https://github.com/abhinavguptas/collections"&gt;https://github.com/abhinavguptas/collections&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;References&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://github.com/apex-commons" target="_blank"&gt;apex-commons&lt;/a&gt;&amp;#160; : Open source(github) Library of utility classes about string, collections, http etc. &lt;/li&gt;    &lt;li&gt;“&lt;a href="https://github.com/apex-commons/collections" target="_blank"&gt;collections&lt;/a&gt;” repository under apex-commons, for all Collections related utilities. &lt;/li&gt;    &lt;li&gt;Previous blog post about &lt;a href="http://www.tgerm.com/2011/07/xcollections-using-udt-with-map-set-in.html" target="_blank"&gt;XCollections - Using UDT with Map &amp;amp; Set in Apex !&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Your views and feedback !&lt;/h3&gt;  &lt;p&gt;Always&amp;#160; appreciate &amp;amp; love to discuss your feedback and views, so looking forward to those :) &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-498281220420181307?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YOd-7iSc7yoTcnHjZmolGdQnS_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YOd-7iSc7yoTcnHjZmolGdQnS_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YOd-7iSc7yoTcnHjZmolGdQnS_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YOd-7iSc7yoTcnHjZmolGdQnS_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=p_Tz1OH5114:JtO885MX8KY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=p_Tz1OH5114:JtO885MX8KY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=p_Tz1OH5114:JtO885MX8KY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=p_Tz1OH5114:JtO885MX8KY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=p_Tz1OH5114:JtO885MX8KY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/p_Tz1OH5114" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/498281220420181307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=498281220420181307" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/498281220420181307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/498281220420181307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/p_Tz1OH5114/apex-currently-doesnt-supports-user.html" title="XCollections - Use Custom Apex Classes in Map &amp;amp; Set." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2011/11/apex-currently-doesnt-supports-user.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHSXc6cSp7ImA9WhRSFU8.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-3232472232661429791</id><published>2011-11-17T15:24:00.001+05:30</published><updated>2011-11-17T15:25:38.919+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-17T15:25:38.919+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="esapi" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Force.com ESAPI v0.5 &amp; death of Apex-CRUD-FLS-Validator API.</title><content type="html">&lt;p&gt;“Apex-CRUD-FLS-Validator” was an open source project I started few days back on github. Motive of this project was to add some handy apis that were missing previously in &lt;a href="http://code.google.com/p/force-dot-com-esapi" target="_blank"&gt;Force.com ESAPI v0.4&lt;/a&gt;. Those missing APIs on a high level were &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;operation to assert() and throw exception if CRUD/FLS is violated.&lt;/u&gt; We found it better to crash the page for security error like Salesforce does, so that admin can give the required access. Showing blank values or hiding items was a challenge to handle in complex screens. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;operation to check if CRUD/FLS is available on a given Sobject/Fields&lt;/u&gt;. This information is used later to show/hide a few links/buttons/sections. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;ability to cache the field describe call and reuse it across.&lt;/u&gt;&lt;strong&gt; &lt;/strong&gt;This is important, as we are already caching describe information as part of other requirement, and don’t want to spend more describe calls for security enforcement on same sobject/fields. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Apex-CRUD-FLS-Validator APIs merged with Force.com ESAPI&lt;/h3&gt;  &lt;p&gt;To merge these Apex-CRUD-FLS-Validator APIs with Force.com ESAPI, I had a discussion with &lt;a href="http://www.linkedin.com/in/yoelgluck" target="_blank"&gt;Yoel Gluck&lt;/a&gt;. Yoel maintains the Google Code project for ESAPI and is Lead Product Security Engineer at Salesforce. In our discussions about adding these new APIs to the Force.com ESAPI project we figured out plan to merge the APIs. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.linkedin.com/pub/neal-harris/29/321/bab" target="_blank"&gt;Neal Harris&lt;/a&gt;(Associate Product Security Engineer at Salesforce.com) is the man who finally made this API merge happen, he introduced following new APIs to release out&amp;#160; v0.5 of Force.com &lt;a href="http://code.google.com/p/force-dot-com-esapi" target="_blank"&gt;ESAPI&lt;/a&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Added new functions isAuthorizedToView, isAuthorizedToCreate, isAuthorizedToUpdate, and isAuthorizedToDelete. &lt;/li&gt;    &lt;li&gt;Added new functions getViewableFields, getUpdateableFields, and getCreatableFields accepting an sObjectType as input. &lt;/li&gt;    &lt;li&gt;Added a describe info cache. Now all the field desc information is cached &lt;/li&gt;    &lt;li&gt;Apart from caching the desc information, we are giving a pluggable desc info cache support. This will help those who are already caching desc information in their own apex data structures, those same can be easily reused with ESAPI now, with small piece of code change. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Apex-CRUD-FLS-Validator is dead now &lt;/h3&gt;  &lt;p&gt;Apex-CRUD-FLS-Validator project is no more on github now, any related documentation on my blog etc is also deleted to avoid any ambiguity. &lt;/p&gt;  &lt;h3&gt;Coming up next !&lt;/h3&gt;  &lt;p&gt;Coming up next is a couple of blog posts and wiki page updates about the new APIs, code samples and tricks to make most out of them.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-3232472232661429791?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ilTzPdjXMF4PNI8BdARzOwp9Qog/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ilTzPdjXMF4PNI8BdARzOwp9Qog/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ilTzPdjXMF4PNI8BdARzOwp9Qog/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ilTzPdjXMF4PNI8BdARzOwp9Qog/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I15FSNlHK3I:J_KOpEM9nhQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I15FSNlHK3I:J_KOpEM9nhQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I15FSNlHK3I:J_KOpEM9nhQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=I15FSNlHK3I:J_KOpEM9nhQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=I15FSNlHK3I:J_KOpEM9nhQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/I15FSNlHK3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/3232472232661429791/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=3232472232661429791" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3232472232661429791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3232472232661429791?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/I15FSNlHK3I/apex-crud-fls-validator-was-open-source.html" title="Force.com ESAPI v0.5 &amp;amp; death of Apex-CRUD-FLS-Validator API." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2011/11/apex-crud-fls-validator-was-open-source.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8GRHY4eCp7ImA9WhRSFE0.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-81359232523106657</id><published>2011-11-12T17:13:00.001+05:30</published><updated>2011-11-16T06:57:05.830+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-16T06:57:05.830+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Self Explanatory naming convention for your Apex Classes</title><content type="html">&lt;p&gt;I am following an apex class naming convention in a couple of projects for a while and its turning up well and big timesaver for me, so thought of sharing with you all. &lt;/p&gt;  &lt;h3&gt;Why a special naming convention ?&lt;/h3&gt;  &lt;p&gt;You must be thinking, “why a special naming convention ?“ This is required because apex classes doesn’t support nested namespaces or packages(java) to organize code in a clean way. So mostly the “classes” area for an org with reasonable code ends up in a mess. Its hard to tell which class is of what use most of the times. A good example with few classes would be&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ContactDuplicateCheck &amp;lt; Used in contact dedupe trigger &lt;/li&gt;    &lt;li&gt;OpportunityAmountValidator &amp;lt; Used to validate opportunity amount in a trigger on opporunity &lt;/li&gt;    &lt;li&gt;OppLoadController &amp;lt; Visualforce controller &lt;/li&gt;    &lt;li&gt;AccountLoader &amp;lt; Visualforce extension used to load accounts &lt;/li&gt;    &lt;li&gt;ContactMergeExtension &amp;lt; Contact merge based on custom logic, an extension class for a VF page. &lt;/li&gt;    &lt;li&gt;ContactService &amp;lt; WebService based on Apex &lt;/li&gt;    &lt;li&gt;BulkRecordCleaner &amp;lt; Batch job that cleans the records. &lt;/li&gt;    &lt;li&gt;NightlyAccountSync &amp;lt; Nightly scheduled job that syncs the system accounts. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It would be hard to tell the use/purpose of above classes, without the desc I added. But this situation is more panic, when many developers are working on the same code base.&lt;/p&gt;  &lt;h3&gt;Better Naming convention !&lt;/h3&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h4&gt;Approach 1 : Prefixing class names&lt;/h4&gt;  &lt;p&gt;Apex class names can be prefixed based on the functionality, feature etc&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;“{prefix}_classname.cls”&lt;/strong&gt;&lt;/p&gt;  &lt;h4&gt;Approach 2 : Suffixing class names&lt;/h4&gt;  &lt;p align="left"&gt;UPDATE : 16/Nov/2011 : Based on discussion in post comments with @jpseabury &amp;amp; @RalphCallaway, another approach was highlighted to do the suffixing in similar way. The plus of doing this is “Classes would be correctly sortable in “Apex Classes” section in setup area.” For more details on this, please check the respective comments in this post.&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;“classname_{suffix}.cls”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Suggested prefixes/suffixes based on scenario&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;page&lt;/strong&gt; : For all controller and extension classes connected to visualforce pages. Ex. names would be page_OppLoadController, page_AccountLoader. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;trgr&lt;/strong&gt; : Any class used by triggers. Example class names would trgr_AccountTriggerHandler, trgr_ContactDuplicateCheck, trgr_OpportunityAmountValidator &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;hlpr&lt;/strong&gt; : For all the classes, that are having reusable code for helper or utility functions. For ex. any code that is common and reused between triggers and page controllers. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;btch&lt;/strong&gt; : Classes for batch jobs. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;schd&lt;/strong&gt; : Classes for scheduled jobs. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;glbl&lt;/strong&gt; : All global classes. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ws&lt;/strong&gt; : All classes declaring web services in them. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;test&lt;/strong&gt; : For all test classes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can easily imagine, how easy would be the life on a reasonably big project with many apex classes. &lt;/p&gt;  &lt;p&gt;This is how the above class list will look after prefixing.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;trgr_ContactDuplicateCheck &lt;/li&gt;    &lt;li&gt;trgr_OpportunityAmountValidator &lt;/li&gt;    &lt;li&gt;page_OppLoadController &lt;/li&gt;    &lt;li&gt;page_AccountLoader &lt;/li&gt;    &lt;li&gt;page_ContactMergeExtension &lt;/li&gt;    &lt;li&gt;ws_ContactService &lt;/li&gt;    &lt;li&gt;btch_BulkRecordCleaner &lt;/li&gt;    &lt;li&gt;schd_NightlyAccountSync &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Isn’t it cleaner and self explanatory. &lt;/p&gt;  &lt;ul&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt;  &lt;h3&gt;Your thoughts and views ?&lt;/h3&gt;  &lt;p&gt;Looking forward to those …&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-81359232523106657?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ItnZg9adEP1C-RM71ym3w1YlmDU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ItnZg9adEP1C-RM71ym3w1YlmDU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ItnZg9adEP1C-RM71ym3w1YlmDU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ItnZg9adEP1C-RM71ym3w1YlmDU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Pa6YKIZ2lTI:xZXMq4dYtGY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Pa6YKIZ2lTI:xZXMq4dYtGY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Pa6YKIZ2lTI:xZXMq4dYtGY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=Pa6YKIZ2lTI:xZXMq4dYtGY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=Pa6YKIZ2lTI:xZXMq4dYtGY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/Pa6YKIZ2lTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/81359232523106657/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=81359232523106657" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/81359232523106657?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/81359232523106657?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/Pa6YKIZ2lTI/apex-class-naming-convention-suggestion.html" title="Self Explanatory naming convention for your Apex Classes" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://www.tgerm.com/2011/11/apex-class-naming-convention-suggestion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8EQ3Y8eip7ImA9WhRTF0s.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-2821587266340945696</id><published>2011-11-08T20:31:00.001+05:30</published><updated>2011-11-08T20:36:42.872+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-08T20:36:42.872+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="richvisualforceeditor" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Rich Visualforce Editor, major feature update live !</title><content type="html">&lt;p&gt;For those who don’t know about &lt;a href="https://github.com/ajayhada/Rich-VisualForce-Editor/" target="_blank"&gt;Rich Visualforce Editor&lt;/a&gt;, its discussed in my &lt;a href="http://www.tgerm.com/2011/11/visualforce-editor-content-assist.html" target="_blank"&gt;previous blog post.&lt;/a&gt; On a high level it gives content assist support in visualforce. &lt;/p&gt;  &lt;h1&gt;New updates !!! &lt;/h1&gt;  &lt;p&gt;&lt;a href="https://twitter.com/#!/ajayhada" target="_blank"&gt;@AjayHada&lt;/a&gt; added a couple of new features to &lt;a href="https://github.com/ajayhada/Rich-VisualForce-Editor/" target="_blank"&gt;Rich Visualforce Editor&lt;/a&gt;, like :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Context sensitive help for visualforce tags, i.e. select the tag name and press &lt;strong&gt;“CTRL + 1”&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Toolbar icons to quickly launch visualforce and apex developer guide right inside eclipse. &lt;/li&gt;    &lt;li&gt;Contextual icons in content assist box for tags and attributes. &lt;/li&gt;    &lt;li&gt;Update site support. Now updating the plugin is super easy. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Further details below about each update :&lt;/p&gt;  &lt;h1&gt;Context sensitive help for Visualforce tags !&lt;/h1&gt;  &lt;p&gt;Now if you need to know more about a visualforce tag you are currently coding around. Just select the tag name after “apex:”, as show below&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-As0P-zjcSLM/TrlEL5bPdzI/AAAAAAAAIQc/Acf1m5wqfHU/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="rich visualforce editor context sensitive help by keyboard shortkey" border="0" alt="rich visualforce editor context sensitive help by keyboard shortkey" src="http://lh4.ggpht.com/-g-fsMFPcKWM/TrlEM0GPScI/AAAAAAAAIQk/Bh0VrA4S8sE/image_thumb%25255B1%25255D.png?imgmax=800" width="438" height="158" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-5cPumvrA9Hw/TrlEN0gaQ5I/AAAAAAAAIQs/nEhoOTvGho0/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="rich visualforce editor help page opened" border="0" alt="rich visualforce editor help page opened" src="http://lh3.ggpht.com/-7Auf5JDL6pw/TrlEO5-u4CI/AAAAAAAAIQ0/mxacg6Mnnuw/image_thumb%25255B3%25255D.png?imgmax=800" width="511" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;TODO &lt;/strong&gt;: Please note, we are working on an enhancement that will open context sensitive help on a tag without selecting the tag name. It will be out soon in a week time.&lt;/p&gt;  &lt;h1&gt;Toolbar icons for Visualforce &amp;amp; apex developer guide&lt;/h1&gt;  &lt;p&gt;Two new toolbar icons are added to quickly launch Apex and Visualforce developer guide right inside eclipse. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-V7Q_k--ivUs/TrlEPwF3s8I/AAAAAAAAIQ8/B45BboeRDC4/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="toolbar icons to launch apex &amp;amp; visualforce developer guides in eclipse" border="0" alt="toolbar icons to launch apex &amp;amp; visualforce developer guides in eclipse" src="http://lh4.ggpht.com/-fSLZqhm6uTU/TrlEQ-I7wII/AAAAAAAAIRE/kT5EoHL1tdw/image_thumb%25255B5%25255D.png?imgmax=800" width="515" height="242" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Contextual icons in content assist box for tags and attributes.&lt;/h1&gt;  &lt;p&gt;Content assist box is beautified now to support different icons for tags and attributes as shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-fgq90djT980/TrlER0sIzcI/AAAAAAAAIRM/7oBSM3Od83U/s1600-h/image%25255B35%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="tag icon in content assist" border="0" alt="tag icon in content assist" src="http://lh3.ggpht.com/-LRXob1nn9C8/TrlESxe6ieI/AAAAAAAAIRU/3EWV76c4vM8/image_thumb%25255B21%25255D.png?imgmax=800" width="305" height="231" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/-aM-lCcnzfEk/TrlET337gGI/AAAAAAAAIRc/0Hf497d2Gls/s1600-h/image%25255B36%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="attribute icon in content assist" border="0" alt="attribute icon in content assist" src="http://lh6.ggpht.com/-F0KzyOx4Uu4/TrlEVPqQjKI/AAAAAAAAIRk/d57Aet7Zcic/image_thumb%25255B22%25255D.png?imgmax=800" width="353" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Update site support &lt;/h1&gt;  &lt;p&gt;Now less of manual intervention is required in updating the rich visualforce editor. It supports Update site from this version. To update, please follow these steps&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Goto “About Eclipse” dialog.&amp;#160; To get this dialog, Mac users “Eclipse &amp;gt; About Eclipse”, Windows/Linux users, “help &amp;gt; about eclipse”.&lt;a href="http://lh3.ggpht.com/-CFlfpTa-hKI/TrlEVzNmB1I/AAAAAAAAIRs/SxVOUGbQYEU/s1600-h/image%25255B17%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 8px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="About eclipse dialog" border="0" alt="About eclipse dialog" src="http://lh4.ggpht.com/-REYkZbF5gCA/TrlEWwS_8VI/AAAAAAAAIR0/lADayAwzUiY/image_thumb%25255B9%25255D.png?imgmax=800" width="429" height="252" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Hit the “Installation details” button. &lt;/li&gt;    &lt;li&gt;Hit Update button in next dialog as indicated below. Please agree and complete the next screens on the update flow&amp;#160; : &lt;a href="http://lh4.ggpht.com/-dWieStXp0RY/TrlEX_NjWvI/AAAAAAAAIR8/NThZg7KWgSQ/s1600-h/image%25255B23%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 13px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Dialog after hitting the update button" border="0" alt="Dialog after hitting the update button" src="http://lh6.ggpht.com/-poBLuJFDX3Y/TrlEZOmg1aI/AAAAAAAAISE/A2Q54_8qx3s/image_thumb%25255B13%25255D.png?imgmax=800" width="487" height="427" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Roadmap&lt;/h1&gt;  &lt;p&gt;We are working in couple of more features as mentioned in TODO section of &lt;a href="http://www.tgerm.com/2011/11/visualforce-editor-content-assist.html" target="_blank"&gt;my previous post&lt;/a&gt;. &lt;/p&gt;  &lt;h1&gt;Feedback &amp;amp; Views &lt;/h1&gt;  &lt;p&gt;Looking forward to those !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-2821587266340945696?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wqd9d9_J2kzV8-iMPdCWJywZhBc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wqd9d9_J2kzV8-iMPdCWJywZhBc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wqd9d9_J2kzV8-iMPdCWJywZhBc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wqd9d9_J2kzV8-iMPdCWJywZhBc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6uzP7nwjn8w:smdZlZPcHSY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6uzP7nwjn8w:smdZlZPcHSY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6uzP7nwjn8w:smdZlZPcHSY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6uzP7nwjn8w:smdZlZPcHSY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6uzP7nwjn8w:smdZlZPcHSY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/6uzP7nwjn8w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/2821587266340945696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=2821587266340945696" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2821587266340945696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2821587266340945696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/6uzP7nwjn8w/rich-visualforce-editor-major-feature.html" title="Rich Visualforce Editor, major feature update live !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-g-fsMFPcKWM/TrlEM0GPScI/AAAAAAAAIQk/Bh0VrA4S8sE/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://www.tgerm.com/2011/11/rich-visualforce-editor-major-feature.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GSHk6eip7ImA9WhRTGEk.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-4697801947412937881</id><published>2011-11-02T22:01:00.001+05:30</published><updated>2011-11-09T18:50:29.712+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T18:50:29.712+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="richvisualforceeditor" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Rich Visualforce Editor that finally supports Content Assist !</title><content type="html">&lt;p&gt;We all miss content assist support in Force.com IDE Visualforce editor. My previous attempt of &lt;a href="http://www.tgerm.com/2011/10/visualforce-templates-snippets-forcecom.html" target="_blank"&gt;using eclipse code templates&lt;/a&gt; was a patch to fill this gap. Good news now is, my colleague &lt;a href="https://twitter.com/#!/ajayhada" target="_blank"&gt;@AjayHada&lt;/a&gt; is creating a Visualforce editor, that will give decent code assistance support on typical “CTRL + SPACE” hit. &lt;/p&gt;  &lt;h3&gt;Meet @AjayHada !&lt;/h3&gt;  &lt;p&gt;Before we go any further, let me introduce you all with &lt;a href="https://twitter.com/#!/ajayhada" target="_blank"&gt;@AjayHada&lt;/a&gt;. He is a J2EE champ with a decade of experience in developing applications ranging from Supply chain management, ERP and Social Event management.&lt;/p&gt;  &lt;h3&gt;AjayHada’s experiences with Force.com IDE :-/&lt;/h3&gt;  &lt;p&gt;Ajay recently started learning and developing on Force.com platform. After a few days of flying in clouds, his major point of frustration was Force.com IDE, because of its well known limited capabilities. Being a Java guy by heart, he decided to write an Eclipse plugin to fill this long void, and he started an open source project for visualforce editor. After a few hours of research and RnD he was able to come up with an alpha version of this editor.&lt;/p&gt;  &lt;p&gt;This editor is available on github here : &lt;a title="https://github.com/ajayhada/Rich-VisualForce-Editor" href="https://github.com/ajayhada/Rich-VisualForce-Editor"&gt;https://github.com/ajayhada/Rich-VisualForce-Editor&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Rich Visualforce Editor Plugin for Force.com IDE&lt;/h3&gt;  &lt;p&gt;This editor in its infant stage is supporting content assist for most commonly used visualforce tags.&lt;/p&gt;  &lt;h4&gt;How to launch ?&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-yzHWiiv7RnY/TrFwPLInOoI/AAAAAAAAH1E/-aRD7PreeWg/s1600-h/image%25255B18%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 32px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="launching rich visualforce editor" border="0" alt="launching rich visualforce editor" align="left" src="http://lh3.ggpht.com/-3gSJ3Fo6rVE/TrFwQ1AuhbI/AAAAAAAAH1M/lGKeFgQYdPY/image_thumb%25255B12%25255D.png?imgmax=800" width="446" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="3"&gt;Right click on any Visualforce page, to launch the popup menu. &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="3"&gt;Select “Open With” menu item. &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="3"&gt;In the sub menu select “Rich Visualforce Editor”.&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h4&gt;Content assist in action !&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-dySFBIl-BrM/TrFwRwLH-UI/AAAAAAAAH1U/80ZtlHV62Fs/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="control space with visualforce editor tags" border="0" alt="control space with visualforce editor tags" src="http://lh6.ggpht.com/-JoZkt0UAzmM/TrFwTTqvCRI/AAAAAAAAH1c/PC5aR_FzvsU/image_thumb%25255B2%25255D.png?imgmax=800" width="340" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;CTRL + SPACE in action for tags&lt;/em&gt; &lt;/h5&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-m7xhQqU4YzE/TrFwUmKbJpI/AAAAAAAAH1k/2StO33M8ATw/s1600-h/image%25255B8%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="tag specific attributes in visualforce editor" border="0" alt="tag specific attributes in visualforce editor" src="http://lh4.ggpht.com/-XxNwtZCI_co/TrFwWQJZR6I/AAAAAAAAH1s/Dg2p17VamYc/image_thumb%25255B4%25255D.png?imgmax=800" width="380" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;CTRL + SPACE assistance for tag specific attributes&lt;/em&gt;&lt;/h5&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h3&gt;Liked it, How to install ?&lt;/h3&gt;  &lt;p&gt;You can download this zip “rich.visual.force.editor.plugin.zip” from &lt;a href="https://github.com/downloads/ajayhada/Rich-VisualForce-Editor/rich.visualforce.editor.plugin.zip" target="_blank"&gt;here&lt;/a&gt;. After download extract the zip and copy “VFEdit_xxxxx.jar” to “eclipse install folder/plugins”. Restart eclipse to reflect the changes.&lt;/p&gt;  &lt;h3&gt;Rich Visualforce Editor Roadmap &amp;amp; TODOs&lt;/h3&gt;  &lt;p&gt;Following are the features planned in next release. You are more than welcome, to fork and contribute to any of these.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HTML5 tag support will be added to future versions &lt;/li&gt;    &lt;li&gt;Only applicable tags will be visible inside tags like apex:param will only be visible for applicable parent tags &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Display validation errors for apex and html tags &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Used attributes will be removed from the suggestion box. &lt;/li&gt;    &lt;li&gt;Suggestion box will also show some mark to show that tag is related to APEX, or HTML4, or HTML5 &lt;/li&gt;    &lt;li&gt;Proper Tag, Attribute, Text, Comment color scheme &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Context sensitive help within IDE on pressing a hot key for visualforce tags.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Support for “plugin update site” for all known pros. &lt;/li&gt;    &lt;li&gt;Support for dynamic update of tags and attributes, as per new Salesforce releases. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Help required from Force.com IDE team !&lt;/h3&gt;  &lt;p&gt;This plugin can be more awesome, if they can give us XSD/DTD for visualforce tags. This will help a lot in developing this editor in lesser time.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;Your views and feedback !&lt;/h3&gt;  &lt;p&gt;Looking forward to those&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-4697801947412937881?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BSQlfFNA1FR1Hr-novWegK2mI6g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BSQlfFNA1FR1Hr-novWegK2mI6g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BSQlfFNA1FR1Hr-novWegK2mI6g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BSQlfFNA1FR1Hr-novWegK2mI6g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=J9Redy2BmZE:2Rngurg24x8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=J9Redy2BmZE:2Rngurg24x8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=J9Redy2BmZE:2Rngurg24x8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=J9Redy2BmZE:2Rngurg24x8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=J9Redy2BmZE:2Rngurg24x8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/J9Redy2BmZE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/4697801947412937881/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=4697801947412937881" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4697801947412937881?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4697801947412937881?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/J9Redy2BmZE/visualforce-editor-content-assist.html" title="Rich Visualforce Editor that finally supports Content Assist !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-3gSJ3Fo6rVE/TrFwQ1AuhbI/AAAAAAAAH1M/lGKeFgQYdPY/s72-c/image_thumb%25255B12%25255D.png?imgmax=800" height="72" width="72" /><thr:total>11</thr:total><feedburner:origLink>http://www.tgerm.com/2011/11/visualforce-editor-content-assist.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQDR3w8fCp7ImA9WhRTEEk.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-5821242741658079495</id><published>2011-10-31T12:47:00.001+05:30</published><updated>2011-10-31T13:19:36.274+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-31T13:19:36.274+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="winter'12" /><title>Easy upgrade Eclipse(Helios) Force.com IDE to Winter’12 release.</title><content type="html">&lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;After long wait, Force.com IDE team finally released an update for Winter’12 release. To see what’s new and supported platforms, please go here : &lt;a title="http://wiki.developerforce.com/index.php/Force.com_IDE_Release_Notes" href="http://wiki.developerforce.com/index.php/Force.com_IDE_Release_Notes"&gt;http://wiki.developerforce.com/index.php/Force.com_IDE_Release_Notes&lt;/a&gt;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;If you are doing clean install or using older version of Eclipse before 3.6 (Helios), you can check the install/update instructions in this &lt;a href="http://wiki.developerforce.com/index.php/Updating_the_Force.com_IDE" target="_blank"&gt;wiki page&lt;/a&gt;. Though I don’t like those mentioned in this wiki update guide, as it requires you to open “Force.com start page”, that is smart enough to crash the eclipse or would take ages to open on faster internet connections. If you are on Eclipse Helios, my preferred way to update in a simpler way is as follows : &lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/div&gt;  &lt;h4 style="text-align: left" dir="ltr" trbidi="on"&gt;1. Goto “help &amp;gt; check for updates” in eclipse menu :&amp;#160;&amp;#160; &lt;/h4&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://lh4.ggpht.com/-InAg0ibrRQE/Tq5LOq73mAI/AAAAAAAAHg0/9iyBz5AdIc4/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="eclipse check of updates menu" border="0" alt="eclipse check of updates menu" src="http://lh5.ggpht.com/-Gbk0mi1sD-M/Tq5LQDMqU3I/AAAAAAAAHg8/9xJhDLerScc/image_thumb%25255B1%25255D.png?imgmax=800" width="440" height="318" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4 style="text-align: left" dir="ltr" trbidi="on"&gt;2. Let eclipse search for updates, until it comes with a dialog like this. Select “Force.com IDE” and hit “Next” button, as shown below:&lt;/h4&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://lh4.ggpht.com/-HX_FFfI2Hcc/Tq5LRONZv2I/AAAAAAAAHhE/X4HZQ1ueHKU/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Force.com IDE update dialog" border="0" alt="Force.com IDE update dialog" src="http://lh6.ggpht.com/-bKn1QOK-USc/Tq5LTPpjriI/AAAAAAAAHhM/esVzfDUC_40/image_thumb%25255B3%25255D.png?imgmax=800" width="510" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;/div&gt;  &lt;h4 style="text-align: left" dir="ltr" trbidi="on"&gt;3. Hit “Next” on the next screen :&lt;/h4&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://lh6.ggpht.com/-htikWdooB0o/Tq5LUWciiHI/AAAAAAAAHhU/lRpUFNVAUF4/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="force.com ide installation details dialog" border="0" alt="force.com ide installation details dialog" src="http://lh4.ggpht.com/-OwPEPymXTCo/Tq5LVXFQl6I/AAAAAAAAHhc/kVhCm0ed6Pk/image_thumb%25255B8%25255D.png?imgmax=800" width="464" height="320" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4 style="text-align: left" dir="ltr" trbidi="on"&gt;4 : Accept the license terms and finish as usual :) &lt;/h4&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://lh5.ggpht.com/-VC63XjNR4M0/Tq5LXB0u3pI/AAAAAAAAHhk/tVs9_O_V0kY/s1600-h/image%25255B15%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="force.com ide upgrade license terms dialog" border="0" alt="force.com ide upgrade license terms dialog" src="http://lh4.ggpht.com/-Yu8W4V-axoY/Tq5LYYpccdI/AAAAAAAAHhs/Iy9gf-DVwss/image_thumb%25255B7%25255D.png?imgmax=800" width="466" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;/div&gt;  &lt;h4 style="text-align: left" dir="ltr" trbidi="on"&gt;5. Let eclipse download the updates, once done you will get a notification to restart Eclipse. Restart it and you are all set to use Winter’12 IDE.&lt;/h4&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="text-align: left" dir="ltr" trbidi="on"&gt;After restart you will notice this classic popup asking for Force.com project upgrades. &lt;/p&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://lh6.ggpht.com/-sOGkEzMfXOY/Tq5LZsJh7mI/AAAAAAAAHh0/vFk70n2wXnY/s1600-h/image%25255B20%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="force.com upgrade project to winter&amp;#39;12 dialog" border="0" alt="force.com upgrade project to winter&amp;#39;12 dialog" src="http://lh5.ggpht.com/-OsijAccf3c8/Tq5La_h32rI/AAAAAAAAHh8/AukewsDQ-lQ/image_thumb%25255B10%25255D.png?imgmax=800" width="474" height="143" /&gt;&lt;/a&gt; &lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;I usually do a clean checkout of project again, as I work on very small and selective metadata required at point of time. Why selective metadata, checkout this blog post for more details : &lt;a title="http://www.tgerm.com/2010/03/fast-save-refresh-force-ide-eclipse.html" href="http://www.tgerm.com/2010/03/fast-save-refresh-force-ide-eclipse.html"&gt;http://www.tgerm.com/2010/03/fast-save-refresh-force-ide-eclipse.html&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-5821242741658079495?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eftppvezZqP_BJlS7jZ1dB7LSn0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eftppvezZqP_BJlS7jZ1dB7LSn0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eftppvezZqP_BJlS7jZ1dB7LSn0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eftppvezZqP_BJlS7jZ1dB7LSn0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=P1a7vJX5IKg:hhjONTfW5T0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=P1a7vJX5IKg:hhjONTfW5T0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=P1a7vJX5IKg:hhjONTfW5T0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=P1a7vJX5IKg:hhjONTfW5T0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=P1a7vJX5IKg:hhjONTfW5T0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/P1a7vJX5IKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/5821242741658079495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=5821242741658079495" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5821242741658079495?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5821242741658079495?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/P1a7vJX5IKg/upgrade-forcecom-ide-winter12.html" title="Easy upgrade Eclipse(Helios) Force.com IDE to Winter’12 release." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-Gbk0mi1sD-M/Tq5LQDMqU3I/AAAAAAAAHg8/9xJhDLerScc/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2011/10/upgrade-forcecom-ide-winter12.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHRH89fCp7ImA9WhdbF0o.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-2855143257799906878</id><published>2011-10-16T13:50:00.001+05:30</published><updated>2011-10-16T20:48:55.164+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-16T20:48:55.164+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chatter" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="approvals" /><title>Winter’12–Social approving of records using ‘Chatter Approvals’ !</title><content type="html">&lt;p&gt;Everyone talking about Social Enterprise, Winter’12 release introduced “&lt;a href="http://developer.force.com/releases/release/Winter12/chatter+approvals" target="_blank"&gt;Chatter Approvals&lt;/a&gt;”. Approvals in Chatter are really fun and new social way of approving items, right inside and from Chatter feeds. &lt;/p&gt;  &lt;p&gt;For more details about &lt;a href="http://developer.force.com/releases/release/Winter12/chatter+approvals" target="_blank"&gt;Chatter approvals&lt;/a&gt;, please check this &lt;a href="https://login.salesforce.com/help/doc/en/approvals_for_chatter_getstart.htm" target="_blank"&gt;Salesforce documentation&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Next, we will see how its social and fun to have Approvals in Chatter.&lt;/p&gt;  &lt;h1&gt;Exploring - Leave approvals in Chatter !&lt;/h1&gt;  &lt;p&gt;Manager approving leaves is common scenario in most of organizations. I tried exploring the same here with new Chatter approvals.&lt;/p&gt;  &lt;h3&gt;Leave management done using Salesforce&lt;/h3&gt;  &lt;p&gt;This great team uses Chatter for managing CRM and HRM operations like Leave management. &lt;/p&gt;  &lt;h4&gt;Leave Sobject &lt;/h4&gt;  &lt;p&gt;A simple custom Sobject called Leave is created to apply &amp;amp; approve leaves. Here are 4 key fields in it&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Type(PickList)&lt;/strong&gt; : EL, ML, etc (Earned Leave, Medical Leave) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Reason : &lt;/strong&gt;Why this leave is required. &lt;/li&gt;    &lt;li&gt;From Date &amp;amp; To Date. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Approval Process&lt;/h4&gt;  &lt;p&gt;We created standard approval process via Setup &amp;gt; App Setup &amp;gt; Create &amp;gt; Workflow &amp;amp; Approvals &amp;gt; Approval Process. &lt;/p&gt;  &lt;p&gt;This approval process sends the record to approval to User’s manager. No more complexity for sake of fun. &lt;/p&gt;  &lt;h4&gt;Setting up Chatter Approvals &lt;/h4&gt;  &lt;p&gt;Here are the steps to make sure your org is ready for Chatter approvals.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Enable approvals in chatter here, Setup &amp;gt; Customize &amp;gt; Chatter &amp;gt; Settings : &lt;a href="http://lh6.ggpht.com/-RJxERAgDCt4/TpqTvdUuP_I/AAAAAAAAHcM/XBHlVBw1t2g/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 4px 0px 3px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Enable Chatter Approvals in Salesforce Setup Screens" border="0" alt="Enable Chatter Approvals in Salesforce Setup Screens" src="http://lh4.ggpht.com/-RL5n6QJROrc/TpqTwgrvSQI/AAAAAAAAHcU/Est-8ElvVOU/image_thumb%25255B3%25255D.png?imgmax=800" width="367" height="333" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Enable Feed Tracking for Leave sobject here, Setup &amp;gt; Customize &amp;gt; Chatter &amp;gt; Feed Tracking. &lt;/li&gt;    &lt;li&gt;Chatter Approvals lets you create “Post Templates” for Chatter feed post. In a Chatter Post Template, one can pick upto 5 fields from Sobject, those fields will be shown in chatter feed post. Create a Post Tempalte for “Leave” sobject here : &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://lh4.ggpht.com/-rCfvuZFDqHI/TprtOURcnfI/AAAAAAAAHcc/Ah8BxugSFOs/s1600-h/image%25255B39%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Chatter Post Template in Salesforce Setup Menu" border="0" alt="Chatter Post Template in Salesforce Setup Menu" src="http://lh3.ggpht.com/-hgUpXCz1Ft4/Tpr0PyldJsI/AAAAAAAAHck/-Duo9U2CzmI/image_thumb20.png?imgmax=800" width="286" height="386" /&gt;&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;In Chatter “Post Template” I selected 4 most relevant fields to a leave i.e. From Date, To Date, Leave Type and Reason. As shown here : &lt;a href="http://lh5.ggpht.com/-I6242BKfN0g/Tpr0Q4wTPzI/AAAAAAAAHcs/RzVz2jSkLp4/s1600-h/image40.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Chatter Post Template" border="0" alt="Chatter Post Template" src="http://lh6.ggpht.com/-DNGlAdDlars/Tpr0SKUD0mI/AAAAAAAAHc0/QirdSJAMgJ4/image_thumb21.png?imgmax=800" width="387" height="395" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;All set now to play with Chatter Approvals in leave. Next, we will see all this in action.&lt;/p&gt;  &lt;h1&gt;Leave approval fun via Chatter Approvals :)&lt;/h1&gt;  &lt;p&gt;Guys, next story is going to revolve around 3 characters in an enterprise. So, lets meet them :&lt;/p&gt;  &lt;h3&gt;Meet the cast – employees !&lt;/h3&gt;  &lt;table border="0" cellspacing="5" cellpadding="5" width="522"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="116"&gt;&lt;a href="http://lh3.ggpht.com/-ryRy1gTCuFk/Tpr0TNWER1I/AAAAAAAAHc8/9uxWR5ZlHus/s1600-h/badboss6.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="badboss" border="0" alt="badboss" src="http://lh6.ggpht.com/-8i6ePGHHLxM/Tpr0TyishsI/AAAAAAAAHdE/7AXi7EiZw34/badboss_thumb2.jpg?imgmax=800" width="132" height="158" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="146"&gt;&lt;a href="http://lh6.ggpht.com/--xhWEUTy6Ug/Tpr0Uxu8Y5I/AAAAAAAAHdM/dn8Y-ICzZa0/s1600-h/scared-employee5.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="scared employee" border="0" alt="scared employee" src="http://lh6.ggpht.com/-234KY-mV6VY/Tpr0Vhv56FI/AAAAAAAAHdU/u9hE7jC5Yd8/scared-employee_thumb1.jpg?imgmax=800" width="181" height="152" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="238"&gt;&lt;a href="http://lh3.ggpht.com/-YaP6Z2-el7Q/Tpr0Wu_KfFI/AAAAAAAAHdc/OotXKWK-sLo/s1600-h/depressed6.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="depressed" border="0" alt="depressed" src="http://lh6.ggpht.com/-y_VguFeu5tM/Tpr0XgRlosI/AAAAAAAAHdk/NSyuvDoOQ20/depressed_thumb1.jpg?imgmax=800" width="146" height="148" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="116"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Mr. Bad Ass, aka Boss/Manager&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="146"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Mr. Depressoo, reports to Mr. BadAss              &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="238"&gt;&lt;strong&gt;Mrs. Frustoo, also reporting to Mr. BadAss&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Mr. Depresso wants Leave next week :-?&lt;/h3&gt;  &lt;p&gt;Mr. Depresso is a star performer working at least 60 hours a week to keep customers &amp;amp; more importantly Mr. Bad Ass happy. On the festive occasion of Diwali, he wants a break to meet family and friends. so applied for Leave of few days using “Leave” sobject in Salesforce CRM.&lt;/p&gt;  &lt;p&gt;He creates a leave record and submits it for Approval :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-EBTYKl3gsUY/Tpr0YpHs_WI/AAAAAAAAHds/iCsWMYR3yag/s1600-h/image13.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Leave Sobject submitted for approval" border="0" alt="Leave Sobject submitted for approval" src="http://lh3.ggpht.com/-ygbdA34LPYM/Tpr0Z71V6MI/AAAAAAAAHd0/_L_Ddsf6cGI/image_thumb6.png?imgmax=800" width="603" height="342" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Mr. Bad Ass Boss feels such leave plan is imaginary, it’s a Joke :)&lt;/h3&gt;  &lt;p&gt;As we have chatter approvals enabled Mr. Bad Ass get an update in his chatter feed about Mr. Depresso looking forward for a leave. So he adds a chatter comment, and laughs out on this leave request.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-EvmBj3rzT4M/Tpr0bG6EEnI/AAAAAAAAHd8/tJkQCNPEPkI/s1600-h/image25.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="chatter approval post in salesforce chatter" border="0" alt="chatter approval post in salesforce chatter" src="http://lh5.ggpht.com/-ukoFfsM5Sik/Tpr0ctV8l4I/AAAAAAAAHeE/SrNBQgIbccI/image_thumb12.png?imgmax=800" width="445" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Mr. Depressoo tries convincing boss about seriousness of Matter !&lt;/h3&gt;  &lt;p&gt;He writes back a chatter comment.. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-8fs-kbnAhok/Tpr0dtEOm7I/AAAAAAAAHeM/nGOFSd5DX5A/s1600-h/image30.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="both approver and the one who applied commenting in chatter" border="0" alt="both approver and the one who applied commenting in chatter" src="http://lh6.ggpht.com/-vFdTo_iuQc0/Tpr0e49kuSI/AAAAAAAAHeU/eSNmS71w3aA/image_thumb15.png?imgmax=800" width="504" height="263" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Mr. Bad Ass boss is not in mood to understand, so he rejects from Chatter itself !&lt;/h3&gt;  &lt;p&gt;This is how a rejected leave would look in chatter. Mr. Bad Ass boss also added condolence chatter comment :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-Ao4WhN1WNrg/Tpr0f95YHMI/AAAAAAAAHec/4O7zbDn7PSs/s1600-h/image34.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="rejecting approval request from Chatter" border="0" alt="rejecting approval request from Chatter" src="http://lh5.ggpht.com/-7VbZT5UT55k/Tpr0hlQ8UeI/AAAAAAAAHek/KWfQEnSs-S4/image_thumb17.png?imgmax=800" width="543" height="366" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Mrs. Frustoo a silent watcher of all this drama, finally speaks up !&lt;/h3&gt;  &lt;p&gt;Mrs. Frustoo is a kind hearted lady, suffering from same tortures of Mr. Bad ass. So, she decided to cheer up Mr. Depresoo..&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-y2U24SQfRM0/Tpr0i4XVjJI/AAAAAAAAHes/tNAz9O3AblU/s1600-h/image38.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="somebody else commneting on the chatter approval feedpost" border="0" alt="somebody else commneting on the chatter approval feedpost" src="http://lh4.ggpht.com/-7GHbZz7bz1Y/Tpr0kpL7UmI/AAAAAAAAHe0/q5J0L2YxJ7Q/image_thumb19.png?imgmax=800" width="554" height="416" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Moral of the Chatter Approvals – Story !&lt;/h1&gt;  &lt;p&gt;Doing Approvals via chatter is really social and fun. It really adds nice context to discuss the approval in chatter feeds. But but but, one needs to be careful about what’s going to be discussed in Approval’s chatter comments, if wrong information is shared to wrong guys, it might be sarcastic fun.&lt;/p&gt;  &lt;p&gt;Looking forward for your views and comments !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-2855143257799906878?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RramAPJ9zv4eTHuTU9f8JWjFPx4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RramAPJ9zv4eTHuTU9f8JWjFPx4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RramAPJ9zv4eTHuTU9f8JWjFPx4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RramAPJ9zv4eTHuTU9f8JWjFPx4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=iyTMaNKu71Y:zg1FJhzF9Ac:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=iyTMaNKu71Y:zg1FJhzF9Ac:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=iyTMaNKu71Y:zg1FJhzF9Ac:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=iyTMaNKu71Y:zg1FJhzF9Ac:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=iyTMaNKu71Y:zg1FJhzF9Ac:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/iyTMaNKu71Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/2855143257799906878/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=2855143257799906878" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2855143257799906878?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/2855143257799906878?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/iyTMaNKu71Y/winter12-chatter-approval-salesforce.html" title="Winter’12–Social approving of records using ‘Chatter Approvals’ !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-RL5n6QJROrc/TpqTwgrvSQI/AAAAAAAAHcU/Est-8ElvVOU/s72-c/image_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://www.tgerm.com/2011/10/winter12-chatter-approval-salesforce.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDSX8zcSp7ImA9WhdbFE8.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-3731763835492519434</id><published>2011-10-12T18:21:00.001+05:30</published><updated>2011-10-12T18:31:18.189+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T18:31:18.189+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>Parse JSON by one line of code using Winter’12 JSON API !</title><content type="html">&lt;p&gt;Salesforce Winter’12 release came with a great new API addition to Apex stack i.e. &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_jsonparser.htm" target="_blank"&gt;JSONParser&lt;/a&gt;. This parser solves all the classic problems using open source Apex based &lt;a href="http://code.google.com/p/apex-library/source/browse/trunk/JSONObject/src/classes/JSONObject.cls" target="_blank"&gt;JSONObject.cls&lt;/a&gt;, to know more about these problems read my previous &lt;a href="http://www.tgerm.com/2011/09/json-parsing-in-apex-programming.html" target="_blank"&gt;post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This post is an attempt to discuss how one can simplify both JSON operations like JSON serialization and deserialization(parsing) using the new &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_json.htm" target="_blank"&gt;System.JSON&lt;/a&gt; API. &lt;/p&gt;  &lt;h1&gt;Parsing JSON using Winter’12 API&lt;/h1&gt;  &lt;p&gt;The new JSON API is having decent documentation and most helpful post to start with is from &lt;a href="https://twitter.com/#!/metadaddy" target="_blank"&gt;Mr. Pat (aka MetaDaddy)&lt;/a&gt;, you can read his post &lt;a href="http://blogs.developerforce.com/developer-relations/2011/09/hands-on-with-the-new-native-json-parser.html" target="_blank"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;h3&gt;Approach 1 - Parse JSON via Streaming Scary Tokens :((&lt;/h3&gt;  &lt;p&gt;Pat did a great job in describing how to parse JSON using the streaming token based approach. The streaming token is good from time/space complexity point of view, but if you have to parse a huge JSON structure, it become pain to write a parser using this, at least for me it was like $#$#%$^$. I was like understanding now what, is it START OBJECT, START ARRAY or FIELD… :((&lt;/p&gt;  &lt;h3&gt;Approach 2 – Using JSON.deserialize(…) method&lt;/h3&gt;  &lt;p&gt;Luckily, I found a very simple approach that can fit to “&lt;strong&gt;MOST&lt;/strong&gt;” of the JSON parsing scenarios. I said most, because this approach will not work well, if your JSON structure is not naming the fields correctly.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;u&gt;This approach requires you to have well defined Apex classes mapped to each of the structure/entity represented in the JSON string. If your apex class exactly resembles the JSON structure you can parse the whole JSON in just one line of code&lt;/u&gt;&lt;/em&gt;. How ? we will see next.&lt;/p&gt;  &lt;p&gt;Lets take the classical example of Departments, Employees and Addresses i.e. Department has many employees and employee can have multiple addresses. &lt;/p&gt;  &lt;h4&gt;Example JSON structure for one department :&lt;/h4&gt;  &lt;pre class="brush:java"&gt;{
   &amp;quot;name&amp;quot;:&amp;quot;Engineering&amp;quot;,
   &amp;quot;code&amp;quot;:&amp;quot;ENGR&amp;quot;,
   &amp;quot;employees&amp;quot;:[
      {
         &amp;quot;name&amp;quot;:&amp;quot;James Bond&amp;quot;,
         &amp;quot;mobile&amp;quot;:&amp;quot;123-456-7892&amp;quot;,
         &amp;quot;isMale&amp;quot;:true,
         &amp;quot;age&amp;quot;:29,
         &amp;quot;addresses&amp;quot;:[
            {
               &amp;quot;street&amp;quot;:&amp;quot;900 Concar Drive&amp;quot;,
               &amp;quot;state&amp;quot;:&amp;quot;CA&amp;quot;,
               &amp;quot;postalCode&amp;quot;:94402,
               &amp;quot;isPrimary&amp;quot;:true,
               &amp;quot;country&amp;quot;:&amp;quot;USA&amp;quot;,
               &amp;quot;city&amp;quot;:&amp;quot;San mateo&amp;quot;
            },
            {
               &amp;quot;street&amp;quot;:&amp;quot;800 Bridgepointe&amp;quot;,
               &amp;quot;state&amp;quot;:&amp;quot;CA&amp;quot;,
               &amp;quot;postalCode&amp;quot;:29230,
               &amp;quot;isPrimary&amp;quot;:false,
               &amp;quot;country&amp;quot;:&amp;quot;USA&amp;quot;,
               &amp;quot;city&amp;quot;:&amp;quot;Foster City&amp;quot;
            }
         ]
      },
      {
         &amp;quot;name&amp;quot;:&amp;quot;Brad Pitt&amp;quot;,
         &amp;quot;mobile&amp;quot;:&amp;quot;987-456-7892&amp;quot;,
         &amp;quot;isMale&amp;quot;:true,
         &amp;quot;age&amp;quot;:35,
         &amp;quot;addresses&amp;quot;:[
            {
               &amp;quot;street&amp;quot;:&amp;quot;900 Rough Drive&amp;quot;,
               &amp;quot;state&amp;quot;:&amp;quot;CA&amp;quot;,
               &amp;quot;postalCode&amp;quot;:13245,
               &amp;quot;isPrimary&amp;quot;:true,
               &amp;quot;country&amp;quot;:&amp;quot;USA&amp;quot;,
               &amp;quot;city&amp;quot;:&amp;quot;SFO&amp;quot;
            }
         ]
      }
   ]
}&lt;/pre&gt;

&lt;h4&gt;Object model required for this JSON :&lt;/h4&gt;

&lt;p&gt;I have created following classes nested under a top level class called “JsonParserTests”. &lt;/p&gt;

&lt;pre class="brush:java"&gt;public with sharing class JsonParserTests {
    
    class Department {
        public String name;
        public String code;
        public Employee[] employees;        
        
        public Department(String n, String c) {
            this.name = n;
            this.code = c;
            this.employees = new List&amp;lt;Employee&amp;gt;();
        }        
    } 
    
    class Employee {
        public String name;
        public Integer age;
        public String mobile;
        public boolean isMale;
        public Address[] addresses;
        
        public Employee(String n, Integer a, String m, boolean im) {
            this.name = n;
            this.age = a;
            this.mobile = m;
            this.isMale = im;
            this.addresses = new List&amp;lt;Address&amp;gt;();
        }
    }
    
    class Address {
        public String street;
        public String city;
        public String state;
        public Integer postalCode;
        public String country;
        public boolean isPrimary;
        
        public Address( String street, String city, String state, Integer postalCode, String country, boolean isPrimary) {
            this.street = street;
            this.city = city;
            this.state = state;
            this.postalCode = postalCode;
            this.country = country;
            this.isPrimary = isPrimary;
        }
    }
} &lt;/pre&gt;

&lt;h3&gt;&amp;#160;&lt;/h3&gt;

&lt;h4&gt;Parsing the full JSON in one line of code.&lt;/h4&gt;

&lt;p&gt;Here is the method from System.JSON to do so :&lt;/p&gt;

&lt;pre class="brush:java"&gt;// This department instance is having the full hierarchy
// of employees and addresses in it
Department d = (Department)JSON.deserialize(jsonToParse, JsonParserTests.Department.class);&lt;/pre&gt;

&lt;p&gt;The beauty of this JSON serialization is you get the full nested object hierarchy in JSON created in one go. Also, it just needs one script statement for the full parsing operation.&lt;/p&gt;

&lt;p&gt;One might argue that the above nested classes more than one line of code. I would say its always good to visualize and work on Entities mapped to Classes/Types. Even if one is using streaming parser, they would have required similar nested classes by the end of parsing. &lt;/p&gt;

&lt;h1&gt;Approach 3 – Hybrid of Streaming Tokens and deserialize !&lt;/h1&gt;

&lt;p&gt;As I mentioned above in Approach 2 also, that all JSON strings can’t be deserialzed directly using “JSON.deserialize()” call. The JSON structure needs to be well formed with proper field names etc. The good news is one can use both streaming token parser and deserialization together i.e.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Parse partial JSON structure using streaming tokens &lt;/li&gt;

  &lt;li&gt;Parse part of JSON structure that can be mapped to an Apex class using “&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_jsonparser.htm" target="_blank"&gt;JSONParser.readValueAs()&lt;/a&gt;” API. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_jsonparser.htm" target="_blank"&gt;JSONParser.readValueAs()&lt;/a&gt; is almost similar to JSON.deserialize() call, only difference is it works on current token value, instead of taking the JSON string explicitly as param. &lt;/p&gt;

&lt;p&gt;Here is an example of “&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_jsonparser.htm" target="_blank"&gt;JSONParser.readValueAs()&lt;/a&gt;” for the same department JSON structure, but using hybrid mode. Here we will only parse first employee object via JSONParser.readValueAs(..)&lt;/p&gt;

&lt;pre class="brush:java"&gt;System.JSONParser parser = JSON.createParser(jsonToParse);
parser.nextToken(); // START OBJECT
parser.nextToken(); // name
parser.nextToken(); // engineering
parser.nextToken(); // employees
parser.nextToken(); // start array
parser.nextToken(); // start object
// only first employee object parsed.
Employee employee = (Employee)parser.readValueAs(JsonParserTests.Employee.class);  &lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Serializing JSON from Apex in one line of code !&lt;/h1&gt;

&lt;p&gt;Similar to the easy deserialization approach discussed above, one can serialize complete object graph too. For ex. the same above JSON structure for department can be created like this&lt;/p&gt;

&lt;pre class="brush:java"&gt;Department engineering = new Department('Engineering', 'ENGR');

Employee e1 = new Employee('James Bond', 29,  '123-456-7892', true );
engineering.employees.add(e1);

e1.addresses.add(new Address('900 Concar Drive', 'San mateo', 'CA', 94402, 'USA', true));
e1.addresses.add(new Address('800 Bridgepointe', 'Foster City', 'CA', 29230, 'USA', false));

Employee e2 = new Employee('Brad Pitt', 35,  '987-456-7892', true );
engineering.employees.add(e2);
e2.addresses.add(new Address('900 Rough Drive', 'SFO', 'CA', 13245, 'USA', true));
// JSON string created and printed in debug logs
System.debug(JSON.serialize(engineering));&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_json_overview.htm" target="_blank"&gt;Winter’12 JSONParser API&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.developerforce.com/developer-relations/2011/09/hands-on-with-the-new-native-json-parser.html" target="_blank"&gt;Pat’s blog post about new JSONParser&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.tgerm.com/2011/09/json-parsing-in-apex-programming.html" target="_blank"&gt;Troubles in using JSONObject.cls&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Your views and thoughts ?&lt;/h1&gt;

&lt;p&gt;Looking forward for your comments !!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-3731763835492519434?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PxVDkNoqfKPq_5WQ8bKk93LhYxc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PxVDkNoqfKPq_5WQ8bKk93LhYxc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PxVDkNoqfKPq_5WQ8bKk93LhYxc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PxVDkNoqfKPq_5WQ8bKk93LhYxc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=_JAb2iR3j-U:xiNOEhxi8Yk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=_JAb2iR3j-U:xiNOEhxi8Yk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=_JAb2iR3j-U:xiNOEhxi8Yk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=_JAb2iR3j-U:xiNOEhxi8Yk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=_JAb2iR3j-U:xiNOEhxi8Yk:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/_JAb2iR3j-U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/3731763835492519434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=3731763835492519434" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3731763835492519434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3731763835492519434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/_JAb2iR3j-U/winter12-jsonparser-serialize.html" title="Parse JSON by one line of code using Winter’12 JSON API !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://www.tgerm.com/2011/10/winter12-jsonparser-serialize.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8MQn89eSp7ImA9WhdbE0g.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-5257767694608073083</id><published>2011-10-12T00:16:00.001+05:30</published><updated>2011-10-12T00:18:03.161+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T00:18:03.161+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Visualforce Code Templates/Snippets for Force.com IDE !</title><content type="html">&lt;p&gt;I recently saw a lot of action around Mac’s favorite editor TextMate. Force.com community has done a great job to create a full fledged IDE and various code templates for ease in working.&lt;/p&gt;  &lt;p&gt;I like TextMate, but I am more inclined towards Force.com IDE, because of its platform neutral nature. Most of my force.com pals are either on Windows machines and few of the geeks are using Ubuntu too. So I am always more motivated towards doing something using Force.com IDE.&lt;/p&gt;  &lt;p&gt;Force.com IDE is already doing a decent job on top of Eclipse. It gives a nice Visualforce editor, that gives syntax highlighting and code indentation based on standard Eclipse HTML Editor. I recently tried to create a couple of Visualforce code templates/snippets to quickly assist in creating the pages, and was successful in that attempt. Rest of the post describes how.&lt;/p&gt;  &lt;h1&gt;How to setup Visualforce code templates for Eclipse ?&lt;/h1&gt;  &lt;p&gt;Here are the steps &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Goto Eclipse &amp;gt; Preferences.&lt;/li&gt;    &lt;li&gt;Search for “Template” in the left pane preference filter box, as shown below&lt;a href="http://lh4.ggpht.com/-64PxW5pvBfs/TpSOvUJSupI/AAAAAAAAHZ4/8FNRT1Ka-R4/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Eclipse Preferences Pane with Template Search Text" border="0" alt="Eclipse Preferences Pane with Template Search Text" src="http://lh5.ggpht.com/-Me8VG38BGLM/TpSOxDp8ElI/AAAAAAAAHZ8/3FzMQSUBEPs/image_thumb%25255B1%25255D.png?imgmax=800" width="421" height="442" /&gt;&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;Hit the “New” button on extreme right side to start creating a new Template, as shown :&lt;a href="http://lh3.ggpht.com/-GRbB9l5EUjc/TpSOyAMSgUI/AAAAAAAAHaI/JuPTr1TOPho/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Create New template for visualforce tag" border="0" alt="Create New template for visualforce tag" src="http://lh6.ggpht.com/-ugNhZaAC96U/TpSOzuxffuI/AAAAAAAAHaM/ElB_FQidlXI/image_thumb%25255B3%25255D.png?imgmax=800" width="424" height="277" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;In the dialog next, enter tag name in the text field labeled “Name” and code snippet in text area labeled “Pattern”. Also select context as “HTML Tag”, as shown below : &lt;a href="http://lh3.ggpht.com/-fha3SQcknAc/TpSO0p5UmYI/AAAAAAAAHaY/sMp7bP05YN8/s1600-h/image%25255B12%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Defining template name and pattern for visualforce" border="0" alt="Defining template name and pattern for visualforce" src="http://lh4.ggpht.com/-ZeTOEk7jAv4/TpSO16EYBEI/AAAAAAAAHag/jYHOMC6GfKY/image_thumb%25255B6%25255D.png?imgmax=800" width="529" height="259" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Now, in any visualforce page in Force.com IDE, press CTRL + SPACE and start typing the tag name, like apex:p… In the content assist box, you will see the newly created template as shown below. Hit enter to get the template inserted in current code location.&amp;#160; &lt;a href="http://lh6.ggpht.com/-qvBrKLzBZac/TpSO2yW-4iI/AAAAAAAAHao/hm4TJm6OzA8/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Visualforce template based content assist box in Eclipse" border="0" alt="Visualforce template based content assist box in Eclipse" src="http://lh5.ggpht.com/-vOLtK8qe8ac/TpSO4Glwi3I/AAAAAAAAHaw/BBVHJqKrs50/image_thumb%25255B8%25255D.png?imgmax=800" width="544" height="184" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Using the same steps as above, I have created a few templates for visualforce like&lt;/p&gt;  &lt;h2&gt;Field Label Template &lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-Uhxm4OUjO80/TpSO5TA5nqI/AAAAAAAAHa8/eK4uTQtTJek/s1600-h/image%25255B20%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Visualforce Field Label template" border="0" alt="Visualforce Field Label template" src="http://lh3.ggpht.com/-NTHcsGFGQus/TpSO60EfHZI/AAAAAAAAHbE/pPLoyIAFVwU/image_thumb%25255B10%25255D.png?imgmax=800" width="527" height="211" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;CRUD FLS Permission&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-UKUDTyLVil0/TpSO72YJ65I/AAAAAAAAHbM/iAROvIWW-d8/s1600-h/image%25255B24%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Visualforce CRUD FLS check template" border="0" alt="Visualforce CRUD FLS check template" src="http://lh4.ggpht.com/-h9_tcMe61TI/TpSO86wg7dI/AAAAAAAAHbU/MgpHoeKr0bY/image_thumb%25255B12%25255D.png?imgmax=800" width="502" height="216" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Creating a useful template library for Visualforce !&lt;/h1&gt;  &lt;p&gt;The good part about Eclipse templates is those can be exported and imported back via XML. I started creating a few code snippets/templates and the export for them is available in gist &lt;a href="https://gist.github.com/1278993" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;One can easily import this GIST on the same template page using the “Import” button near the New one. Similarly exporting yours is easy too, just select templates to export and hit “Export” button.&lt;/p&gt;  &lt;p&gt;Please join me to add more and better code templates for making Visualforce development easier in Eclipse.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-5257767694608073083?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4IwUPXje-Hu0m02PJ7Yi-HWP3x0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4IwUPXje-Hu0m02PJ7Yi-HWP3x0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4IwUPXje-Hu0m02PJ7Yi-HWP3x0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4IwUPXje-Hu0m02PJ7Yi-HWP3x0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3gauNRY6N6U:-cYPDi94hPE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3gauNRY6N6U:-cYPDi94hPE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3gauNRY6N6U:-cYPDi94hPE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=3gauNRY6N6U:-cYPDi94hPE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=3gauNRY6N6U:-cYPDi94hPE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/3gauNRY6N6U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/5257767694608073083/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=5257767694608073083" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5257767694608073083?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/5257767694608073083?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/3gauNRY6N6U/visualforce-templates-snippets-forcecom.html" title="Visualforce Code Templates/Snippets for Force.com IDE !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-Me8VG38BGLM/TpSOxDp8ElI/AAAAAAAAHZ8/3FzMQSUBEPs/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://www.tgerm.com/2011/10/visualforce-templates-snippets-forcecom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkADRnk_fSp7ImA9WhdbE0g.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-8343505849676180544</id><published>2011-10-11T20:24:00.001+05:30</published><updated>2011-10-11T23:09:37.745+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T23:09:37.745+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="visualforce" /><title>Visualforce RelatedList CRUD FLS Security Tip !</title><content type="html">&lt;p&gt;Visualforce makes it very easy to create Salesforce look and feel pages. It also helps developers to get most of the Salesforce security guidelines implemented transparently, though developers need to take care of few items on their own. All these items are discussed in great details on DeveloperForce WIKI &lt;a href="http://wiki.developerforce.com/index.php/Secure_Coding_Guideline" target="_blank"&gt;here&lt;/a&gt;. Motive of this post is to highlight a common mistake done by most of the developers from both security and quality point of view.&lt;/p&gt;  &lt;p&gt;Code below is a very basic example of a visualforce page, to show some account details with a Contact related list only.&lt;/p&gt;  &lt;pre class="brush:xml"&gt;&amp;lt;apex:page standardController=&amp;quot;Account&amp;quot;&amp;gt;
    &amp;lt;apex:detail relatedList=&amp;quot;false&amp;quot;/&amp;gt;
    &amp;lt;apex:relatedList list=&amp;quot;Contacts&amp;quot;/&amp;gt;
&amp;lt;/apex:page&amp;gt;&lt;/pre&gt;

&lt;p&gt;This page will work very well with all user’s, whose profiles are having at least read permission on “Contact” standard object. But but but, the same page will crash completely if user’s profile is not having at least READ permission on Contact, like this&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-KcTiGqcbcnA/TpRYpG8i0RI/AAAAAAAAHZo/foDYNjlj8og/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Visualforce error on missing related list permission" border="0" alt="Visualforce error on missing related list permission" src="http://lh5.ggpht.com/-zoEPS6whGTc/TpRYqEaEUqI/AAAAAAAAHZs/CUPaNMJvA60/image_thumb%25255B1%25255D.png?imgmax=800" width="448" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, its clear that Salesforce doesn’t transparently hides the related list on missing permissions, thus highly recommended to all Salesforce developers to add a security CRUD/FLS check on related lists too like this&lt;/p&gt;

&lt;pre class="brush:xml"&gt;&amp;lt;apex:page standardController=&amp;quot;Account&amp;quot;&amp;gt;
    &amp;lt;apex:detail relatedList=&amp;quot;false&amp;quot;/&amp;gt;
     &amp;lt;!--
          Control rendering of related list by checking the relevant
          child sobject, via $ObjectType.Contact.accessible
     --&amp;gt;
    &amp;lt;apex:relatedList list=&amp;quot;Contacts&amp;quot; rendered=&amp;quot;{!$ObjectType.Contact.accessible}&amp;quot;/&amp;gt;
&amp;lt;/apex:page&amp;gt;&lt;/pre&gt;

&lt;p&gt;Now, the page will atleast show the record details except the Contacts related list on Account and this is what should happen as per profile permissions.&lt;/p&gt;

&lt;p&gt;I hope above fix will make life easy post go-live, no fear of facing a panic customer whose page is messed for a given profile :)&lt;/p&gt;

&lt;h1&gt;References&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;&lt;a href="http://wiki.developerforce.com/index.php/Secure_Coding_Guideline" target="_blank"&gt;Secure Coding Guidelines on DeveloperForce&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 align="left"&gt;&amp;#160;&lt;/h1&gt;

&lt;h1 align="left"&gt;Want to explore more about Salesforce security ?&lt;/h1&gt;

&lt;p align="left"&gt;These articles will be a good read&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;&lt;a href="http://www.tgerm.com/2011/09/apex-crud-fls-security-salesforce.html" target="_blank"&gt;Adding more CRUD FLS Security to your Salesforce Apps with new “Validator” API&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;&lt;a href="http://www.tgerm.com/2011/07/salesforce-appexchange-security-review.html" target="_blank"&gt;Preparing for Salesforce AppExchange Security Review !&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;&lt;a href="http://www.tgerm.com/2011/01/no-such-column-on-entity-error-and.html" target="_blank"&gt;No such column on entity error and connections with FLS !&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-8343505849676180544?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n8NhLkORH8QUPO7deVxvSC9Abfo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n8NhLkORH8QUPO7deVxvSC9Abfo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n8NhLkORH8QUPO7deVxvSC9Abfo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n8NhLkORH8QUPO7deVxvSC9Abfo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=2eW_t5JfOZE:07cLstk6yTc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=2eW_t5JfOZE:07cLstk6yTc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=2eW_t5JfOZE:07cLstk6yTc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=2eW_t5JfOZE:07cLstk6yTc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=2eW_t5JfOZE:07cLstk6yTc:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/2eW_t5JfOZE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/8343505849676180544/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=8343505849676180544" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/8343505849676180544?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/8343505849676180544?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/2eW_t5JfOZE/crudfls-security-visualforce-salesforce.html" title="Visualforce RelatedList CRUD FLS Security Tip !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-zoEPS6whGTc/TpRYqEaEUqI/AAAAAAAAHZs/CUPaNMJvA60/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.tgerm.com/2011/10/crudfls-security-visualforce-salesforce.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMQnozfCp7ImA9WhdUFE4.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-4914745964702401679</id><published>2011-09-29T18:49:00.000+05:30</published><updated>2011-10-01T06:23:03.484+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-01T06:23:03.484+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="apex" /><title>JSON parsing in Apex, a developer’s nightmare :( Winter’12 release I badly need you !</title><content type="html">&lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;Today I stumbled upon a requirement to parse JSON in Apex. I was happy about the fact that I know there is a cool open source library called &lt;a href="http://code.google.com/p/apex-library/source/browse/trunk/JSONObject/src/classes/JSONObject.cls" target="_blank"&gt;JSONObject&lt;/a&gt;, that will do all the heavy lifting of JSON parsing and another more cooler native JSON parser is lined up in &lt;a href="http://blogs.developerforce.com/developer-relations/2011/09/hands-on-with-the-new-native-json-parser.html" target="_blank"&gt;coming winter'12 release&lt;/a&gt;. &lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;br /&gt;I was able to quickly setup the web service fixture using all goodness of dependency injection for callouts in apex, as discussed in &lt;a href="http://www.tgerm.com/2011/09/testing-apex-webservice-callout.html" target="_blank"&gt;this post&lt;/a&gt;. &lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/div&gt;  &lt;h1 style="text-align: left" dir="ltr" trbidi="on"&gt;“JSON response vs JSONObject Parser” the bloody war !&lt;/h1&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;The real pain started when I started parsing JSON response. I met a series of awesome exceptions and errors, leaving me confused about who is wrong JSON or Parser :-?    &lt;br /&gt;I firstly got this exception about “Missing Value” &lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-rwe5VcMtCIM/ToRzTe3i7EI/AAAAAAAAHZg/6muWq3UbYm0/s1600-h/image%25255B9%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-6NPzsGucQRI/ToRzUT--suI/AAAAAAAAHZk/4NX3Kg7gyL4/image_thumb%25255B4%25255D.png?imgmax=800" width="502" height="143" /&gt;&lt;/a&gt;     &lt;br /&gt;After doing some googling, I found this &lt;a href="http://techblog.appirio.com/2010/01/calling-rest-web-service-json-with-apex.html" target="_blank"&gt;post&lt;/a&gt;, where the code snippet indicated that newlines might be an issue with the parser. So I removed both “\r” &amp;amp; “\n” chars from the JSON response, why would machine require a pretty printed JSON :) Then life moved on for a while, until I got this exception &lt;/div&gt;  &lt;blockquote style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;p&gt;&lt;strong&gt;“FATAL_ERROR|superpat.JSONObject.JSONException: Expected a , or }”&lt;/strong&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p dir="ltr"&gt;I was again thinking, now what who’s wrong here JSON or Parser :-? Again after some fighting with code, I ended up on google searching for the same and luckily found &lt;a href="http://blog.superpat.com/" target="_blank"&gt;metadady&lt;/a&gt; already fixed this one. Many thanks to metadady, for fixing &lt;a href="http://code.google.com/p/apex-library/issues/detail?id=3" target="_blank"&gt;this issue and submitting a patch&lt;/a&gt;, I don’t know why this patch is still not applied on JSONObject since Jan 24, 2011. &lt;/p&gt;  &lt;p dir="ltr"&gt;   &lt;br /&gt;Again, life moved a bit ahead, until the JSONObject started parsing some Unicode chars like “\u0026”, in the response. Again Metadady was nice enough to mention this issue with his patch, but it seems there is no clean way to handle unicode chars in Apex. So I decided to get rid of them, I really can live without these special creatures in String :(     &lt;br /&gt;So, I kicked off all unicode awesomeness in JSON response with something like     &lt;br /&gt;&lt;/p&gt;  &lt;blockquote style="text-align: left" dir="ltr" trbidi="on"&gt;“jsonstring.replaceAll('\\\\u.{4}', '')”&lt;/blockquote&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;Next, life moved really good and my JSON was parsed successfully, I was having tears of joy in my eyes :) But those tears of joy turned into tears of sorrow, when I saw the debug logs    &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;ul&gt;     &lt;li&gt;it took around 10+ seconds and &lt;/li&gt;      &lt;li&gt;“154574” script lines for parsing a moderate json string. &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;blockquote&gt;&lt;strong&gt;Number of script statements: 154574 out of 200000 ******* CLOSE TO LIMIT&lt;/strong&gt;&lt;/blockquote&gt;  &lt;p&gt;It was a strange feeling of loosing everything after you won, words can’t express it. &lt;/p&gt;  &lt;p&gt;I was having some hope, that I can get rid of it. But but but, it was all lost when I read &lt;a href="http://blog.jeffdouglas.com/2009/12/28/problems-parsing-json-responses-with-apex/" target="_blank"&gt;this post&lt;/a&gt; from legendary &lt;a href="https://twitter.com/#!/jeffdonthemic" target="_blank"&gt;Jeff Douglas&lt;/a&gt;. It was an unlucky Googling day for me, if this Jeff’s post could have appeared earlier, I could be more happy guy by EOD.     &lt;br /&gt;&lt;/p&gt;  &lt;h1&gt;Is Game over ?&lt;/h1&gt;  &lt;div align="left"&gt;Anyway, game is not over yet. I am waiting for &lt;a href="http://blogs.developerforce.com/developer-relations/2011/09/hands-on-with-the-new-native-json-parser.html" target="_blank"&gt;winter’12 release and native JSON parser&lt;/a&gt; i.e. &lt;a href="http://www.salesforce.com/us/developer/docs/apexcodepre/Content/apex_methods_system_json_overview.htm" target="_blank"&gt;SYSTEM.JSON&lt;/a&gt; to come. Thanks to Salesforce team for finally adding a native JSON parser to the Apex library.&lt;/div&gt;  &lt;div align="left"&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-4914745964702401679?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/krxNLu-4-Z-AOBbTvParpgXOgLE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/krxNLu-4-Z-AOBbTvParpgXOgLE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/krxNLu-4-Z-AOBbTvParpgXOgLE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/krxNLu-4-Z-AOBbTvParpgXOgLE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=banWXWHhZEU:GDL5xH47soE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=banWXWHhZEU:GDL5xH47soE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=banWXWHhZEU:GDL5xH47soE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=banWXWHhZEU:GDL5xH47soE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=banWXWHhZEU:GDL5xH47soE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/banWXWHhZEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/4914745964702401679/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=4914745964702401679" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4914745964702401679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/4914745964702401679?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/banWXWHhZEU/json-parsing-in-apex-programming.html" title="JSON parsing in Apex, a developer’s nightmare :( Winter’12 release I badly need you !" /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-6NPzsGucQRI/ToRzUT--suI/AAAAAAAAHZk/4NX3Kg7gyL4/s72-c/image_thumb%25255B4%25255D.png?imgmax=800" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://www.tgerm.com/2011/09/json-parsing-in-apex-programming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMGQn48fyp7ImA9WhdUFE4.&quot;"><id>tag:blogger.com,1999:blog-1920855543634022909.post-3912520811189069937</id><published>2011-09-29T06:08:00.001+05:30</published><updated>2011-10-01T06:23:43.077+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-01T06:23:43.077+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips n Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="salesforce" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><title>Fixing connection issues with Salesforce Servers in browser &amp; Force.com IDE.</title><content type="html">&lt;p&gt;If you are guy who “loves to” or ”has to” work from multiple locations i.e. home, office, client site &amp;amp; coffee shops etc. Then you might have faced the problem connecting to Salesforce and some other web destinations. &lt;/p&gt;  &lt;p&gt;For me this problem appears sometimes in browser, but most of the times in Force.com IDE, when a page/class/trigger is saved or refreshed, it either &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;fails to connect to salesforce api serves i.e. na7-api.salesforce.com etc. &lt;/li&gt;    &lt;li&gt;shows this progress forever “Polling Server 'na7-api.salesforce.com' for response(2)” &lt;/li&gt;    &lt;li&gt;Response time for refresh/save is difference across spaces, for ex. runs faster in coffee shop but, runs slower in office network. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Fortunately for me the fix was very simple, I just need to execute this command to flush the DNS cache, after this it starts working well with immediate effect. Here is the command that can solve the problem in Mac OS (Snow Leopard+) : &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;$ dscacheutil –flushcache&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I haven’t tried it on other platforms. So to flush DNS cache, for older mac versions, linux and windows, one can try commands mentioned in this link : &lt;a title="http://www.tech-faq.com/how-to-flush-dns.html" href="http://www.tech-faq.com/how-to-flush-dns.html"&gt;http://www.tech-faq.com/how-to-flush-dns.html&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;More thoughts ?&lt;/h1&gt;  &lt;p&gt;Do you have any easier fix for this, please share !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1920855543634022909-3912520811189069937?l=www.tgerm.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d8dBpqeDxiul0eIf4XYStOdCEgM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8dBpqeDxiul0eIf4XYStOdCEgM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d8dBpqeDxiul0eIf4XYStOdCEgM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8dBpqeDxiul0eIf4XYStOdCEgM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6UPWGMn5Yus:SjYA_xzEnew:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6UPWGMn5Yus:SjYA_xzEnew:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6UPWGMn5Yus:SjYA_xzEnew:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?i=6UPWGMn5Yus:SjYA_xzEnew:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TechnologyGerm?a=6UPWGMn5Yus:SjYA_xzEnew:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TechnologyGerm?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TechnologyGerm/~4/6UPWGMn5Yus" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.tgerm.com/feeds/3912520811189069937/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1920855543634022909&amp;postID=3912520811189069937" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3912520811189069937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1920855543634022909/posts/default/3912520811189069937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TechnologyGerm/~3/6UPWGMn5Yus/connection-issues-with-salesforce.html" title="Fixing connection issues with Salesforce Servers in browser &amp;amp; Force.com IDE." /><author><name>Abhinav Gupta</name><uri>https://profiles.google.com/117729771558116862589</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-Bm-0d1RmA4M/AAAAAAAAAAI/AAAAAAAAHi8/_Ow1Hndoe3Q/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.tgerm.com/2011/09/connection-issues-with-salesforce.html</feedburner:origLink></entry></feed>

