<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>The Art of Possible</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/arbindo/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/arbindo/feed.xml</link>
    <description>The greatest pleasure in life is doing what people say you can’t do</description>
    <lastBuildDate>Tue, 16 Apr 2019 04:41:26 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Analysis: Who creates a new team in Microsoft Teams - End user or IT?</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/analysis-who-creates-a-new-team-in-microsoft-teams-end-user-or-it</link>
      <pubDate>Tue, 01 May 2018 01:55:16 GMT</pubDate>
      <dc:creator><![CDATA[Arbindo_C]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/?p=1085</guid>
      <description><![CDATA[Introduction
Are you here looking for an answer to the question in the tile? If you are Microsoft...]]></description>
      <content:encoded><![CDATA[<h1><span style="text-decoration:underline">Introduction
</span></h1><p>Are you here looking for an answer to the question in the tile? If you are Microsoft partner helping our customer implement Teams or our customer in the process of implementing Teams, then it is likely this topic is being discussed. Almost every customer I work with asks me what other customers are doing about Teams provisioning? Are others allowing end users to create a new Team as and when they need or is there a review and approval process? 
</p><p>Few years back, <strong>this question was not even asked</strong> in large enterprises. In recent years, organizations have developed processes for provisioning SharePoint sites and file shares. This process usually included request from end user, followed by review and approval by IT prior to provisioning an additional content store.  <strong>Then why this question now</strong>? What has changed that has prompted IT to even consider if end users should be allowed to create a new Team without any review and approval? 
</p><p>To understand this, lets understand why organizations have a process in place for provisioning:
</p><h1><span style="text-decoration:underline">Historical reasons for review and approval process
</span></h1><h2>CAPEX &amp; OPEX
</h2><p>With on premises infrastructure such as Exchange Server and SharePoint, every new SharePoint site or a mailbox resulted in additional CAPEX &amp; OPEX to manage the content. Though cost of storage is going down, there is still a limit, and if IT does not control growth, it ends up increasing CAPEX &amp; OPEX – storage, networking, security, etc. In addition, IT is responsible for meeting SLA (Service Level Agreements), and with increase in CAPEX there is additional cost to ensure there are adequate people, processes and technology to ensure SLAs are met. Some organizations may also have a secondary disaster recovery infrastructure, which also needs infrastructure boost with increase in usage.
</p><p>Review and approval process for provisioning allowed IT to <strong>gather business justification</strong> for new content store. In some cases, this process also allowed IT to <strong>charge back to business units</strong>.
</p><h2>Redundant content:
</h2><p>Broadly speaking there are 2 types of content store – <strong>authoritative and project based</strong>. Authoritative content store includes corporate content, which is single source of truth for entire organization. These are managed centrally, and the content usually goes through review process before being published in that store. Examples include HR policies, financial reports, organizational records etc. Project based on the other hand are short lived content with limited visibility (compared to authoritative), and may become authoritative as it matures. Examples include initiatives, and projects. As noted earlier, you need review and approval for creating authoritative content store and to publish content in that store. Lack of review and approval in this scenario will result in redundant and obsolete content. Without a process you will end up having several HR policies, some new, some old and some in between. 
</p><p>In case of project based content, the scope itself is limited to a group of users. Still you can have redundant content stores in scenarios where users from two separate groups create a SharePoint site for a similar initiative. In some cases, this is a valid need, but what if it is not? <strong>What if these two groups really needed to work together in same SharePoint site</strong>? 
</p><p>Review and approval process in this case <strong>may have prevented</strong> creation of 2 separate SharePoint sites (assuming IT has visibility to existing sites and aware of business justification for each SharePoint site).
</p><h2>Obsolete content:
</h2><p>Do you know someone who is still <strong>holding on to their emails from 15 years back</strong>? Most of us do because as human we are programmed to hold on to things in case we may need it in future. You will see this play out in large enterprises where you have several file shares, folders and SharePoint sites that are no longer being used. In some cases, IT finds it difficult to get rid of this content because either the owner has left the organization or owner feels there is still a need to retain this content. 
</p><p>Review and approval process would capture business need for this content and <strong>drive the retention and disposition</strong>. 
</p><h2>Security &amp; compliance concerns:
</h2><p>Every organization big or small in most countries need to <strong>comply with industry and Govt. regulations</strong>. It could be GDPR or HIPAA or SOX or anything else. Compliance need the content to be secured, audited, archived, and reviewed based on the privacy and other needs by the regulations. As new content store or content is created, organizations need to ensure that content complies with regulatory requirements. 
</p><p>Review and approval process helps IT to ensure <strong>appropriate compliance controls</strong> are enabled based on the business need of the content store. 
</p><h2>Legal liability:
</h2><p>One of the biggest liability of not disposing content is the <strong>exposure to legal litigation</strong>. Content that does not need to be retained must be disposed to reduce risk of exposure from legal litigation. In addition to legal exposure, additional content results in additional expenses for attorneys review of the content during eDiscovery process. 
</p><p>In this scenario, having a review and approval process helps in determining the <strong>lifespan and classification</strong> of the content store resulting in retention rules.
</p><h2>Findability and user experience:
</h2><p>Have you heard users complaining <strong>search doesn't work</strong>? It doesn't because most of the content is <strong>outdated and therefore irrelevant</strong>. Our earlier points on redundant and obsolete content directly affects the search experience. Imagine trying to find recent example for a RFP response, and in turn spending time clicking through results before you find something relevant. Naming the content store has direct impact on findability as well. Imagine searching for RFP and seeing results of 10 folders named 'RFP Response'. 
</p><p>With review and approval process, the thought is that IT would guide users with naming to alleviate the findability concern.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/05/050118_0155_AnalysisWho1.png" alt="" />
	</p><h1><span style="text-decoration:underline">Discussion between end user and IT
</span></h1><p>Now the question is whether the reasons stated above are still valid? To understand this, I encourage you to watch <a href="https://www.youtube.com/watch?time_continue=1787&amp;v=HeccYWdvHDY">this recording</a> of a dialog between end users and IT community. A lot has changed in last few years, not only technology has advanced, but <strong>agility has become key driver of business success</strong>. Today CIO has to balance risk of compliance and security with speed of innovation. I am seeing more and more organizations discussing this topic, and some even going so far as to removing all the review and approval process for creating a team in Microsoft Teams. Microsoft's IT is an example. Is your or your customer's organization ready to take the leap? Should you open it up for end users to create new Teams or take a gradual step in the process. Following are some key perspectives from the discussion in the recorded video.
</p><h2>End user perspective
</h2><p>Following are some key themes from end users. Note these are not actual phrases, but the essence of the conversation.
</p><ol><li>People fight with me when I give wrong names. Don't tell me I cannot create teams. <strong>Educate me</strong> in soft skills, such as naming convention, necessary to make better decisions 
</li><li>Just like driver needs a driving license, make sure users who are empowered to create new team has been through <strong>appropriate training</strong>. 
</li><li>End users do not understand compliance unless they are part of compliance group. Help end <strong>users understand why compliance is important</strong>, and help understand what needs to be protected and how
</li><li>Control <strong>defeats innovation</strong> for learning something new. It is an experiment to learn and adjust for creating new policies for your organization. <strong>It is not point of failure, it is attempted learning</strong>
		</li><li>If I am in a meeting with other end users and we decide to start a team for collaboration, I cannot wait 3, 1 or even half a day before my request for new team is approved. How do we <strong>balance speed and compliance?</strong>
		</li><li>As an end user, I am not going to ask right questions. Don't write too many rules because <strong>you are keeping me dumb</strong>. Invest in end users. Educate us why this is important. This is <strong>an investment that will help in future</strong>
		</li><li>Turing a control ON or OFF is not a right question. How do we <strong>enable end users to leverage technology to drive business value</strong> and what requirements we have? There is no good or bad, there is <strong>contextual learning</strong>
		</li></ol><h2>IT perspective
</h2><p>Following are some key themes from IT pro community. Note these are not actual phrases, but the essence of the conversation.
</p><ol><li>When you create a new Team, other artifacts get created such as Groups, SharePoint site, and a mailbox. SharePoint is a good example. What if you have created a Team for which a SharePoint site already exists? In this scenario, you end up with <strong>two SharePoint sites for same purpose</strong>. This impacts search. As an IT pro, I want users to adopt and also want to put <strong>process in place that is fast for approvals</strong>. 
</li><li>IT is responsible to protect corporate assets. In highly regulated organizations, we need to know what is being put in there so that we can control the security and expiration. We need to know when new group or team gets created. This will help us reach out for <strong>training and information protection</strong>
		</li></ol><h1><span style="text-decoration:underline">Analysis
</span></h1><p>One common theme among end users is <strong>educate, don't control; </strong>and similarly, from IT the concern includes points we discussed above: security, compliance, and findability. I believe now is the time for every organization to revisit this topic and have a discussion between end users and IT. There are several technical controls today to ensure security and compliance, but it does not replace the need to ensure <strong>end users are educated about importance and risks</strong>. Every initiative includes people, process and technology aspect, and it starts with people. Like one of the end user suggested, let's not make end users dumb by applying controls, but <strong>empower them</strong> by education. 
</p><p>Even with all the education and technology controls, there could be a very valid reason to have a review and approval process for creating a new Team. Maybe you could implement the driving license analogy to ensure users who are empowered are trained and understand their responsibility. Other factors to consider is the industry and maturity of IT processes. 
</p><p>Unfortunately, there is no one answer that suits every organization.  As a service vendor, we provide controls you can use to manage the process. In following section we will revisit all the concerns we discussed above in the light of new IT controls offered by Microsoft 365. 
</p><p>Use this as a guidance to help you decide how you <strong>balance between compliance and agility</strong>.
</p><h2>CAPEX &amp; OPEX
</h2><p>Just recently there was an <a href="https://techcommunity.microsoft.com/t5/SharePoint-Blog/Increase-in-SharePoint-Online-storage-allocation/ba-p/187617">announcement</a> about expanding the SharePoint storage by 20x in SharePoint online per user license storage allocation. The point being, when you are using cloud service such as Office 365, your <strong>infrastructure management cost goes down</strong>. You are not managing backup / recovery, storage or even a disaster recovery infrastructure. This does not mean there is no limit, but the whole idea of managing additional infrastructure with increase in usage is not a concern it was when you had all your infrastructure on premises. For instance, for 5000 users you get total of 51 TB of storage. This should be sufficient enough for most organizations to alleviate infrastructure management concerns with respect to Teams provisioning.
</p><h2>Redundant content:
</h2><p>Earlier we talked about authoritative and project based content. In Office 365, SharePoint provides content services for storing, managing and recommending content for end users. You would use SharePoint capabilities such as publishing, communication and hub sites for managing authoritative content across your organization. Similarly, you would use Microsoft Teams for project based content such as projects and initiatives. Remember, when you create a new team, a SharePoint team site is created for you, and all the files within Teams team is stored and managed behind the scene by SharePoint. 
</p><p>In order to address the concern of having more than one team with same name, you can now use the <a href="https://support.office.com/en-us/article/Office-365-Groups-Naming-Policy-6ceca4d3-cad1-4532-9f0f-d469dfbbb552">Office 365 Groups naming policy</a>  capability. With naming policy you can define <strong>prefix and suffix rules such that name of new Group</strong> includes user's department in the prefix. For instance, when user Joe from HR creates a Group / Team named 'Hurricane Relief', the name becomes 'HR_Hurricane Reflief', similarly when user Jane from Marketing creates a new Group / Team named 'Hurricane Relief', the name becomes 'Marketing_Hurricane Relief'. This naming convention eventually helps with findability because when someone is trying to email to a Group 'Hurricane Relief', they will see 2 separate groups in their Global Address List, one with prefix of HR and other with prefix of Marketing. 
</p><p>One common IT ask is to prevent end users from creating Teams / Groups with names that suggests corporate functions such as HR, Marketing, Legal etc. These names are reserved for authoritative content stores managed at corporate level. Now IT can achieve this requirement by using Office 365 Groups naming policy with blocked words
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/05/050118_0155_AnalysisWho2.png" alt="" />
	</p><h2>Obsolete content:
</h2><p>As mentioned earlier, obsolete content is biggest concern not only for IT but also for legal because of the legal exposure. Most organizations find themselves trying to clean up their content every 2 to 5 years by asking their users to revisit what they have stored in file shares and SharePoint sites. This concern is now addressed with Office 365 <a href="https://support.office.com/en-us/article/office-365-group-expiration-policy-8d253fe5-0e09-4b3c-8b5e-f48def064733">expiration policy</a>. With expiration policy, IT can <strong>define length of period</strong> after which the team owner <strong>will need to confirm</strong> that a team is still being used. If there is no confirmation, the team will be disposed. 
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/05/050118_0155_AnalysisWho3.png" alt="" />
	</p><h2>Security &amp; compliance concerns:
</h2><p><a href="https://techcommunity.microsoft.com/t5/Security-Privacy-and-Compliance/Compliance-Manager-Preview-is-now-available/ba-p/124662">Compliance manager</a>  is a new capability in Office 365 that allows organizations to perform an assessment of their current compliance controls and provides recommendations to address the gaps. This is particularly important for <a href="https://www.microsoft.com/en-us/TrustCenter/Privacy/gdpr/default.aspx?&amp;wt.srch=1&amp;wt.mc_id=AID641639_SEM_w8IiEsqO&amp;msclkid=b162ba01582a19cf122ce0e74d83676a">GDPR</a> (General Data Protection Regulation) compliance needs. 
</p><p>To address security requirements, Office 365 provides DLP (<a href="https://support.office.com/en-us/article/Overview-of-data-loss-prevention-policies-1966b2a7-d1e2-4d92-ab61-42efbb137f5e">Data Loss Prevention</a>) and AIP (<a href="https://docs.microsoft.com/en-us/azure/information-protection/understand-explore/what-is-information-protection">Azure Information Protection</a>) capabilities irrespective of where content is stored within Office 365. DLP allows IT to create policies that would prevent users from sharing sensitive content. AIP allows IT to create policies to add protection controls within the content based on DLP rules and classification labels. AIP ensures that content is protected irrespective of where it travels from one user to another. For instance, if a document contains SSN information, AIP would classify the document as Highly Confidential and then apply encryption such that only users from HR department can view the document. So even if the document is now emailed outside, either accidently or by a malicious user, the document cannot be opened by users other than from HR department.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/05/050118_0155_AnalysisWho4.jpg" alt="" />
	</p><h2>Legal liability:
</h2><p>Another great capability to deal with legal liability is the advanced <a href="https://support.office.com/en-us/article/Manage-data-governance-in-Office-365-48064107-fed2-4db0-9e5c-aa5ddd5ccb09">data governance policies</a>. This capability allows IT to <strong>define length of period content should either be retained</strong>, for compliance reasons, or be deleted. For instance, if a content is tagged as a contract, and if contract needs to be retained for 5 years, even if the contract is deleted by a user, Office 365 will retain the contract document for 5 years. Similarly, if the policy states that any document should be deleted in 7 years from the date of creation, the document will be deleted in 7 years even if user has not deleted the document. Data <a href="https://techcommunity.microsoft.com/t5/Microsoft-Teams-Blog/Retention-policies-for-Microsoft-Teams/ba-p/178011">retention policies</a> are now available for Microsoft Teams
</p><p>Capabilities such as expiration policy and advanced data governance helps address the compliance needs across Office 365.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/05/050118_0155_AnalysisWho5.png" alt="" />
	</p><h2>Findability and user experience:
</h2><p>Capabilities such as expiration policy and advanced data governance ensures that obsolete content is disposed as per compliance needs. This ensures that results generated by search includes content that is <strong>active and relevant.</strong>
	</p><h1><span style="text-decoration:underline">Summary
</span></h1><p>What we discussed in this blog post is primarily the technology aspect. There is people and process aspects, which are equally important to ensure successful deployment and adoption of Microsoft Teams. Following are key learnings I want you to take away:
</p><ol><li>There is <strong>no one universal answer</strong> to the question on whether you allow end users to provision Teams or there should be a process for review and approval. It really depends on the requirements. Recommendation is to revisit your decision in the light of new technological advances in Microsoft 365
</li><li>End users need <strong>speed to innovate</strong>. IT needs to ensure assets are <strong>protected and compliance needs</strong> are met. 
</li><li>One key aspect from the discussion video is from end user who is asking IT to <strong>educate them</strong> on how end users can help in the process rather than controlling what end users can and cannot do.
</li><li>Review and approval process was key to ensure security and compliance because policies were assigned at container level. Now with Office 365 data governance, AIP, DLP and Office 365 Groups capabilities, <strong>policies are applied and enforced at a tenant level</strong> and <strong>applies to content across services</strong> such as Teams, SharePoint and Exchange.
</li><li><strong>Walk before you run</strong>. Pilot new approach, solicit feedback often, fail fast, and iterate quickly.
</li></ol><h1>Resources
</h1><p style="margin-left: 36pt">
 </p><ol style="margin-left: 54pt"><li><a href="https://www.youtube.com/watch?time_continue=1787&amp;v=HeccYWdvHDY">Video: Discussion between end user and IT pro community</a>
		</li><li><a href="https://support.office.com/en-us/article/Learn-about-Office-365-groups-b565caa1-5c40-40ef-9915-60fdb2d97fa2">Office 365 Groups management – naming controls, expiration policies etc.</a>
		</li><li><a href="https://techcommunity.microsoft.com/t5/Security-Privacy-and-Compliance/Compliance-Manager-Preview-is-now-available/ba-p/124662">Compliance Manager</a>
		</li><li><a href="https://www.microsoft.com/en-us/TrustCenter/Privacy/gdpr/default.aspx?&amp;wt.srch=1&amp;wt.mc_id=AID641639_SEM_w8IiEsqO&amp;msclkid=b162ba01582a19cf122ce0e74d83676a">General Data Protection Regulations</a>
		</li><li><a href="https://support.office.com/en-us/article/office-365-group-expiration-policy-8d253fe5-0e09-4b3c-8b5e-f48def064733">Office 365 Groups expiration policy</a>
		</li><li><a href="https://support.office.com/en-us/article/Office-365-Groups-Naming-Policy-6ceca4d3-cad1-4532-9f0f-d469dfbbb552">Office 365 Groups naming policy</a>
		</li><li>Office 365 <a href="https://support.office.com/en-us/article/Overview-of-data-loss-prevention-policies-1966b2a7-d1e2-4d92-ab61-42efbb137f5e">Data Loss Prevention</a>
		</li><li>Office 365 <a href="https://support.office.com/en-us/article/Manage-data-governance-in-Office-365-48064107-fed2-4db0-9e5c-aa5ddd5ccb09">Data Governance</a>
		</li><li><a href="https://techcommunity.microsoft.com/t5/Microsoft-Teams-Blog/Retention-policies-for-Microsoft-Teams/ba-p/178011">Retention policies in Microsoft Teams</a>
		</li><li><a href="https://docs.microsoft.com/en-us/azure/information-protection/understand-explore/what-is-information-protection">Azure Information Protection</a>
		</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Teamwork: Embracing new culture of work</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/teamwork-embracing-new-culture-of-work</link>
      <pubDate>Sun, 25 Mar 2018 01:23:16 GMT</pubDate>
      <dc:creator><![CDATA[Arbindo_C]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/?p=715</guid>
      <description><![CDATA["Talent wins games, but teamwork and intelligence wins championships" – Michael Jordan

New...]]></description>
      <content:encoded><![CDATA[<span style="font-size: 14pt">"Talent wins games, but teamwork and intelligence wins championships" – Michael Jordan
</span>
<h1>New culture of work</h1>
<span style="font-size: 12pt">Just like sports, fostering a culture of teamwork is essential for a productive enterprise. Teamwork is about team members working together, building upon each other's expertise, sharing their experiences, expressing their opinions and thereby <strong>building culture that helps companies innovate</strong>. Hallmark of a highly productive team is culture where members believe in sharing information rather than keeping it to themselves. Again, just like any team sports, team members need to <strong>cultivate trust</strong> among each other. They need to believe that <strong>whole is always greater than a pie</strong>. And just like Michael Jordan said, aim at winning the championship, not individual games.
</span>

<span style="font-size: 12pt">So, what is all this to do with Microsoft Teams? It is:
</span>
<ul>
 	<li><span style="font-size: 12pt">The <strong>spirit of working in open</strong>,
</span></li>
 	<li><span style="font-size: 12pt"><span style="text-decoration: underline"><strong>Sharing</strong></span> by default,
</span></li>
 	<li><span style="font-size: 12pt">and <span style="text-decoration: underline"><strong>Trusting</strong></span> by default.
</span></li>
</ul>
<span style="font-size: 12pt">Emails and Instant Messaging applications have made us all productive by speeding up time it takes to communicate between team members, and now it is time to <strong>speed up the reach</strong> of information. If we want to speed up our innovation, we need to:
</span>
<ul>
 	<li><span style="font-size: 12pt">Change <strong>our culture</strong>,
</span></li>
 	<li><span style="font-size: 12pt"><strong>Our habit and
</strong></span></li>
 	<li><span style="font-size: 12pt"><strong>Our tools of communication</strong>.
</span></li>
</ul>
<span style="font-size: 12pt">At the same time:
</span>
<ul>
 	<li><span style="font-size: 12pt">We need to start <strong>trusting</strong>,
</span></li>
 	<li><span style="font-size: 12pt">We need to start <strong>sharing</strong>, and
</span></li>
 	<li><span style="font-size: 12pt">We need to start <strong>building</strong> upon each other's contribution.
</span></li>
</ul>
<span style="font-size: 12pt">Please note, sharing in this context does not mean compromising on information protection or compromising security. Information is the new oil, and it needs to be protected. Context here is sharing within your team members with all the controls and policies appropriately configured for security, privacy and compliance.
</span>

<span style="font-size: 12pt">If you are using emails and IMs are your primary communication tools, and still are on the fence on adopting Microsoft Teams, this article will walk you through benefits that your team is missing by not making the change. It's a team effort, the team has to be all in to gain the benefits.
</span>
<h1>Why Conversations rock!</h1>
Emails restrict the consumption of information to folks who are chosen by the author of email. Whereas by using Teams conversation, information is available to all existing as well as future members of the team.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/032518_0124_TeamworkEmb1.png" />

<span style="font-size: 14pt"><strong>Benefits of Teams conversation compared to emails
</strong></span>
<ul>
 	<li><span style="font-size: 12pt"><em>Conversations are <strong>available to new members</strong> who join the team. New members can quickly ramp up on history and context.
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Access to conversation is removed when <strong>members leave the team</strong>. In case of emails, the information is available in the member's inbox even when they leave team.
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Information is always available in the <strong>context of a team</strong>. Emails are transactional in nature and do not live within a team's context
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Author of conversation can use @ mentions to <strong>notify specific members, channel or a team</strong>. This generates a notification for the consumer of the information thereby raising the importance for the consumer. Emails do not have such notification functionality
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Conversations in Teams can be supplemented with pulling <strong>information directly from an app</strong> (either Microsoft, enterprise or 3rd party app).
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Ability for members to <strong>like conversations</strong> thereby increasing the significance of the information
</em></span></li>
</ul>
<h1>Why Teams Chats is better</h1>
Teams provide persistent chat between 2 or more people, whereas instant messaging (IM) is transactional in nature where the context is lost when conversation ends

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/032518_0124_TeamworkEmb2.png" /><span style="font-size: 14pt"><strong>
</strong></span>

<span style="font-size: 14pt"><strong>Benefits of Teams Chat compared to IM
</strong></span>
<ul>
 	<li><span style="font-size: 12pt"><em>Teams provides <strong>persistent chat</strong> that preserves conversation context.
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Members in a chat can pull in new members. Since conversation is persisted, new members can <strong>view conversation history</strong>
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Member can add a Tab that pulls in <strong>data from apps</strong>
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Files shared in chat are automatically <strong>stored in OneDrive</strong>. Permissions to the file are automatically updated for members in the chat
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Members in chat can quickly get <strong>access to all files</strong> shared in the conversation through Files tab
</em></span></li>
</ul>
<h1>Why meetings in Teams are cooler</h1>
Meetings in Teams allows members to be productive by providing access to conversations and recordings before and after the meeting.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/03/032518_0124_TeamworkEmb3.png" /><span style="font-size: 14pt"><strong>
</strong></span>

<span style="font-size: 14pt"><strong>Benefits of meetings in Teams compared to Skype For Business
</strong></span>
<ul>
 	<li><span style="font-size: 12pt"><em>Meetings scheduled and recorded within a Teams channel is <strong>available to new members</strong>.
</em></span></li>
 	<li><span style="font-size: 12pt"><em><strong>Plugin-less</strong> meeting join from Edge or Chrome browser
</em></span></li>
 	<li><span style="font-size: 12pt"><em>User is alerted if they are <strong>speaking on mute</strong>. How cool is this!
</em></span></li>
 	<li><span style="font-size: 12pt"><em>Ability for members who are not in invite to <strong>join meetings
</strong></em></span></li>
 	<li><span style="font-size: 12pt"><em><strong>Persistent conversations</strong> during and after meeting
</em></span></li>
</ul>
<a href="https://aka.ms/swt"></a>
<h2><a href="https://aka.ms/swt"><span style="color: #0563c1;text-decoration: underline">Get started today!</span></a></h2>
&nbsp;
<h2>Be the champion for change.</h2>]]></content:encoded>
    </item>
    <item>
      <title>Role of Yammer in driving productivity: Integrating Yammer with Teams and SharePoint - Part 2</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/role-of-yammer-in-driving-productivity-integrating-yammer-with-teams-and-sharepoint</link>
      <pubDate>Thu, 22 Feb 2018 22:30:40 GMT</pubDate>
      <dc:creator><![CDATA[Arbindo_C]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/?p=605</guid>
      <description><![CDATA[In this 3 part series we will explore a scenario of a customer service team in Contoso and build...]]></description>
      <content:encoded><![CDATA[<span style="float: none;background-color: transparent;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;line-height: 24px;text-align: left;text-decoration: none;text-indent: 0px">In this 3 part series we will explore a scenario of a customer service team in Contoso and build solution that helps them become productive and help Contoso increase customer satisfaction. The solution we will build will leverage new capabilities in Microsoft 365 universal toolkit for teamwork - SharePoint, Yammer, Teams and Flow. </span>
<h1>Introduction</h1>
In my previous <a href="https://blogs.msdn.microsoft.com/arbindo/2018/02/08/starting-microsoft-teams-conversation-on-items-from-sharepoint-list/">blog</a> post I described how we increase team's productivity by leveraging Microsoft Teams to enable conversations around customer feedback from SharePoint list. Now if you can connect your team to drive solutions, imagine the impact you can drive by leveraging collective experience and insights from employees across your organization.

In this blog post we look at how Yammer helps in solving business challenges by bringing in insights from employees across organization.
<h1>Customer feedback – scenario recap</h1>
If you have not already done so, I recommend you read my previous <a href="https://blogs.msdn.microsoft.com/arbindo/2018/02/08/starting-microsoft-teams-conversation-on-items-from-sharepoint-list/">article</a> to get context of the business scenario. Following is a summarized recap:
<ol>
 	<li>Contoso has a customer service team. This team focusses on improving customer satisfaction by capturing and addressing customer feedback. They have a solution that helps them maintain, brainstorm and triage feedbacks.</li>
 	<li>Solution uses a SharePoint list that captures all the customer feedback</li>
 	<li>Solution also uses Microsoft Teams to collaborate internally.</li>
 	<li>We have integrated SharePoint list with Microsoft Teams using Flow. This integration helps team members to share ideas and have conversation around each customer feedback. Because of this integration, the team has accelerated their time to resolution on each feedback item</li>
</ol>
<h1>Building on insights from employees across organization</h1>
Contoso is a global organization with operations in all major regions – North America (NA), EMEA, and Africa. The customer service team in our scenario is from North America. Similarly, Contoso has 2 other customer service team each in EMEA and Africa. Our NA team shared their Teams solution with EMEA and Africa and now these 2 regions are using similar solution to work through their customer feedback.

Each of our 3 regional teams service their regional customers. However, there is a need for a region to reach out to other regional teams to get their insights and experience on a customer feedback. They would like to know how other regions are addressing similar challenges. For instance, NA team receives feedback that process of assembling the product needs significant simplification. Customers have complained that it is difficult to follow the instructions and they end up calling customer support to help with assembly. This is negatively impacting customer satisfaction and based on the survey the NA team realized that some customers are moving to competitor products because of this experience.

The NA team has some ideas on how they can simplify the product assembly process but would like to get insights from other regions on how they have addressed this feedback. Currently they reach out using emails, which works mostly but there is an efficient solution we will propose to this team.
<h1>Solution at a glance</h1>
We know Contoso has a Yammer network in their Office 365 tenant. In this solution we will use their existing solution components, which includes SharePoint, Teams and Flow, and extend this solution to include Yammer for organizational insight. Following are our solution components and their role
<ol>
 	<li><strong>SharePoint list (existing): </strong>named <strong><em>customer feedback</em></strong> already exists. This is where the team keeps track of each customer feedback. Each region has its own instance of customer feedback SharePoint list.</li>
 	<li><strong>Microsoft Teams (existing): </strong>named <strong><em>customer satisfaction </em></strong>already exists. This is where the team members collaborate and discuss solutions to address customer feedback. Each region has its own Team in Microsoft Teams for collaboration<strong>
</strong></li>
 	<li>
<div><a href="#_Microsoft_Flow_–"><strong>Microsoft Flow – SharePoint to Teams (update)</strong></a><strong>: </strong>In my last article we created a Flow that posts new customer feedbacks created in SharePoint into Teams as conversation post. We will be updating this Flow such that the post that is made in Teams includes an user experience to post the question from Teams into Yammer<strong>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme1.png" /><strong>
</strong>

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme2.png" /><strong>
</strong></li>
 	<li>
<div><a href="#_Microsoft_Flow_–_1"><strong>Microsoft Flow – Teams to Yammer (new):</strong></a><strong>
</strong>We will build a new Flow that gets triggered when user posts their question from Teams conversation. This Flow will take the message from Teams and then post it into Yammer. Along with the message, this Flow will also include a topic #customersat into the Yammer message. <strong>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme3.png" /><strong>
</strong></li>
 	<li>
<div><a href="#_Microsoft_Teams_–"><strong>Microsoft Teams – Yammer Connector (new).</strong></a><strong>
</strong>We will configure Yammer connector in our Teams for each region. This connector will bring in Yammer conversations that are tagged with topic #customersat into Teams conversation. This will help members across regions to get notified about the ask that was posted by a member in a region<strong>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme4.png" /><strong>
</strong></li>
</ol>
Just to recap, with this solution now have achieved following:
<ol>
 	<li>With our first part solution in my previous article, we connected team members within region to brainstorm ideas and address challenges</li>
 	<li>With our second part solution in this article, we have connected all the regional teams across geography to learn from each other and share their learnings with each other.</li>
</ol>
<h1>Make it real!</h1>
In this section we will do a deep dive on the implementation aspect of the solution. We will start where we left in previous article.
<ol>
 	<li>
<h2>Microsoft Flow – SharePoint to Teams (update)</h2>
</li>
</ol>
We will update the Flow we created earlier to include a button that will allow user to enter message that gets posted into Yammer

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme5.png" />

This can be achieved by adding following to our HTTP Post body in the Flow
<p style="background: #d0cece">"potentialAction": [</p>
<p style="background: #d0cece">{</p>
<p style="background: #d0cece">"@@type": "ActionCard",</p>
<p style="background: #d0cece">"name": "Post in Yammer",</p>
<p style="background: #d0cece">"inputs": [</p>
<p style="background: #d0cece">{</p>
<p style="background: #d0cece">"@@type": "TextInput",</p>
<p style="background: #d0cece">"id": "<strong>comment</strong>",</p>
<p style="background: #d0cece">"isMultiline": true,</p>
<p style="background: #d0cece">"title": "Enter your Yammer post here"</p>
<p style="background: #d0cece">}</p>
<p style="background: #d0cece">],</p>
<p style="background: #d0cece">"actions": [</p>
<p style="background: #d0cece">{</p>
<p style="background: #d0cece">"@@type": "HttpPOST",</p>
<p style="background: #d0cece">"name": "Submit",</p>
<p style="background: #d0cece">"target": "https://&lt;&lt;<strong>webapi url&gt;&gt;</strong>/api/YammerFlow",</p>
<p style="background: #d0cece">"body": " {\"YammerPost\": \"{{<strong>comment.value</strong>}}\" }",</p>
<p style="background: #d0cece">"bodyContentType": "application/json"</p>
<p style="background: #d0cece">}]}]</p>
You can refer to Office connector cards extensibility article <a href="https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors">here</a> for more information on the JSON markup. One other great tool to help with markup is the <a href="https://messagecardplayground.azurewebsites.net/">message card playground</a>.

What is essentially happening here is when user clicks on <strong>"Post in Yammer"</strong> button, a text input shows up with a multi-line text input and a button named <strong>Submit. </strong>When user clicks on the button the user input is sent through http POST to Web API hosted in Azure. Ideally, we would post the user input directly to Flow (described below), which would post this message to Yammer. However, currently invoking a Flow from Teams does not work because of a pending engineering work detailed <a href="https://stackoverflow.com/questions/46288116/http-post-from-card-in-microsoft-teams">here</a>. I do not have any ETA, but until that happens you can create an intermediary Web API using .NET core and hose it in Azure. This Web API takes the user input and invokes the Flow described below.

If you want to know how to build a Web API using .NET core, take a look at channel 9 video <a href="https://channel9.msdn.com/events/dotnetConf/2017/T322?term=ASP.NET%20REST%20API">here</a>
<ol>
 	<li>
<h2>Microsoft Flow – Teams to Yammer (new)</h2>
</li>
</ol>
In this section we will create a new Flow that accepts HTTP Post request and passes it on to a Yammer flow action.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme6.png" />

To learn more about this Flow, refer to this blog post <a href="https://flow.microsoft.com/en-us/blog/call-flow-restapi/">here</a>

You will notice that we are adding <strong>#customersat </strong>in our message text. This will ensure all the messages posted through Yammer is tagged with topic <strong>#customersat. </strong>In next section you will see how this is used to bring all Yammer messages tagged with #customersat is pulled into Teams conversation. This helps all of 3 regional customer satisfaction teams to be sync and share their questions and learnings. Microsoft Teams is our hub for teamwork and it is pushing and pulling relevant information from SharePoint and Yammer.
<ol>
 	<li>
<h2>Microsoft Teams – Yammer Connector (new)</h2>
</li>
</ol>
In this last step we will configure Yammer connector in each of our 3 regional Teams. This connector will bring in Yammer posts that are tagged with #customersat. Instead of me walking you through each step, I am going to redirect you this blog <a href="https://blogs.technet.microsoft.com/skypehybridguy/2017/08/22/connectintegrate-yammer-to-microsoft-teams-how-to-configure/">post</a> by a colleague of mine. Only change you will make here is to configure the connector with #customersat in the screen below

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/022218_2230_RoleofYamme7.png" />
<h1>Business value</h1>
Value to the business here is improved customer experience and thus growing the market share. This is possible by connecting people and allowing them to share their learnings and experience. Even without this solution, team members would have communicated, but this solution just made the process much more efficient. Now not only team members can brainstorm on customer challenges among themselves, they can reach out to their colleagues across their organization.
<h1>Why Yammer?</h1>
One question that usually gets asked is why we need Yammer at all for this solution. Couldn't we have leveraged another Team within Microsoft Teams? Yes we certainly could have and it probably would make sense to do that if you are in SMB (Small and Medium business) space. The reason I would recommend using Yammer for this solution is to reach out to employees across business functions and geography, reach out to folks you may not even know, and also to share your experience with organization. Some one some where may find your information useful and use it for purpose that you may not have anticipated.

I also get asked when to use Yammer and when to use Teams, and I think this blog post and the previous one helps us with that question. There is no one matrix that we can build to guide the decision tree, but there are these scenarios that will help us understand the role each one plays.
<h1>Why not use Teams action in Flow?</h1>
After I my previous blog post, I was asked why did I have to create a HTTP post action and use the JSON markup when I could have use the new <a href="https://flow.microsoft.com/en-us/blog/introducing-the-microsoft-teams-connector-for-flow/">Teams flow action</a>. The answer is the extensibility that Office connector card provides. The Teams flow would have helped us to post a conversation in Teams from SharePoint list, but we could not have added a button and the user experience we have built in this scenario.

Let me know your thoughts in the comments below.]]></content:encoded>
    </item>
    <item>
      <title>Starting Microsoft Teams conversation on items from SharePoint list - Part 1</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/starting-microsoft-teams-conversation-on-items-from-sharepoint-list</link>
      <pubDate>Thu, 08 Feb 2018 01:32:49 GMT</pubDate>
      <dc:creator><![CDATA[Arbindo_C]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/?p=245</guid>
      <description><![CDATA[In this 3 part series we will explore a scenario of a customer service team in Contoso and build...]]></description>
      <content:encoded><![CDATA[In this 3 part series we will explore a scenario of a customer service team in Contoso and build solution that helps them become productive and help Contoso increase customer satisfaction. The solution we will build will leverage new capabilities in Microsoft 365 universal toolkit for teamwork - SharePoint, Yammer, Teams and Flow.

What is greater invention than sliced bread? Dare I say SharePoint list! Talk to any SharePoint developer or an architect and they will tell you that SharePoint lists are like ninjas. They are useful in practically every collaboration scenarios. From maintaining master lists of products, to customer feedback, to orders. You can also link one SharePoint list to another, very much like your relational database tables. And what makes it so appealing is that it is easy. You can create a list in seconds and start adding columns. They became so popular that Microsoft published an <a href="https://msdn.microsoft.com/en-us/library/ff647105.aspx">article</a> comparing SharePoint lists to databases. Suffice to say, SharePoint lists are first class citizens since dawn of SharePoint and will be so for long term. If you are still not convinced about how awesome SharePoint lists are, you may want to check out new investments Microsoft is making in addressing some performance barriers. Microsoft recently <a href="https://techcommunity.microsoft.com/t5/SharePoint-Blog/Reinvent-business-process-in-SharePoint-and-OneDrive/ba-p/109490">announced</a> that SharePoint lists no more has the 5000 items limit in view.
<h1>Business scenario – customer feedback</h1>
This article is not about SharePoint lists, but about how we can take our most beloved functionality and make it even more useful to business scenarios by extending its value using Microsoft Teams. Now that I have your attention, imagine you are working in customer support group and use SharePoint list to track customer feedback. Because this is SharePoint list, you can sort, filter, group, export to excel etc. to help you with triaging process. In your group, you work with several team members each responsible for an aspect of customer support function. How would you like if you could have a near real time conversation with your team about each customer feedback that you add to SharePoint list? For instance, if you receive a customer feedback about certain improvements you could do in your supply chain; with conversations in the team, you can tag (@mention) the supply chain representative and brain storm on ideas. Since the conversation is happening in the open, others in your team can participate in the brainstorming as well. What you get out of this is quick resolution or a next step action on the customer feedback and close the loop with the customer. Without this conversation, the customer feedback in the SharePoint list would have to wait until you meet with your team to triage the feedback where the feedback would have received few minutes for discussion. Now instead you can take insights from the conversation and add that to your triaging process.
<h1>Make it real!</h1>
In this section we will walkthrough on how we make the above scenario real using SharePoint online list and Microsoft Teams. Following are high level steps
<ol>
 	<li><a href="#_Create_customer_feedback">Create customer feedback list in SharePoint</a></li>
 	<li><a href="#_Create_a_Team">Create a Team and a channel in Microsoft Teams</a></li>
 	<li><a href="#_Configure_Incoming_webhook">Configure Incoming webhook connector</a></li>
 	<li><a href="#_Create_a_Microsoft">Create a Flow to push customer feedback from SharePoint list into Teams channel as Rich card</a></li>
 	<li><a href="#_Having_conversation_with">Having conversation with your team members on the feedback</a></li>
</ol>
<h2>Create customer feedback list in SharePoint</h2>
Based on our business scenario of customer feedback, let's start by creating a SharePoint list with few relevant columns. Screenshot below shows our customer feedback SharePoint list:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic1.png" />

Columns in Customer feedback list:
<ol>
 	<li><strong>Title:</strong> Default mandatory single line text column. Captures title of the feedback</li>
 	<li><strong>Customer Name:</strong> Choice field with list of customers. If customer name is not present, user can add a new one</li>
 	<li><strong>Area:</strong> Pre-defined list of categories for feedback. Choice includes <strong><em>Customer service, Shipping, Packaging and Quality. </em></strong>As we build our Flow, we will use Area to redirect the feedback to channel specific to the Area. For instance, feedback about Shipping will be pushed into <strong><em>Shipping </em></strong>channel within Teams</li>
 	<li><strong>Feedback:</strong> Multi line of text to capture feedback</li>
 	<li><strong>Status:</strong> Pre-defined list of feedback status – <strong><em>New, In Review, Archived and Addressed. </em></strong>As feedback is triaged, the status is changed to reflect the feedback state. At present status is changed manually by user triaging the feedback.</li>
 	<li><strong>Action:</strong> Multi line of text describing what action was taken on the feedback</li>
</ol>
<h2>Create a Team and a channel in Microsoft Teams</h2>
Next we create <strong><em>Customer Satisfaction </em></strong>team in Microsoft Teams. Within this team, we create 4 channels: <strong><em>Customer service, Packaging, Quality and Shipping. </em></strong>Idea here is that each channel represents an aspect of customer satisfaction. For instance, we will have packaging related conversations, documents, and notes within <strong><em>Packaging </em></strong>channel. We also add our customer satisfaction team members to the team.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic2.png" />

Now we have SharePoint list where we capture customer feedback and we have a team in Microsoft Teams to have conversations and teamwork internally within members of this organization.
<h2>Configure Incoming webhook connector</h2>
In order to get value out of these capabilities, we will integrate customer feedback list with conversations in teams. This will allow members of the team to collaborate and triage the feedback in near real time and be prepared for next triage meeting. The way we will achieve this is by pushing area specific customer feedback to its respective channel. For instance, if a customer feedback is about packaging, the feedback will be published in <strong><em>Packaging </em></strong>channel for discussion. Similarly, feedback about shipping will be published in <strong><em>Shipping </em></strong>channel. You get the idea!

There are couple of ways to achieve this. One way is to use the new <a href="https://flow.microsoft.com/en-us/blog/introducing-the-microsoft-teams-connector-for-flow/">Teams action</a> in Flow, which is in preview at the time of this writing, and second approach is the use Incoming Webhook connector and <a href="https://flow.microsoft.com/en-us/blog/http-card-tutorial/">HTTP action</a> in Flow. For purpose of this article, we will use Incoming webhook connector as it provides some additional customization in the way rich cards are published in the channel. Using this approach we have ability to use JSON for customizing the message.

Follow steps below to configure Incoming webhook connector for <strong><em>Customer service</em></strong> channel. Repeat these steps for other channels in your team
<ol>
 	<li>
<div><strong>Add connector </strong>by right clicking on the channel and selecting <strong><em>Connectors</em>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic3.png" /><strong>
</strong></li>
 	<li>
<div><strong>Add Incoming Webhook </strong>connector<strong>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic4.png" /><strong>
</strong></li>
 	<li><strong>Click on Install
</strong></li>
 	<li>
<div><strong>Give a name to the connector </strong>and click on <strong><em>Create </em>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic5.png" /><strong>
</strong></li>
 	<li>
<div>On the<strong>
</strong>next screen, you will be presented with URL to the connector. The URL is important and should be saved because we will use it later when we configure Flow<strong>
</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic6.png" /><strong>
</strong></li>
 	<li>
<div>That is it, we have our Incoming Webhook connector configured for <strong><em>Customer service </em></strong>channel<strong>
</strong></div></li>
</ol>
<h2>Create a Microsoft Flow to push customer feedback from SharePoint list into Teams channel</h2>
Now we build a Flow that pushes the customer feedback from SharePoint list to respective channel within Teams.
<ol>
 	<li>Navigate to Flow by going to URL <a href="https://flow.microsoft.com">https://flow.microsoft.com</a> and login using your Office 365 credentials</li>
 	<li>Click on <strong>My Flows </strong>and click on <strong>Create from blank</strong></li>
 	<li>
<div>Next select <strong>When an item is created. </strong>This is applicable to SharePoint</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic7.png" /></li>
 	<li>
<div>Configure the Flow. In this Flow, we will publish every new feedback created in SharePoint to <strong><em>Customer service </em></strong>Teams channel</div>
<ol>
 	<li>Specify the site URL where your Customer Feedback list resides. Then select the Customer Feedback list</li>
 	<li>
<div>Select HTTP-HTTP in the Action</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic8.png" /></li>
 	<li><strong>Method </strong>is <strong><em>POST </em></strong></li>
 	<li>In the <strong>Uri </strong>paste the url we copied when we configured Incoming webhook connector</li>
 	<li>
<div>In the Headers add <strong>Content Type </strong>value <strong>application/json</strong></div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic9.png" />

d. In the <strong>Body</strong>, paste the following

[sourcedode language="text"]

{

"@@type": "MessageCard",

"@@context": "http://schema.org/extensions",

"summary": "New feedback created for <strong>&lt;&lt;Area Value&gt;&gt;</strong>",

"themeColor": "0075FF",

"sections": [

{

"heroImage": {

"image": <strong>&lt;&lt;Created By Picture&gt;&gt;</strong>

}

},

{

"startGroup": true,

"title": <strong>&lt;&lt;Title&gt;&gt;</strong> ,

"activityImage": <strong>&lt;&lt;Created By Picture&gt;&gt;</strong>,

"activityTitle": <strong>&lt;&lt;Customer Name Value&gt;&gt;</strong>,

"activitySubtitle": <strong>&lt;&lt;Status Value&gt;&gt;</strong>,

"facts": [

{

"name": "Date submitted:",

"value": <strong>&lt;&lt;Created&gt;&gt;</strong>

},

{

"name": "Customer",

"value": <strong>&lt;&lt;Customer Name Value&gt;&gt;</strong>

},

{

"name": "Area",

"value": <strong>&lt;&lt;Area Value&gt;&gt;</strong>

},

{

"name": "Feedback:",

"value": <strong>&lt;&lt;Feedback&gt;&gt;
</strong>

},

{

"name": "Link:",

"value": <strong>&lt;&lt;Link to Item&gt;&gt;</strong>

}

]

},

{

"startGroup": true,

"activitySubtitle": "Access this feedback [Link to insight] <strong>&lt;&lt;link to item&gt;&gt;</strong>\n\nThis message was created by an automated workflow in Microsoft Flow. Do not reply."

}

]

}

[/sourcecode]</li>
</ol>
</li>
 	<li>
<div>Make sure you edit the Body and replace the placeholders <strong>&lt;&lt;&gt;&gt; </strong>with valued from Dynamic expression. The end result should look like this</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic10.png" /></li>
 	<li>
<div>Click on <strong>Create flow </strong>to save the flow</div></li>
</ol>
Congratulations! You are done with the integration. The beauty of this approach is that it gives you the flexibility to customize the conversation (aka message card) as it is posted in the Teams channel. Because it is JSON, you can be creative with the branding as well as the content that goes into the conversation. In future post, we will look at how we can add interactivity to this conversation such that user can update the feedback item directly from the Teams channel.

One thing I didn't add to the flow is the conditional logic that would post the feedback to Teams channel specific to Area. You can easily do this by adding <strong>Switch </strong>between <strong>When item is created </strong>and the <strong>HTTP post </strong>action.
<h2>Having conversation with your team members on the feedback</h2>
Let's get this to work by creating a new feedback in the SharePoint list and having conversation around it within Teams
<ol>
 	<li>
<div>I start by creating a new customer feedback in SharePoint list</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic11.png" /></li>
 	<li>
<div>The Flow runs in the background and posts the feedback to our <strong><em>customer service </em></strong>channel within Teams</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic12.png" /></li>
 	<li>
<div>The value of integration is to have conversation with my team members around this feedback. I start this by pulling in my team members to discuss this feedback</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic13.png" /></li>
 	<li>
<div>Now my team members who are so customer obsessed, they jump in to this conversation to address this issue.</div>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/02/020818_0133_StartingMic14.png" /></li>
</ol>
<h1>Business value</h1>
The value here is the accelerated time to address the feedback. Because of the conversation in Teams, we could pull in our experts based on the feedback that was received and brain storm on possible solutions prior to the triage meeting. Moreover, since the conversation is happening in the channel, other team members, who were not part of this conversation, could learn on what is happening around this feedback. In next few articles we will be extending this capability with additional scenarios by leveraging some of the extensibility capabilities in Teams

If you are still trying to figure out why Teams, I suggest you check out <a href="https://blogs.technet.microsoft.com/skypehybridguy/2017/12/28/microsoft-teams-overview-and-demonstration/">blog</a> by my colleague, Matt Soseman, who provides a demo and overview video of Teams
<h1>Resources</h1>
<ol>
 	<li>This integration scenario was inspired by <a href="https://www.youtube.com/watch?v=jfbjiIqLZV8">video</a> on youtube by Teams program manager Nishanth Nadarajah</li>
 	<li>Recommend following Matt Soseman's blog on Teams <a href="https://blogs.technet.microsoft.com/skypehybridguy/">here</a></li>
 	<li>If you need JSON sample for other scenarios such as Yammer, Trello etc. head over to <a href="https://messagecardplayground.azurewebsites.net/">this</a> website</li>
 	<li>Refer to this MSDN <a href="https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/bots/bots-cards">article</a> if you need in depth information on building rich cards in Teams</li>
</ol>
Let me know your thoughts / comments and feedback.
<h1>Part 2</h1>
In<a href="https://blogs.msdn.microsoft.com/arbindo/2018/02/22/role-of-yammer-in-driving-productivity-integrating-yammer-with-teams-and-sharepoint/"> part 2</a> we will extend this solution such that the team reaches out for insights outside its immediate team by leveraging Yammer

AC]]></content:encoded>
    </item>
    <item>
      <title>Application Platform - A Perspective</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/application-platform-a-perspective</link>
      <pubDate>Sun, 19 Jul 2009 21:05:00 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/07/19/application-platform-a-perspective/</guid>
      <description><![CDATA[For every developer and for anyone who earns their livlihood in Information Technology world, I...]]></description>
      <content:encoded><![CDATA[<P>For every developer and for anyone who earns their livlihood in Information Technology world, I highly recommend watching this 1 hour<A href="https://channel9.msdn.com/posts/matthijs/David-Chappell-The-Microsoft-Application-Platform-A-perspective/" target=_blank mce_href="https://channel9.msdn.com/posts/matthijs/David-Chappell-The-Microsoft-Application-Platform-A-perspective/"> video</A> by <A href="http://www.davidchappell.com/" target=_blank mce_href="http://www.davidchappell.com/">David Chappell</A>. I admire David for his great story telling ability and at the same time making his topic interesting and simple to grasp. </P>
<P>In this particular talk David takes his audience from early days of (modern) platform technologies - birth of Java and .NET - to clound computing. The most interesting part to me was the whole topic of SOA and why he thinks it has failed to gain as much traction as it was hyped.</P>
<P>Enjoy!</P>
<P>Arbindo</P>]]></content:encoded>
    </item>
    <item>
      <title>CMIS – The common language for Content Repositories</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/cmis-the-common-language-for-content-repositories</link>
      <pubDate>Sun, 19 Jul 2009 12:50:00 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/07/19/cmis-the-common-language-for-content-repositories/</guid>
      <description><![CDATA[During early days of my career, I was taught that one of the most important tenets of software...]]></description>
      <content:encoded><![CDATA[<P>During early days of my career, I was taught that one of the most important tenets of software design is “Separation of Concern” – break your software into modules that perform or manage one and only one task. Once you have all your modules in place, make them communicate with each other to accomplish overall requirements. </P>
<P>Every <A href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1248021940&amp;sr=8-1" target=_blank mce_href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1248021940&amp;sr=8-1">design pattern</A> basically tries to achieve ‘Separation of Concern’ and provide communication mechanism between various modules. When you have multiple modules interacting with one another, you may also want to replace a module with another without breaking the overall software. This is ensured by designing loosely coupled modules that do not depend on another module explicitly, but communicates using well defined interfaces.</P>
<P>Without these design principles – modular, loose coupling and well defined interfaces - , it is difficult to imagine the progress we have made in software technology. Today you have various software vendors such as Microsoft, Oracle, IBM etc. building database solutions. Each one of them providing their own niche that is different than others. However, each of their database adhere to common standard, SQL, without which we couldn’t have built application that work with different databases. For instance, ERP applications, such as from SAP, works with DB2, Oracle or SQL Server because SQL is used to communicate with backend database.</P>
<P>As Content Management space is getting matured every year and more and more organizations are demanding rich applications, there is clearly a need for standards for content management similar to standards we have for database. I am glad that most of the big players are already thinking and working hard to make it possible in near future. This standard, which is still in draft form, is called <A href="http://www.oasis-open.org/committees/cmis/charter.php#item-3" target=_blank mce_href="http://www.oasis-open.org/committees/cmis/charter.php#item-3">Content Management Interoperability Standards</A> (CMIS). This was announced roughly a year back in SharePoint Records Center team <A href="http://blogs.msdn.com/ecm/archive/2008/09/09/announcing-the-content-management-interoperability-services-cmis-specification.aspx" target=_blank mce_href="http://blogs.msdn.com/ecm/archive/2008/09/09/announcing-the-content-management-interoperability-services-cmis-specification.aspx">blog</A>. Since then lot of progress has been made , so I thought of providing a quick update.</P>
<P><STRONG>What is CMIS?</STRONG></P>
<P>CMIS is currently a draft standard by OASIS and its goal is to provide a standard way of interacting with content management repositories. Just like SQL is a standard way of interaction with database (structured content), CMIS would provide a SQL equivalent to interact with content management repositories (unstructured / semi structured content). </P>
<P>CMIS intends to provide interfaces to most common set of tasks that is generally supported by every content management application. It will provide common set of data models and interfaces to interact with content management repository.</P>
<P><STRONG>What CMIS is not?</STRONG></P>
<P>CMIS will not address how a particular interface is implemented. Implementation is left to vendor specific application. CMIS addresses WHAT needs to be implemented rather than HOW it should be implemented. The HOW of implementation is something that will differentiate one vendor from another. </P>
<P>CMIS also does not address the authentication with content repository. It is left to the vendor to ensure requests to repository is authenticated.</P>
<P><STRONG>CMIS use cases</STRONG></P>
<P>First version of CMIS will address functions that are most common for every content repository. These functions or use cases are called core use cases, which includes:</P>
<P><EM><U>Core Use Cases</U></EM></P>
<P>1. Collaborative and Content Applications</P>
<P>2. Portal leveraging content management repositories</P>
<P>3. Mashups</P>
<P>4. Searching a Content Repository</P>
<P><U><EM>Following is list of use cases that can be built on top of core uses cases; i.e, by leveraging core uses cases</EM></U></P>
<P>1. Workflow and BPM centric applications utilizing content</P>
<P>2. Archival Applications</P>
<P>3. Compound and Virtual Documents</P>
<P>4. Electronic and Legal Discovery : I am looking forward to this one. eDiscovery is one of the biggest challenges every organization faces today as it is a complex and manual process. Manual because content is present in various repositories and without a standard way of searching, the eDiscovery task becomes time consuming and expensive. I plan on writing a post on eDiscovery some time soon.</P>
<P><EM><U>Following is list of use cases that are <STRONG>out of scope </STRONG>for initial set of deliverables by OASIS TC for CMIS</U></EM></P>
<P>1. Records Management and Compliance</P>
<P>2. Digital Asset Management</P>
<P>3. Web Content Management</P>
<P>4. Subscription and Notification Services</P>
<P><STRONG>CMIS and other standards</STRONG></P>
<P>CMIS, like most other standards will be based off XML. Data models by CMIS will be defined using XML Schema Definition (XSD). Following is list of other interoperable binding that OASIS TC for CMIS may support.</P>
<P>1. Web Services 2. REST 3. JSON-RPC 4. XMPP 5. JMS 6. JCA and 7. SMTP</P>
<P><STRONG>Benefits of CMIS</STRONG></P>
<P>One of the most well known design pattern in software world is <A href="http://en.wikipedia.org/wiki/Model-view-controller" target=_blank mce_href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</A> (Model View Controller). MVC provides flexibility of changing Model (Data) and View (Presentation) by delinking both of them and ensuring that View communicated with Model only through Controller. </P>
<P>I think CMIS is the Controller for content repositories. With CMIS, content repositories can be used by other applications just like they use databases. I am not saying this is the plan or intention of SharePoint product&nbsp; team, but with CMIS in place, products like SharePoint can easily plug into other applications such as one that is provided by EMC or Open Text for Archival.</P>
<P>With standards support such as REST, the repository could be easily accessed via browser and mobile phones. There could be applications that just provide presentation layer and in the backend interacts with multiple repositories using CMIS.</P>
<P>I would hope for a day when every repository supports CMIS so that eDiscovery could reach out to every content using CMIS.</P>
<P><STRONG>Useful Links for CMIS</STRONG></P>
<P>I have bookmarked several relevant links to read more about CMIS <A href="http://delicious.com/avi_pioneer/CMIS" target=_blank mce_href="http://delicious.com/avi_pioneer/CMIS">here</A>, and I will continue to update these links as I learn more.</P>
<P>Alfresco Labs has also <A href="http://www.cmswire.com/cms/enterprise-cms/alfresco-offers-first-implementation-of-cmis-in-alfresco-labs-3-003136.php" target=_blank mce_href="http://www.cmswire.com/cms/enterprise-cms/alfresco-offers-first-implementation-of-cmis-in-alfresco-labs-3-003136.php">built a first implementation</A> of CMIS based on draft specification.</P>
<P><STRONG>CMIS and SharePoint</STRONG></P>
<P>There is currently no news of support of CMIS in next version of SharePoint. CMIS is still in draft form, so I doubt there will be any public announcement of support for CMIS in SharePoint 2010. However, Microsoft is one of the TC members in OASIS working aggressively on CMIS standard. You can read the <A href="http://go.microsoft.com/fwlink/?LinkId=127855" target=_blank mce_href="http://go.microsoft.com/fwlink/?LinkId=127855">draft specification</A> by Microsoft</P>
<P>There is also a MSDN <A href="http://msdn.microsoft.com/en-us/library/dd440954.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd440954.aspx">article</A> that demonstrates integration of external repository into SharePoint using draft CMIS specification.</P>
<P>There is lot to look forward to and build as soon as CMIS delivers version 1.</P>
<P>Cheers,</P>
<P>Arbindo</P>]]></content:encoded>
    </item>
    <item>
      <title>5 things you should know about SharePoint 2007 Records Center</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/5-things-you-should-know-about-sharepoint-2007-records-center</link>
      <pubDate>Wed, 01 Jul 2009 18:54:24 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/07/01/5-things-you-should-know-about-sharepoint-2007-records-center/</guid>
      <description><![CDATA[For past couple of months, I have been working on large implementation of Records Center site in...]]></description>
      <content:encoded><![CDATA[<p>For past couple of months, I have been working on large implementation of Records Center site in SharePoint 2007. During this time, I have come across few features in Records Center site template that are quite different from a regular SharePoint site template such as Collaboration and Team site template. Obviously, the Records Center comes with Hold infrastructure that consists of Holds List and Record Routing List, but these features make document library function differently. I spent considerable amount of time trying to research why document libraries are not functioning the way I would expect them in a Team or a Collaboration Site. There is nothing wrong in functionality, it is just that there is not much information around how document libraries in Records Center function differently in Records Center</p>  <p>I hope by sharing my information, people implementing Records Center can save time researching on this topic.</p>  <p><strong>1. Cannot save library as Template:</strong></p>  <p>When you create a new document library, you will notice that it functions the same way as you would expect a document library to function. Things get little different as soon as you have a single document put on hold. The first thing you will notice that “<em>Save document library as template” </em>link disappears from Settings. Even before a document is placed on hold, if you click on that link and save the document library as template, you will not see the template in the <em>Create </em>screen. In short, you cannot save document libraries as template and use the template to create new document library.</p>  <p>Interestingly, you could create a <a href="http://msdn.microsoft.com/en-us/library/ms434306.aspx" target="_blank">List Template</a> Feature and publish a library template. You are just not allowed to do it using User Interface.</p>  <p><strong>2. Library Permission inheritance is broken:</strong></p>  <p>A new document library, by default, inherits permission from Site Collection. When you go to Document Library –&gt; Settings –&gt; Document Library Settings –&gt; Permissions for document library, you will see that permissions are inherited and not broken. However, as soon as you create a Record Routing entry with location pointing to your document library, the permission inheritance is broken. So adding new users / groups in site collection, will not make it the library.</p>  <p><strong>3. Cannot Delete Document Library:</strong></p>  <p>Similar to point 1, <em>Delete this document library </em>link disappears from document library settings screen as soon as a Routing Entry is created in Record Routing List that points to new document library. This means, you will not be able to delete the document library as long as the library has a document with hold, or there is a routing entry in Record Routing List that points to document library. As soon as the Record Routing entry is deleted, you will notice that <em>Delete this document library </em>link appears in the Document library settings. One other important point to note is that the user deleting the routing entry should be Site Collection administrator. If the routing entry is deleted by non Site collection administrator, then the delete link is not brought back.</p>  <p><strong>4. Record Routing List:</strong></p>  <p>Several activities happen behind the scene when a new Record Routing entry is created. Before we get to that, it is important to note that Record Routing List is supposed to be managed only by Site Collection Administrators. This list’s permission does not inherit from Site Collection. By default, this list has <em>Viewers</em> and <em>Records Center Web Service Submitters</em> with View Only and Read permission respectively. You could add&#160; a SharePoint group or a user to the library with Full Control or Contribute permission, and that will allow that group / user to add, edit and delete entries. However, deleting a routing entry will not bring back <em>Delete this document library </em>link<em> </em>in the document library. See point 3 for more details.</p>  <p>When a new routing entry is created, the document library that is specified in the Location goes through few changes: </p>  <blockquote>   <p>a. Permission inheritance is broken for the document library (See point 2)</p>    <p>b.. <em>Save this document library as template </em>link disappears from Document Library Settings. This link anyways is of no help (see point 1)</p>    <p>c. <em>Delete this document library </em>link disappears from Document Library Settings (See point 3).</p> </blockquote>  <p><strong>5. Release Active Hold:</strong></p>  <p>I, like many others, assumed that if a user has contribute permission on the Holds list, the user could Add, Edit a new hold or Release an existing hold. Though Add and Edit is possible using Contribute permission, Release hold requires <em>Manage List </em>permission level checked.</p>  <p>Based on all the above findings, I have concluded that Record Routing List should always be managed by Site Collection Administrator. Though, this is not obvious in the tool as you can add other users in the permissions, it causes unexpected behaviors in document libraries.</p>  <p>After thinking about the working of Records Center, I believe the way it is designed is aligned with how a Records department works in an organization. There are typically number of attorneys grouped by area of specialty responsible for a litigation. Also there are only few Records Manager responsible for all litigation holds. Litigations are sensitive in nature and therefore shared with only handful of people that are working on a particular litigation. </p>  <p>When a routing entry is created, permission inheritance is broken in the library. This ensures that any new user or a group added to site collection do not get access to the content that are held for litigation. <em>Save library as template </em>is disabled to prevent content on hold to be saved&#160; as template. <em>Delete this document library </em>is disabled to prevent even Site Collection Administrators from deleting content or library that is being held until the hold is released. Though attorneys are responsible for individual holds that they manage, they are not allowed to add, delete or change record routing entries. Record Routing entries have global impact (in context of Records Center), as content from multiple content type can be routed to single library. Therefore, only handful of users – Site Collection Administrators – are responsible to Record Routing entries.</p>  <p>Hope some people saves time by reading this.</p>]]></content:encoded>
    </item>
    <item>
      <title>Extending SharePoint CoreResultsWebPart</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/extending-sharepoint-coreresultswebpart</link>
      <pubDate>Sun, 21 Jun 2009 13:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/06/21/extending-sharepoint-coreresultswebpart/</guid>
      <description><![CDATA[My previous post explained technique of altering the search results presentation using XSLT. Though...]]></description>
      <content:encoded><![CDATA[<P>My previous <A href="http://blogs.msdn.com/arbindo/archive/2008/04/04/Customizing-SharePoint-2007-Search-Result-for-Structured-Content.aspx" mce_href="http://blogs.msdn.com/arbindo/archive/2008/04/04/Customizing-SharePoint-2007-Search-Result-for-Structured-Content.aspx">post</A> explained technique of altering the search results presentation using XSLT. Though I prefer using XSLT for presentation related changes, server side changes to search logic is not possible using XSLT. This post describes technique on extending the out of the box CoreResultsWebPart for adding server side logic to search query execution.</P>
<P>The example in this post will provide a web part property, named <EM>Extended Keyword Query, </EM>which will allow designers to add additional query filters to keyword query issued by end user. A scenario where this could be useful is when you need to have a custom search results page that only displays results that are tagged as Documents in SharePoint. This could also be achieved by end user using <EM>Advanced Search </EM>with <EM>Results Type </EM>as ‘<EM>Document’ </EM>(see figure 1). In our example, end user simply enters keyword in search box and the results will only include content tagged as <EM>Document.</EM></P>
<P><STRONG>Figure 1</STRONG></P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_2.png" original-url="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_2.png"><IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="" border=0 alt="" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb.png" original-url="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb.png" width=350 height=186 mce_src="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb.png"></A></P>
<P>We will start with creating a web part class that inherits from CoreResulsWebPart. Start a new Project in Visual Studio.NET. If you have VseWSS installed, select <EM>SharePoint –&gt; Web Part </EM>template. Add <EM>Microsoft.SharePoint.dll </EM>and <EM>Microsoft.Office.Server.Search.dll </EM>as Reference.</P>
<P>Declare a private field named _extendedQuery that will hold value for the additional query term.</P>
<DIV style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px" id=codeSnippetWrapper>
<DIV style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum1>   1:</SPAN> [Guid(<SPAN style="COLOR: #006080">"d6d212a1-dbca-4150-b023-e64c480bc8b6"</SPAN>)]</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum2>   2:</SPAN>     <SPAN style="COLOR: #0000ff">public</SPAN> <SPAN style="COLOR: #0000ff">class</SPAN> AdvSearchResultsWebPart : Microsoft.Office.Server.Search.WebControls.CoreResultsWebPart</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum3>   3:</SPAN>     {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum4>   4:</SPAN>         <SPAN style="COLOR: #0000ff">private</SPAN> <SPAN style="COLOR: #0000ff">string</SPAN> _extendeQuery = String.Empty;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum5>   5:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum6>   6:</SPAN>         <SPAN style="COLOR: #0000ff">public</SPAN> AdvSearchResultsWebPart()</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum7>   7:</SPAN>             : <SPAN style="COLOR: #0000ff">base</SPAN>()</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum8>   8:</SPAN>         {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum9>   9:</SPAN>             </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum10>  10:</SPAN>         }</PRE><!--CRLF--></DIV></DIV>
<P>Add a new web part property named, <EM>Extended Keyword Query, </EM>that lets designer specify additional query term.</P>
<DIV style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px" id=codeSnippetWrapper>
<DIV style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum1>   1:</SPAN> [Personalizable(PersonalizationScope.Shared)]</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum2>   2:</SPAN>     [WebBrowsable(<SPAN style="COLOR: #0000ff">true</SPAN>)]</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum3>   3:</SPAN>     [System.ComponentModel.Category(<SPAN style="COLOR: #006080">"Advanced"</SPAN>)]</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum4>   4:</SPAN>     [WebDisplayName(<SPAN style="COLOR: #006080">"Extended Keyword Query"</SPAN>)]</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum5>   5:</SPAN>     <SPAN style="COLOR: #0000ff">public</SPAN> <SPAN style="COLOR: #0000ff">string</SPAN> ExtendedQuery</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum6>   6:</SPAN>     {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum7>   7:</SPAN>         get { <SPAN style="COLOR: #0000ff">return</SPAN> _extendeQuery; }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum8>   8:</SPAN>         set { _extendeQuery = <SPAN style="COLOR: #0000ff">value</SPAN>; }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum9>   9:</SPAN>     }</PRE><!--CRLF--></DIV></DIV>
<P>Next we override OnLoad method where we merge the keyword query entered by end user with additional query term specified in the <EM>Extended Keyword Query </EM>web part property.</P>
<DIV style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 91.78%; PADDING-RIGHT: 4px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; HEIGHT: 248px; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px" id=codeSnippetWrapper>
<DIV style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum1>   1:</SPAN> <SPAN style="COLOR: #0000ff">protected</SPAN> <SPAN style="COLOR: #0000ff">override</SPAN> <SPAN style="COLOR: #0000ff">void</SPAN> OnLoad(EventArgs e)</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum2>   2:</SPAN>         {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum3>   3:</SPAN>             <SPAN style="COLOR: #0000ff">base</SPAN>.OnLoad(e);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum4>   4:</SPAN>             <SPAN style="COLOR: #0000ff">if</SPAN> (<SPAN style="COLOR: #0000ff">base</SPAN>.xmlResponseDoc == <SPAN style="COLOR: #0000ff">null</SPAN>) <SPAN style="COLOR: #008000">// add additional term only if query hasn't been executed</SPAN></PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum5>   5:</SPAN>                 SetAdditionalQueryTerm();</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum6>   6:</SPAN>         }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum7>   7:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum8>   8:</SPAN>         <SPAN style="COLOR: #0000ff">private</SPAN> <SPAN style="COLOR: #0000ff">void</SPAN> SetAdditionalQueryTerm()</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum9>   9:</SPAN>         {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum10>  10:</SPAN>             <SPAN style="COLOR: #0000ff">if</SPAN> (String.IsNullOrEmpty(_extendeQuery))</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum11>  11:</SPAN>                 <SPAN style="COLOR: #0000ff">return</SPAN>;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum12>  12:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum13>  13:</SPAN>             <SPAN style="COLOR: #0000ff">object</SPAN> queryObject = HttpContext.Current.Items[<SPAN style="COLOR: #006080">"OSSSRHDC_0"</SPAN>];</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum14>  14:</SPAN>             Type valType = queryObject.GetType();</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum15>  15:</SPAN>             PropertyInfo fullTextQueryProp = valType.GetProperty(<SPAN style="COLOR: #006080">"FullTextQuery"</SPAN>, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum16>  16:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum17>  17:</SPAN>             <SPAN style="COLOR: #0000ff">string</SPAN> query = (String)fullTextQueryProp.GetValue(queryObject, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum18>  18:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum19>  19:</SPAN>             <SPAN style="COLOR: #0000ff">if</SPAN> (!_extendeQuery.StartsWith(<SPAN style="COLOR: #006080">" "</SPAN>))</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum20>  20:</SPAN>                 _extendeQuery = <SPAN style="COLOR: #006080">" "</SPAN> + _extendeQuery;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum21>  21:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum22>  22:</SPAN>             <SPAN style="COLOR: #0000ff">if</SPAN> (String.IsNullOrEmpty(query)) <SPAN style="COLOR: #008000">// This is Keyword search</SPAN></PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum23>  23:</SPAN>             {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum24>  24:</SPAN>                 PropertyInfo keywordQueryProp = valType.GetProperty(<SPAN style="COLOR: #006080">"KeywordQuery"</SPAN>, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum25>  25:</SPAN>                 query = (String)keywordQueryProp.GetValue(queryObject, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum26>  26:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum27>  27:</SPAN>                 <SPAN style="COLOR: #0000ff">string</SPAN> additionalTerm = String.Empty;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum28>  28:</SPAN>                 </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum29>  29:</SPAN>                 <SPAN style="COLOR: #0000ff">if</SPAN> (!query.Contains(_extendeQuery)) <SPAN style="COLOR: #008000">// Set additional term only if it is not set already</SPAN></PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum30>  30:</SPAN>                 {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum31>  31:</SPAN>                     keywordQueryProp.SetValue(queryObject, query + _extendeQuery, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum32>  32:</SPAN>                 }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum33>  33:</SPAN>             }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum34>  34:</SPAN>         }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum35>  35:</SPAN>  </PRE><!--CRLF--></DIV></DIV>
<P>The OnLoad method invokes <EM>SetAdditionalQueryTerm </EM>private method that does the actual work of merging query terms. Lets examine the <EM>SetAdditionalQueryTerm </EM>method closely.</P>
<DIV id=codeSnippetWrapper class=csharpcode-wrapper>
<DIV id=codeSnippet class=csharpcode>
<DIV style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px" id=codeSnippetWrapper>
<DIV style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum1>   1:</SPAN> <SPAN style="COLOR: #0000ff">object</SPAN> queryObject = HttpContext.Current.Items[<SPAN style="COLOR: #006080">"OSSSRHDC_0"</SPAN>];</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum2>   2:</SPAN> Type valType = queryObject.GetType();</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum3>   3:</SPAN> PropertyInfo fullTextQueryProp = valType.GetProperty(<SPAN style="COLOR: #006080">"FullTextQuery"</SPAN>, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum4>   4:</SPAN> <SPAN style="COLOR: #0000ff">string</SPAN> query = (String)fullTextQueryProp.GetValue(queryObject, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--></DIV></DIV></DIV></DIV>
<P>CoreResultsWebPart stores an object named OSSSRHDC_0 in HttpConext. This object is of type <EM>Microsoft.Office.Server.Search.WebControls.SearchResultHiddenObject</EM> and contains various information such as Keyword Query, FullTextQuery etc. as its properties. Since <EM>SearchResultsHiddenObject </EM>is actually hidden, we cannot cast it to its orginal type; therefore, we cast it to <EM>System.Object,</EM> </P>
<P><STRONG>Note: </STRONG>As this is a hidden object as in not documented in SDK, we should keep in mind that it may not work in next version of SharePoint. </P>
<P>Next three lines (2,3 and 4) uses Reflection to retrieve value from FullTextQuery property from the hidden object. This property contains SQL for search query in case the end user uses Advanced Search. </P>
<P>Following lines of code merges <EM>query </EM>variable – that contains query issued by end user – and <EM>_extendedQuery </EM>variable – that contains the additional query term from the web part property. Finally it sets the merged query term to the <EM>KeywordQuery </EM>property. CoreResultsWebPart uses the query term from <EM>KeywordQuery </EM>property to query the SharePoint index using <A href="http://msdn.microsoft.com/en-us/library/ms467796.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/ms467796.aspx">keyword syntax</A></P>
<DIV style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px" id=codeSnippetWrapper>
<DIV style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum1>   1:</SPAN> <SPAN style="COLOR: #0000ff">if</SPAN> (!_extendeQuery.StartsWith(<SPAN style="COLOR: #006080">" "</SPAN>))</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum2>   2:</SPAN>     _extendeQuery = <SPAN style="COLOR: #006080">" "</SPAN> + _extendeQuery;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum3>   3:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum4>   4:</SPAN> <SPAN style="COLOR: #0000ff">if</SPAN> (String.IsNullOrEmpty(query)) <SPAN style="COLOR: #008000">// This is Keyword search</SPAN></PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum5>   5:</SPAN> {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum6>   6:</SPAN>     PropertyInfo keywordQueryProp = valType.GetProperty(<SPAN style="COLOR: #006080">"KeywordQuery"</SPAN>, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum7>   7:</SPAN>     query = (String)keywordQueryProp.GetValue(queryObject, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum8>   8:</SPAN>&nbsp; </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum9>   9:</SPAN>     <SPAN style="COLOR: #0000ff">string</SPAN> additionalTerm = String.Empty;</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum10>  10:</SPAN>     </PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum11>  11:</SPAN>     <SPAN style="COLOR: #0000ff">if</SPAN> (!query.Contains(_extendeQuery)) <SPAN style="COLOR: #008000">// Set additional term only if it is not set already</SPAN></PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum12>  12:</SPAN>     {</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum13>  13:</SPAN>         keywordQueryProp.SetValue(queryObject, query + _extendeQuery, <SPAN style="COLOR: #0000ff">null</SPAN>);</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum14>  14:</SPAN>     }</PRE><!--CRLF--><PRE style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"><SPAN style="COLOR: #606060" id=lnum15>  15:</SPAN> }</PRE><!--CRLF--></DIV></DIV>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>
<P mce_keep="true">&nbsp;</P>
<P>Now you are all set. Final steps, which I won’t go in details, is to package the code as Feature and deploy it to SharePoint Farm. To put this web part in action, browse to SharePoint search results page, Edit the page, delete the CoreResultsWebPart and add the web part you just deployed. </P>
<P>When you modify this web part, you will see the new <EM>Extended Keyword Query </EM>property under <EM>Miscellaneous </EM>category. Enter <STRONG><EM>IsDocument:1 </EM>(figure 2)</STRONG>in this property. This will further filter your search results to display content that are tagged as ‘Document’ in SharePoint index.</P>
<P>Figure 2</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_4.png" original-url="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_4.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb_1.png" original-url="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb_1.png" width=149 height=330 mce_src="http://blogs.msdn.com/blogfiles/arbindo/WindowsLiveWriter/ExtendingSharePointCoreResultsWebPart_A51D/image_thumb_1.png"></A> </P>
<P>Any keyword search that directs search results to page that contains your modified web part, will always filter content that are tagged as Document. </P>
<P><STRONG>Note: </STRONG><EM>IsDoucment:1 </EM>is just an example. You can add it to any managed property filter. For example <EM>Site:http://yoursharepointsite/sites/customer. </EM>This web part will support all <A href="http://msdn.microsoft.com/en-us/library/ms467796.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/ms467796.aspx">keyword query syntax</A>.</P>
<P>Entire code for this web part can be accessed from:</P>
<P><A title=http://cid-ed3f2f28de595784.skydrive.live.com/self.aspx/Public/Sharepoint%20Search/AdvSearchResultsWebPart.cs href="http://cid-ed3f2f28de595784.skydrive.live.com/self.aspx/Public/Sharepoint%20Search/AdvSearchResultsWebPart.cs" mce_href="http://cid-ed3f2f28de595784.skydrive.live.com/self.aspx/Public/Sharepoint%20Search/AdvSearchResultsWebPart.cs">http://cid-ed3f2f28de595784.skydrive.live.com/self.aspx/Public/Sharepoint%20Search/AdvSearchResultsWebPart.cs</A></P>
<P>-Arbindo</P>]]></content:encoded>
    </item>
    <item>
      <title>Creating Content Types</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/creating-content-types</link>
      <pubDate>Sun, 07 Jun 2009 23:22:00 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/06/07/creating-content-types/</guid>
      <description><![CDATA[Content Types in SharePoint 2007 is a powerful mechanism to put content into a lifecycle. Mostly it...]]></description>
      <content:encoded><![CDATA[<P>Content Types in SharePoint 2007 is a powerful mechanism to put content into a lifecycle. Mostly it is used to&nbsp;associate metadata with content, which can be useful for searching. Other content type features, such as workflows, information management policies, event handlers and&nbsp;document templates, if&nbsp;leveraged properly can provide robust lifecycle to content within SharePoint. <A href="http://technet.microsoft.com/en-us/library/cc262729.aspx" target=_blank mce_href="http://technet.microsoft.com/en-us/library/cc262729.aspx">Managing Enterprise Metadata with Content Type is a great whitepaper</A> on content types that&nbsp;describes challenges associated with desigining metadata that is application across enterprise.</P>
<P>Assuming your enterprise has figured out metadata model&nbsp;for enterprise, this&nbsp;post describes various ways of creating content types in&nbsp;SharePoint 2007 along with its pros and cons.&nbsp;</P>
<P><STRONG>1. Create using Site Administration User Interface</STRONG></P>
<P>SharePoint 2007 provides user interface&nbsp;for site administrators to create content types that are scoped at a site collection or a site level. </P>
<P>This is the most restrictive approach, in the sense that content types cannot be leveraged outside the site collection it was created. However, it provides maximum flexibility for the site administrator to change the definition without affecting other site collections. It also does not require developer involvement as there is no custom code required. This approach is particularly suitable for document centers and team sites that are specialized in nature. For example, a document center site collection for storing company policies. Since all policies will be stored in single site collection, there is hardly any need to share the content types outside the document center.</P>
<P>The user interface allows adding site columns, reordering columns, template, versioning, workflows and <A href="http://office.microsoft.com/en-us/sharepointserver/HA100995531033.aspx" target=_blank mce_href="http://office.microsoft.com/en-us/sharepointserver/HA100995531033.aspx">informationmanagement polcies</A>. It does not allow association of <A href="http://msdn.microsoft.com/en-us/magazine/cc163318.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/magazine/cc163318.aspx">event handlers</A>.</P>
<P><STRONG>2. Package as SharePoint FEATURE</STRONG></P>
<P><A href="http://msdn.microsoft.com/en-us/library/ms479975.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/ms479975.aspx">SharePoint Feature</A> allows content types to be defined declaratively&nbsp;in XML format. Any text editor from Notepad to Visual Studio can be used to write XML, which can be easily packaged into SharePoint Feature and deployed as SharePoint Solution. Content Type Feature is scoped only at site level, therefore, cannot be activated at Farm, web application and sub site level. This is a constraint and needs be considered during design. After a Solution with content type Feature is&nbsp;deployed on&nbsp; a Farm, the&nbsp;Feature shows up within 'Site Collection Features' list under every site collection. This can Feature can be activated only by a site collection administrator, after which, the content type is provisioned for that site collection.&nbsp;Content type definition can be marked as Sealed to prevent any&nbsp;modification by end user.</P>
<P>Except for Information Management Policies, the XML definition can be used to describe Fields, event handlers and workflows. Each Field in Content Type refers to Site Column and can be used to override display name and mandatory requirement. Event&nbsp;handlers&nbsp;refer to event type and binaries that contain code to execute on&nbsp;particular event. Similarly, workflows refer to workflow definitions that&nbsp;exist at site collection.</P>
<P>The biggest advantage of this approach&nbsp;is having a single content type definition that&nbsp;can be used across site collections. For e.g. if your enterprise wishes to collect&nbsp;specific properties, such as Project Number, Duration, Cost etc., for every project related content, then a Project content type can be defined a SharePoint Feature and made available across SharePoint Farm. Any team site or document center that wishes to store project related content can activate&nbsp;Project content type Feature and&nbsp; have consistent metadata captured for Project content. </P>
<P><STRONG>3.&nbsp;Write custom code </STRONG></P>
<P>Custom code involves writing .NET code using SharePoint Object model to create columns, events, workflows as well as Information management policies. Note that Information Policies are not applicable to content types in WSS. Similar to Feature approach, custom code can provide single content type definition - in form of .NET code - that can be applied across site collections. Code is less desirable for obvious reasons such as testing and maintenance, but provides highest flexibility. Certain operations such as creation of lookup columns and information policies can be achieved only using custom code.</P>
<P>It requires developers to write code and package it as a Feature, where the code runs when the Feature is either Installed or Activated. It is a good practice to remove the content type when the Feature is deactivated or uninstalled. This approach can also be used to provision a content type across site collections within a web application. To achieve this, a developer can create a Feature that is scoped at Web Application and write code in Feature Activated event that create content type in every site collection. </P>
<P mce_keep="true">&nbsp;</P>
<P>It will be interesting to see how Content Types evolve in SharePoint 2010. </P>]]></content:encoded>
    </item>
    <item>
      <title>Activating Content Type Feature at Web Application Scope</title>
      <link>https://docs.microsoft.com/archive/blogs/arbindo/activating-content-type-feature-at-web-application-scope</link>
      <pubDate>Sat, 30 May 2009 16:37:00 GMT</pubDate>
      <dc:creator><![CDATA[Garry Trinder]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/arbindo/2009/05/30/activating-content-type-feature-at-web-application-scope/</guid>
      <description><![CDATA[In SharePoint 2007, one of the ways of provisioning content type is by packaging content type...]]></description>
      <content:encoded><![CDATA[<P mce_keep="true">In SharePoint 2007, one of the ways of provisioning content type is by packaging content type definition as <A href="http://msdn.microsoft.com/en-us/library/ms454431.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/ms454431.aspx">SharePoint Feature</A>. This&nbsp;method allows a single content type&nbsp;definition to be leveraged across multipe site collections. One drawback of &nbsp;this method is it's inability to restrict the Feature to be activated&nbsp;within a pariticular web application. </P>
<P>Content Type Features&nbsp;can be scoped only at a&nbsp;Site level. When this Feature is installed, it appears on&nbsp;every site collection in&nbsp;every web application.&nbsp;There are scenarios when this&nbsp;Feature needs to be activated only at a particular web application. For e.g. if you have&nbsp;two web applications; one&nbsp;for Sales&nbsp;and other for Marketing, you wouldn't want Sales specific content types&nbsp;to be activated in Marketing web application and vice versa.</P>
<P>One approach to work around this challenge is to write custom code in Feature activated event that makes the decision on whether the Feature can be activated. The other approach is to create a dependent Feature, scoped at Web Application, which would prevent Content Type Feature activation unless the dependent Feature is activated. Following section demonstrates the dependent Feature method:</P>
<P><STRONG>Step 1 - Create Web Application Feature:</STRONG></P>
<P>In this step, we will create a blank Feature, scoped at Web Application. Sole purpose of this Feature is to provide Activation Dependency for the Content Type Feature.&nbsp;Unless this Feature is activate for a Web&nbsp;Application, the content type Feature cannot be activated at site collection</P>
<P mce_keep="true">________________________________&nbsp;</P>
<P mce_keep="true">&lt;?xml version="1.0" encoding="utf-8"?&gt;<BR>&lt;Feature&nbsp; Id="E4160D49-39CC-4a17-B700-03E4129F1350"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title="Allow Customer Content Type Feature"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Description="Activating this Feature&nbsp;will allow site collection administrators to activate Customer Content Type Feature"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Version="12.0.0.0"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hidden="FALSE"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scope="WebApplication"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultResourceFile="core"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="<A href="http://schemas.microsoft.com/sharepoint/">http://schemas.microsoft.com/sharepoint/</A>"&gt;<BR>&nbsp;&lt;ElementManifests&gt;<BR>&nbsp;&lt;/ElementManifests&gt;<BR>&lt;/Feature&gt;</P>
<P mce_keep="true">______________________</P>
<P mce_keep="true">Note that ElementManifest tag is empty because this Feature does not contain any elements.</P>
<P mce_keep="true">&nbsp;</P>
<P><STRONG>Step&nbsp;2 - Create Content Type Definition and Feature:</STRONG></P>
<P>In this step, we will create content type definition and Feature that will provision the content type. The imporant part here is the <A href="http://msdn.microsoft.com/en-us/library/aa543162.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa543162.aspx">Activation Dependency</A> to the Web application Feature.</P>
<P><EM><B><U>Content Type Definition</U></B></EM><B></B></P>
<P>&lt;?xml version="1.0" encoding="utf-8"?&gt;<BR>&lt;Elements Id="25994054-FF0E-49b1-8785-143D1A433924" xmlns="<A href="http://schemas.microsoft.com/sharepoint/">http://schemas.microsoft.com/sharepoint/</A>"&gt;<BR>&nbsp;&lt;ContentType ID="0x01010043e1c49b93d74e4b968fb95a6a330da40204"<BR>&nbsp;&nbsp;Name="Customer"<BR>&nbsp;&nbsp;Group="Document Content Types"<BR>&nbsp;&nbsp;Description="Content Type for Customer related documents"<BR>&nbsp;&nbsp;Version="0"&gt;<BR>&nbsp;&nbsp;&lt;FieldRefs&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;FieldRef ID="{7c8b4e26-cb9d-405c-84bd-18e76c40433e}" Name="CustomerName" /&gt;<BR>&nbsp;&nbsp;&lt;/FieldRefs&gt;<BR>&nbsp;&lt;/ContentType&gt;</P>
<P>&lt;Field ID="{7c8b4e26-cb9d-405c-84bd-18e76c40433e}"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type="Text"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name="CustomerName"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisplayName="Customer Name"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StaticName="CustomerName"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hidden="FALSE"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Required="FALSE"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sealed="FALSE" /&gt;<BR>&lt;/Elements&gt;</P>
<P><EM><B><U>Feature Definition</U></B></EM></P>
<P>&lt;?xml version="1.0" encoding="utf-8"?&gt;</P>
<P>&lt;Feature&nbsp; Id="{969A3FA2-1357-48f8-9FC8-D40422A462D8}"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title="Customer Content Type"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Description="Contains Content Types for Customer content"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Version="12.0.0.0"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hidden="FALSE"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scope="Site"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultResourceFile="core"</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="http://schemas.microsoft.com/sharepoint/"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ElementManifests&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ElementManifest Location="Customer.xml"/&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ElementManifests&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ActivationDependencies&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B>&lt;ActivationDependency FeatureId="</B><B> E4160D49-39CC-4a17-B700-03E4129F1350"/&gt;</B></P>
<P>&lt;/ActivationDependencies&gt;</P>
<P>&lt;/Feature&gt;</P>
<P mce_keep="true">Note the ActivationDependency element in the content type Feature that points to Feature ID of the web applications scoped Feature that we created in step 1. This will ensure that content type Feature cannot be activated at a site collection, unless the Web application Feature is activated for the web application.</P>]]></content:encoded>
    </item>
  </channel>
</rss>