<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.sharepointblogs.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>pm4everyone&amp;#39;s blog</title><link>http://www.sharepointblogs.com/pm4everyone/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>SharePoint and Groove Bidirectional Syncing with MS Project and MindManager</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/11/06/sharepoint-and-groove-bidirectional-syncing-with-ms-project-and-mindmanager.aspx</link><pubDate>Mon, 06 Nov 2006 22:53:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1510</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1510</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/11/06/sharepoint-and-groove-bidirectional-syncing-with-ms-project-and-mindmanager.aspx#comments</comments><description>Those series of articles I wrote about SharePoint and Groove web services have finally turned into a real project. Well, still in Beta, but getting close enough for both demos and &lt;a href="http://www.teamdirection.com/tdweb/support/download_plus.php"&gt;downloads&lt;/a&gt;.&lt;br /&gt;The product works with both SharePoint 2003 and 2007, as well as Groove 2007.&lt;br /&gt;&lt;br /&gt;Demo #1 shows TeamDirection publishing MindManager topics and subtopics  to a SharePoint server-- and a hosted one at that (free publicity for  you, Apptix). Team members then use their browser to update an assigned  task in the task list. TeamDirection gathers the latest data and  reports back to MindManager. We still have to package it nicely with  our site layout, but you can get a direct, sneak peak &lt;a href="http://www.teamdirection.com/tdweb/demos/MMTDSP1Demo.php"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Demo  #2 is similar, but this time TeamDirection publishes MS Project tasks  and subtasks to a Groove workspace. Groove doesn&amp;#39;t actually ship with a  Task List, so TeamDirection provides one for you. It&amp;#39;s similar to the  SharePoint Task List, and only people with proper permissions can  update their tasks. Once again, TeamDirection gathers the latest data  and reports back to MS Project. Again, nice packaging to follow, but  you can get a direct, sneak peak &lt;a href="http://www.teamdirection.com/tdweb/demos/MPTDGV1Demo.php"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These demos show TeamDirection Project Plus 2007. If you like what you see, go download the beta &lt;a href="http://www.teamdirection.com/tdweb/support/download_plus.php"&gt;here&lt;/a&gt; and share a task or topic today.&lt;br /&gt;&lt;br /&gt;And yes, that&amp;#39;s my voice narrating. Sorry about that.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=15820" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1510" width="1" height="1"&gt;</description></item><item><title>Welcome Microsoft Tech Ed 2006</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/11/02/welcome-microsoft-tech-ed-2006.aspx</link><pubDate>Thu, 02 Nov 2006 10:21:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1511</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1511</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/11/02/welcome-microsoft-tech-ed-2006.aspx#comments</comments><description>If you got here via the Groove presentation at Microsofts Tech Ed conference in Barcelona, here are the links you&amp;#39;ll be interested in. If you got here by any other means, I think you&amp;#39;ll still be interested in these links. They show you how to get started using Groove (and SharePoint) web services in clear and understandable language. It worked for me!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/18/9316.aspx"&gt;Part I &lt;/a&gt;-- Starting to Talk&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/24/9440.aspx"&gt;Part II &lt;/a&gt;-- Comparing SharePoint and Groove Web Service Constructs&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/31/9612.aspx"&gt;Part III&lt;/a&gt; -- Working with Tools&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/08/14/9948.aspx"&gt;Part IV&lt;/a&gt; -- SharePoint Lists and Groove Forms Interaction&lt;br /&gt;&lt;br /&gt;These four steps form the basic working blocks of our TeamDirection application.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=15632" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1511" width="1" height="1"&gt;</description></item><item><title>SharePoint 2003 Querying with GMT DateTime</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/10/03/sharepoint-2003-querying-with-gmt-datetime.aspx</link><pubDate>Tue, 03 Oct 2006 09:23:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1512</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1512</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/10/03/sharepoint-2003-querying-with-gmt-datetime.aspx#comments</comments><description>The issue is resolving ows_Created and ows_Modified timestamps for users in different timezones. Perhaps the documentation is wrong, but I noticed slightly different behaviour than what was &lt;a href="http://msdn2.microsoft.com/en-us/library/websvclists.lists.getlistitems.aspx"&gt;described&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The problem at hand. We are integrating with the basic SharePoint Task List and are heavily dependent on proper date time-- especially across time zones.&amp;nbsp; What I needed was timezone information in a well formed ISO date time format with the UTC hours and minutes, or the date time set to GMT. What I got was neither a well-formed ISO date time or a GMT date time.&lt;br /&gt;&lt;br /&gt;So off to Google to find out how to get a SharePoint servers timezone. To my dismay, it wasn&amp;#39;t available via a web service call. Horrors! It was, of course, available via the SPModel, but that must run on the server and that isn&amp;#39;t an option for our application.&lt;br /&gt;&lt;br /&gt;So I went back to the above documentation that describes the Lists.GetListItems web service call and particularly the QueryOptions. From the documentation:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code" id="ctl00_LibFrame_ctl12other"&gt;&lt;font color="#006400"&gt;&amp;lt;QueryOptions&amp;gt;&lt;br /&gt;   &amp;lt;IncludeMandatoryColumns&amp;gt;FALSE&lt;br /&gt;      &amp;lt;/IncludeMandatoryColumns&amp;gt;&lt;br /&gt;   &amp;lt;DateInUtc&amp;gt;TRUE&amp;lt;/DateInUtc&amp;gt;&lt;br /&gt;&amp;lt;/QueryOptions&amp;gt;&lt;br /&gt;&lt;br /&gt;DateInUtc&lt;br /&gt;&lt;br /&gt;TRUE to return dates in Coordinated Universal Time (UTC) format.&lt;br /&gt;FALSE to return dates in ISO format. This element is optional, and&lt;br /&gt;its default values is TRUE.&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And I had code doing this:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;XmlDocument xmlDoc = new XmlDocument();&lt;br /&gt;&lt;br /&gt;XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element,&amp;quot;Query&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element,&amp;quot;ViewFields&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;string viewFields = &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfID + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;viewFields += &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfTitle + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;viewFields += &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfCreatedOn + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;ndViewFields.InnerXml = viewFields;&lt;br /&gt;&lt;br /&gt;XmlNode node = null;&lt;br /&gt;node = ls.GetListItems( m_nativeID, null, ndQuery, ndViewFields, null, null);&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;One would think that would use the default QueryOption behaviour. But then one would be wrong. I found out through much trial and tribulation (once again) that you can&amp;#39;t always trust the documentation, or at least your interpretation of it.&lt;br /&gt;&lt;br /&gt;If you really want that CreatedOn field to be GMT, you have to specify the QueryOption fragment like this:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;XmlDocument xmlDoc = new XmlDocument();&lt;br /&gt;  &lt;br /&gt;  XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element,&amp;quot;Query&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;  XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element,&amp;quot;ViewFields&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;XmlNode ndQueryOptions =&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; xmlDoc.CreateNode(XmlNodeType.Element,&amp;quot;QueryOptions&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;  string viewFields = &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfID + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;  viewFields += &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfTitle + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;  viewFields += &amp;quot;&amp;lt;FieldRef Name=&amp;#39;&amp;quot; + s_vfCreatedOn + &amp;quot;&amp;#39; /&amp;gt;&amp;quot;;&lt;br /&gt;  ndViewFields.InnerXml = viewFields;&lt;br /&gt;  &lt;br /&gt;ndQueryOptions.InnerXml = &amp;quot;&amp;lt;DateInUtc&amp;gt;TRUE&amp;lt;/DateInUtc&amp;gt;&amp;quot;;&lt;br /&gt;&lt;br /&gt;  XmlNode node = null;&lt;br /&gt;  node = ls.GetListItems( m_nativeID, null, ndQuery, ndViewFields, null, ndQueryOptions);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;The next question I&amp;#39;m working on: why do RichText fields in SharePoint return html when retrieved via web services? Go head, use that rich text control in a sharepoint task description, and then look at it in MS Word. Hmmm....&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=13230" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1512" width="1" height="1"&gt;</description></item><item><title>Do You Know Who You Are?</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/31/do-you-know-who-you-are.aspx</link><pubDate>Thu, 31 Aug 2006 10:10:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1513</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1513</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/31/do-you-know-who-you-are.aspx#comments</comments><description>Collaboration infrastructure can be a great thing. But it has one major stumbling block; a really big block. And it&amp;#39;s preventing the next generation of applications from really taking off. The big stumbling block is you. More precisely, who you are. Or really more precisely, who you are to the collaboration system.&lt;br /&gt;&lt;br /&gt;Don&amp;#39;t you realize you can be anybody?&lt;br /&gt;&lt;br /&gt;Not in the sense of John turning into Bob, though that&amp;#39;s possible too, but maybe johnm@hotmail.com turning into johnm@teamdirection.com. Or worse, multiplying johnm&amp;#39;s at hotmail, gmail and yahoo in addition to your company.&lt;br /&gt;&lt;br /&gt;The problem is one of synergy, in this case the lack of it. Most well-architected systems are built upon smaller well architected building blocks. Do I need to mention how everything in the universe is made up of varying combinations of 100+ elements? Operating systems, office applications and modern conveniences, however, don&amp;#39;t quite embody the same elegance.&lt;br /&gt;&lt;br /&gt;What we lose is the ability for our poor application designers and developers to tie different collaboration pieces together. Why is MS Office successful? Because they are very well integrated. But these are pieces one company produces, maintains and upgrades. What about your identities? Your identity spans everything from Active Directory to Social Security to your Family agreeing who you are.&lt;br /&gt;&lt;br /&gt;Sure, integrated instant messaging will work IFF you use matching SIP or EMAIL ids. Calendaring will work IFF everyone agrees this is your name. My cell phone will be useful IFF I can keep the same number. My drivers license works until I change my address. And so on. If I change anything, I&amp;#39;m screwed. It used to be newlyweds either didn&amp;#39;t take a man&amp;#39;s last name or hyphenated it as a means to demonstrate empowerment. But now, changing your last name as a result of marriage necessitates a wrenching digital re-identification.&lt;br /&gt;&lt;br /&gt;Can we come up with a means to absolutely identify yourself? Social Security number? Phone number? Email? CPU Chip ID? Bio metrics? &lt;br /&gt;&lt;br /&gt;Bio metrics is interesting in theory, but you know, I used to not like cantaloupe. Really. I liked watermelon alot, but even though cantaloupes always looked pretty tasty, I had to spit it out every time. Until my thirties. Then I found cantaloupe started tasting really good. Something about my chemistry seems to have changed. So just like changing email, cell phone numbers or home addressses, I have this funny feeling that being able to eat cantaloupe means my bio-metric id has changed too.&lt;br /&gt;&lt;br /&gt;At this point, you&amp;#39;re expecting me to write something like &amp;quot;But I have the solution. Use the JohnM identification system and everything is solved.&amp;quot; And while I think it could work, the rest of the world will likely remain unconvinced.&lt;br /&gt;&lt;br /&gt;Unfortunately, I think the answer lies in being able to manage the chaos. The only parallel I&amp;#39;m able to draw is the world wide web and URLs. URLs don&amp;#39;t dictate the type of things we can address, rather they give *something* an address in canonical form. Maybe everyone just needs to be canonically addressable.&lt;br /&gt;&lt;br /&gt;http://johnmilan.id/&lt;br /&gt;&lt;br /&gt;Could house all the forms of identification for John Milan. Yes we still need to agree on what the acceptable forms are, but at this point we still need a way to find them.&lt;br /&gt;&lt;br /&gt;Or we can all be GUIDs.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=11734" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1513" width="1" height="1"&gt;</description></item><item><title>Open Groove Question for the SharePoint Community</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/17/open-groove-question-for-the-sharepoint-community.aspx</link><pubDate>Thu, 17 Aug 2006 13:00:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1514</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1514</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/17/open-groove-question-for-the-sharepoint-community.aspx#comments</comments><description>I&amp;#39;m not totally dating myself because this movie was a bit before my time. However, &amp;#39;The Day the Earth Stood still&amp;#39; immediately popped in my mind as I feel like a visitor from the planet Groove touching down in the SharePoint community.&lt;br /&gt;&lt;br /&gt;&lt;font color="#000080"&gt;Klaatu Barada Nikto&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;I mean you no harm :)&lt;br /&gt;&lt;br /&gt;But I do have a question (or two) as I ramp up on SharePoint knowledge: What does the SharePoint community think of Groove?&lt;br /&gt;&lt;br /&gt;a) Groove is the perfect solution for SharePoint offline&lt;br /&gt;b) SharePoint is the perfect solution for Groove online&lt;br /&gt;c) A means to hire Ray Ozzie&lt;br /&gt;d) SharePoint Uber Alles&lt;br /&gt;e) Interesting, but I&amp;#39;m not sure how it fits&lt;br /&gt;f) Other (please post in the comments section)&lt;br /&gt;&lt;br /&gt;The reason I&amp;#39;m asking is I see a natural symmetry between SharePoint and Groove (so much so that we&amp;#39;re betting our company on it), and I believe Microsoft does too since they grouped SharePoint, Groove and Project together. But I&amp;#39;m approaching it as the new kid on the block excited to be here. What about you guys who have been around the block a few times?&lt;br /&gt;&lt;br /&gt;SharePoint has been immensely successful and seems to be gaining momentum. Does Groove have to prove anything to you? Is it obvious how to connect the two? Package them for your clients?&lt;br /&gt;&lt;br /&gt;I hope I get lots of comments, because the silence would be deafening.&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=10084" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1514" width="1" height="1"&gt;</description></item><item><title>SharePoint Groove 2007 Web Services Part IV -- Adding Data</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/14/sharepoint-groove-2007-web-services-part-iv-adding-data.aspx</link><pubDate>Mon, 14 Aug 2006 12:03:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1515</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1515</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/14/sharepoint-groove-2007-web-services-part-iv-adding-data.aspx#comments</comments><description>It&amp;#39;s time to get our elbows a little dirty. Oh sure, we can initate a conversation with SharePoint/Groove, we can add workspaces to SharePoint/Groove and we can even add tools to SharePoint/Groove. But this is all preliminary stuff. What have you done for me lately? How about adding a little data to our tools? And what&amp;#39;s really nice, it further supports my claim that SharePoint and Groove could really have their web services unified and become SharePoint Groove, or Groove SharePoint, depending on your point of view.&lt;br /&gt;&lt;br /&gt;    I&amp;#39;ll pick two tools that I&amp;#39;ve been working with extensively for the past two weeks. Yes, its taken me a couple weeks to figure out how best to present this information. This may be a bit longer than my earlier posts, but its chock full of information.&lt;br /&gt;&lt;br /&gt;    The tools we will examine are the standard Task List in SharePoint 2003 and the unstandard TeamDirection Task List in Groove 2007. Why the Task List? My company does Project Management software and I&amp;#39;m partial to tasks. Why an unstandard TeamDirection Task List? Because, as of right now, there is no standard Task List for Groove 2007. We&amp;#39;re hoping to change that; whether Microsoft ends up using ours or creates their own, we believe Groove needs a task list (and Project Management, as you might expect :)). In any case, you can download the TeamDirection Task List &lt;a href="http://www.teamdirection.com/tdweb/products/solutions.php"&gt;here&lt;/a&gt;, if you&amp;#39;d like to follow along.&lt;br /&gt;&lt;br /&gt;    The SharePoint Task List is really a SharePoint List and the TeamDirection Task List is really a Groove Form. Remember, I&amp;#39;m claiming SharePoint Lists and Groove Forms are equivalent. Although, in all honesty, I&amp;#39;m not the only one to see the similarities. Groove &lt;a href="http://docs.groove.net/htmldocs/guide/tools/business/grooveststoolset/spaces_mobile_workspace_defined.htm"&gt;did too&lt;/a&gt;, a couple of iterations ago. I&amp;#39;m sure that&amp;#39;s why SharePoint Lists and Groove Forms line up so nicely.&lt;br /&gt;&lt;br /&gt;    Let&amp;#39;s start with the SharePoint Task List. The first thing I&amp;#39;d like to do is add tasks. To accomplish this, you first have to take a detour and meet CAML. I&amp;#39;m not exactly sure what it stands for, and to be honest it doesn&amp;#39;t really matter. All I will say is it is aptly named, since its ungainly and something only a mother could love. BUT, its what we have to work with, and in fact it can cross the sands of stateless data transfer. It&amp;#39;s just that what makes this journey particulary daunting is the documentation on this kind of CAML is so minimal that its next to useless. Thankfully, we have the ultimate reference implementations in Microsoft Office, and the ultimate HTTP sniffer tool in &lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt;. Fiddler Rocks and is a detour worth taking. If you are serious about WSS, GWS and any WS development, its worth its weight in gold to see what&amp;#39;s really going on to make things work. Note: There is a server side object model available from Microsoft &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1c64af62-c2e9-4ca3-a2a0-7d4319980011&amp;amp;Di%0AsplayLang=en"&gt;here&lt;/a&gt;; but it won&amp;#39;t help you do smart clients, which is why I&amp;#39;m writing this.&lt;br /&gt;&lt;br /&gt;    Where were we? Right, CAML. You can add a task with CAML following these three easy steps. We will lift the curtain and start with Step 3 first:&lt;br /&gt;&lt;br /&gt;    &lt;font color="#006400"&gt;  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;  &amp;lt;ows:Batch OnError=&amp;quot;Continue&amp;quot; xmlns:ows=&amp;quot;http://tempuri.org/&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=&amp;quot;DatesInGregorian&amp;quot;&amp;gt;TRUE&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=&amp;quot;TimesInUTC&amp;quot;&amp;gt;TRUE&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;Method ID=&amp;quot;New&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;SetList Scope=&amp;quot;Request&amp;quot;&amp;gt;{DF1CC702-9C1F-4C05-8805-BFEF41F5CC28}&amp;lt;/SetList&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=&amp;quot;Cmd&amp;quot;&amp;gt;Save&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=&amp;quot;ID&amp;quot;&amp;gt;New&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=&amp;quot;urn:schemas-microsoft-com:office:office#Title&amp;quot;&amp;gt;My New Task&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#AssignedTo\&amp;quot;&amp;gt;0&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#Status\&amp;quot;&amp;gt;Not Started&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#Priority\&amp;quot;&amp;gt;(2) Normal&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#PercentComplete\&amp;quot;&amp;gt;0&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar   Name=\&amp;quot;urn:schemas-microsoft-com:office:office#StartDate\&amp;quot;&amp;gt;2006-08-14T15:00:00Z&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#DueDate\&amp;quot;&amp;gt;2006-08-16T00:00:00Z&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;SetVar Name=\&amp;quot;urn:schemas-microsoft-com:office:office#Body\&amp;quot;&amp;gt;&amp;lt;/SetVar&amp;gt;&lt;br /&gt;  &amp;lt;/Method&amp;gt;&lt;br /&gt;  &amp;lt;/ows:Batch&amp;gt;&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  So what does this all mean? For one, like a camel, its very finicky. If any of your data types are wrong, for instance your StartDate isn&amp;#39;t in Zulu time, the web service request fails. If you mistakenly place the &amp;#39;DatesInGregorian&amp;#39; element after the &amp;#39;Method ID=&amp;#39; element, the web service request fails. This is where fiddler shines in that you can set up the exact scenario your smart cilent is trying to produce in MS Word or Excel and watch how they do it.&lt;br /&gt;&lt;br /&gt;    Some other points of interest are the Method element and the SetVar Name=&amp;#39;Cmd&amp;#39; element. Because we are creating a new task, the Method element&amp;#39;s value is &amp;#39;New&amp;#39; and the SetVar Name=&amp;#39;Cmd&amp;#39; value is New. As you might expect, when updating, these values change to Update and a real task id, respectively.&lt;br /&gt;&lt;br /&gt;    A word of caution, though. Don&amp;#39;t rely purely on the MS Office applications, for they may not tell you the whole story. For example, if you watch Word create a task, you&amp;#39;d never know you can set the start date. It only sets the due date. How can you find all the available values for your tasks? In other words, how do you find the schema for the list? Ah, that was Step 2:&lt;br /&gt;&lt;br /&gt;  &lt;font color="#006400"&gt;  SharePointProxies.Lists ls = new SharePointProxies.Lists();&lt;br /&gt;  ... set up the credentials and Url ...&lt;br /&gt;  XmlNode result = ls.GetList( listID );&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  The result XML divulges the schema of a particular list. I put a sample of the SharePoint Task List schema &lt;a href="http://www.teamdirection.com/blogs/TaskSchema.xml"&gt;here&lt;/a&gt;. This schema gives you important information on what&amp;#39;s available, either purely for reading (like creation and modification stamps) or updating (like our StartDate).&lt;br /&gt;&lt;br /&gt;    So how do you find that list ID? That is Step 1, Finding your List ID:&lt;br /&gt;&lt;br /&gt;  &lt;font color="#006400"&gt;  SharePointProxies.Lists ls = new SharePointProxies.Lists();&lt;br /&gt;  ... set up the credentials and Url ...&lt;br /&gt;  XmlNode result = ls.GetListCollection();&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  The result XML divulges all you lists, descriptions and identifiers. I put a sample of the SharePoint list collection XML &lt;a href="http://www.teamdirection.com/blogs/ListCollectionResult.xml"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;    So let&amp;#39;s review the SharePoint steps to add data in order:&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;Step 1&lt;/b&gt;&lt;br /&gt;  Get a listing of all the lists in your SharePoint Workspace and associate ids with lists you want to work with.&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;Step 2&lt;/b&gt;&lt;br /&gt;  Get familiar with what the schema for your list has to offer. Ideally you will have an application you can sniff that works with your list.&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;Step 3&lt;/b&gt;&lt;br /&gt;  Start adding data. Here&amp;#39;s a fuller example for creating a task. Remember that big CAML up above? Here&amp;#39;s how you send it (Note that it goes to a Document Workspace Service instead of a Lists service!):&lt;br /&gt;&lt;br /&gt;  &lt;font color="#006400"&gt;  SharePointProxies.Dws dws = new SharePointProxies.Dws();&lt;br /&gt;  dws.Credentials = this.Credentials;&lt;br /&gt;  dws.Url = m_uri + &amp;quot;_vti_bin/dws.asmx&amp;quot;;&lt;br /&gt;&lt;br /&gt;    string result = null;&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;  result = dws.UpdateDwsData( camlString, null );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  The resulting XML of this call is a list of new ids for all the tasks you have created. We will leave this as an exercise for the reader to match new identifiers with tasks (hint: its returned in order of creation).&lt;br /&gt;&lt;br /&gt;    Are you ready for a bit of Groove Form task creation? Let&amp;#39;s get started on that.&lt;br /&gt;&lt;br /&gt;    If you go to the TeamDirection SharePoint Groove Solutions &lt;a href="http://www.teamdirection.com/tdweb/products/solutions.php"&gt;page&lt;/a&gt;, you see a TDWorkspace. Download and double click on this to install it in Groove 2007 if you&amp;#39;d like to apply these samples to something real.&lt;br /&gt;&lt;br /&gt;    Like the SharePoint Task creation, it takes 3 general steps to perform a Groove Task creation, but we will cover the steps in more detail.&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;Step 1&lt;/b&gt;&lt;br /&gt;  Get a listing of all Forms within your Groove Workspace&lt;br /&gt;&lt;br /&gt;    We covered this a bit in &lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/31/9612.aspx"&gt;Part III&lt;/a&gt; of the series with the acquireTelespaceTools example code.&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;Step 2&lt;/b&gt;&lt;br /&gt;  Get familiar with what the schema for your form has to offer.&lt;br /&gt;&lt;br /&gt;    Where SharePoint uses CAML to manipulate list data via WSS, Groove 2007 made the (good) decision to use System.Data.DataSets to manipulate form data via GWS. I have to bone up on SharePoint 2007 and their support of DataSets, but I like the idea in general as DataSets represent a nice abstraction. You can still work with XML if you really want to, and in fact I&amp;#39;ll show you a Groove XML schema for our Task List, but DataSets will make your life easier. And don&amp;#39;t forget about Hugh Pyle&amp;#39;s &lt;a href="http://blogs.msdn.com/hughpyle"&gt;blog&lt;/a&gt; and his samples.&lt;br /&gt;&lt;br /&gt;    If we&amp;#39;ve completed step 1 successfully, we get the forms schema by querying for it. SharePoint lists also support querying, of course, but unlike Groove provides a distinct schema acquisition method. Groove supplies the schema by query flags. The code looks like this:&lt;br /&gt;&lt;br /&gt;  &lt;font color="#006400"&gt;  protected System.Data.DataSet getSchema() {&lt;br /&gt;&lt;br /&gt;    GrooveProxies.Forms2 svc = new GrooveProxies.Forms2();&lt;br /&gt;  buildRequestHeader( svc );&lt;br /&gt;&lt;br /&gt;    GrooveProxies.RecordQuery recordQuery = new GrooveProxies.RecordQuery();&lt;br /&gt;  recordQuery.FormURI = &amp;quot;&amp;quot;;&lt;br /&gt;  recordQuery.IncludeFileAttachmentContent = false;&lt;br /&gt;  recordQuery.QueryMetadataOnly = true;&lt;br /&gt;  recordQuery.UnreadRecordsOnly = false;&lt;br /&gt;  recordQuery.ViewURI = &amp;quot;&amp;quot;;&lt;br /&gt;  recordQuery.WhereClause = &amp;quot;&amp;quot;;&lt;br /&gt;&lt;br /&gt;    // The query is really a schema retrieval, but this is the mechanism to retrieve&lt;br /&gt;  WSDLProxies.Forms2RecordDataSet fds;&lt;br /&gt;  fds = svc.QueryRecords(recordQuery);&lt;br /&gt;&lt;br /&gt;       // Make a DataSet to contain the records&lt;br /&gt;  System.Data.DataSet recordDataSet = new System.Data.DataSet(&amp;quot;RecordDataSet&amp;quot;);&lt;br /&gt;&lt;br /&gt;    // Load the schema into the DataSet&lt;br /&gt;  if (fds.Schema is System.Array) {&lt;br /&gt;      System.Xml.XmlNode[] schemaNodes = (System.Xml.XmlNode[])fds.Schema;&lt;br /&gt;      foreach (System.Xml.XmlNode schemaNode in schemaNodes) {&lt;br /&gt;          System.IO.StringReader schemaReader = new System.IO.StringReader(&amp;quot;&amp;lt;?xml     version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot; + schemaNode.OuterXml);&lt;br /&gt;   recordDataSet.ReadXmlSchema(schemaReader);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;    recordDataSet.AcceptChanges();&lt;br /&gt;  recordDataSet.EnforceConstraints = false;&lt;br /&gt;  return recordDataSet;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  If your curious what a Groove Form schema looks like, &lt;a href="http://www.teamdirection.com/blogs/GrooveFormTaskList.xml"&gt;here&lt;/a&gt; is the xml for our Task List.&lt;br /&gt;&lt;br /&gt;    What immediately stands out in this schema as opposed to the SharePoint Task List schema is the presence of multiple Tables. Groove Forms, and DataSets, can contain multiple tables, whereas the SharePoint 2003 (at least) lists contain only a single table. This makes Groove Forms not only able to handle SharePoint list schemas, but even richer tools like InfoPath schemas as well (which in fact Groove 2007 does). By the way, the table defining our task is named &amp;quot;_451_465619523540032702E_43034&amp;quot;.   I&amp;#39;m going to ask our developer if we can name it &amp;#39;Task&amp;#39; instead.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GOTCHA NOTE:&lt;/b&gt; Its always the little things that eat up time, and here&amp;#39;s one that I found. When you build your request headers, the Url value you use changes depending on the context of your web service call. Let&amp;#39;s revisit a sample web service request Url.&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;/GWS/Groove/2.0/Spaces/grooveTelespace/8ecctni3u4hzrvpxhhymbmqcdd8q8itexbttk7s&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Which is fine if I send requests to the Spaces proxy, but I need to change Spaces to Tools like so:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;/GWS/Groove/2.0/Tools/grooveTelespace/8ecctni3u4hzrvpxhhymbmqcdd8q8itexbttk7s&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;And, when you talk to specific tools, like the Forms, you need two changes: no only from Tools to Forms, but you need to append DataModelDelegate. DataModelDelegate is a Groove API construct from way back and represents the Data controller of a Model View Controller pattern. So talking to a form requires an url like:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;/GWS/Groove/2.0/Forms2/grooveTelespace/8ecctni3u4hzrvpxhhymbmqcdd8q8itexbttk7s/DataModelDelegate&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Finally, when dealing with records within a form, you append the record id like so:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;/GWS/Groove/2.0/Forms2/grooveTelespace/8ecctni3u4hzrvpxhhymbmqcdd8q8itexbttk7s/DataModelDelegate/12321.212352233&lt;br /&gt;  &lt;/font&gt;&lt;br /&gt;    &lt;b&gt;Step 3&lt;/b&gt;&lt;br /&gt;  Start adding data.&lt;br /&gt;&lt;br /&gt;    Here&amp;#39;s the easy part with the Groove Forms interface. Since it works so well with   System.Data.DataSets, adding a task to our task form is as easy as adding it to our data set. In fact, Hugh has a nice example of exactly &lt;a href="http://blogs.msdn.com/hughpyle/archive/2006/06/22/643098.aspx"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;    For our task specific application, it might look like this:&lt;br /&gt;&lt;br /&gt;  &lt;font color="#006400"&gt;  DataTable dt = ds.Tables [&amp;quot;_451_465619523540032702E_43034&amp;quot;];&lt;br /&gt;  DataRow dr = dt.NewRow();&lt;br /&gt;&lt;br /&gt;    dr[&amp;quot;Title&amp;quot;] = &amp;quot;Task 1&amp;quot;;&lt;br /&gt;  dr[&amp;quot;description&amp;quot;] = &amp;quot;I am the first task&amp;quot;;&lt;br /&gt;  dr[&amp;quot;startDate&amp;quot;] = &amp;quot;2006-08-14T08:00:00&amp;quot;;&lt;br /&gt;  dr[&amp;quot;dueDate&amp;quot;] = &amp;quot;2006-08-15T17:00:00&amp;quot;;&lt;br /&gt;  dr[&amp;quot;Priority&amp;quot;] = &amp;quot;(2) Normal&amp;quot;;&lt;br /&gt;  dr[&amp;quot;Status&amp;quot;] = &amp;quot;In Progress&amp;quot;;&lt;br /&gt;  dr[&amp;quot;PercentComplete&amp;quot;] = 0.5;&lt;br /&gt;  dr[&amp;quot;AssignedTo&amp;quot;] = &amp;quot;grooveIdentity://asdfawtadfglksa&amp;quot;;&lt;br /&gt;&lt;br /&gt;    dt.Rows.Add(dr);&lt;br /&gt;  tool.Insert(ds);&lt;br /&gt;&lt;br /&gt;  &lt;/font&gt;  Both SharePoint and Groove provide a means to create, update and delete data. We haven&amp;#39;t looked at deleting data, but its there. The other thing we might have noticed is query capabilities for Groove. Rest assured SharePoint has query capabilities as well. And rest assured we will cover querying in the near future.&lt;br /&gt;&lt;br /&gt;    Now if I had a company, and I knew a little something about SharePoint and a little something about Groove-- possibly even enough something to make me dangerous-- do you think I&amp;#39;d be looking into a way to seamlessly transfer data to and from SharePoint Lists and Groove Forms? Yeah, I think so.&lt;br /&gt;&lt;br /&gt;    But what you may not know is Groove Forms must be designed by the Groove Forms Designer. Unlike SharePoint, which allows me to modify list schema via WSS (that&amp;#39;s a whole nother topic!), Groove can only inject &amp;#39;well formed&amp;#39; forms into a workspace. So we can&amp;#39;t quite achieve total data mobility, however, what we can do is move data between well understood workspaces. An example would be data between a default SharePoint Document Workspace and a richer Groove Workspace. I&amp;#39;m partial to the TD Workspace myself, and soon I may just point you to a tool that does exactly what I&amp;#39;ve described.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9948" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1515" width="1" height="1"&gt;</description></item><item><title>SharePoint and Groove 2007 Integration -- A Vision, Some Samples</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/04/sharepoint-and-groove-2007-integration-a-vision-some-samples.aspx</link><pubDate>Sat, 05 Aug 2006 02:09:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1516</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1516</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/08/04/sharepoint-and-groove-2007-integration-a-vision-some-samples.aspx#comments</comments><description>Sometimes while blogging an idea hits you, and you have to decide whether to pursue it or let it go. Well, I chose to pursue it. And I convinced some smart people to pursue it too, so it just might work!.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve been doing a series on SharePoint and Groove differences and similarites with respect to web services. What struck me in &lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/24/9440.aspx"&gt;Part II&lt;/a&gt; was not just how similar SharePoint and Groove web services are, but also how similar the end products are. In fact, the biggest, obvious difference between the two is the richness of tools available for the two systems. For instance, a default Document Workspace in SharePoint contains 9 tools where a default Groove Workspace contains 3. If only Groove Workspaces had a few more tools.&lt;br /&gt;&lt;br /&gt;TeamDirection will be happy to provide a few more tools.&lt;br /&gt;&lt;br /&gt;Today on our site we are opening the first, simple &lt;a href="http://www.teamdirection.com/tdweb/products/solutions.php"&gt;Solutions Center&lt;/a&gt; whose goal will be bringing parity to SharePoint and Groove. Not just with the tools, which we will be fleshing out and making available as they come, but also with integration and synchronization products. Things that will enable you to move data easily from one collaboration solution to the other.&lt;br /&gt;&lt;br /&gt;For a developer, this will mean a library that abstracts collaboration workspaces. This means you can create a workspace and tell the library if you want it to be SharePoint or Groove. Or create tools with either a SharePoint or Groove template.&lt;br /&gt;&lt;br /&gt;For a user, this will mean a product (like, Project Management) that allows you to pick where to collaborate (SharePoint and Groove again) and also &lt;b&gt;how&lt;/b&gt; to collaborate-- with a smart client on everyone&amp;#39;s desktop, or with a single, manager desktop that synchronizes data with SharePoint lists and Groove forms.&lt;br /&gt;&lt;br /&gt;We&amp;#39;ve been with Groove since the early days-- way back in 2001. Through hard work and great products, we became the leader in Groove tools. And now here in 2006, we plan on more more hard work and more great products; and we&amp;#39;d like to be a leader in providing SharePoint tools too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9753" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1516" width="1" height="1"&gt;</description></item><item><title>SharePoint and Groove Web Services Part III -- Adding Tools</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/31/sharepoint-and-groove-web-services-part-iii-adding-tools.aspx</link><pubDate>Mon, 31 Jul 2006 21:49:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1517</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1517</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/31/sharepoint-and-groove-web-services-part-iii-adding-tools.aspx#comments</comments><description>We authenticated in &lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/18/9316.aspx"&gt;Part I&lt;/a&gt;, and created Workspaces in &lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/24/9440.aspx"&gt;Part   II&lt;/a&gt;, and we are about to add our first tools here in Part III. But first I&amp;#39;d like to revisit SharePoint and Groove workspace creation, for I did them a disservice by not talking about custom templates. These are templates created by you, that describe either the components of a workspace, or describe a component itself.     &lt;br /&gt;&lt;br /&gt;In Part II I stated that Groove&amp;#39;s workspace creation is designed to be much more generic than SharePoint&amp;#39;s Document Workspace. This is not entirely true. As a few people pointed out, and as Microsoft&amp;#39;s &lt;a href="http://www.microsoft.com/resources/documentation/wss/2/all/adminguide/en-us/stsh05.mspx?mfr=true"&gt;Working   with Templates&lt;/a&gt; page attests, you can in fact create, load and instantiate custom templates with SharePoint. SharePoint calls these Site Templates and List Templates. In Groove nomenclature, these are called Groove Space Archives (.gsa file extension) and Groove Tool Archives (.gta file extension) and while they&amp;#39;re not techinically templates, you can use them as such.    &lt;br /&gt;&lt;br /&gt;Where SharePoint and Groove differ with regard to populating custom spaces is how they differ with populating custom tools themselves. You cannot register a custom template with SharePoint strictly using WSS. With Groove GWS, however, you can, sort of. SharePoint site templates and Groove space archives are really immaterial to the problem of created templated workspaces. The root of the problem lies with the tool templates. By this I mean both SharePoint and Groove allow you to create empty workspaces and to add new tools based on a template-- so your tool layout could exist purely in your smart client code if you wished.&lt;br /&gt;&lt;br /&gt;For SharePoint, you must be use their HTML based administration UI to add a custom template to the system, which then allows WSS to add that custom template to a workspace. SharePoint then acts as its own distribution mechanism for the template, but cannot propogate the template to other SharePoint servers. &lt;br /&gt;&lt;br /&gt;Groove, on the other hand, because of its peer-to-peer nature, can. In fact, Groove used to allow you to add a general template as long as you identified a server on the internet to fetch it from (this is how our &lt;a href="http://www.teamdirection.com/tdweb/products/project_g3x.php"&gt;first PM tool&lt;/a&gt; works). You can&amp;#39;t do that anymore, but you can add a Groove Form with a custom schema, design and view, and &lt;b&gt;not&lt;/b&gt; need to identify a server to fetch it from. Why? Because a Groove Form is self-contained. And once its registered on an endpoint, it is propogated to other endpoints by Groove itself. And this process of adding a custom Groove Form can be done by GWS.    &lt;br /&gt;&lt;br /&gt;But that&amp;#39;s yet another part. &lt;a href="http://blogs.msdn.com/hughpyle/"&gt;Hugh Pyle&lt;/a&gt; has been extremely helpful in showing me how this works, but I have to work through it myself first before I can write about it. In the meantime, on to the this weeks installment: Adding tools to SharePoint and Groove.    &lt;br /&gt;&lt;br /&gt;What is a workspace without any tools? Not much. So both SharePoint and Groove provide a set of default tools a developer can add via web services. SharePoint and Groove also provide a way to create default workspaces that contain a default set of tools. As we saw in Part II, a SharePoint Document workspace comes packaged with tools like Announcements, Share Documents, Task List and such, while Groove&amp;#39;s default workspace contained only Files, Discussion and Members. (By the way, this is an disparity we hope to correct soon!).     &lt;br /&gt;&lt;br /&gt;But what if our SharePoint space needs a second Document Library tool, and our Groove workspace needs a Groove Form? We add them with the code outlined below.    &lt;br /&gt;&lt;br /&gt;For SharePoint, I need to identify the tool template I would like to use. Assuming I have the workspace in mind, maybe even a workspace I just created, I would use the Webs service method    &lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;GetListTemplates();&lt;/font&gt;    &lt;br /&gt;&lt;br /&gt;This will return an XML string you can parse for specific template names and identifiers. It&amp;#39;s generally human readable, which is good, since you do have to know what you&amp;#39;re looking for. But once you&amp;#39;ve identified the template id for a Document Library (&amp;quot;101&amp;quot;), you could code something like:    &lt;font color="#006400"&gt;  &lt;br /&gt;&lt;br /&gt;public void AddDocumentLibrary() {        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // We&amp;#39;ve gotten the templates via Webs, now we use the Lists service      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // to add a tool based on a template      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharePointProxies.Lists l = new SharePointProxies.Lists();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; // We&amp;#39;re caching our credentials&lt;br /&gt;&amp;nbsp; &amp;nbsp; l.Credentials = this.Credentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; // and using the workspace we created in Part II&lt;br /&gt;&amp;nbsp; &amp;nbsp; l.Url = &amp;quot;http://myserver/myroot/uniquename&amp;quot; + &amp;quot;/_vti_bin/lists.asmx&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; // The result xml from the AddList method      XmlNode resultNode = null;       &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // the display name of the tool we will add     &lt;br /&gt;&amp;nbsp;&amp;nbsp; string toolName = &amp;quot;My Display Name&amp;quot;;       &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // its template id&lt;br /&gt;&amp;nbsp; &amp;nbsp; int toolID = 101;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {             &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if successful, the result will be XML we can parse for&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultNode = l.AddList( toolName, &amp;quot;My Description&amp;quot;, toolID );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the result id, which looks a alot like a GUID         &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // I like to check for both name and id         &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultID = parseForID( toolName, toolID.ToString() );&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; catch ( System.Exception ex ) {            &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reportError( aReporter, ex.Message );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; finally {            &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( l != null ) {              &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l.Dispose();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; l = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;// a simple routine to find the ID from the AddList result XML&lt;br /&gt;private string parseForID( System.Xml.XmlNode xmlNode, string name, string templateID ) {        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Xml.XmlAttributeCollection attrs = xmlNode.Attributes;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; XmlNode idNode = attrs.GetNamedItem( &amp;quot;ID&amp;quot; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlNode titleNode = attrs.GetNamedItem( &amp;quot;Title&amp;quot; );&lt;br /&gt;&amp;nbsp; &amp;nbsp; XmlNode serverTemplateNode = attrs.GetNamedItem( &amp;quot;ServerTemplate&amp;quot; );&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; string id = ( idNode == null ) ? &amp;quot;&amp;quot; : idNode.Value;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string title = ( titleNode == null ) ? &amp;quot;&amp;quot; : titleNode.Value;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string serverTemplate = ( serverTemplateNode == null ) ? &amp;quot;&amp;quot; : serverTemplateNode.Value;          &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( title == name &amp;amp;&amp;amp; templateID == serverTemplate )          &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return id;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;The end result of the above code is the addition of a new Document Library to the SharePoint workspace. An interesting thing about this particular tool is it also supports Web Distributed Authoring and Versioning, or &lt;a href="http://www.webdav.org/"&gt;WevDAV&lt;/a&gt;. This is a nice tool in two respects: 1) You have a choice of using SharePoint WSS or WebDAV to work with it and 2) It supports versioning-- which is very hard to do in a purely peer-to-peer environment.    &lt;br /&gt;&lt;br /&gt;The pattern for adding a Groove Form to a new Groove workspace is very similar. First we call the Groove version GetListTemplates, which is part of the Tools service and is called:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;ReadAvailableTools();&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Also similar to SharePoint is you have to know what you are looking for. This call returns an array of templates you can iterate through. Each template contains a human readable Name and a not so human readable ComponentResourceURL (your remember those?). The ComponentResourceURL is like the SharePoint template identifier.    The code for adding a Groove tool via GWS follows:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;// Here is an OSD URL that identifies a Groove Form and its version&lt;br /&gt;private static string s_grooveFormComponentResourceURL =   &amp;quot;http://components.groove.net/Groove/Components/Root.osd?Package=net.groove.Groove.Tools.Business.GrooveForms.Groo  veForms_TPL&amp;amp;Version=5&amp;amp;Factory=Open&amp;quot;;    &lt;br /&gt;&lt;br /&gt;public string AddGrooveForm() {       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Tools is the container we add a Tool to      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Tools tools = new GrooveProxies.Tools();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // refer to Part I or Part II for more detail      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buildRequestHeader( tools );        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // refer to Part I or Part II for more detail      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tools.Url = m_grooveHost + m_grooveTelespaceTools;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instantiae a tool to fill out      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Tool tool = new GrooveProxies.Tool();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // with name      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tool.Name = &amp;quot;My Display Name&amp;quot;;       &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // and all-important identifier      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tool.ComponentResourceURL = s_grooveFormComponentResourceURL;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the result is the tool identifier you can append to&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // m_grooveHost     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string toolID = tools.Create( tool );      &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( toolID == null || toolID.Length == 0 )   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return toolID;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private bool acquireTelespaceTools() {        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // We go through Spaces container to find the Space tool&lt;br /&gt;&amp;nbsp; &amp;nbsp; // to find the Tools container.      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Spaces spaces = new GrooveProxies.Spaces();        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // refer to Part I or Part II if you&lt;br /&gt;&amp;nbsp; &amp;nbsp; // want to see headers built      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buildRequestHeader( spaces );        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // again, refer to Part I or Part II for more detail      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spaces.Url = m_grooveHost + m_grooveTelespace;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // retrieve data about the space      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Space space = spaces.ReadSpace();      &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( space == null )   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // retrieve the Tools container for the space      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_grooveTelespaceTools = space.Tools;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;The Groove Forms tool also has lots of nifty features, but we&amp;#39;ll get to them in another installment, I promise. In the meantime, what you have seen is how to add not just SharePoint Document Libraries or Groove Forms, but any tool given the proper template id. For each system, you could iterate through the templates returned by either GetListTemplates or ReadAvailableTools and add them to a workspace, thus creating a workspace containing every possible web part or Groove tool. &lt;br /&gt;&lt;br /&gt;In this case, SharePoint and Groove are nearly identical in how you discover and add tools.     The real differences lie in the tools themselves. Each tool tends to, understandably, acquiesce to the strengths and weaknesses of their architecture. The SharePoint Document Library supports versioning as well as robust internet protocols, while the Groove Form supports peer-to-peer distribution of schema, design and content.    &lt;br /&gt;&lt;br /&gt;We will take a more detailed look at both in Part IV.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9612" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1517" width="1" height="1"&gt;</description></item><item><title>SharePoint and Groove web services comparison and how to -- Part II</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/24/sharepoint-and-groove-web-services-comparison-and-how-to-part-ii.aspx</link><pubDate>Mon, 24 Jul 2006 22:04:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1518</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1518</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/24/sharepoint-and-groove-web-services-comparison-and-how-to-part-ii.aspx#comments</comments><description>We &lt;a href="http://www.sharepointblogs.com/pm4everyone/archive/2006/07/18/9316.aspx"&gt;left off&lt;/a&gt; with how you get past the authentication gate and talk to both SharePoint and Groove. SharePoint uses the familiar challenge/Response pattern and Groove implements a localhost/registry solution. Now that we have our clearance, let&amp;#39;s see what awaits us on the inside. Here is a table outlining the basic services for each system:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SharePoint&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    &lt;table&gt;  &lt;tr&gt;  &lt;td&gt;Administration&lt;/td&gt;  &lt;td&gt;Manage Site Collection&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Alerts&lt;/td&gt;  &lt;td&gt;Alerts for list items&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Document Workspace&lt;/td&gt;  &lt;td&gt;Manage document workspaces&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Forms&lt;/td&gt;  &lt;td&gt;HTML Display forms for list content&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Imaging&lt;/td&gt;  &lt;td&gt;Manage picture libraries&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Lists&lt;/td&gt;  &lt;td&gt;Working with lists and data&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Meetings&lt;/td&gt;  &lt;td&gt;Manage Meeting workspaces&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Permissions&lt;/td&gt;  &lt;td&gt;SharePoint Services Security&lt;/td&gt;&lt;td&gt;  &lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Sites&lt;/td&gt;  &lt;td&gt;Information about workspace templates&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Users and Groups&lt;/td&gt;  &lt;td&gt;Manage users and groups&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Versions&lt;/td&gt;  &lt;td&gt;Working with file versions&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Views&lt;/td&gt;  &lt;td&gt;Presentation views of Lists&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Webs&lt;/td&gt;  &lt;td&gt;Managing workspaces and subworkspaces&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt;  &lt;p&gt;  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groove&lt;/b&gt;&lt;br /&gt;  &lt;table&gt;  &lt;tr&gt;  &lt;td&gt;Accounts&lt;/td&gt;  &lt;td&gt;Provide Account and Identity info&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Calendar&lt;/td&gt;  &lt;td&gt;Manage Calendar Tool&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Contacts&lt;/td&gt;  &lt;td&gt;Contact info for Identities&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Discussion&lt;/td&gt;  &lt;td&gt;A Form presented as a Discussion tool&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Events&lt;/td&gt;  &lt;td&gt;Read events you subscribe to&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;FilesBase64&lt;/td&gt;  &lt;td&gt;A Files tool in Base64&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;FilesDIME&lt;/td&gt;  &lt;td&gt;A Files tool in DIME binary attachments&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Forms&lt;/td&gt;  &lt;td&gt;Highly configurable Groove Form  (Kind of like HTML Form, but more powerful)&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Local&lt;/td&gt;  &lt;td&gt;Methods that invoke the Groove UI&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Members&lt;/td&gt;  &lt;td&gt;Workspace membership info&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Messages&lt;/td&gt;  &lt;td&gt;Read and Send instant messages&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Properties&lt;/td&gt;  &lt;td&gt;Version info for Groove client and web services&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Spaces&lt;/td&gt;  &lt;td&gt;Manage Groove workspaces&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Subscriptions&lt;/td&gt;  &lt;td&gt;Monitor Groove events with subscriptions&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Tools&lt;/td&gt;  &lt;td&gt;Manage tools within a Workspace&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;VCard&lt;/td&gt;  &lt;td&gt;Detailed info for an Identity&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;  &lt;br /&gt;I&amp;#39;ve been &lt;a href="http://intelligantt.blogspot.com/2006/07/crossing-gulch.html"&gt;claiming&lt;/a&gt; that SharePoint and Groove are more similar than not. What do you suppose a merging of the two might look like? While its not a one-to-one correspondence, there are definitely similarities between the two web service APIs. But first let&amp;#39;s define a few terms:&lt;br /&gt;&lt;br /&gt;A &lt;b&gt;Workspace&lt;/b&gt; is a &lt;b&gt;SharePoint Site&lt;/b&gt; is a &lt;b&gt;Groove Workspace&lt;/b&gt;.&lt;br /&gt;A &lt;b&gt;Tool&lt;/b&gt; is a &lt;b&gt;SharePoint Web Part&lt;/b&gt; is a &lt;b&gt;Groove Tool&lt;/b&gt;.&lt;br /&gt;A &lt;b&gt;User&lt;/b&gt; is a &lt;b&gt;SharePoint User&lt;/b&gt; is a &lt;b&gt;Groove Account and Identity&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;And finally, the most important:&lt;br /&gt;&lt;br /&gt;A &lt;b&gt;Form&lt;/b&gt; is a &lt;b&gt;SharePoint List&lt;/b&gt; is a &lt;b&gt;Groove Form&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Given the above terms, I can claim that the following web services are similar:&lt;br /&gt;&lt;br /&gt;  &lt;table&gt;  &lt;tr&gt;  &lt;td&gt;&lt;b&gt;SharePoint&lt;/b&gt;&lt;/td&gt;  &lt;td&gt;&lt;b&gt;Groove&lt;/b&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Administration, Sites&lt;/td&gt;  &lt;td&gt;Spaces&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Alerts&lt;/td&gt;  &lt;td&gt;Events, Subscriptions&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Document Workspace&lt;/td&gt;  &lt;td&gt;Space*&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Meetings&lt;/td&gt;  &lt;td&gt;Space*&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Lists, Views, Forms&lt;/td&gt;  &lt;td&gt;Forms&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Users and Groups&amp;nbsp;&lt;/td&gt;  &lt;td&gt;Accounts, Members&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;Webs&lt;/td&gt;  &lt;td&gt;Spaces&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;  &lt;br /&gt;&lt;br /&gt;*Groove follows a container/item pattern whereby the web service often exposes a container, which in turn manipulates specific items within that container. For spaces, we can ask Groove for all workspaces, identify a particular Space, and then drill down for more information.&lt;br /&gt;&lt;br /&gt;So let&amp;#39;s do some sample code. First up is SharePoint.&lt;br /&gt;&lt;br /&gt;Now that I can talk to SharePoint, I&amp;#39;d like to create a Workspace. First I must determine where I want to locate it. SharePoint follows a hierarchical convention much like a file system. It happens to be a database under the covers, but the effect is that standard URL addressing works just fine.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s say we have a SharePoint server set up at &lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;http://myserver&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;And that we&amp;#39;ve set up a root site at&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;/myroot&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;We can then address the location we want to base our creation as&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;http://myserver/myroot&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;So we use the SharePoint Document Workspace Server (which we will call DWS) in the following code:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;// the Document Workspace Service&lt;br /&gt;SharePointProxies.Dws dws = new SharePointProxies.Dws();&lt;br /&gt;&lt;br /&gt;// we&amp;#39;re caching our credentials&lt;br /&gt;dws.Credentials = this.Credentials;&lt;br /&gt;&lt;br /&gt;// the web service address&lt;br /&gt;dws.Url = &amp;quot;http://myserver/myroot&amp;quot; + &amp;quot;/_vti_bin/dws.asmx&amp;quot;;&lt;br /&gt;&lt;br /&gt;string result = &amp;quot;&amp;quot;;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = dws.CreateDws( &amp;quot;uniquename&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;My Title -- Hello World!&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;catch ( System.Net.WebException webex ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reportError( webex );&lt;br /&gt;}&lt;br /&gt;catch ( System.Exception sysex ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reportError( sysex );&lt;br /&gt;}&lt;br /&gt;finally {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( dws != null ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dws.Dispose(); // Don&amp;#39;t forget to dispose these web service calls!&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dws = null; // I try to help the garbage collector whenever I can.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Uri newWorkspaceLocation = parseResultForUri( newWorkspaceLocation );&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And voila, you have created a new Document Workspace &amp;#39;under&amp;#39; http://myserver/myroot with an address of&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://myserver/myroot/uniquename&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now what is a Document Workspace? It is a blank workspace with the following web parts added:&lt;br /&gt;&lt;br /&gt;1) Announcements&lt;br /&gt;2) Shared Documents&lt;br /&gt;3) Tasks&lt;br /&gt;4) Contact List&lt;br /&gt;5) Event List&lt;br /&gt;6) Discussion&lt;br /&gt;7) Surveys&lt;br /&gt;8) Links&lt;br /&gt;9) Members&lt;br /&gt;&lt;br /&gt;Obviously all these web parts weren&amp;#39;t individually represented in the SharePoint services defined above. What most of them are (Announcements, Tasks, Contacts, Events, Discussion, Links, Surveys and Share Documents) are permutations of a SharePoint List. You can verify this by making a SharePointProxies.Lists.GetListCollection call, which tells you the lists in a SharePoint workspace. In fact, the only thing that is not a list is the Members web part. Hmmm... interesting...&lt;br /&gt;&lt;br /&gt;And now let&amp;#39;s look at instantiating a Groove Workspace.&lt;br /&gt;&lt;br /&gt;Groove has a shallow addressing scheme, which means yes there is a hiearchy for workspaces, but its a single parent/child relationship. You can organize workspaces into hiearchical folders via the Groove Launchbar UI, however, for addressing purposes, you usually work with an url like:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://localhost:9080/&amp;lt;groove service&amp;gt;/&amp;lt;identifier&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Groove version of the SharePoint Document Workspace Service is the Spaces service. Spaces is short for Workspaces and, unlike SharePoint, Groove provides the unique identifier for you. In fact, Groove usually provides the unique identifier for everything.&lt;br /&gt;&lt;br /&gt;Here is code to create a Groove Workspace.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;// This bundle of info is an identifier for the Groove default workspace.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// It&amp;#39;s a more generic version of the SharePoint Document Workspace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// in that there are many different Component Resource URLs you&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// could use to instantiate a space. This one specifies we&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// should use version 4 of the default workspace, which&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// comes with a files tool and a discussion tool.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;private static string s_grooveWorkspaceComponentResourceURL = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;quot;http://components.groove.net/Groove/Components/Tools/System/SystemTools.osd?Package=net.groove.Groove.Tools.Syste&lt;/span&gt;&lt;br /&gt;&lt;span&gt;m.GrooveDefault_CST&amp;amp;amp;Version=4&amp;amp;amp;Factory=Open&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;// remember the context that Groove needs?&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// this assumes you went through the discovery process in Part I&lt;/span&gt;&lt;br /&gt;&lt;span&gt;// and have cached the necessary values.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;private void buildRequestHeader( WSDLProxies.Spaces spaces ) {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spaces.GrooveRequestHeaderValue = new GrooveProxies.GrooveRequestHeader();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spaces.GrooveRequestHeaderValue.GrooveRequestKey = m_grooveRequestKey;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spaces.GrooveRequestHeaderValue.GrooveIdentityURL = m_grooveIdentity;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;private bool createGrooveWorkspace() {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Spaces is the container service for Space operations.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Spaces spaces = new GrooveProxies.Spaces();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buildRequestHeader( spaces );&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spaces.Url = m_grooveHost + &amp;quot;/GWS/Groove/2.0/Spaces/&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // setdata to the particular item&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrooveProxies.Space space = new GrooveProxies.Space();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; space.Name = title;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use the container to invoke the operation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string grooveTelespace = spaces.Create( space, s_grooveWorkspaceComponentResourceURL );&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // grooveTelespace now contains the &amp;lt;groove service&amp;gt; and &amp;lt;identifier&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // so you can concatenate m_grooveHost and grooveTelespace for future&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // calls.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The result of createGrooveWorkspace is a new, default Groove Workspace. Now what is a default Groove Workspace? As of today, it is a blank workspace with the following tools added:&lt;br /&gt;&lt;br /&gt;1) Files&lt;br /&gt;2) Discussion&lt;br /&gt;3) Members&lt;br /&gt;&lt;br /&gt;The files web service is provided by either GrooveFilesBase64 or GrooeFilesDIME. The discussion web service is provided by GrooveDiscussion, however, it is actually a GrooveForm with discussion semantics-- much like those SharePoint lists masquerading as various tools. And the member web service is provided by GrooveMembers.&lt;br /&gt;&lt;br /&gt;As we noted above, Groove&amp;#39;s workspace creation is designed to be much more generic than SharePoint&amp;#39;s Document Workspace. It used to be, in Groove, you could create your own workspace templates and feed that workspace&amp;#39;s component resource url and presto, you&amp;#39;d have a workspace designed to your template specs. However, I don&amp;#39;t believe this feature is available anymore. Maybe in the future.&lt;br /&gt;&lt;br /&gt;What you can do is manipulate individual tools to configure the Groove workspace how you&amp;#39;d like. For instance, &lt;a href="http://www.teamdirection.com/tdweb/products/project_wss.php"&gt;our product&lt;/a&gt; will be adding a Groove Forms tool. However, the Groove Forms tool cuts a wide swath of functionality, and really deserves its own part.&lt;br /&gt;&lt;br /&gt;Perhaps Part III?&lt;br /&gt;&lt;br /&gt;Finally, for all you old timers out there, no you weren&amp;#39;t dreaming. You were probably thinking that Groove component resource URL looked a lot like something from the &lt;a href="http://www.w3.org/TR/NOTE-OSD"&gt;Open Software Description Specification&lt;/a&gt;. And in fact, you would be correct. Pre-Groove 2007 you could use OSD specifications to inject new functionality into Groove. &lt;br /&gt;&lt;br /&gt;This is on hiatus for the moment, but I wouldn&amp;#39;t be a bit surprised if OSD injection becomes available once again in a future version.&lt;/p&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9440" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1518" width="1" height="1"&gt;</description></item><item><title>SharePoint and Groove web services comparison and how to -- Part I</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/18/sharepoint-and-groove-web-services-comparison-and-how-to-part-i.aspx</link><pubDate>Wed, 19 Jul 2006 00:18:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1519</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1519</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/18/sharepoint-and-groove-web-services-comparison-and-how-to-part-i.aspx#comments</comments><description>I&amp;#39;ve always wanted to start a series. And while I&amp;#39;m no Alexandre Dumas, I&amp;#39;m sure the topic will be no less exciting: Comparing SharePoint web services with Groove web services. OK, so maybe there&amp;#39;s not as much intrigue but with the convergence of SharePoint and Groove its no less interesting and quite a bit more relevant. &lt;br /&gt;&lt;br /&gt;My &lt;a href="http://www.teamdirection.com/"&gt;company&lt;/a&gt; produces Project Management software for both &lt;a href="http://www.teamdirection.com/tdweb/products/project_wss.php"&gt;SharePoint&lt;/a&gt; and &lt;a href="http://www.teamdirection.com/tdweb/products/project_g3x.php"&gt;Groove&lt;/a&gt;. We just released our SharePoint product that uses web services and while we&amp;#39;ve been shipping a Groove tool for the past three years, we&amp;#39;re making a transition to web services for Groove 12. Over the course of several web posts, I will share my experiences with both web service platforms and hope to draw a conclusion on where things are headed. As a teaser, I believe SharePoint and Groove will oneday converge since their models are very, very similar. I talk about this a little bit &lt;a href="http://intelligantt.blogspot.com/2006/07/crossing-gulch.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note: for brevity, I will refer to SharePoint Web Services as WSS, and Groove Web Services as GWS. Also, I will assume you can set up the web service proxies for both systems. There&amp;#39;s plenty of help for WSS. For GWS, a good jumping off point is Hugh Pyle&amp;#39;s &lt;a href="http://blogs.msdn.com/hughpyle/"&gt;blog&lt;/a&gt;. I&amp;#39;m here to help you get up and running. On to the story....&lt;br /&gt;&lt;br /&gt;Everything has a beginning and when talking web services you have to start with authentication. If you&amp;#39;re not authenticated, you won&amp;#39;t get far. So how to authenticate?&lt;br /&gt;&lt;br /&gt;For both systems, authentication information is bundled into each web service request. However, &lt;i&gt;how&lt;/i&gt; they bundle the information is quite different.&amp;nbsp; With WSS, each web service request contains credential information. This is standard SOAP that works with the System.Net.CredentialCache. For example:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;SharePointProxies.Lists l = new SharePointProxies.Lists();&lt;br /&gt;l.Credentials = this.System.Net.CredentialCache.DefaultCredentials.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;If your default credentials are not sufficient, you will need to create your own credentials, preferably with the credentials UI Microsoft &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/dpapiusercredentials.asp"&gt;provides&lt;/a&gt;. This is the standard Challenge/Response scenario common to Client/Server... oops, I mean Smart Client/Web Service computing.&lt;br /&gt;&lt;br /&gt;That&amp;#39;s about it for SharePoint since you can only log in as a single entity. Now that you have the proper credentials, you can access WSS for site information, member lists, tools and such. Just be sure to keep that credential handy.&lt;br /&gt;&lt;br /&gt;Groove is a different beast, however. While it is a web service endpoint, it is in fact the world&amp;#39;s smartest smart client. By this I mean you will most likely be accessing GWS via localhost on the &lt;i&gt;same&lt;/i&gt; computer as your application. Because of this, GWS does not use System.Net.ICredentials, but instead creates a separate authentiaction requirement: windows registry lookups for key values.&lt;br /&gt;&lt;br /&gt;What&amp;#39;s happening is this: because Groove is a smart client most likely running on your local machine, it sets keys for access into the CURRENT_USER hive in your registry. Specifically:&lt;br /&gt;&lt;font color="#006400"&gt;&lt;br /&gt;// Read GrooveLocalHTTPPort&lt;br /&gt;Microsoft.Win32.RegistryKey grooveRegKey = &amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.Win32.Registry.CurrentUser.OpenSubKey( &amp;quot;Software\\Microsoft\\Office\\12.0\\Groove&amp;quot; );&lt;br /&gt;string grooveHost= &amp;quot;http://localhost:&amp;quot; + grooveRegKey.GetValue(&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;GrooveLocalHTTPPort&amp;quot; ).ToString();&lt;br /&gt;&lt;br /&gt;// Read LocalRequestKey&lt;br /&gt;Microsoft.Win32.RegistryKey grooveWebServicesRegKey&amp;nbsp; = Microsoft.Win32.Registry.CurrentUser.OpenSubKey( &amp;quot;Software\\Microsoft\\Office\\12.0\\Groove\\WebServices&amp;quot;);&lt;br /&gt;string grooveRequestKey = (string)grooveWebServicesRegKey.GetValue( &amp;quot;LocalRequestKey&amp;quot;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;There is a third key for remote access, but it&amp;#39;s left to the user to transport the key value from the computer running GWS to the machine that wants to talk to GWS. Because these keys are generated every time your start Groove, its a non-trivial challenge. The port is also generated by Groove in that 9080 is preferred, but it will bounce higher if another process has already grabbed 9080. So we perform the lookup on this as well.&lt;br /&gt;&lt;br /&gt;Once you have the keys, you still must figure out who you want to be. This is done by accessing the GrooveAccounts. You can have multiple user accounts in Groove, much like multiple logins in Windows. Additionally, each account can have multiple identities. GWS wants to know exactly what &lt;i&gt;Identity&lt;/i&gt; you want to be in order to work. Maybe you only have one Account with one Identity, in which case life is simple. But if you have multiple Accounts with multiple Identities, then you will need to settle on one. Here is how you can iterate through the choices:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;// Create the GrooveAccounts service&lt;br /&gt;GrooveProxies.Accounts accounts = new GrooveProxies.Accounts();&lt;br /&gt;accounts.GrooveRequestHeaderValue = new GrooveProxies.GrooveRequestHeader();&lt;br /&gt;accounts.GrooveRequestHeaderValue.GrooveRequestKey = grooveRequestKey;&lt;br /&gt;accounts.Url = grooveHost + &amp;quot;/GWS/Groove/2.0/Accounts/&amp;quot;;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;// Read the accounts-- this is the actual Web Service Call&lt;br /&gt;GrooveProxies.Account2 [] result = accounts.Read2();&lt;br /&gt;&lt;br /&gt;// Display accounts and identities&lt;br /&gt;foreach ( GrooveProxies.Account2 account in result) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Console.WriteLine( account.Name );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( GrooveProxies.Identity2 identity in account.Identities) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Console.WriteLine( &amp;quot;\t&amp;quot; + identity.Name );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Once you select your Identity, you have the GWS equivalent of the WSS System.Net.ICredential.&lt;br /&gt;&lt;br /&gt;Did you notice the GrooveRequestHeader? This is how GWS extends basic SOAP packets to include its own keys and identity information. Whereas WSS uses a basic SOAP property&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;SharePointProxies.Lists.Credentials&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;GWS requires that you use:&lt;br /&gt;&lt;br /&gt;&lt;font color="#006400"&gt;GrooveRequestHeader&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;for authentication. And remember, those GWS key values will change every time the Groove process is restarted, so you can&amp;#39;t cache keys. Instead, you should have a routine that does lookups for you when you start a series of operations. Also, unlike WSS, you cannot use the Microsoft credentials UI since GWS does not use System.Net.ICredentials. In fact, Groove has its own login UI that will challenge the user for a password. However, people (like me) often choose the &amp;#39;Remember Password&amp;#39; option in Groove and rely on a successful Windows login for user validation. Once GWS is accessible, it will provide you the &lt;span&gt;choice&lt;/span&gt; of Accounts and Identities you can use. &lt;br /&gt;&lt;br /&gt;Wouldn&amp;#39;t it be nice if Groove used the System.Net.ICredentials system as well? I suspect this will happen in the future.&lt;br /&gt;&lt;br /&gt;Congratulations, you&amp;#39;ve just been cleared to talk WSS and GWS! But remember that this is a series. We will find out how to gather information about Sites and Workspaces in Part II.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9316" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1519" width="1" height="1"&gt;</description></item><item><title>SharePoint Web Part vs. Smart Client using WSS</title><link>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/11/sharepoint-web-part-vs-smart-client-using-wss.aspx</link><pubDate>Tue, 11 Jul 2006 08:10:00 GMT</pubDate><guid isPermaLink="false">1f6a1193-f4bb-4480-a5ae-b538d8b20f46:1520</guid><dc:creator>Unclaimed Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.sharepointblogs.com/pm4everyone/rsscomments.aspx?PostID=1520</wfw:commentRss><comments>http://www.sharepointblogs.com/pm4everyone/archive/2006/07/11/sharepoint-web-part-vs-smart-client-using-wss.aspx#comments</comments><description>Suppose you wanted to build a Project Management solution and you thought SharePoint was pretty neat. Then you got a group of programmers you respected and you knew could do the job. Then imagine this group of programmers had to decide whether to build a web part or a smart application. At the end of the discussion would you a) have consensus and begin coding right away or b) have to come back the next day with doughnuts and alms to ease the tension and hash it out again.&lt;br /&gt;&lt;br /&gt;If you&amp;#39;re like us, then the answer was .... errr... (b). The arguments were plentiful and forceful, but mostly boiled down to ease of deployment and management for web parts vs richer UI and offline mobility for smart clients.&lt;br /&gt;&lt;br /&gt;Before I get too far down the road, however, I should point out how overweighted towards web parts the SharePoint community seems to be. For instance, doing a cursory search of SharePointBlogs.com yielded only two(!) mentions of smart client technology:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/henkhooiveld/archive/2005/12/15/4400.aspx"&gt;Henk Hooiveld&amp;#39;s blog on SharePoint and Office&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sharepointblogs.com/tbaginski/archive/2006/05/31/8012.aspx"&gt;Todd Baginski&amp;#39;s SharePoint 2003 and MOSS 2007 blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obviously the developer community has spoken and it&amp;#39;s web parts in a runaway. But the right decision for a particular circumstance is the right decision, even if everyone else thinks you&amp;#39;re wrong &lt;img src="http://www.sharepointblogs.com/emoticons/emotion-1.gif" alt="smile" /&gt;.&lt;br /&gt;&lt;br /&gt;For me it came down to the nature of the application and mobility. Mind you, I have my set of biases. Before SharePoint we developed a product for Groove (also project management), which carries smart client technology to the nth degree (must have been doing something right though, since Microsoft bought them and created the &lt;a href="http://news.com.com/Microsoft+splits+Office+duties/2100-1014_3-6078520.html"&gt;SharePoint, Groove and Project group&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The application aspect of the decision is the most rock solid for me. Project Management has enough complexity that it can be difficult to manipulate the various components without a lot of serious DHML and vbscript. And even then it seems problematic to do drag and drop scheduling in an &lt;a href="http://intelligantt.blogspot.com/2006/07/its-intelligent-its-gantt-its.html"&gt;interactive gantt chart&lt;/a&gt; through your browser without an ActiveX control of some sort-- and that would obviate the east of deployment advantage. While some approximation has been done by a few companies, it has taken them several iterations to approach basic usability. And we wanted to make usability one of our selling points.&lt;br /&gt;&lt;br /&gt;The mobility aspect of our decision really comes down to when you believe will happen. I fully believe that some day no matter where you are, you will be able to access the internet. But that day has not arrived yet, and it won&amp;#39;t arrive by the end of this decade either. And the day it does arrive, it actually won&amp;#39;t because that will be the day they announce public travel to the moon, with internet connectivity coming soon. But maybe you reading this at Starbucks on your Danger Sidekick and shaking your head at the crumudgeon who just doesn&amp;#39;t get it. Well, go start your own company &lt;img src="http://www.sharepointblogs.com/emoticons/emotion-5.gif" alt="wink" /&gt;.&lt;br /&gt;&lt;br /&gt;Now I absolutely acknowledge the inherent distribution superiorty of a web application, or web part. However, I would argue its not quite as superior as it once was. Sure, if faced with the choice of purchasing boxes of software and installing them machine by machine, then I bow down before the web server and chant &amp;#39;ease of deployment&amp;#39;. HOWEVER... those were the bad old days. Today, tools like SMS and technology like .NET reduce the web application distribution advantage to almost even. I recall a recent conversation with an IT person at a Fortune 500 company who stated they can update all 15,000 machines with new software in under 60 minutes.&lt;br /&gt;&lt;br /&gt;So our decision came do to this: If you believe your application is complex enough and you don&amp;#39;t believe in an &amp;#39;always on anywhere&amp;#39; internet, then the benefits of a smart client will outweigh the single (but substantial) benefit of deployment. If you want to build the world&amp;#39;s best name, rank and serial number data entry application, then I think a web part makes absolute perfect sense. But if you want to create an app that that is focused on user experience and furthers what&amp;#39;s possible with todays rich UIs, then a rich, smart client is the way to go.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.teamdirection.com/"&gt;We&lt;/a&gt; certainly hope so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=9086" width="1" height="1" alt="" /&gt;
			&lt;hr&gt;&lt;span style="font-size:10pt;"&gt;Posted on &lt;a href="http://www.sharepointblogs.com/"&gt;SharePoint Blogs&lt;/a&gt;&lt;/span&gt;
		  &lt;img src="http://www.sharepointblogs.com/aggbug.aspx?PostID=1520" width="1" height="1"&gt;</description></item></channel></rss>