tag:blogger.com,1999:blog-14008735399087123502024-03-06T19:33:59.380-08:00Eric HuizaAnonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-1400873539908712350.post-52401281478053875142015-10-21T04:58:00.001-07:002015-10-21T04:58:16.535-07:00SDL Web 8: Understanding Site Types<div class="WordSection1">
<div class="MsoNormal">
SDL Web Introduced a new feature called Site Types allowing Content Editors to create Web Applications by marking an existing Publication as a Template.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The Site Types feature uses a new tool called Site Builder available in the new SDL Web 8 user interface<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUDw8eniUfcbV9-P_f9V_WjT1Xwu-Rspi98DNiP62szFc7mX8KBzJ5MJNzKE0jQlxf92GPsOvQegHEW0CkzGCin2qASscqSKimRmYZL50JHILuHs6c28uxvint3YbV_LD0uhE5NeMOlB7/s1600/image001-756315.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068377914405842" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWUDw8eniUfcbV9-P_f9V_WjT1Xwu-Rspi98DNiP62szFc7mX8KBzJ5MJNzKE0jQlxf92GPsOvQegHEW0CkzGCin2qASscqSKimRmYZL50JHILuHs6c28uxvint3YbV_LD0uhE5NeMOlB7/s320/image001-756315.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The SDL Web User Interface will show all the available Sites. The Content Editor will be able to use the "Create a new Site" button in order to start the configuring a new Site<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following list will show the steps to create a new Website: <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Provide the new Website Name</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU0eEhWWJx_FVdyYeyeDfAwqf1zTvgUwdUJist4wrNIanj9lmV3r7Gmq4RdsFwbvBRc0pmTuGFr2A9NcxFQKVTMU4Vlp9YTDgsU2KDXxmiN6V25GBFiM5WGu_UH2x4XWboozDr4u8C6R_y/s1600/image002-757987.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068388855912610" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU0eEhWWJx_FVdyYeyeDfAwqf1zTvgUwdUJist4wrNIanj9lmV3r7Gmq4RdsFwbvBRc0pmTuGFr2A9NcxFQKVTMU4Vlp9YTDgsU2KDXxmiN6V25GBFiM5WGu_UH2x4XWboozDr4u8C6R_y/s320/image002-757987.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Select the a Site Type. You have to mark the Template Publication as a Site Type first by setting the Publication Type available in the Publication Properties dialog</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgegGAJt88oqzqHsYt0U07N2K-foMB7EGK7sdHlAZ9N-B0D4z7GtC2lZSd7hq_dXBJGnuzLIsEBKw6R-DZRu0_zJdimANCRTn3DbZVjB144SmuColZp2LrFZ6LOsBo5pIUDp0etbtcH7T-v/s1600/image003-759466.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068390208276834" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgegGAJt88oqzqHsYt0U07N2K-foMB7EGK7sdHlAZ9N-B0D4z7GtC2lZSd7hq_dXBJGnuzLIsEBKw6R-DZRu0_zJdimANCRTn3DbZVjB144SmuColZp2LrFZ6LOsBo5pIUDp0etbtcH7T-v/s320/image003-759466.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Select the Content Publication, you can inherit all the Content from the Site Type or you can create your own Component Publication</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8owDiAMtatdORSEkuXzdzMlyRyNvQjTZC-vrSkF7HyxGX3JxS0zgm9gwaJdt6DVhXlaK1T2XFuxxJ3luJdbhUjZI5z8aPt32T1nhntXufciI7hntfc4wxTq69f3LySrC8GLfmAbysIJI/s1600/image004-761246.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068400269833746" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8owDiAMtatdORSEkuXzdzMlyRyNvQjTZC-vrSkF7HyxGX3JxS0zgm9gwaJdt6DVhXlaK1T2XFuxxJ3luJdbhUjZI5z8aPt32T1nhntXufciI7hntfc4wxTq69f3LySrC8GLfmAbysIJI/s320/image004-761246.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Select the URL segment (Relative Path) for the new Website</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSR2oC6EdqaFOpkPRfwVgM4-i3ILekHg5TiNzCVlMvvEaT9VTR72G-i9XGjo7oCCT7uGSrUZnuXJcIl7QIQ0kkLXoGHaKVeI0BMnIv94y2sEbUAWjQlYhPcxqK7SO5hfzqSEfgySUXHcZK/s1600/image005-763770.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068409633833074" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSR2oC6EdqaFOpkPRfwVgM4-i3ILekHg5TiNzCVlMvvEaT9VTR72G-i9XGjo7oCCT7uGSrUZnuXJcIl7QIQ0kkLXoGHaKVeI0BMnIv94y2sEbUAWjQlYhPcxqK7SO5hfzqSEfgySUXHcZK/s320/image005-763770.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Finish and create the new Site</li>
<li>In order to test you can use the Built in functionality (View in Context)</li>
</ul>
<o:p></o:p><br />
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQdnqu4D6v9ftBKyFWYh1FSxMRL9UIOt3D8aw6X1bKv-_XNbYYaEJz89yDHPlyxnoy-BfjVIaxD2_MNATLbcR3QKcbRsPMaPCaCEmtypN-_b8CL8puYTeWKcFS81Zg8yHjgIAfJHKtTNY/s1600/image006-765535.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068419239412386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQdnqu4D6v9ftBKyFWYh1FSxMRL9UIOt3D8aw6X1bKv-_XNbYYaEJz89yDHPlyxnoy-BfjVIaxD2_MNATLbcR3QKcbRsPMaPCaCEmtypN-_b8CL8puYTeWKcFS81Zg8yHjgIAfJHKtTNY/s320/image006-765535.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
</div>
<ul>
<li>Enjoy your new site</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihcjp7I6vRJodzAw5s7LyjbejPnr-_8mBp2L_tG9NCbop1OBwg-2eUrX2SslxL1WNjHGZ41gu6DH1QmMnSZmgJw7zOMWgJo4rKSTqG_yqY3rUzzAtWPbHirHCB8YPWvMMOlQZNWTbaR7xB/s1600/image007-767417.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6208068427186273074" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihcjp7I6vRJodzAw5s7LyjbejPnr-_8mBp2L_tG9NCbop1OBwg-2eUrX2SslxL1WNjHGZ41gu6DH1QmMnSZmgJw7zOMWgJo4rKSTqG_yqY3rUzzAtWPbHirHCB8YPWvMMOlQZNWTbaR7xB/s320/image007-767417.png" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Use Cases<o:p></o:p></b></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
</div>
<ol>
<li>Multilingual Website where the Web Master Structure publication is marked as a Site Type. Content Editors will be able to create Country (Language) specific publications that will use the Web Master Structure as a Template</li>
<li>Microsites. Content Editors will be able to create a Microsite which is relative to an existing Web Application</li>
</ol>
<br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>The Content Editor may say, why do I need to use the Site Builder if I just can use the Blueprint. Site Builder will configure all the Business Processes including Publishing and Topology Manager configuration, as a result the Content Editor will receive a Publication that is ready to publish content without IT involvement</b></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-82569915137969083642014-12-30T20:24:00.002-08:002015-01-05T10:12:58.851-08:00Application Life Cycle Management for SDL Tridion Projects using .NET Technologies<div class="WordSection1">
<div class="MsoNormal">
In a Previous Post I covered in a Technology Agnostic way a set of considerations for Application Life Cycle Management for SDL Tridion Projects. In this post I will be using the same terms but using .NET Technologies. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In this blog post I’ve selected Team Foundation System (TFS) suite in order to fit the different tools and roles for a proper Application Life Cycle Management. The following diagram shows the ALM for Agile projects but using TFS tools suite<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
TFS<o:p></o:p></div>
<div class="MsoNormal">
Controls the set of Work Items as well as Bugs and Tasks<o:p></o:p></div>
<div class="MsoSubtitle">
<br /></div>
<div class="MsoSubtitle">
Excel<o:p></o:p></div>
<div class="MsoNormal">
Integrates with TFS in order to show Status Reports and Work Items status<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
TFS Version Control<o:p></o:p></div>
<div class="MsoNormal">
Source code control<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
MS Build<o:p></o:p></div>
<div class="MsoNormal">
Automated builds (Continuous Integration)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
NUnit<o:p></o:p></div>
<div class="MsoNormal">
Unit Testing<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Release Management System<o:p></o:p></div>
<div class="MsoNormal">
Packaging and deployment<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZCtAcZfSEfi25pXzj9uZLeMjLR-3sFTHd6365sJq7cRqeaGHiqfbCiua32I_V-3pW-ffrmqEvY5wWsuCIv6WyRiNG_vzuDMw-zrGqmQak1ggddNNUtJioFJeaE3HUN60fio27ixQSDoa3/s1600/image002-702431.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZCtAcZfSEfi25pXzj9uZLeMjLR-3sFTHd6365sJq7cRqeaGHiqfbCiua32I_V-3pW-ffrmqEvY5wWsuCIv6WyRiNG_vzuDMw-zrGqmQak1ggddNNUtJioFJeaE3HUN60fio27ixQSDoa3/s320/image002-702431.jpg" id="BLOGGER_PHOTO_ID_6098852710272025042" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to open original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-34062253722063784582014-12-30T19:48:00.005-08:002014-12-30T19:57:20.382-08:00SDL Tridion integration with Portal Servers<div class="WordSection1">
<div class="MsoNormal">
One very common use case during enterprise implementations is integrating SDL Tridion with Portal servers. There are several approaches out there, this article will show 2 options that can be use perform such integration. <o:p></o:p></div>
<div class="MsoNormal">
Integrating with Portal servers is not an straight forward exercise since Portals control the overall page rendering as well as page life cycle, in that sense SDL Tridion becomes to be a data (content) repository that is consumed in certain manner. Portals can consume formatted or unformatted data from Tridion in the format of XML, JSON or HTML chunks, selecting the content format is very important since it will determine design and styling responsibilities. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Thinking as a Software Architect I prefer to specialize responsibilities instead of sharing responsibilities between different systems. Having said that I prefer sending unformatted data to the Portal Server and passing the Content formatting and styling to the Portal server itself.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Based on different approaches I’ve seen so far I have determined two different options<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h1>
Option 1: Integrated through the Content Delivery Web Service<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRIRKFoP0HkEIL1lKq1LQQvuSEaRA_BNvQp5JBx9U8MO-PGi03IUb-Bhvedpe5o447ctICYdTPaMiFqOYgiWo5mTOTiARRepAHFr9I9IleKTyqhyphenhyphen3tqqflMgx3KZeIJH8Mu9wGYZFkBV53/s1600/image001-703664.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRIRKFoP0HkEIL1lKq1LQQvuSEaRA_BNvQp5JBx9U8MO-PGi03IUb-Bhvedpe5o447ctICYdTPaMiFqOYgiWo5mTOTiARRepAHFr9I9IleKTyqhyphenhyphen3tqqflMgx3KZeIJH8Mu9wGYZFkBV53/s320/image001-703664.png" id="BLOGGER_PHOTO_ID_6098843266583568898" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo2; text-indent: -.25in;">
</div>
<ul>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Data (Content) is consumed via the Content Delivery Web Service</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Binaries are consumed via the Content Delivery Web Service or via a Network Shared location (NAS)</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Content is sent unformatted using JSON or XML (no styling)</span></strong></li>
</ul>
<br />
<div class="MsoNormal">
<br /></div>
<h1>
<strong><span style="font-family: "Cambria","serif";">Option 2: Building Meta Files<o:p></o:p></span></strong></h1>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHloBK8qvOVA1t8ZFOgR3Xjjqa_tRH8Zoq5n3PF3QJlDL-2DaUlhcVOULt7Qom2WQSPfcyY8geK8IgnvWgP8vPChrMOlTEZsu4KZA15btBtV69xiTUALpPbmG1LNG0gnh-_LpXS_yaoUDH/s1600/image002-705250.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHloBK8qvOVA1t8ZFOgR3Xjjqa_tRH8Zoq5n3PF3QJlDL-2DaUlhcVOULt7Qom2WQSPfcyY8geK8IgnvWgP8vPChrMOlTEZsu4KZA15btBtV69xiTUALpPbmG1LNG0gnh-_LpXS_yaoUDH/s320/image002-705250.png" id="BLOGGER_PHOTO_ID_6098843273905846562" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;"><o:p></o:p></span></strong></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo2; text-indent: -.25in;">
</div>
<ul>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">A deployer extension to be developed in order to build a Meta Page File containing Content Positioning as well as relevant metadata is generated during publishing</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">The Portal Server will consume the Page Meta File by mapping the Portal Page name with the Page Meta File name File Name</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">The Meta File Name will contain unformatted data in XML or JSON format (No Styling)</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Binaries are consumed from a Network Shared location (NAS)</span></strong></li>
</ul>
<br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">The two options shown above are not intended to be considered final solution but to be options to be evaluated during Portal Integrations. Below my considerations to take while deciding the Integration strategy<o:p></o:p></span></strong></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo2; text-indent: -.25in;">
</div>
<ul>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Styling to be controlled in only 1 system (SDL Tridion or the Portal Server). I would suggest to control Styling in the Portal Server so that the HTML Design Team will work with only 1 paradigm</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Page Life Cycle to be controlled by the Portal Server</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">SDL Tridion to control editorial content as well as any relevant metadata</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">SDL Tridion to control Binaries</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">SDL Tridion page templates to produce unformatted data that can be consumed by Portals (Option 2)</span></strong></li>
<li><strong><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Component Templates to produce unformatted data that can be consumed by Portals (Option 1 and 2)</span></strong></li>
</ul>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-41226015537101055242014-12-30T19:17:00.003-08:002014-12-30T19:56:46.123-08:00How to create SDL Tridion Contextual Expressions<div class="WordSection1">
<div class="MsoNormal">
Contextual Expressions are intended to be created from external systems like CMA. In this blog post I am showing a basic method to create Contextual Expressions (Expressions Target Groups) without the need of CMA.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Expressions Target Groups should must contain certain Application Data in the following format<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TargetGroupExtensionData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> targetGroupExtensionData = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TargetGroupExtensionData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ContextExpression = contextExpression,<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> SyncLabel = version<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">The Context Expression and the SyncLabel properties are mandatory. They should be included while saving the Target Group Application Data<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ApplicationDataAdapter</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> appDataAdapter = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ApplicationDataAdapter</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TargetGroupExtensionData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ApplicationId, targetGroupExtensionData);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">_coreServiceClient.SaveApplicationData(existingTargetGroup.Id, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { appDataAdapter.ApplicationData });</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">The source code is available in my Git Repository.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;"><a href="https://github.com/erichuiza/SyncContextExpressions">https://github.com/erichuiza/SyncContextExpressions</a></span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-55408701473749480432014-12-30T17:56:00.001-08:002014-12-30T19:56:23.581-08:00Application Life Cycle Management for SDL Tridion Projects<div class="WordSection1">
<div class="MsoNormal">
In this Article I would like to share what I think is a workable and efficient Application Life Cycle Management for SDL Tridion Projects. We need to consider the different project stages and SDL Tridion dependencies before we define the Strategy to maximize the ALM (Application Life Cycle Management) effectiveness.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Please note that this post is based on Agile projects (implementations) and assuming a mature ALM level during the implementation as well as all of the recommendations are my own opinion and cannot be considered SDL guidelines for Agile projects.<o:p></o:p></div>
<h1>
Blueprint and Schemas are not Agile<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
One common error during Agile implementation is to think that the Blueprint and Schemas can be partially defined and finished, curated and tuned during the different steps (sprints) in the project. Consider the Blueprint and Schemas as your model and infrastructure (when an Civil Engineer designs a House, he delivers a completed blueprint for the house that contains electrical, plumbing and other multiple aspects for the home, then it can be built in different steps (sprints)). Consider the Blueprint and Schemas as the base of your project, I know it will sound archaic but I would suggest an small waterfall to completely define the Blueprint and Schemas (I know that we cannot completely define the Blueprint and Schemas in one single shot, but we have to do our best and be creative in order to consider all the possible scenarios and make them as extensible as possible, you can check the <a href="http://miguelmiguelez.blogspot.com/">Miguel Migulez</a> blog for Blueprint and Schemas best practices)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguyzypz56YCcTz91f4vSEbWsB0mF-kP3VuLgt8YCiMlyoJw8RpukS4ephxhmtHk1xw5IpG6Z9KIamJjUMPk0vhbd3SV_P8OILbY9OxS37cIQK5JyCL36_ObNqwI7Dula84hHSeeW6QE6TK/s1600/image002-779869.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguyzypz56YCcTz91f4vSEbWsB0mF-kP3VuLgt8YCiMlyoJw8RpukS4ephxhmtHk1xw5IpG6Z9KIamJjUMPk0vhbd3SV_P8OILbY9OxS37cIQK5JyCL36_ObNqwI7Dula84hHSeeW6QE6TK/s320/image002-779869.jpg" id="BLOGGER_PHOTO_ID_6098813961352561650" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<h1>
Determine a Dev Environment and Process<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A typical SDL Tridion Dev Environment for Agile projects must be connected to a Code Repository (Git, SVN, …) as well as a tool for Tasks and Defects management (TFS, JIRA, …) as well as an Deploy Automation tool (Teamcity, Jenkins, …). The following diagram shows how a typical Dev Environment is set up.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1phhWnZJG5XfO-0Yyjw2pkn6BwY-MRRsSB9GC_7UTXfrKR2BtBARsXxMSjMl-VPOwshfAF1wNUTK8Wt8kSs5u7TGkcLaMt5z3tmYedx6Hb4S_K_moarB8iWdxVXH5tpuMwtsyDBSksC6f/s1600/image006-781775.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1phhWnZJG5XfO-0Yyjw2pkn6BwY-MRRsSB9GC_7UTXfrKR2BtBARsXxMSjMl-VPOwshfAF1wNUTK8Wt8kSs5u7TGkcLaMt5z3tmYedx6Hb4S_K_moarB8iWdxVXH5tpuMwtsyDBSksC6f/s320/image006-781775.jpg" id="BLOGGER_PHOTO_ID_6098813966690415122" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In the diagram below we can notice the following elements<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Dev Branch<o:p></o:p></div>
<div class="MsoNormal">
In order to separate the code base it is mandatory to configure a Branch that is intended only for Development. This Branch will contain the latest code for Template Building Blocks, Event Systems, Workflow as well as the Presentation Server pieces. It is important to separate it from the Master branch that is intended only to contain code that has been properly tested and quality assured <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Build Server<o:p></o:p></div>
<div class="MsoNormal">
In order to improve productivity it is important to accomplish Continuous Integration so that after some code changes as Pushed into the Dev Branch an automated build is performed in the Dev environment. It will improve developers productivity since it will hide tasks like Upload Template Building Blocks, Deploy Event Systems, Deploy Workflows or Presentation server elements<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Version Control<o:p></o:p></div>
<div class="MsoNormal">
All the different Code Branches are controlled and defined in this element, as well as it support Pull and Push requests in order to apply or retrieve code changes.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Work Tasks<o:p></o:p></div>
<div class="MsoNormal">
All the different Technical Tasks that represent the different User Stories that represents an Sprint <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Unit Testing<o:p></o:p></div>
<div class="MsoNormal">
This is an optional but high recommended step and should be automated during the Continuous Integration (Fail the Build process if a Unit Test fails)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Dev Deliverable<span style="color: windowtext; font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
This is the result after a Push operation is performed, it will contain a package containing (Compiled Template Building Blocks, Event Systems, Workflow, …., and Presentation Server elements)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h1>
Determine a QA Environment and Process<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The QA Environment uses the Master Branch coming from the Version Control system. For QA I would not recommend an automated build process (Continuous Integration) instead I would suggest a time basis build process (Nightly Builds for instance) so that we can deliver an stable and testable version of the different components to be tested by the QA team next day.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQnXP2I0sHDILjLQu5GbXyBGi8ecDcXSQEy0cQboFDQXIKjYJz03FyDbBrhZ49SzbRo4PUhZI46A_BmU6g_V9LJG7MpE8x_HAe2l0hvW_ONs-SLEIGVjqKzCtT5-a08NxGg1Sjb4wabfkI/s1600/image009-783789.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQnXP2I0sHDILjLQu5GbXyBGi8ecDcXSQEy0cQboFDQXIKjYJz03FyDbBrhZ49SzbRo4PUhZI46A_BmU6g_V9LJG7MpE8x_HAe2l0hvW_ONs-SLEIGVjqKzCtT5-a08NxGg1Sjb4wabfkI/s320/image009-783789.jpg" id="BLOGGER_PHOTO_ID_6098813977427494962" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In the diagram above we can see the following elements<o:p></o:p></div>
<div class="MsoSubtitle">
<br /></div>
<div class="MsoSubtitle">
Scheduled Built Artifact<o:p></o:p></div>
<div class="MsoNormal">
Final deliverable (Artifact) that is built timely basis (Nightly Build)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoSubtitle">
Version Control<o:p></o:p></div>
<div class="MsoNormal">
QA deliverables should be built pulling from the Version Control System (Master Branch)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h1>
Determine a Preview and Live Environment<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As part of the QA process it is recommended to define a central repository for the different tested version of the deliverables, it is called an Artifactory, We will be manually deploying to Preview and Live (Prod) from the Artifactory.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_m-CiKHbKhyphenhyphenBYobSS1AU2tW0NsChqAVxrXTulKIUJ-JnA1SFa4xKMunVMqnOp8hN5qC_IeDJ5NK0n74QT_1AbcNObCUDUzdsY6yAkWEEs3cCN5yWUGFXfNq43Zt3y3hzUPVlb5z88KqI6/s1600/image010-786357.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_m-CiKHbKhyphenhyphenBYobSS1AU2tW0NsChqAVxrXTulKIUJ-JnA1SFa4xKMunVMqnOp8hN5qC_IeDJ5NK0n74QT_1AbcNObCUDUzdsY6yAkWEEs3cCN5yWUGFXfNq43Zt3y3hzUPVlb5z88KqI6/s320/image010-786357.jpg" id="BLOGGER_PHOTO_ID_6098813988758861602" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<h1>
Gluing everything together<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following diagram shows how the different environmetns defined above are glued together, We are also including Content Porter as an important piece in this strategy. Content Porter is responsible to port Tridion Items that doesn’t live in the Artifactory by in SDL Tridion like (Blueprint, Schemas, Taxonomy, Folders, Structure Groups, ……)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ-9-8WEWKHD0DRnvWSTfe_QWX0JijQc8Dg-UGaUp8uzh1dsCR_w5tM1KFUygX2sqgb2F5ivpNWihyphenhyphenkjqFL8PL_Q3_PXWemPJg0WixQ3T3P4q6MyNwAjXfm9uhcnD98D5XRU1ze4lhvps7/s1600/image011-788260.jpg" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ-9-8WEWKHD0DRnvWSTfe_QWX0JijQc8Dg-UGaUp8uzh1dsCR_w5tM1KFUygX2sqgb2F5ivpNWihyphenhyphenkjqFL8PL_Q3_PXWemPJg0WixQ3T3P4q6MyNwAjXfm9uhcnD98D5XRU1ze4lhvps7/s320/image011-788260.jpg" id="BLOGGER_PHOTO_ID_6098813998567902498" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">click to see original image</td></tr>
</tbody></table>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com1tag:blogger.com,1999:blog-1400873539908712350.post-35642429834098877792014-12-30T16:28:00.000-08:002014-12-30T19:55:33.727-08:00Adding razor dotnet style support to the TCDL Transformer<div class="WordSection1">
<div class="MsoNormal">
There are plenty of scripting options as well as coding styles involved in a Web Application development. SDL Tridion supports several scripting options that can be configured at 3 different levels, Component Template, Publication Target and Deployer. At the moment this article is being writing SDL Tridion current version is 2013 SP1. This version supports the following script options.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span class="MsoIntenseEmphasis">JSP<o:p></o:p></span></div>
<div class="MsoNormal">
<span class="MsoIntenseEmphasis">ASP .NET<o:p></o:p></span></div>
<div class="MsoNormal">
<span class="MsoIntenseEmphasis">VBScript<o:p></o:p></span></div>
<div class="MsoNormal">
<span class="MsoIntenseEmphasis">JScript<o:p></o:p></span></div>
<div class="MsoNormal">
<span class="MsoIntenseEmphasis">REL<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
This Article is not intended to describe each of the above scripting options but to show how to extend the existing ones and add new coding styles. In order to show it I will describe how ASP .NET scripts are configured and how it can be extended. However the same procedure can be used for other script options. Please notice that this procedure has been tested in Tridion 2013 SP1 and it may stop working on future versions of the product since it is not a documented or supported extension<o:p></o:p></div>
<h1>
Configuring ASP .NET<o:p></o:p></h1>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The first Step is to select ASP .NET as the script option in the Publication Target. Consider this configuration as a very high level one. ASP .NET holds different coding styles like “inline coding”, and “controls” that are configured in the cd_deployer_conf.xml<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><TCDLEngine></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><Properties></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"><Property</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">Name</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">=</span></b><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">"tcdl.dotnet.style"</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">Value</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">=</span></b><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">"controls"</span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">/></span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></Properties></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></TCDLEngine></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The above configuration is instructing to the TCDL Transformer to use the <b><span style="font-size: 12.0pt;">DotNet Language</span></b> with <b><span style="font-size: 12.0pt;">Controls Coding Style</span></b>. This will generate an output suitable for ASP .NET Web Forms Web Applications as shown in the following code snippet.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><html></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><body></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><nav></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><ul></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentLink PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" LinkAttributes="[LinkAttributes]" AddAnchor="[AddAnchor]" /></span><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentLink PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" LinkAttributes="[LinkAttributes]" AddAnchor="[AddAnchor]" /></span><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentLink PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" LinkAttributes="[LinkAttributes]" AddAnchor="[AddAnchor]" /></span><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentLink PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" LinkAttributes="[LinkAttributes]" AddAnchor="[AddAnchor]" /></span><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></ul></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></nav></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><div</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"main"</span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentPresentation PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" /><b><o:p></o:p></b></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentPresentation PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" /><b><o:p></o:p></b></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><tridion:ComponentPresentation PageURI="[PageURI]" ComponentURI="[ComponentURI]" TemplateURI="[TemplateURI]" /><b><o:p></o:p></b></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></div></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></body></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></html></span><span style="color: blue; font-family: "Courier New"; font-size: 10.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
All the above transformation are very well known and there is no reason for further explanation. However the intention of this post is to show how to add another coding style so that we can write the same code but using Razor coding style or any other coding style that may be available.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h2>
Create a Razor Code Generator class<o:p></o:p></h2>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
SDL Tridion comes with a set of Code Generator classes that will generate code from TCDL to an specific script language like DotNet, JSP, REL, VBScript and JSScript. In this Article I will show how to write a Code Generator class that will transform TCDL into Razor HTML Helpers. This class is implementing the transformation of <tcdl:ComponentPresentation> and <tcdl:Link> tags<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: green; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">/*<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: green; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">* Created by Eric Huiza on 12/28/2014.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: green; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">*/</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">package</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">codegen</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">OutputDocument</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Tag</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TransformContext</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tags</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TargetGroupTagHandler</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> java</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">io</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">IOException</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> java</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">io</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Writer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> java</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">util</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">List</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> RazorCodeGenerator </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">implements</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> CodeGenerator </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">protected</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> TransformContext context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">protected</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> OutputDocument target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> RazorCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TransformContext context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> OutputDocument output</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> output</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateDynamicComponentPresentation</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">StringBuffer tagBody</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String componentURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String templateURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> tagBody</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">append</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">format</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"@Html.ComponentPresentation(\"%s\", \"%s\", \"%s\")"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> componentURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> templateURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">));</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String generateBinaryLink</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String binaryURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String variantId</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">format</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"@Html.BinaryLink(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", %s)"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> binaryURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> variantId</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> Boolean</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">toString</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">));</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String generateComponentLink</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String componentURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String templateURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">format</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"@Html.ComponentLink(\"%s\", \"%s\", \"%s\", %s, \"%s\", \"%s\", %s)"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> componentURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> templateURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> Boolean</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">toString</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">),</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> Boolean</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">toString</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">));</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String generatePageLink</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String parameters</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">format</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"@Html.PageLink(\"%s\", \"%s\", \"%s\", \"%s\", %s, \"%s\")"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> pageURI</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> addAnchor</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkText</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> linkAttributes</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> Boolean</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">toString</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">textOnFail</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">),</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> parameters</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generatePageHeader</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">()</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateWAIPageHeader</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">StringBuffer stringBuffer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateTargetGroupCondition</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">StringBuffer stringBuffer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s2</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> b</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s3</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s4</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String convertTargetGroupOperator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String generateTargetGroupIf</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TargetGroupTagHandler</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Conditions conditions</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String generateIncrementTrackingKey</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s2</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateTaxonomy</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">StringBuffer stringBuffer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s2</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> b</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> b2</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> b3</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s3</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s4</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String getNegationSymbol</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">()</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String getAlwaysFalseExpression</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">()</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateImport</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Writer writer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">throws</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> IOException </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generatorPageDirectives</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Writer writer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> List list</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">throws</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> IOException </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> generateCodeStatements</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Writer writer</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String s</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> List list</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> b</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">throws</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> IOException </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">boolean</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> requiresCodeBlocks</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">Tag tag</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">false</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<h2>
Create a New Code Generator Factory<o:p></o:p></h2>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A new Code Generator Factory class needs to be developed in order to recognize the Razor coding style and instantiate the Razor Code Generator we already defined above.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: teal; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">/**<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: teal; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">* Created by Eric Huiza on 12/28/2014.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: teal; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">*/</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">package</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">codegen</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">OutputDocument</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">import</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> com</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tridion</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">tcdl</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TransformContext</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> CodeGeneratorFactory </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">final</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String CODE_GENERATOR_CONTEXT_NAME </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"tcdl.internal.codegenerator"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">final</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String TARGET_LANGUAGE_NAME </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"tcdl.target.language"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">final</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String JSP_STYLE_NAME </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"tcdl.jsp.style"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">final</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String DONET_STYLE_NAME </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"tcdl.dotnet.style"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> CodeGeneratorFactory</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">()</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> CodeGenerator getGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TransformContext context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> OutputDocument target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> CodeGenerator result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">CodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">getProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">CODE_GENERATOR_CONTEXT_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">==</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> String language </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">getProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">TARGET_LANGUAGE_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">""</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">language</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"jscript"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> JScriptCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">language</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"vbscript"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> VBSCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">language</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"jsp"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(((</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">getProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">JSP_STYLE_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">""</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)).</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"tags"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> JSPTagCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> JSPCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">language</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"none"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> NullCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">();</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">language</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"dotnet"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(((</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">getProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">DONET_STYLE_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">""</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)).</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"controls"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> ASPNETCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(((</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">String</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">getProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">DONET_STYLE_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">""</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">)).</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">equalsIgnoreCase</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"native_interop"</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">))</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> JuggerNETCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">else</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">(((</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">String</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">)</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">.</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">getProperty</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">(</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">DONET_STYLE_NAME</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">,</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">""</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">)).</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">equalsIgnoreCase</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">(</span></b><b><span style="background: white; color: grey; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">"razor"</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">))</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">{</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> result </span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">=</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> RazorCodeGenerator</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">(</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">,</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"> target</span></b><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;">);</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> DotNETCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">else</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">{</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">new</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> DotNETCodeGenerator</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> target</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> context</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">.</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">setGlobalProperty</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">(</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">CODE_GENERATOR_CONTEXT_NAME</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">,</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">);</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">return</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> result</span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">;</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: navy; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">}</span></b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h2>
Configure Razor Coding Style<o:p></o:p></h2>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Set Razor to the tcdl.donet.style property<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><TCDLEngine></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><Properties></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"><Property</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">Name</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">=</span></b><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">"tcdl.dotnet.style"</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">Value</span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">=</span></b><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">"razor"</span></b><b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;">/></span></b><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 12.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></Properties></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></TCDLEngine></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<h2>
Override the JVM Class Loading process<o:p></o:p></h2>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Since I created a new CodeGeneratorFactory class, it is necessary to instruct the JVM to load the overridden CodeGeneratorFactory instead of the out of the box one. In order to do so, there are plenty of options like using the Boot Class Path option to force a class to be loaded first. In this scenario I opted for an easier one which is to copy the class files in the “config” folder. Classes living inside the “config” folder will be loaded before the ones in the “lib” folder. It needs to be done the Deployer Application.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">C:\INETPUB\WWWROOT\DEPLOYERS\REFERENCE_STAGING\BIN\CONFIG<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">| cd_deployer_conf.xml<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">| cd_storage_conf.xml<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">| logback.xml<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">| <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;">\---com<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;"> \---tridion<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;"> \---tcdl<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;"> \---codegen<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;"> CodeGeneratorFactory.class<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt;"> RazorCodeGenerator.class<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<h2>
Publishing using Razor coding style<o:p></o:p></h2>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The result of this operation is shown as following<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><html></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><body></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><nav></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><ul></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentLink("[PageURI]", "[ComponentURI]", "[TemplateURI]", "[AddAnchor]", "[LinkText]", "LinkAttributes", "TextOnFail")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentLink("[PageURI]", "[ComponentURI]", "[TemplateURI]", "[AddAnchor]", "[LinkText]", "LinkAttributes", "TextOnFail")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentLink("[PageURI]", "[ComponentURI]", "[TemplateURI]", "[AddAnchor]", "[LinkText]", "LinkAttributes", "TextOnFail")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></li></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></ul></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></nav></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><div</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">=</span><b><span style="background: white; color: #8000ff; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">"main"</span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;">></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span lang="ES-PE" style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentPresentation("[PageURI]", "[ComponentURI]", "[TemplateURI]")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span lang="ES-PE" style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span lang="ES-PE" style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentPresentation("[PageURI]", "[ComponentURI]", "[TemplateURI]")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span lang="ES-PE" style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span lang="ES-PE" style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><article></span><b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> @Html.ComponentPresentation("[PageURI]", "[ComponentURI]", "[TemplateURI]")<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></article></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></div></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"> </span></b><span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></body></span><b><span style="background: white; color: black; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: "Courier New"; font-size: 10.0pt; mso-highlight: white;"></html></span><o:p></o:p></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-25599164972578916992014-10-03T02:33:00.000-07:002015-01-05T10:12:28.767-08:00Adding Expression Target Groups support to the Reference Implementation<div class="WordSection1">
<div class="MsoNormal">
Now days “Context” is a key part on almost every SDL Tridion implementation, the Reference Implementation is not a exception, the first version of the Reference Implementation supports Contextual Images Delivery. However it doesn’t support Dynamic Vocabulary (Expression Target Groups)<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In this post I am describing the process to extend the Reference Implementation in order to add support for Dynamic Vocabulary. If you need more details on what is a Dynamic Vocabulary, please refer to this blog post <a href="http://erichuiza.blogspot.pt/2014/02/context-expression-extension.html"> Context Expression Extension</a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Adding Dynamic Vocabulary support for the Reference Implementation involves adding / changing some DD4T and Reference implementation areas.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Publishing Model<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span>Update the IComponentPresentation interface. Add a new property that holds Expressions<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> DD4T.ContentModel<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">interface</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponent</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Component { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentTemplate</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ComponentTemplate { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IPage</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Page { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> IsDynamic { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RenderedContent { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> OrderOnPage { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IList</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ICondition</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> Conditions { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">IList</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;"><</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">string</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">> Expressions { </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">get</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">; </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">set</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 12.0pt; mso-highlight: white;">; }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>Update the ComponentPresentation class. Implement the Expressions property<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlIgnore</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IPage</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Page { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Component</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Component { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlIgnore</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponent</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Component<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Component </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">as</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponent</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentTemplate</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ComponentTemplate { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlIgnore</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentTemplate</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ComponentTemplate<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ComponentTemplate </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">as</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentTemplate</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RenderedContent { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> IsDynamic { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlIgnore</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> OrderOnPage { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">List</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Condition</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> Conditions { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">List</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> Expressions { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlIgnore</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IList</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ICondition</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IComponentPresentation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Conditions<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Conditions.ToList<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ICondition</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>(); }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">[</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">XmlIgnore</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">]<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">IList</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">string</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">IComponentPresentation</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">.Expressions {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">get</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">throw</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">NotImplementedException</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">set</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">throw</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">NotImplementedException</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }</span></b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoListParagraph" style="margin-left: .25in;">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span>Add Context Target Groups TBB. New TBB to be created / added in order to populate the Expressions property with Target Groups / Component Presentations mapping<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> DD4T.Templates {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> [</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmTemplateTitle</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Add Expression Target Groups"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AddExpressionTargetGroups</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BasePageTemplate</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">protected</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> TransformPage(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Page</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> page) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tcm.</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Page</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> tcmPage = GetTcmPage();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> index = 0;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> componentPresentation </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> tcmPage.ComponentPresentations) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (componentPresentation.Conditions != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> && componentPresentation.Conditions.Count > 0) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> page.ComponentPresentations[index].Expressions = componentPresentation.Conditions.Select(s => s.TargetGroup.Title).ToList();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> index += 1;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">Update the Render Page Content Composite TBB in order to use Add Expressions Target Group<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUNeMFUPSTJ26SmZEQQRFc5FpNypZQUGCyN1N2s2lCtDBPyUDvjGii9u0oIwPtI_PCAMne5U5MWB4lHdEH3Jz1lb8aVz8dw5HObx2Od5QADOtdwpg4ochumd0Dru6scA4Y9wuyAuEEGVC/s1600/image003-771374.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUNeMFUPSTJ26SmZEQQRFc5FpNypZQUGCyN1N2s2lCtDBPyUDvjGii9u0oIwPtI_PCAMne5U5MWB4lHdEH3Jz1lb8aVz8dw5HObx2Od5QADOtdwpg4ochumd0Dru6scA4Y9wuyAuEEGVC/s320/image003-771374.jpg" id="BLOGGER_PHOTO_ID_6065904596414667058" /></a></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: black; font-family: Consolas; font-size: 14.0pt;">Context Expression Extension<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">Create a set of Expressions Target Groups to test the functionality<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2HKgbHMGfMcZoSpUlksAYsKUDzybo0tJY7DrNSdgcFaJi9rzpO0eUw1adNNCneotf0bHAYRE3IraZj0BPMo9FyAu4LG8221l7_IiTvynOMHAsp1C1RQs_IOT63ySA7VMiC1q5GK55YOOK/s1600/image005-773249.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2HKgbHMGfMcZoSpUlksAYsKUDzybo0tJY7DrNSdgcFaJi9rzpO0eUw1adNNCneotf0bHAYRE3IraZj0BPMo9FyAu4LG8221l7_IiTvynOMHAsp1C1RQs_IOT63ySA7VMiC1q5GK55YOOK/s320/image005-773249.jpg" id="BLOGGER_PHOTO_ID_6065904602924425346" /></a></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsC8aYbBba0BvhByFVbimgCp3ze-WF2XVLpTBnDvXMiXhiF_IhLB942HSJXrajlzHxQUT0TJbdCzzoY2aByFMLb_EcBU3SxwcudsmIamfEnO_RLxKawd8Ii18MS5pXJlQzHbyk3xOzH6vp/s1600/image007-775354.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsC8aYbBba0BvhByFVbimgCp3ze-WF2XVLpTBnDvXMiXhiF_IhLB942HSJXrajlzHxQUT0TJbdCzzoY2aByFMLb_EcBU3SxwcudsmIamfEnO_RLxKawd8Ii18MS5pXJlQzHbyk3xOzH6vp/s320/image007-775354.jpg" id="BLOGGER_PHOTO_ID_6065904612083568082" /></a></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">Apply Context Target Groups to Component Presentations. In this case I have applied them to the Article in the Reference Implementation Home Page<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwoUE61P4A07f-mwaPJsOQSWWjn5ykOg6hnHOu5P33D3aPQhRu7jJF6NIYWpBn6hJJ10tdWYFqxC3QW1fWgUv9RYjl5oM9dHWhJUbzh7HKezLJ7Ou2wW-sT-SkaX11aa60-h7JXtHPan3q/s1600/image012-777204.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwoUE61P4A07f-mwaPJsOQSWWjn5ykOg6hnHOu5P33D3aPQhRu7jJF6NIYWpBn6hJJ10tdWYFqxC3QW1fWgUv9RYjl5oM9dHWhJUbzh7HKezLJ7Ou2wW-sT-SkaX11aa60-h7JXtHPan3q/s320/image012-777204.jpg" id="BLOGGER_PHOTO_ID_6065904620162777378" /></a></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l2 level1 lfo3; text-indent: -.25in;">
<span style="color: black; font-family: Consolas; font-size: 9.5pt;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="color: black; font-family: Consolas; font-size: 9.5pt;">Publish the Expressions Target Groups so that they can be part of the Dynamic Vocabulary<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: black; font-family: Consolas; font-size: 14.0pt;">Reference Implementation<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l4 level1 lfo2; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span>Add a new class ExpressionsEngine to Sdl.Web.Tridion. This class will call the JEXL engine in order to validate the expressions while Rendering Items<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Sdl.Web.Tridion.Context {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ExpressionsEngine</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> EvaluateExpression(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> expression) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">using</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ClaimStoreExpressionEngine</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> expressionEngine = </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ClaimStoreExpressionEngine</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">(Com.Tridion.Ambientdata.</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">AmbientDataContext</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">.GetCurrentClaimStore(), </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ValueConverter</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">())) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> Java.Lang.</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">Boolean</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> result = expressionEngine.EvaluateBooleanExpression(expression);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (result != </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">) </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">return</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> result.BooleanValue();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">return</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">false</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">public</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">static</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">string</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> WriteExpression(</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">string</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> expression) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">using</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ClaimStoreExpressionEngine</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> expressionEngine = </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ClaimStoreExpressionEngine</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">(Com.Tridion.Ambientdata.</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">AmbientDataContext</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">.GetCurrentClaimStore(), </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ValueConverter</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">())) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">return</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> expressionEngine.EvaluateStringExpression(expression);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l4 level1 lfo2; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>Update the RenderEntity method in the DD4TRenderer class in order to evaluate expressions before entities are written<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MvcHtmlString</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RenderEntity(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">HtmlHelper</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> helper, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> containerSize = 0, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">List</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> excludedItems = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">var</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> cp = item </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">as</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> ContentModel.</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ComponentPresentation</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (cp.Expressions != </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> && cp.Expressions.Count > 0) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">foreach</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">string</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> expression </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">in</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> cp.Expressions) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> (!</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">ExpressionsEngine</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">.EvaluateExpression(expression)) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">return</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">null</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </span></b><b><span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">}<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span lang="ES-PE" style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> mvcData = ContentResolver.ResolveMvcData(cp);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span lang="ES-PE" style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (cp != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> && (excludedItems == </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> || !excludedItems.Contains(mvcData.ViewName)))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parameters = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">RouteValueDictionary</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parentContainerSize = helper.ViewBag.ContainerSize;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (parentContainerSize == 0)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parentContainerSize = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SiteConfiguration</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.MediaHelper.GridSize;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (containerSize == 0)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> containerSize = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SiteConfiguration</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.MediaHelper.GridSize;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parameters[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"containerSize"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">] = (containerSize * parentContainerSize) / </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SiteConfiguration</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.MediaHelper.GridSize;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parameters[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"entity"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">] = cp;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parameters[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"area"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">] = mvcData.ControllerAreaName;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> key </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> mvcData.RouteValues.Keys)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parameters[key] = mvcData.RouteValues[key];<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MvcHtmlString</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result = helper.Action(mvcData.ActionName, mvcData.ControllerName, parameters);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">WebRequestContext</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.IsPreview)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MvcHtmlString</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TridionMarkup</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ParseEntity(result.ToString()));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Test the Reference Implementation<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l3 level1 lfo5; text-indent: -.25in;">
<span style="font-size: 9.5pt;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-size: 9.5pt;">Test with an Apple Device<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: .25in;">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnAumfMl4w-ANPe5qlN0d_j8oAN602mWdjdulpcVxKpFKEQ-Ptl4xbb5MROuyaJV3Jlj3s0267sEnhJgiVeAgYrNzhk3hjtbo52BnIC7Etv0xyF8UkDEmNx02Q24e0juXSgW5pfdkxfPkr/s1600/image013-779028.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnAumfMl4w-ANPe5qlN0d_j8oAN602mWdjdulpcVxKpFKEQ-Ptl4xbb5MROuyaJV3Jlj3s0267sEnhJgiVeAgYrNzhk3hjtbo52BnIC7Etv0xyF8UkDEmNx02Q24e0juXSgW5pfdkxfPkr/s320/image013-779028.jpg" id="BLOGGER_PHOTO_ID_6065904631528064498" /></a></span></b><b><span style="font-size: 14.0pt;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l3 level1 lfo5; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>Test with a Non Apple Device<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgisfVnOpMo5wNeBjegfmyxodRGkNCepTVQeOkWE3TBqVUqMm_xtxGwfSJE9suWtvu0mMInWdlxmoB3hZ_AGEGfuRNVAbfXGAR_XzTQoySF-BZgVOcv5WU1V8oWhmIbhuoAQG-5hOdXn5Bq/s1600/image014-781188.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgisfVnOpMo5wNeBjegfmyxodRGkNCepTVQeOkWE3TBqVUqMm_xtxGwfSJE9suWtvu0mMInWdlxmoB3hZ_AGEGfuRNVAbfXGAR_XzTQoySF-BZgVOcv5WU1V8oWhmIbhuoAQG-5hOdXn5Bq/s320/image014-781188.jpg" id="BLOGGER_PHOTO_ID_6065904637847111074" /></a><o:p></o:p></div>
</div>
<pre></pre>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-13244636383059881132014-09-24T20:11:00.000-07:002014-09-24T20:11:34.986-07:00Developing a Custom Transport Handler<div class="WordSection1">
<div class="MsoNormal">
In this blog post I wanted to show a more advanced feature available in SDL Tridion, this feature gives developers a more deeper control on the Transport Package. Unfortunately this nice feature is neither documented nor supported but I think it is good enough to show how to use it in a Blog Post.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Developing a Transport Handler is very similar to developing other Tridion extension points like Resolvers or Event Systems. So, let’s provide a list of steps in order to develop one. In this sample I am writing a Transport Handler that overrides the existing TaxonomyTransportHandler in order to add the user that published the Category in the Instructions document.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span>Implement a class that inherits ITransportHandler interface. This interface is not available in the DLLs available in /bin/client, you have to reference Tridion.ContentManager.Publishing.Transporting.dll that is in the GAC<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.Collections.Generic;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.IO;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.Linq;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.Text;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.Threading.Tasks;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> System.Xml;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Publishing.Rendering;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Publishing.Resolving;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Publishing.Transporting;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> TransportHandlers {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CustomTaxonomyTransportHandler</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ITransportPackageHandler</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyTransportPackageHandler</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultTaxonomyHandler;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlDocument</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultInstructionsDocument;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _user;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CustomTaxonomyTransportHandler(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TransportPackage</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> package) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultTaxonomyHandler = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyTransportPackageHandler</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(package);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultInstructionsDocument = package.InstructionsDocument;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _user = package.PublishTransaction.Creator.Title;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> HandleItemForPublishing(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parentElement) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultTaxonomyHandler.HandleItemForPublishing(item, parentElement);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> HandleRenderedItemForPublishing(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">RenderedItem</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> renderedItem, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> parentElement) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XmlElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> customCategoryElement = _defaultInstructionsDocument.CreateElement(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"CustomCategoryInfo"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> customCategoryElement.InnerXml = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Format(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<Category>{0}</Category><User>{1}</User>"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, renderedItem.ResolvedItem.Item.Id, _user);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultInstructionsDocument.DocumentElement.AppendChild(customCategoryElement);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultTaxonomyHandler.HandleRenderedItemForPublishing(renderedItem, parentElement);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> HandleResolvedItemForUnPublishing(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ResolvedItem</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> resolvedItem) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> _defaultTaxonomyHandler.HandleResolvedItemForUnPublishing(resolvedItem);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>The class above should be compiled in an Strong Name Assembly and registered in the GAC<o:p></o:p></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span>Register it in the Tridion.ContentManager.config configuration file<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">transporting</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">rootStorageFolder</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">c:\Temp</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">mappings</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">itemType</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Tridion.ContentManager.ContentManagement.Category</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">handler</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TransportHandlers.CustomTaxonomyTransportHandler</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">assembly</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TransportHandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3b4b2f6e0f11afc8</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> .<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">mappings</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">transporting</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span>Restart the TcmPublisher Windows Service<o:p></o:p></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">5.<span style="font: 7.0pt "Times New Roman";"> </span></span>Publish any Publishable Category, as a Result you will see a custom Xml Element appended in the Transport Package Instructions document<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ProcessorInstructions</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">version</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">7.1.0.1290</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Publication</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Id</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">tcm:0-3-1</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Title</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">400 Example Site</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Key</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">400 Example Site</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">PublicationPath</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">\</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">PublicationUrl</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MultimediaPath</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">\media</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MultimediaUrl</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/media/</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Action</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Deploy</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Action</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Target</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">6</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">CustomCategoryInfo</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> <</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">Category</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">tcm:3-29-512</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"></</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">Category</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> <</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">User</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">T2013SP1\Administrator</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"></</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">User</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"> </</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">CustomCategoryInfo</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 14.0pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Section</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Taxonomies</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Taxonomies</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Taxonomy</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Id</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">tcm:3-29-512</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">tcm_3-29-512.xml</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">UseForIdentification</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">False</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Section</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ProcessorInstructions</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-36092306420237854332014-09-22T18:03:00.000-07:002014-09-22T18:03:12.681-07:00ILMerge and SDL Tridion Development<div class="WordSection1">
<div class="MsoNormal">
SDL Tridion comes with a nice feature that allows developers to upload DLLs as managed Assemblies (Template Building Blocks, Workflow Activities) or to reference DLLs in the file system (Event System, Resolvers). While implementing SDL Tridion we normally have to re-use projects or external assemblies across different areas in our implementation which is normal in modular software development.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The fact of re-usability is mandatory and key in any software implementation. .NET code is executed in boundaries called Application Domains, at execution time the .NET Framework creates an Application Domain which will contain the executing assembly and any other dependency (Assemblies and Resources). The .NET Framework looks for dependencies in the following places.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span>Checks for assemblies referenced in Configuration Files (<runtime> element)<o:p></o:p></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>Checks for assemblies in the same Folder<o:p></o:p></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span>Check for assemblies in the Global Assembly Cache<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
However the way SDL Tridion executes code brings some issues. .NET TBBs and Workflow Activities are dynamically loaded from records in the Content Manager database. It means we cannot reference assemblies in the same folders or dependencies in configuration files (because there is no folder or configuration file involved), it leaves GAC as the only option<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
So, the question is, What are my alternatives when I want to use a shared library or project between different areas in our implementation?, for instance I have developed a Logging Framework or XML Parsing libraries that are used by Event System and TBBs as well as Workflow Activities. In that scenario the only option is to register those shared libraries in the GAC (Global Assembly Cache) which makes deployment process more difficult and managing dependencies even more complicated.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
ILMerge allows to merge different assemblies (libraries, projects) into a single assembly which in fact will make all the code and functionality available in different libraries and projects in the same Application Domain. With ILMerge we can have a logging library or project references in Workflow Activities as well as referenced in TBBs. ILMerge will generate a single assembly that contains the result of merging different assemblies (executing assemblies and dependencies) in the same DLL so we don’t need to worry about registering all the shared dependencies in the GAC.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
DD4T and SDL Reference Implementation are using that approach in order to make compilation and deployment easier.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
ILMerge can be downloaded from <a href="http://www.microsoft.com/en-us/download/details.aspx?id=17630"> http://www.microsoft.com/en-us/download/details.aspx?id=17630</a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Here a sample on how DD4T templates are compiled using ILMerge. This sample shows the Post Build Event configured in the DD4T Template Project<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none;"> <tbody>
<tr> <td style="border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div align="center" class="MsoNormal" style="text-align: center;">
<b>Command Segment<o:p></o:p></b></div>
</td> <td style="border-left: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div align="center" class="MsoNormal" style="text-align: center;">
<b>Description<o:p></o:p></b></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
"C:\Development\dynamic-delivery-4-tridion-master\dotnet\Dynamic Delivery Publishing Solution Items\ilmerge" <o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
ILMerge location<o:p></o:p></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
/lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" <o:p></o:p></div>
<div class="MsoNormal">
/lib:"C:\Program Files (x86)\Tridion\bin\client" <o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
Use a /lib parameter in order to specify paths where ILMerge will look for dependencies that should be merged in the resulting assembly<o:p></o:p></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
/t:dll <o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
Target Format (DLL, EXE)<o:p></o:p></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
/targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319<o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
Specifies that the DLL is intended for the .NET Framework 4 and higher<o:p></o:p></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
/out:"C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.merged.dll"<o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
Resulting merged DLL path<o:p></o:p></div>
</td> </tr>
<tr> <td style="border-top: none; border: solid windowtext 1.0pt; padding: 0in 5.4pt 0in 5.4pt; width: 4.65in;" valign="top" width="446"><div class="MsoNormal">
"C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.Contracts.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.Base.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.XmlSerializers.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.dll"<o:p></o:p></div>
</td> <td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; padding: 0in 5.4pt 0in 5.4pt; width: 239.4pt;" valign="top" width="319"><div class="MsoNormal">
The list of assemblies that should be merged<o:p></o:p></div>
</td> </tr>
</tbody> </table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><i>"C:\Development\dynamic-delivery-4-tridion-master\dotnet\Dynamic Delivery Publishing Solution Items\ilmerge" <o:p></o:p></i></b></div>
<div class="MsoNormal">
<b><i>/lib:</i></b><i>"C:\Windows\Microsoft.NET\Framework\v4.0.30319" <o:p></o:p></i></div>
<div class="MsoNormal">
<b><i>/lib:</i></b><i>"C:\Program Files (x86)\Tridion\bin\client" <o:p></o:p></i></div>
<div class="MsoNormal">
<b><i>/t</i></b><i>:dll <o:p></o:p></i></div>
<div class="MsoNormal">
<b><i>/targetplatform:</i></b><i>v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 <o:p></o:p></i></div>
<div class="MsoNormal">
<b><i>/out</i></b><i>:"C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.merged.dll" <o:p></o:p></i></div>
<div class="MsoNormal">
<i>"C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.Contracts.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.Base.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.ContentModel.XmlSerializers.dll" "C:\Development\dynamic-delivery-4-tridion-master\build\DD4T.Templates.dll"<o:p></o:p></i></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-46577497648044169462014-02-03T20:42:00.001-08:002014-02-03T20:42:17.736-08:00Context Expression Extension<div class="WordSection1">
<div class="MsoNormal">
I this post I will cover a brand new feature added in Tridion 2013 SP1 called Context Expression Extension (CEE). CEE is part of Tridion 2013 SP1 and is installed as a GUI Extension that will mark Target Groups as Context Expressions. Additionally it has Content Delivery pieces that will be described later in this post.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CEE integrates SDL Tridion with Campaign Management and Analysis Data (CMA) allowing marketers and data analysts to define Expressions in CMA and push them into Tridion in the form of Target Groups. Context Expression Target Groups are read only and can just be updated in CMA, as a personal quote for future releases it would be nice if we can generate Context Expressions from external systems or within the Tridion user interface.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CEE updates how a Target Group looks like if it recognizes that it contains a Context Expression as you can appreciate in the following pictures.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4kFhQbnVDqxOmJGmBYmXgvK80hEj0Zx5V1GCURRIY7Obma97WH0YWukKeTBShUMgS-forrQBydElXgbLJYMWxqrWDOyRZa6qfKNH6QSFnLliELtHKrMWeTy0e8pFV9iSILU6eGBwIXfS/s1600/image001-723932.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4kFhQbnVDqxOmJGmBYmXgvK80hEj0Zx5V1GCURRIY7Obma97WH0YWukKeTBShUMgS-forrQBydElXgbLJYMWxqrWDOyRZa6qfKNH6QSFnLliELtHKrMWeTy0e8pFV9iSILU6eGBwIXfS/s1600/image001-723932.jpg" height="83" width="400" /></a></div>
<div class="MsoNormal">
<br /><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Context Expressions Target Groups are named in the form of [aspect].[property]<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX2ZgnB5QI8JUHte2YqzsKDJTrOPlaolY_-OBRS34Vhzl-VBaKSMQ2bNX-kTVXhWGmKAzFm1VzTJonMlpDWHFykj-hpjqArY6zqjQT31hvlLh7b01xtV5xl2X9SfHtIHUlvJ32435RUIMF/s1600/image003-725381.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX2ZgnB5QI8JUHte2YqzsKDJTrOPlaolY_-OBRS34Vhzl-VBaKSMQ2bNX-kTVXhWGmKAzFm1VzTJonMlpDWHFykj-hpjqArY6zqjQT31hvlLh7b01xtV5xl2X9SfHtIHUlvJ32435RUIMF/s1600/image003-725381.jpg" height="167" width="400" /></a></div>
<div class="MsoNormal">
<br /><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CEE will show an extra tab called Context Expression that shows the Expression in read only mode.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 18.0pt;">Publishing Context Expressions<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Context Expressions integrates perfectly with Context Engine Cartridge (CEC) providing access to the Expression in the Presentation Server by publishing the Context Expression Target Group using a new feature called Dynamic Vocabulary. So you may be thinking what is a dynamic vocabulary and what is an static vocabulary instead? Well I will try to explain it. I will call a static vocabulary to the set of expressions that are configured in the cwd_engine_vocabulary_conf.xml. So what is a dynamic vocabulary? Well it is the set of expressions that are published from Tridion (Target Groups Publishing). <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
You might be asking where are those expressions published, well they are pushed to the Ambient Data Framework (ADF) making them available as claims and eventually available for Tags like <b>If</b> or <b>Eval<o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Targeting Component Presentations using Context Expressions<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The process to target Component Presentations is the same to the one used with P&P (Personalization & Profiling), it is done in the Page - Component Presentations tab. Below a sample.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SYZpclMHvOC-3TwSRgc2-itgRW6gKad4wlqO3xMtTI4ycHGLh3Ah3yqItgGGcKiGHdav1fvO41uwi_q8L7yIfXKZdgUwMtDE93vd0zwSmv-fEz9WBNab3zvi5ZZQpZgDYlv-vrFpK7Xf/s1600/image004-726619.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SYZpclMHvOC-3TwSRgc2-itgRW6gKad4wlqO3xMtTI4ycHGLh3Ah3yqItgGGcKiGHdav1fvO41uwi_q8L7yIfXKZdgUwMtDE93vd0zwSmv-fEz9WBNab3zvi5ZZQpZgDYlv-vrFpK7Xf/s1600/image004-726619.jpg" height="273" width="640" /></a></div>
<div class="MsoNormal">
<br /><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
After publishing the Page you will see content like the following.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">:</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">If</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Expression</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">="(os.apple)"</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">runat</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">="server"></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Presentation: {"ComponentID" : "tcm:5-2051", "ComponentModified" : "2014-02-03T19:39:54", "ComponentTemplateID" : "tcm:5-1058-32", "ComponentTemplateModified" : "2013-12-26T16:18:55", "IsRepositoryPublished" : false } --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">div</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h2</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Field: {"XPath":"tcm:Content/custom:Content/custom:Heading[1]"} --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h1</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">strong</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Article For Apple Devices<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">strong</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h1</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h2</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">p</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Field: {"XPath":"tcm:Content/custom:Content/custom:Description[1]"} --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> This is a description for </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">strong</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Article For Apple Devices.</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">strong</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">p</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">div</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">:</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">If</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">:</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">If</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Expression</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">="(os.notapple)"</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">runat</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">="server"></span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Presentation: {"ComponentID" : "tcm:5-51", "ComponentModified" : "2014-02-03T17:59:54", "ComponentTemplateID" : "tcm:5-1058-32", "ComponentTemplateModified" : "2013-12-26T16:18:55", "IsRepositoryPublished" : false } --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">div</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h2</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Field: {"XPath":"tcm:Content/custom:Content/custom:Heading[1]"} --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h1</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">This is a Non Apple Devices Article<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h1</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">h2</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">p</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: darkgreen; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><!-- Start Component Field: {"XPath":"tcm:Content/custom:Content/custom:Description[1]"} --></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> This is a description for Non Apple Devices<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">p</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">div</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">span</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">context</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">:</span></b><b><span style="background: white; color: maroon; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">If</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A Context Expression Target Group is transformed in a <b><context:if> </b>tag by a TCDL Tag Transformed that is configured in the Deployer.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<TCDLEngine><o:p></o:p></div>
<div class="MsoNormal">
<Properties><o:p></o:p></div>
<div class="MsoNormal">
<Property Name="tcdl.dotnet.style" Value="controls"/><o:p></o:p></div>
<div class="MsoNormal">
<Property Name="tcdl.jsp.style" Value="tags"/><o:p></o:p></div>
<div class="MsoNormal">
</Properties><o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<b><TagBundle Resource="com/sdl/context/transformer/contextTagTransformerBundle.xml" /><o:p></o:p></b></div>
<div class="MsoNormal">
</TCDLEngine><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The final result is shown below (Please note that in order to have your web application working you have to have a Context Engine Cartridge configured and working).<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Non Apple Device Result<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL-01KMDvaEtaFdx_toUMD_Jxy5vS0Gql2EN0Hc15MituUfDwsT92UzUOftcGzmSbCyP66Ts__-e8cA1mIX8USpNxjQ7ih0CNfS2BKStuzysSHnGcsRDcHJenwnoSooDCTIh51co2La2Qd/s1600/image005-728178.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL-01KMDvaEtaFdx_toUMD_Jxy5vS0Gql2EN0Hc15MituUfDwsT92UzUOftcGzmSbCyP66Ts__-e8cA1mIX8USpNxjQ7ih0CNfS2BKStuzysSHnGcsRDcHJenwnoSooDCTIh51co2La2Qd/s320/image005-728178.jpg" id="BLOGGER_PHOTO_ID_5976397294580585362" /></a><o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Apple Device Result<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFPxl4VKzy35vWX8VxPdM4BS41yMiXuB4Zlm8_N_wr_AvQISTWPIfwyFHbXHJQT-g48WwNbPzD_DzfAjLDX4evj1-WOQmxox7It787q-dsfFB7RzZp9n5QTS0m2mNQB3SUuEkoiCkvuoi/s1600/image007-730132.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFPxl4VKzy35vWX8VxPdM4BS41yMiXuB4Zlm8_N_wr_AvQISTWPIfwyFHbXHJQT-g48WwNbPzD_DzfAjLDX4evj1-WOQmxox7It787q-dsfFB7RzZp9n5QTS0m2mNQB3SUuEkoiCkvuoi/s320/image007-730132.jpg" id="BLOGGER_PHOTO_ID_5976397302252946354" /></a><o:p></o:p></span></b></div>
</div>
<pre></pre>
<span style="color: #736f6e; font-family: arial; font-size: x-small;"> <a href="http://www.sdl.com/?utm_source=Email&utm_medium=Email%2BSignature&utm_campaign=SDL%2BStandard%2BEmail%2BSignature"> </a></span>Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-67795713166203707452014-01-22T10:25:00.001-08:002014-01-22T10:25:40.863-08:00Developing Translation Manager Plug Ins<div class="WordSection1">
<div class="MsoNormal">
In this post I want to talk about some of the cool but sadly no often used features available with SDL Tridion, Translation Manager plug in system. This plug in system allow us to customize the default Translation Jobs processing behavior. Before I start with the Translation Manager Plug In system I will provide some background about Translation Manager and how it is integrated with a Translation System like TMS or World Server.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following picture will explain how the integration is done.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJzY5-qw66UXPH6Oxoxo_umjwHbsc1dzVWi4eR5_e_T2e4XHhxWO0pkmopplQgi8Ui9mN6EsTIsF3rAUISIoiD9m1zPnWRvYLGMBlz1MvDwTuhsxZhmEQZhHYD9PWAwN14yct1yev0GU4f/s1600/image003-736057.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJzY5-qw66UXPH6Oxoxo_umjwHbsc1dzVWi4eR5_e_T2e4XHhxWO0pkmopplQgi8Ui9mN6EsTIsF3rAUISIoiD9m1zPnWRvYLGMBlz1MvDwTuhsxZhmEQZhHYD9PWAwN14yct1yev0GU4f/s320/image003-736057.jpg" id="BLOGGER_PHOTO_ID_5971787111260334466" /></a><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Just to provide a little more context. The translation is started in Tridion via Translation Manager and is sent to the Translation System via the Translation Manager Service, then after the translation is completed in the Translation system it is returned back to Tridion and the changes are applied by the Translation Manger Service and visualized by SDL Tridion and Translation Manager.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
So the behavior above is the default one, but what happens if we want to customize it for instance we want to add or update items that are sent for translation or we want to execute some operation after the translation is completed (like notifications or workflow integrations). Here is when the Translation Manager Plug In system comes into the picture.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Developing a Translation Manager Plug In<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Step 1<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
We should start identifying the API and the libraries that will help us to develop a Plug In.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><i>Translation Manager API (Tridion.TranslationManager.DomainModel.dll)<o:p></o:p></i></b></div>
<div class="MsoNormal">
<b><i>Tridion Core Services (Tridion.ContentManager.CoreService.Client.dll)</i></b> – I prefer using Core Services instead of TOM .Net API when I connect to Tridion from a Plug In, because I don’t need to start a new <i>Session</i> object and I don’t have to deal with session objects initialization and disposal.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Once you have identified the libraries that will help us to develop a plug in, you will need to reference them to your project in Visual Studio (Class Library project).<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Step 2<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The next step is to create the plug in class skeleton as you can see in the following code.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationManagerPlugIn</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MyTranslationPlugIn</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> MyTranslationPlugIn()<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TranslationJobCreated += TranslationJobManagerInitiated;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TranslationJobLoaded += TranslationJobManagerInitiated;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> TranslationJobManagerInitiated(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> sender, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobEventArgs</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> e)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As you might noticed in the source code above we need to decorate the class with the TranslationManagerPlugIn attribute.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Step 3<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Subscribe to a Translation Event that should be extended to meet your requirement. The events that can be used are actually Translation Jobs events. Below are the list and a some description of them.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Deleted:</b> Executed when a Translation Job is deleted. A translation job can be deleted when it is completed or canceled from a Translation System.<o:p></o:p></div>
<div class="MsoNormal">
<b>Deleting:</b> This event happens while the Translation Job is being deleted but the translation is not completed yet.<o:p></o:p></div>
<div class="MsoNormal">
<b>Saved:</b> Executed when a Translation Job is saved. It is a good event to add / remove more items for Translation.<o:p></o:p></div>
<div class="MsoNormal">
<b>Saving:</b> This event happens while the Translation Job is being saved but the transaction is not completed yet.<o:p></o:p></div>
<div class="MsoNormal">
<b>Resolved:</b> Executed when all the items are resolved.<o:p></o:p></div>
<div class="MsoNormal">
<b>Resolving:</b> This is the last stage where the resolved items collection can be modified and items can be added to the items sent for Translation. Items added at this stage are not visible in a Translation Job.<o:p></o:p></div>
<div class="MsoNormal">
<b>StateChanged:</b> Executed when the Translation job changes its state. It can be used to execute logic when the Translation is completed.<o:p></o:p></div>
<div class="MsoNormal">
<b>StateChanging:</b> This event happens when the Translation Job is changing its state but the transaction is not completed yet.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following sample will add linked components to the Translation Job using the Save Event.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationManagerPlugIn</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AddLinkedComponents</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">readonly</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> UserId = </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Administrator"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> AddLinkedComponents()<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TranslationJobCreated += OnTranslationJobInitiated;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TranslationJobLoaded += OnTranslationJobInitiated;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> OnTranslationJobInitiated(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> sender, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobEventArgs</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> e)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> e.TranslationJob.Saving += OnSaving;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> OnSaving(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> sender, System.ComponentModel.</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CancelEventArgs</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> e)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJob</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> job = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJob</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)sender;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (job.State == </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationJobState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Definition)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SessionAwareCoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SessionAwareCoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"netTcp_2012"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Impersonate(UserId);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> links = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XNamespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> xLinkNS = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XNamespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Get(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"http://www.w3.org/1999/xlink"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AddedItem</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> addedItem </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> job.AddedItems)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> addedItemId = addedItem.TcmUri.ToString();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">RepositoryLocalObjectData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">RepositoryLocalObjectData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)channel.Read(addedItemId, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (item </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">is</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> component = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)item;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (!</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.IsNullOrEmpty(component.Content)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> xContent = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Parse(component.Content);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XNamespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> xNS = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XNamespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Get(xContent.FirstAttribute.Value);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> links = xContent.Descendants().Where(w => w.Attributes(xLinkNS + </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"href"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">).Count() > 0);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (links != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> && links.Count() > 0)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">XElement</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> link </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> links)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AddedItem</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> newItem = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AddedItem</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(link.Attribute(xLinkNS + </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"href"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">).Value, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TranslationOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TranslateSubItems);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (!job.AddedItems.Contains(newItem))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> job.AddedItems.Add(newItem);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex)<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Abort();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">throw</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Step 4<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In this sample I am using Core Services to access Tridion Objects so you will need to configure the endpoints, the easiest is to configure the Core Services endpoints and bindings in the app.config files for your class library.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Step 5<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Once you have finished developing your plug in then you need to register it. You can do in but updating the TranslationManager.xml file available at %TRIDION_HOME%/config<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Here a sample:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<PlugInAssemblies><o:p></o:p></div>
<div class="MsoNormal">
<Assembly fullPath="D:\Tridion\Translation Manager\Plugins\Tridion.TranslationManager.PlugIn.dll"/><o:p></o:p></div>
<div class="MsoNormal">
</PlugInAssemblies></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com1tag:blogger.com,1999:blog-1400873539908712350.post-85232210212262470442013-12-11T17:54:00.000-08:002013-12-11T17:54:10.300-08:00How to correctly dispose CoreService client objects<div class="WordSection1">
<div class="MsoNormal">
Today I was doing some research in the WCF internals and I realized that the stories around the “using” statement are not all true. If you are a C# developer you are familiar with the “using” statement and you know that it will save lines of code since it will explicitly call the Dispose method in the object getting instantiated in the “using” statement (the object must implement the IDisposable interface).<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The sentence above is not true for WCF clients like the CoreServiceClient or SessionAwareCoreServiceClient classes because they are typed WCF clients.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Why I cannot use “using” to safely dispose CoreService clients?<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The answer is pretty simple the Dispose method calls the Close method and it might throw an exception if a Transport related exception happens. So it is not correct to use “using” because you are not managing exceptions correctly and eventually the underline communication object will remain undisposed.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> component = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)channel.Read(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"tcm:5-2051"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">} </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// Dispose will be called here and an exception might happen.</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// This code might not be reached</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"I have sucessfully retrieved my component"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">I know I have some samples where I was using “using” and having a try catch finally block in order to handle exceptions and try to close the channel, it might help but there are still some gaps.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: black;">Sample:<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> component = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)channel.Read(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"tcm:5-2051"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) { </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// This code will manage any exception that might happen in the try block</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">throw</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel.State != </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Closed) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Close(); </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// This code might throw an exception if there is a Network issue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">} </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// Dispose will be called here and an exception might happen if there is a Network issue.</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// This code might not be reached</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"I have sucessfully retrieved my component"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: black; font-size: 14.0pt;">What is the right way to Dispose a CoreService client object?<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Microsoft recommends a way to do it, basically they don’t use the “using” statement and they use a classic way to manage exceptions as back in the .Net Framework 1.1 <span style="font-family: Wingdings;">J</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Solution:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> component = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)channel.Read(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"tcm:5-2051"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Close(); </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//This line might throw a network exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"I have sucessfully retrieved my component"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">} <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationException</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Abort(); </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//The channel is aborted and the resources released.</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">} <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TimeoutException</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Abort(); </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">//The channel is aborted and the resources released.</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">} <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Abort(); </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// The channel is aborted and the resources released.</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">I know it looks tedious but we can put it in an Extension method or a Utility so that we don’t have to write all these catch sentences all the time.</span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-27887594650976318532013-12-10T20:28:00.002-08:002013-12-10T20:28:51.322-08:00Tridion 2013 SP1 - Synchronizing components<div class="WordSection1">
<div class="MsoNormal">
Continuing with my posts about Tridion 2013 SP1, I will talk about the new Synchronization API. This API that is available via the Core Services making this API easy to use and very light.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The new synchronization functionality will analyze the component content and the schema and it will infer which operations need to be completed in order to keep them in sync.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> SynchronizeComponent(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"tcm:5-2051"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel.State != </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Closed) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> SynchronizeComponent(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> componentId, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> updateAfterSynchronize) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Starting Sychronization..."</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> options = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() { <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> SynchronizeFlags = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.All<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> };<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizationResult</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (updateAfterSynchronize) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result = channel.SynchronizeWithSchemaAndUpdate(componentId, options);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">else</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IdentifiableObjectData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item = channel.Read(componentId, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result = channel.SynchronizeWithSchema(item, options);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizationActionData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> action </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> result.SynchronizationActions) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Field Name: {0}"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, action.FieldName);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Field Index: {0}"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, action.FieldIndex);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Action Taken: {0}"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, action.SynchronizationActionApplied);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.WriteLine(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Sychronization completed."</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Console</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ReadLine();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The first thing we need to consider while writing a synchronizing program would be the Synchronization Options, basically the Synchronization flags.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.All</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ApplyDefaultValuesForMissingMandatoryFields</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ApplyDefaultValuesForMissingNonMandatoryFields</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ApplyFilterXsltToXhtmlFields</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Basic</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ConvertFieldType</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.FixNamespace</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.RemoveAdditionalValues</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.RemoveUnknownFields</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SynchronizeFlags</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.UnknownByClient</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">You must be careful while using those flags since some of them like RemoveUnknownFields that will lead you to lose data if is not used carefully.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">Other important feature in this new API is the fact that this will return feedback in the form of SynchronizationActionData objects. As you can see in the sample above it will give you information like the FileName, FileIndex and the action that was taken.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">You may also notice that in the sample above I am using two different methods SycnrhonizeWithSchema and SynchronizeWithSchemaAndUpdate, the difference is clear, the first one won’t check in any changes and the second one will check in the changes leading you to lose data if not used carefully.<o:p></o:p></span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-75223402713711072672013-12-10T20:01:00.002-08:002013-12-10T20:01:51.651-08:00Tridion 2013 SP1 - API improvements<div class="WordSection1">
<div class="MsoNormal">
Continuing with my Tridion 2013 SP1 posts I will talk about some API improvements. Below a list containing API improvements.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">StreamDownload endpoint can now download external items<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">StreamDownloadClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> downloadChannel { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (downloadChannel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">StreamDownloadClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"streamDownload_basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Stream</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> stream = downloadChannel.DownloadExternalBinaryContent(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"http://www.sdl.com/Content/themes/common/images/sdl-logo.png"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MemoryStream</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ms = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MemoryStream</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> b;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">while</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ((b = stream.ReadByte()) != -1) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ms.WriteByte((</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">byte</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)b);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FileStream</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> fs = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FileStream</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"C:\\sdl-logo.png"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FileMode</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.OpenOrCreate, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FileAccess</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ReadWrite))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BinaryWriter</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> writer = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BinaryWriter</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(fs)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> writer.Write(ms.ToArray());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> writer.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> fs.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ms.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (downloadChannel.State != </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Closed) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> downloadChannel.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="color: black; font-size: 14.0pt;">Schemas can be retrieved by Namespace<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">This is a change in both Core Services and TOM .NET APIs. In this post I will show a Core Service sample.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">Sample:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> schema = GetSchemaFromNamespace();</span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel.State != </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Closed) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> GetSchemaFromNamespace() {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">LinkToSchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> schema = channel.GetSchemasByNamespaceUri(PublicationId, </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"http://www.tridion.com/ContentManager/5.0/DefaultMultimediaSchema"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">).FirstOrDefault();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (schema != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)channel.Read(schema.IdRef, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">This change is very important since now we can retrieve schemas by using namespaces (XML like functionality) without having the need to specify tcm uris or webdav urls.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="color: black; font-size: 14.0pt;">Multimedia Components can be created without specifying a Multimedia Type<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">This is an small change but it will save you several lines of code </span><span style="color: black; font-family: Wingdings;">J</span><span style="color: black;">, if the file extension that you are using to create the multimedia component can be mapped to an existing multimedia type, then the API will do it for you. <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">Sample:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">using</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CoreServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">))<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> schema = GetSchemaFromNamespace();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CreateMultimediaComponent(schema);</span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> } <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">finally</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (channel.State != </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">CommunicationState</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Closed) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Close();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CreateMultimediaComponent(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> schema) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> multimediaComponent = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Id = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmUri</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.UriNull.ToString(),<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Title = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Guid</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.NewGuid().ToString(), <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Schema = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">LinkToSchemaData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() { IdRef = schema.Id },<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> LocationInfo = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">LocationInfo</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() { OrganizationalItem = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">LinkToOrganizationalItemData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() { IdRef = FolderId } },<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ComponentType = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ComponentType</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Multimedia,<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> BinaryContent = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BinaryContentData</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Filename = </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"sdl-logo.png"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">,<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> UploadFromFile = </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"C:\\sdl-logo.png"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> };<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.Create(multimediaComponent, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ReadOptions</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">());<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="color: black; font-size: 14.0pt;">Decommissioning Publication Targets<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">This is a very important change, and it will allow us to mark items that were published to a publication target as unpublished to that publication target in one single operation. It is useful in case you have a publication target that is no longer used and can block other items to be deleted or moved.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="color: black;">Sample:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">static</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> DecommissioningPublicationTarget(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> publicationTargetId) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel.DecommissionPublicationTarget(publicationTargetId);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com1tag:blogger.com,1999:blog-1400873539908712350.post-70989298528567155122013-12-10T19:24:00.001-08:002013-12-18T06:24:03.479-08:00Tridion 2013 SP1 - Import Export API<div class="WordSection1">
<div class="MsoNormal">
Continuing with my posts related to the new Tridion 2013 SP1 release, in this opportunity I will talk about the new Import/Export API. Imagine that you want to execute Content Porter like functionality in your programs or scripts, it is now possible by using the Import/Export API.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The Import/Export API is a set of WCF services and endpoints with a set of operations that will allow you to export and import packages. Note that the next release of Content Porter will use the Import/Export API.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Developing a .NET Application that uses the Import/Export API<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As the first step, we will need to add a reference to the Import/Export client dlls. You can find the DLLs in [TRIDION_HOME]\bin\client\ImportExport. Add a reference to the following DLLs.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<i>Tridion.ContentManager.ImportExport.Client.dll<o:p></o:p></i></div>
<div class="MsoNormal">
<i>Tridion.ContentManager.ImportExport.Common.dll<o:p></o:p></i></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The second step will be to add the WCF configuration settings to the configuration file, in this case I am using the app.config file. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<i>Tridion.ContentManager.ImportExport.Client.dll.config<o:p></o:p></i></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Merge the contents of the file above into your configuration file.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As the third step I will create an instance of the ImportExport service client.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ImportExportServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> channel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ImportExportServiceClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"basicHttp_2013"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Creating an Export Package<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
There are three steps in order to create an export package, select items, define export instructions and create the export package.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to select items we will need to use the Selection class and its derived classes that are listed below.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<i>Selection<o:p></o:p></i></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<i>ApprovalStatusesSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>GroupsSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>ItemsSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>MultimediaTypesSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>ProcessDefinitionsSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>SubtreeSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<i>TaxonomiesSelection<o:p></o:p></i></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample: <o:p></o:p></div>
<div class="MsoNormal">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Selection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> selection = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ItemsSelection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"tcm:5-1053"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> });</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to define export instructions we will use the ExportInstructions class<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ExportInstruction</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> exportInstruction = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ExportInstruction</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> BluePrintMode = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BluePrintMode</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ExportSharedItemsFromOwningPublication<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to export items we will need to execute the StartExport method available in the ImportExportServiceClient class<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> processId = channel.StartExport(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Selection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { selection }, exportInstruction);</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Notice that the StartExport method returns the Import/Export process id that will be used later when we perform an import operation or to follow the process status.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 14.0pt;">Importing a Package<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
There are two steps in order to import a package, define import instructions and import the page.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to define import instructions we need to use the ImportInstruction class.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sample:<o:p></o:p></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ImportInstruction</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> importInstructions = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ImportInstruction</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">() {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RunInTransaction = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> DiscoverPotentialProblems = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> LogLevel = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">LogLevel</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Debug<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">In order to import a package we need to use the StartImport available in the ImportExportServiceClient class<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">Sample:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> packageFullPath = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Format(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"{0}ImportExport\\Packages\\export_{1}.zip"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ConfigurationSettings</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetTcmHomeDirectory(), processId);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">channel.StartImport(packageFullPath, importInstructions);</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black;">This API is easy and very powerful and it will open a lot of possibilities regarding content management.</span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com6tag:blogger.com,1999:blog-1400873539908712350.post-11643607913579010322013-12-02T09:06:00.002-08:002013-12-02T09:06:35.299-08:00What is new in Tridion 2013 SP1 Workflow<div class="WordSection1">
<div class="MsoNormal">
Last week I was starting playing with the new workflow features coming with the new Tridion 2013 SP1 release. After revising all of them I will resume all of them in the following section.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">First Activity Changes<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In previous releases a workflow designer was able to only use a manual activity that is assigned to everyone as the first activity in the process definition. This limitation lead to multiple workarounds like using Event System to start and finish that first activity automatically, leading to some performance issues and unnecessary complexity during implementations.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Fortunately this limitation is gone and we are able to use an automatic activity as the first activity or having a manual activity assigned to an specific group or user.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Use cases for this new feature would be the following ones.<o:p></o:p></div>
<ul>
<li><o:p></o:p>Merging multiple process definitions into a single one. For instance you can define a different workflow path for items coming from a different publication or with different metadata.<o:p></o:p></li>
</ul>
<ul>
<li>Having different workflows for certain groups.<o:p></o:p></li>
</ul>
<ul>
<li>Publish as soon as the workflow has been started then review.<o:p></o:p></li>
</ul>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<o:p> </o:p><img alt="" src="data:image/png;base64,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" /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Expiration Scripts<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
This new feature was visible in the Visio Workflow designer in Tridion 2013 GA but it was completely implemented in this release. This feature came with some API changes adding a new method to the ExternalActivity base class <b>Expire </b>this method will be executed when the Activity Due date is reached and the activity hasn’t been finished or even started.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
I was doing some researching on it and it seems that the new method as added as part of a new interface IExternalActivity2013.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Here some sample implementation for an Expiration Script (very similar to a normal automatic activity script), one big thing to notice here is that you can specify an expiration script for a manual activity as well, so we can include some sort of automation for manual activities now.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<o:p><img alt="" src="data:image/png;base64,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" /> </o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<o:p>
</o:p></div>
<o:p></o:p><br />
<div class="MsoNormal">
<o:p>
protected override void Expire() {<br /> SmtpClient client = new SmtpClient();<br /> MailMessage message = new MailMessage();<br /> message.From = new MailAddress("system@tridion.com");<br /><br /> MailAddressCollection toAddress = new MailAddressCollection();<br /> toAddress.Add(new MailAddress(GetCurrentUserMail()));<br /><br /> client.Send(message);<br />}</o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Approval Status for items added to Bundles<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
When an item is added to a bundle that is already in a workflow process instance, the added item will receive the current approval status, actually it will receive all the bundle workflow trace. For instance if you have a Bundle that has this workflow trace, Draft -> Staging -> Draft -> Staging, the added item will receive the same in its workflow process history.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Approval Status evaluation during publishing<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Approval status is checked during publishing to make sure that the item being published meet at least the minimal approval status. This functionality is not new and has been there in tridion for several releases, so what is the difference?, Since Tridion 2013 GA we have the possibility to remove items from a Bundle regardless if it is in Workflow or not, it will lead to the possibility of removing an item from a bundle / workflow before it meets the minimal approval status for a publication target, then since it is not in workflow we were able to publish it even causing some inconsistency. In this release we are evaluating the approval status even if the item is not in workflow so that we can ensure that just content with the required approval level reaches the publication target.<o:p></o:p></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-52705561821570200312013-11-26T21:25:00.002-08:002013-11-26T21:27:06.080-08:00Tridion Workflow - Developing using Dependency Injections<div class="WordSection1">
During a workflow design session I noticed that sometimes using a classes design just based on inheritance is not enough and not as flexible as I expected. You can refer to a previous post to get some background <a href="http://erichuiza.blogspot.com/2013/08/developing-sdl-tridion-2013-workflows.html" target="_blank"> Developing Tridion 2013 Workflows</a>.<o:p></o:p><br />
In that previous post I was reusing code by having an abstract class called BaseActivity and then creating more specialized classes like PublishActivity and RejectActivity that inherit from BaseActivity. This design allows me to reuse and to create specialized functionality for my activities.<o:p></o:p><br />
There is a concept that I remember from my days studying computer engineering at the University (old and fun days) “Favor composition over inheritance” – Thanks Alvin Reyes for refreshing my mind. Why composition and why not inheritance, well Inheritance is not bad but if we can combine it with composition then we get an stronger result.<o:p></o:p><br />
I decided to integrate an <a href="http://en.wikipedia.org/wiki/Inversion_of_control"> IoC</a> Container to my workflow implementation so that I can instantiate my objects members (composition) at runtime, giving flexibility and scalability to my implementation. I used <a href="http://www.ninject.org/">Ninject</a> as my IoC container because it is light and easy to use.<o:p></o:p><br />
<b><span style="font-size: 18.0pt;">Integrating Ninject with a Tridion Workflow Implementation<o:p></o:p></span></b><br />
The following classes design clearly shows two classes hierarchies that are not linked and can be developed / extended independently.<o:p></o:p><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw91ZFu1ZQ-hZ-k_wg25bcdO3LfbHw0r3OWcsgRqfOIgztlvrDqnu-T5Mu7Wbg9jDxbfHnNn-aMp_lP5gfkYxnF7hiV6oFemkZcOBmTHlML4ta5wZxYbZY1C3jDnE5OIBJ1b2E2GRck9Vf/s1600/image002-793681.png"><img alt="" height="448" src="data:image/png;base64,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" width="640" /></a><o:p></o:p><br />
In order to bind those two classes hierarchies I will use Ninject to inject dependencies at runtime based on the class composition.<o:p></o:p><br />
<b><span style="font-size: 14.0pt;">Binding Activity Classes with Worker Classes<o:p></o:p></span></b><br />
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span>Declare loosely coupled links in the activity classes.<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Spark.Workflow.Publish {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">PublishToDraftActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BaseActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> <o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none; text-indent: .5in;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">protected</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Publisher</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> publisher;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none; text-indent: .5in;">
<b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">protected</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Notifier</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> notifier;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none; text-indent: .25in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
Notice that I am declaring abstract types in order to avoid linking the activity class with a concrete implementation.<o:p></o:p><br />
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span>Declare a constructor that will receive concrete instances of abstract members.<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Spark.Workflow.Publish {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">PublishToDraftActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">BaseActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">protected</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Publisher</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> publisher;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">protected</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Notifier</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> notifier;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">public</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> PublishToDraftActivity(</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Publisher</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> publisher, </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Notifier</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> notifier) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">.publisher = publisher;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">.notifier = notifier;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> }</span></b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<o:p> </o:p><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;"><span style="mso-list: Ignore;"> </span></span></div>
<div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;"><span style="mso-list: Ignore;"> 3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">Define injection rules, in this implementation I am using a Ninject module, however you can use an XML file or Ninject naming conventions.<o:p></o:p></span></div>
<div class="MsoListParagraph">
<br /></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">namespace</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Tridion.ContentManager.Spark.Workflow.Modules {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">InjectionModule</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">NinjectModule</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Load() {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> Bind<</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Publisher</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">>().To<</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">StandardPublisher</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">>();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> Bind<</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Notifier</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">>().To<</span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">EmailNotifier</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">>();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .25in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .25in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .25in;">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">The injection rules above will bind any Publisher reference to StandardPublisher and any Notifier reference to EmailNotifier. Here the beauty of Dependencies Injections, we can change bindings and it doesn’t affect the activities implementation. For instance we can decide to notify using Rss instead of sending an email, then we should change the binding to use RssNotifier instead of EmailNotifier.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .25in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .25in;">
<br /></div>
<div class="MsoNormal">
<b><span style="font-family: "Times New Roman","serif"; font-size: 14.0pt;">Creating Activity Classes Instances – Linking all together at runtime.<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">In order to accomplish this I have created a new Workflow Script Executor that will use the Ninject Kernel to create instances instead of System.Reflection. You can get information about how to create your own Workflow Script Executor in this post <a href="http://erichuiza.blogspot.com/2013/04/extending-tridion-2013-workflow-scripts.html"> Extending Workflow Scripts</a><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">The Ninject Kernel will instantiate Activity Instances and “Apply” the injection rules when the object is being constructed (the magic happens in the constructor).<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">External Activity Script<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">AssemblyTbbId = "tcm:2-49-2048"<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">Type = "Tridion.ContentManager.Spark.Workflow.Publish.PublishToDraftActivity"<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IExternalActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> GetExternalActivity(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> script, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> isExpiration, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> currentActivityInstanceId) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Match</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> matches = _nameValuePairRegex.Matches(script).Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Match</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Match</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> assemblyMatch = matches.FirstOrDefault(m => m.Groups[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Name"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value.ToUpperInvariant().Trim() == _assemblyTbbIdParam);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Match</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> typeMatch = matches.FirstOrDefault(m => m.Groups[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Name"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value.ToUpperInvariant().Trim() == _typeParam);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmUri</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> uri = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmUri</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(assemblyMatch.Groups[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Value"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> typeName = typeMatch.Groups[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Value"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">StreamDownloadClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> downloadChannel = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">StreamDownloadClient</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmConstants</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.LatestStreamDownloadNetTcpEndPointName);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FullVersionInfo</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> fullVersionInfo = (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">FullVersionInfo</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)buildingBlockData.VersionInfo; <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">byte</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] bytes = ReadContentBytes(downloadChannel.DownloadBinaryContent(uri));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Assembly</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> assembly = <o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TemplateAssemblyCache</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetCachedAssembly(bytes, uri, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmUri</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(buildingBlockData.BluePrintInfo.OwningRepository.IdRef), fullVersionInfo.Version.Value, fullVersionInfo.Revision.Value);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">Type</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> type = assembly.GetType(typeName);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">IKernel</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> kernel = </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">new</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">StandardKernel</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;">();<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 10.0pt; mso-highlight: white;"> kernel.Load(assembly);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IExternalActivity</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">)kernel.Get(type, contextDataParameter);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: "Times New Roman","serif"; font-size: 12.0pt;">The Kernel will execute the Injections Modules and will glue everything while the object is being constructed.<o:p></o:p></span></div>
</div>
<pre></pre>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-8402826459149956172013-10-14T21:41:00.001-07:002013-10-14T21:41:48.331-07:00Integrating ASP .NET Security with Audience Manager<div class="WordSection1">
<div class="MsoNormal">
Security is a very important piece in every well defined software architecture. We will find security in all the software development levels from a high level functional specification to a very detailed technical specification.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In this opportunity I will write about how to integrate ASP .NET security with Audience Manager, Audience Manager is a very powerful Tridion feature that fits perfectly with the ASP .NET membership, roles and profiles features. In this post I will describe how to develop a ASP .NET Membership, Roles and Profile provider that uses Audience Manager.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Membership Provider<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A membership provider will provide standard authentication functionality like Create, Update, Validate users as well as Change Password. The following sample will show how to Create, Update and Validate users using Audience Manager within a Membership Provider.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The first step will be to create a class that inherits from Membership Provider. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerMembershipProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Initialize(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> name, System.Collections.Specialized.</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">NameValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> config) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName = config[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"applicationName"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">];<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">base</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Initialize(name, config);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The second step will be to implement the Create, Update and Delete methods by implementing the Membership base class.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipUser</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CreateUser(<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none; text-indent: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> username, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> password, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> email, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> passwordQuestion, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> passwordAnswer, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> isApproved, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">object</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> providerUserKey, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">out</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipCreateStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> status) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipUser</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> user = GetUser(email, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (user == </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">else</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { email, ApplicationName });<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (contact.SubscriptionStatus == </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SubscriptionStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.OptedIn) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> status = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipCreateStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.DuplicateEmail;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TcmUri</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> addressBookUri = </span><span style="background: white; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">GetAddressBookId()<span style="color: black;">;<o:p></o:p></span></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.AddressBookId = addressBookUri.ItemId;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.EmailAddress = email;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"NAME"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = username;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Crypto</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> crypto = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Crypto</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"PASSWORD"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = crypto.Encrypt(password);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"IDENTIFICATION_KEY"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = email;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"IDENTIFICATION_SOURCE"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = ApplicationName;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"LAST_ACCESS_DATE"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DateTime</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Now;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Save();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> status = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipCreateStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Success;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> GetUser(email, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">throw</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> UpdateUser(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MembershipUser</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> user) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { user.UserName, ApplicationName });<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.EmailAddress = user.Email;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"EMAIL"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = user.Email;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.SubscriptionStatus = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SubscriptionStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.OptedIn;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"LAST_ACCESS_DATE"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Value = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DateTime</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Now;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Save();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ValidateUser(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> username, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> password) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ((contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { username, ApplicationName })) != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Crypto</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> crypto = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Crypto</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Compare(crypto.Encrypt(password), contact.ExtendedDetails[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"PASSWORD"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].StringValue) == 0 && contact.SubscriptionStatus == </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SubscriptionStatus</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.OptedIn) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The third step will be to configure the Membership provider. It will be configured in the Web.config file.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">membership</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">defaultProvider</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerMembershipProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">clear</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerMembershipProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerMembershipProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">enablePasswordRetrieval</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">enablePasswordReset</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">requiresQuestionAndAnswer</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">applicationName</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MyApplication</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">requiresUniqueEmail</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">passwordFormat</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Encrypted</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">maxInvalidPasswordAttempts</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">100</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">minRequiredPasswordLength</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">5</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">minRequiredNonalphanumericCharacters</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">0</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">passwordAttemptWindow</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">10</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">passwordStrengthRegularExpression</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">""</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">membership</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Roles Provider<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A Roles provider will provide standard functionality to specify roles for a given user as well as validate if a given user belongs or not a group or set of groups. In this sample I will implement AddUsersToRoles, GetUserRoles and IsUserInRole. Additionally since this is an Audience Manager implementation I will use some Tridion features to define roles, In my sample I am defining them as Keywords in a Category called Roles so that we can assign roles (Keywords) to an AudienceManager contact that can be used later for personalization and segmentation.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The first step will be to create a class that inherits from RoleProvider.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerRolesProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">RoleProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ConfigItems</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Config;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">private</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RolesCategoryUri;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Initialize(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> name, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">NameValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> config) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName = config[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"applicationName"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">];<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> RolesCategoryUri = GetRolesCategoryId();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">base</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Initialize(name, config);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The second step will be to implement AddUsersToRoles, GetUSerRoles and IsUserInRole.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> AddUsersToRoles(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] usernames, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] roleNames) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> userName = usernames.First();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> factory = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Keyword</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> roles = factory.GetTaxonomyKeywords(RolesCategoryUri).KeywordChildren.Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Keyword</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ((contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { userName, ApplicationName })) != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">foreach</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> roleName </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">in</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> roleNames) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Keyword</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> role = roles.Where(w => w.KeywordName.Equals(roleName)).ElementAtOrDefault(0);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (role != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> && !contact.Keywords.Contains(role.KeywordUri)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Keywords.Add(role.KeywordUri);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Save();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] GetRolesForUser(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> username) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ((contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { username, ApplicationName })) != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> factory = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> roleIds =<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Keywords.OfType<</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Where(w => factory.GetTaxonomyKeyword(w).TaxonomyUri.Equals(RolesCategoryUri));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> roleIds.Select(s => factory.GetTaxonomyKeyword(s).KeywordName).ToArray();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">bool</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> IsUserInRole(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> username, </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> roleName) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ((contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { username, ApplicationName })) != </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">null</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> factory = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">TaxonomyFactory</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Keywords.OfType<</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().Any(a => {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Keyword</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contactKeyword = factory.GetTaxonomyKeyword(a);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contactKeyword.TaxonomyUri.Equals(RolesCategoryUri) && contactKeyword.KeywordName.Equals(roleName);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> });<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The third step will be to configure the Roles Provider.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">roleManager</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">enabled</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">defaultProvider</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerRolesProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">clear</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerRolesProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerRolesProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">applicationName</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MyApplication</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">roleManager</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="font-size: 16.0pt;">Profile Provider<o:p></o:p></span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A profile provider will provide standard functionality to manage user profiles, as you may noticed we are just working with user names, passwords and roles, but how about the user profile like Salutation, Title, City, Age, Birth Date… fortunately all this is managed by AudienceManager and can be integrated beautifully with a Profile Provider. In the following sample I will show how to configure a user profile and how to implement read and write operations against the profiles repository (Audience Manager).<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The first step will be to configure and define a profile in the Web.config file.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">profile</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">defaultProvider</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerProfileProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">clear</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerProfileProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">applicationName</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">MyApplication</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerProfileProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">providers</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">properties</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Salutation</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">allowAnonymous</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">customProviderData</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Name</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">allowAnonymous</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">customProviderData</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Surname</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">allowAnonymous</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">customProviderData</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">add</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Birth_Date</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">datetime</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">allowAnonymous</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">customProviderData</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManager</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> /></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">properties</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">profile</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Once we have configured it, ASP .NET will generate a dynamic type called ProfileCommon which will have defined properties that map directly with the profile properties, that means that we will have properties for Salutation, Name, Surname, Birth_Date. In the following sample I will be implementing methods to read and write properties from/to the profiles repository which in this case will be Audience Manager.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The second step in this sample will be to inherit from ProfileProvider class.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">class</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">AudienceManagerProfileProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> : </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ProfileProvider</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName { </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">get</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">set</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">; }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Initialize(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> name, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">NameValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> config) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ApplicationName = config[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"applicationName"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">];<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">base</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Initialize(name, config);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><span style="color: black; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The third and last step will be to implement the SetPropertyValues and GetPropertyValues methods.<o:p></o:p></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">void</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> SetPropertyValues(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsContext</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> context, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> collection) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> userName = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(context[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"UserName"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { userName, ApplicationName });<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> audienceManagerProperties =<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> collection.Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().Where(w => w.Property.Attributes[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"CustomProviderData"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Equals(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"AudienceManager"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">for</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerator</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> e = audienceManagerProperties.Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().GetEnumerator(); e.MoveNext(); ) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> detailName = e.Current.Name.ToUpper();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DetailType</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> detailType = contact.ExtendedDetails[detailName].FieldType;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">switch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (detailType) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">case</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DetailType</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Date:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DateTime</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> dateValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DateTime</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TryParse(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(e.Current.PropertyValue), </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">out</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> dateValue)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[detailName].Value = dateValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">break</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">case</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DetailType</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Decimal:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">decimal</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> decimalValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">decimal</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TryParse(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(e.Current.PropertyValue), </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">out</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> decimalValue)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[detailName].Value = decimalValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">break</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">case</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">DetailType</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.Integer:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> intValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">int</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.TryParse(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(e.Current.PropertyValue), </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">out</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> intValue)) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[detailName].Value = intValue;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">break</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">default</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">:<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.ExtendedDetails[e.Current.Name.ToUpper()].Value = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(e.Current.PropertyValue);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">break</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact.Save();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">throw</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">public</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">override</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> GetPropertyValues(</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsContext</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> context, </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> collection) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">try</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> values = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValueCollection</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">();<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> userName = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Convert</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.ToString(context[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"UserName"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> contact = </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Contact</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.GetFromContactIdentificatonKeys(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">string</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">[] { userName, ApplicationName });<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsProperty</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> audienceManagerProperties = collection.Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsProperty</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().Where(w => w.Attributes[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"CustomProviderData"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Equals(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"AudienceManager"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerable</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsProperty</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> dbProperties = collection.Cast<</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsProperty</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">>().Where(w => !w.Attributes[</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"CustomProviderData"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">].Equals(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"AudienceManager"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">));<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">for</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">IEnumerator</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsProperty</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">> e = audienceManagerProperties.GetEnumerator(); e.MoveNext(); ) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> propertyValue = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">new</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">SettingsPropertyValue</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">(e.Current);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> propertyValue.PropertyValue = contact.ExtendedDetails[e.Current.Name.ToUpper()].Value;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> values.Add(propertyValue);<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> values;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">catch</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (</span><span style="background: white; color: #2b91af; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Exception</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex) {<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">throw</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ex;<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-5373420202739871802013-10-10T14:28:00.000-07:002013-10-10T14:41:47.112-07:00UI Extensions - Ensuring an Item is Full Loaded before isAvailable and isEnabled are executed<div class="WordSection1">
<div class="MsoNormal">
Recently I saw a few questions in Tridion Stack Exchange related to GUI Extensions and how to load items in the _isAvailable and _isEnabled methods. The question here would be. Are the _isAvailable and _isEnabled methods good places to load an item? The answer is NO.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The reason why they are no good places to load items is because those methods return values (true or false) so that we cannot manage asynchronous calls inside them because the code execution won’t be sequential. I was thinking on a good solution for that since I have been myself in such situation when a button or context menu should be enabled or disabled based on information that is just available if the item if fully loaded.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to solve this issue I have use several techniques related to GUI extensions, some of them are not documented and of course not supported by SDL Tridion R&D but I think it is worth to show them in this post.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>SOLUTION:<o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="mso-list: l2 level1 lfo2; text-indent: -.25in;">
<<b><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></b><b>Extend an existing Resources Group<o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
It is known for all the Tridion Implementers that SDL Tridion R&D does an excellent job while designing and making things extensible even if they are not documented, one of those extensible features are the possibility to add or inject javascript files to a pre-existing group of files at runtime.<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
In order to use a Resources Group we need to configure it in the configuration file used by your GUI Extension. In my sample implementation I have done it in the following way.<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extensiongroups</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extensiongroup</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">target</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Tridion.Web.UI.Editors.CME.Views.Dashboard</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:insertafter</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:insertafter</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extensiongroup</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:extensiongroups</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
Let’s explain it a little bit. <o:p> </o:p></div>
<ul>
<li>The <b>name</b> attribute will identify your extension group make sure it is unique in the whole system.<o:p></o:p></li>
</ul>
<ul>
<li>The <b>target </b>attribute will define which existing group you want to extend, in this case I want to extend <b><span style="background: white; mso-highlight: white;">Tridion.Web.UI.Editors.CME.Views.Dashboard</span></b><b> </b>because this one contains call to <b>Dashboard.js </b>which is the javascript file that will load the <b>Tridion Items List control</b>.<o:p></o:p></li>
</ul>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .75in;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0LNncLUURURtZq31zQ9XVGx3wEgwVYew-LJ6Ornr4xbABWSA9JZa7_uAtJ31GeUgMiPS6FEM0B9cYPQXdG27GsjF7FRNMWVzB8jF6W7MFPHOHeVLpPmgkGWTKtSuHGTatZmX1Ir1ftVeB/s1600/image003-708473.jpg"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0LNncLUURURtZq31zQ9XVGx3wEgwVYew-LJ6Ornr4xbABWSA9JZa7_uAtJ31GeUgMiPS6FEM0B9cYPQXdG27GsjF7FRNMWVzB8jF6W7MFPHOHeVLpPmgkGWTKtSuHGTatZmX1Ir1ftVeB/s320/image003-708473.jpg" height="73" id="BLOGGER_PHOTO_ID_5933240516331259970" width="640" /></a><o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .75in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .75in;">
The idea behind this solution is to extend the <b>OnSelectionChange</b> event handler for the <b>Tridion Items List Control</b> so that we can pre-load an item when we change the current selection in the view.<o:p></o:p></div>
<ul>
<li>The <b>insertafter</b> element will specify the group that will contain the javascript files that will be executed right after the <b><span style="background: white; mso-highlight: white;">Tridion.Web.UI.Editors.CME.Views.Dashboard</span></b> files are executed.<o:p></o:p></li>
</ul>
<div class="MsoListParagraph" style="margin-left: .75in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .75in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:group</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">name</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">merge</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">always</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .75in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:fileset</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .75in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">script</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/Client/ListExtension.js</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .75in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:fileset</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .75in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:group</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal">
<b> </b>In this sample I am defining a single javascript file called ListExtension.js that will be executed right after the extended resources group. Following this approach my execution chain will look like this.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">style</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/Views/Dashboard/Dashboard.sprited.css</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">style</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">{ThemePath}/Views/dashboard.sprited.css</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">script</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/Views/Dashboard/Dashboard.js</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
And <o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: red; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">type</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">=</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">script</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">/Client/ListExtension.js</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">cfg:file</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b> </b>Finally we need to register the resources extension.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">resourceextensions</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">resourceextension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">resourceextension</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"></</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">resourceextensions</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">></span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="mso-list: l2 level1 lfo2; text-indent: -.25in;">
2. <b>Override a DashboardView.js method<o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
Having the fact that ListExtension.js is executed right after Dashboard.js, then we can override or extend the methods defined inside Dashboard.js since they are already enabled. For this sample I have overridden the <b>onListSelectionChanged</b> method. This would the content for my ListExtension.js file.<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Tridion.Cme.Views.DashboardBase.prototype._oldListSelectionChanged = Tridion.Cme.Views.DashboardBase.prototype.onListSelectionChanged;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Tridion.Cme.Views.DashboardBase.prototype.onListSelectionChanged = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> DashboardBase$onListSelectionChangedNew(event) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">._oldListSelectionChanged(event);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> list = event.source;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> selection = list.getSelection();<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// We are just pre-loading single selections</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (selection.getCount() == 1) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item = $models.getItem(selection.getItem(0));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> updateControlsDelegate = </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.getDelegate(</span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.updateControls);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> onListSelectionChanged$itemLoaded(event) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> $evt.removeEventHandler(item, </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"load"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, onListSelectionChanged$itemLoaded);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> <b>updateControlsDelegate(); </b></span><span style="background: white; color: green; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">// This call will trigger _isAvailable and _isEnabled for all the commands in the current view</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> };<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> $evt.addEventHandler(item, </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"load"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, onListSelectionChanged$itemLoaded);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (!item.isLoaded()) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item.load($const.OpenMode.VIEW);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">else</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> onListSelectionChanged$itemLoaded({ source: item });<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">}</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
In this method I am saving the original onListSelectionChanged method in a variable called _oldListSelectionChanged. This will ensure that I can call the original one and then execute extra logic. My overridden version of this method will call the original one and also will access to the current list selection and pre-load the item that has been selected. Additionally I am executing the <b>updateControls </b>method, this method will call the _isAvailable and _isEnabled methods of all the commands available in the current view including our custom ones <span style="font-family: Wingdings;">J</span><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="mso-list: l2 level1 lfo2; text-indent: -.25in;">
<b><span style="mso-list: Ignore;"> 3.<span style="font: 7.0pt "Times New Roman";"> </span></span></b><b>Implement _isAvailable and _isEnabled<o:p></o:p></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
The final part will be to implement _isAvailable and _isEnabled, for this sample I have implemented a very basic custom button in the Dashboard Toolbar but that will check if the item has been fully loaded in order to return <b>true<o:p></o:p></b></div>
<div class="MsoNormal" style="margin-left: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">Type.registerNamespace(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"ListExtension"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension.CustomButton = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> ListExtension$CustomButton(name) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> Type.enableInterface(</span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"ListExtension.CustomButton"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">.addInterface(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Tridion.Core.Command"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">, [name || </span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"CustomButton"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">]);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension.CustomButton.prototype._isAvailable = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CustomButton$_isAvailable(selection, pipeline) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (pipeline) pipeline.stop = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (selection.getCount() == 1) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">var</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> item = $models.getItem(selection.getItem(0));<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">if</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> (item.isLoaded()) {<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> console.debug(</span></b><b><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"Item is fully loaded."</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span></b><b><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">true</span></b><b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<b><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">false</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">;<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension.CustomButton.prototype._isEnabled = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CustomButton$_isEnabled(selection, pipeline) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">return</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">this</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">._isAvailable(selection, pipeline);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">ListExtension.CustomButton.prototype._execute = </span><span style="background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">function</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> CustomButton$_execute(selection, pipeline) {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;"> console.debug(</span><span style="background: white; color: #a31515; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">"You have clicked in a custom buttom"</span><span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">);<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: .5in; text-autospace: none;">
<span style="background: white; color: black; font-family: Consolas; font-size: 9.5pt; mso-highlight: white;">};<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In the code above I am returning <b>true </b> just in case my item is fully loaded which will always be the case if I have selected it from the <b>Tridion Items List</b><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yNyIkyC4Mmynj9XIuwEdtVsHK3DEJbiIx6Pi4pqMq8CDz90e1pKZiacNmjiv-IM-pUxgrhVH62zGqDzOJFqaZchbl3edCbihQUgFuhyphenhyphenq-oSErmAC3y9aRBLKBAfeNR0LJmSkV5WH7_EV/s1600/image005-709934.png"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2yNyIkyC4Mmynj9XIuwEdtVsHK3DEJbiIx6Pi4pqMq8CDz90e1pKZiacNmjiv-IM-pUxgrhVH62zGqDzOJFqaZchbl3edCbihQUgFuhyphenhyphenq-oSErmAC3y9aRBLKBAfeNR0LJmSkV5WH7_EV/s320/image005-709934.png" id="BLOGGER_PHOTO_ID_5933240521562687042" /></a><o:p></o:p></div>
</div>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com0tag:blogger.com,1999:blog-1400873539908712350.post-1634704525432873832013-10-04T11:01:00.001-07:002013-10-04T11:01:44.463-07:00Improving Tridion .Net Controls - Component PresentationIn several .Net implementations I've noticed certain deficiencies related to the Component Presentation .Net Web Control. Basically this controls allow us to retrieve content from either the Tridion Broker database or file system. Additionally it will execute any server side code in the form of ASP .NET inline code / code blocks or REL tags. In the next sections in this post we will explore some of the deficiencies.<br />
<br />
<h3>
.NET server side code must be located in the File System.</h3>
A restriction is that if the developer wants to publish component presentations that includes .NET server side code to the database the standard Component Presentation web control won't execute this code. This is issue is related to the design behind the Component Presentation Assembler class, this class is intended to be technology agnostic so that it could be reason why it is not specialized to execute neither .NET or JAVA code from the database.<br />
<br />
In a previous post I have written about how to solve this issue using a <a href="http://erichuiza.blogspot.com/2013/07/executing-net-component-presentations.html" target="_blank">Virtual Path provider</a>. This approach will instruct ASP .NET to consider Component Presentations stored in a database as ASCX files.<br />
<br />
<br />
<h3>
Child Controls are not initialized properly.</h3>
The standard Component Presentation Web Control renders its content by overriding the Render method in the following way.<br />
<br />
protected override void Render(HtmlTextWriter writer)<br />{<br /> if(HttpContext.Current != null && HttpContext.Current.Application != null) <br /> {<br /> ComponentPresentationAssembler assembler = new ComponentPresentationAssembler(pageUri, this.Page); <br /> writer.Write(assembler.GetContent(componentUri, templateUri));<br /><br /> this.RenderChildren(writer);<br /> }<br />}<br />
<br />
This approach will work fine for common things like having <tridion:ComponentLink> or <tridion:ComponentPresentation> as child controls. However let's consider an scenario where we need more complex controls initialization (<b>let's consider having fully functional ASP .NET Form in the form of a component presentation</b>) like <asp:RegulerExpressionValidator> or <asp:RequiredFieldValidator> in those case the standard Component Presentation Web Control won't be able to initialize them. <br />
<br />
The main problem resides on the fact that Render is called too late in the ASP .Net page life cycle, it will lead to child controls not to be initialized.<br />
<br />
I order to solve it, I create a new version of the Component Presentation, this version will use the CreateChildControls method instead of Render.<br />
<br />
The following code sample is a refactored and improved version of code I presented before in the <a href="http://erichuiza.blogspot.com/2013/07/executing-net-component-presentations.html" target="_blank">Virtual Path provider</a> post.<br />
<br />
protected override void CreateChildControls() {<br /> if (HttpContext.Current != null && HttpContext.Current.Application != null) {<br /> ComponentPresentationMeta meta = new ComponentPresentationMetaFactory(ComponentUri).GetMeta(ComponentUri, TemplateUri);<br /> if (meta != null) {<br /> string contentType = meta.ContentType;<br /> if (contentType.StartsWith("ASCX")) {<br /> using (ComponentPresentationFactory factory = new ComponentPresentationFactory(ComponentUri)) {<br /> Tridion.ContentDelivery.DynamicContent.ComponentPresentation componentPresentation =<br /> factory.GetComponentPresentation(ComponentUri, TemplateUri);<br /><br /> TcmUri componentId = new TcmUri(ComponentUri);<br /> TcmUri templateId = new TcmUri(TemplateUri);<br /><br /> ComponentMetaFactory metaFactory = new ComponentMetaFactory(componentId.PublicationId);<br /> IComponentMeta componentMeta = metaFactory.GetMeta(componentId.ItemId);<br /><br /> string virtualPath = string.Format("dcp_{0}_{1}.ascx", componentId.ItemId, templateId.ItemId);<br /> CacheInvalidation(virtualPath, componentMeta);<br /><br /> Control control = Page.LoadControl(virtualPath);<br /> this.Controls.Add(control);<br /> }<br /> }<br /> else {<br /> Tridion.ContentDelivery.Web.UI.ComponentPresentation componentPresentation = new Tridion.ContentDelivery.Web.UI.ComponentPresentation();<br /> componentPresentation.Page = this.Page;<br /> componentPresentation.PageUri = PageUri;<br /> componentPresentation.ComponentUri = ComponentUri;<br /> componentPresentation.TemplateUri = TemplateUri;<br /> this.Controls.Add(componentPresentation);<br /> }<br /> }<br /> }<br />}<br />
<br />
The source code above will execute server side code from the database and it will also initialize child controls properly. This code can be improved to recognize if there is a Virtual Path provided present if not, it can retrieve the component presentation from the file system as before.<br />
<br />
<h3>
Child Controls events are not properly attached and initialized.</h3>
This is another issue related to complex scenarios where we have complex child controls like the ones present in an ASP .NET web form. Basically even if we use CreateChildControls instead of Render event handlers are still not attached properly. In order to solve it our Component Presentation Web Control should inherit from CompositeControls instead from Web Control.<br />
<br />
Here a sample of how the class declaration should look like.<br />
<br />
[DefaultProperty("ComponentUri"), <br />ToolboxData("<{0}:ComponentPresentation runat=server></{0}:ComponentPresentation>"), <br />ParseChildrenAttribute(ChildrenAsProperties = false)]<br />public class ComponentPresentation : CompositeControl {<br />
... <br />
}<br />
<br />
Here how the whole class should look like.<br />
<br />
[DefaultProperty("ComponentUri"), <br />ToolboxData("<{0}:ComponentPresentation runat=server></{0}:ComponentPresentation>"), <br />ParseChildrenAttribute(ChildrenAsProperties = false)]<br />public class ComponentPresentation : CompositeControl {<br /><br /> [Bindable(true), Category("Appearance"), DefaultValue("")]<br /> public string ComponentUri { get; set; }<br /> [Bindable(true), Category("Appearance"), DefaultValue("")]<br /> public string TemplateUri { get; set; }<br /> [Bindable(true), Category("Appearance"), DefaultValue("")]<br /> public string PageUri { get; set; }<br /><br /> protected override void CreateChildControls() {<br /> if (HttpContext.Current != null && HttpContext.Current.Application != null) {<br /> ComponentPresentationMeta meta = new ComponentPresentationMetaFactory(ComponentUri).GetMeta(ComponentUri, TemplateUri);<br /> if (meta != null) {<br /> string contentType = meta.ContentType;<br /> if (contentType.StartsWith("ASCX")) {<br /> using (ComponentPresentationFactory factory = new ComponentPresentationFactory(ComponentUri)) {<br /> Tridion.ContentDelivery.DynamicContent.ComponentPresentation componentPresentation =<br /> factory.GetComponentPresentation(ComponentUri, TemplateUri);<br /><br /> TcmUri componentId = new TcmUri(ComponentUri);<br /> TcmUri templateId = new TcmUri(TemplateUri);<br /><br /> ComponentMetaFactory metaFactory = new ComponentMetaFactory(componentId.PublicationId);<br /> IComponentMeta componentMeta = metaFactory.GetMeta(componentId.ItemId);<br /><br /> string virtualPath = string.Format("dcp_{0}_{1}.ascx", componentId.ItemId, templateId.ItemId);<br /> CacheInvalidation(virtualPath, componentMeta);<br /><br /> Control control = Page.LoadControl(virtualPath);<br /> this.Controls.Add(control);<br /> }<br /> }<br /> else {<br /> Tridion.ContentDelivery.Web.UI.ComponentPresentation componentPresentation = new Tridion.ContentDelivery.Web.UI.ComponentPresentation();<br /> componentPresentation.Page = this.Page;<br /> componentPresentation.PageUri = PageUri;<br /> componentPresentation.ComponentUri = ComponentUri;<br /> componentPresentation.TemplateUri = TemplateUri;<br /> this.Controls.Add(componentPresentation);<br /> componentPresentation.Dispose();<br /> }<br /> }<br /> }<br /><br /> }<br /><br /> private void CacheInvalidation(string virtualPath, IComponentMeta componentMeta) {<br /> if (HttpContext.Current.Cache[virtualPath] == null) {<br /> HttpContext.Current.Cache[virtualPath] = componentMeta.LastPublicationDate;<br /> }<br /> else {<br /> DateTime lastPublishedDate = (DateTime)HttpContext.Current.Cache[virtualPath];<br /> if (lastPublishedDate < componentMeta.LastPublicationDate) {<br /> HttpContext.Current.Cache.Remove(virtualPath);<br /> HttpContext.Current.Cache[virtualPath] = componentMeta.LastPublicationDate;<br /> }<br /> }<br /> }<br />}Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com8tag:blogger.com,1999:blog-1400873539908712350.post-42357441618872882752013-09-26T23:55:00.000-07:002013-09-26T23:55:00.850-07:00Working with Tridion and ASP .Net 4 MobileIn this post I would like to introduce some concepts about how to use the new mobile capabilities of ASP .Net 4 and Tridion. ASP .Net 4 brings a nice feature called display modes where we can define specific views for display modes without changing the controllers. Additionally Tridion brings a new feature called Context Engine Cartridge (CEC) this new feature uses Ambient Data Framework to put context specific information in the form of claims.<br />
<br />
<h3>
ASP .Net 4 Display Modes</h3>
ASP .Net 4 comes with two display modes by default (default and mobile), they are determined by the <b>Razor View Engine </b>which is responsible to determine if the request is coming from a mobile device or not. This feature is very simple and powerful, let's put some examples.<br />
<br />
Imagine you want to define two different versions of a razor view, one for regular browsers and one for mobile browsers, if that is the case you will need to follow this rules.<br />
<br />
<b>Default View Name:</b> Index.cshtml<br />
<b>Mobile View Name:</b> Index.mobile.cshtml<br />
<br />
It means that we just need to add the "mobile" word after the regular view name. The <b>Razor View Engine</b> will use the home.mobile.cshtml view if the requests comes from a mobile device. If we want to integrate this feature with Tridion we just need to create two pages using the same page template (cshtml extension) but using different content, metadata and logic which should be specific for mobile or regular pages.<br />
<br />
<br />
<br />
<br />
<br />
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM4AAAA3CAIAAADL4OJCAAAEOUlEQVR4nO2aP27bMBTGcxHpEM4NPGnPEs85QHiDAEHhMQU0uWsyBIGnAFqaQYBHbxmioe2Q3CAtAhENCpodKFGk/lmSZUq0vw/f4FBPJBH+wEdJ7+T0G4dhAz4ZfAbCtEKDTwzuy6NATVA1n8+nuoDaIXkY1Iq713w+v77+8vv9jzRQOzAPhlpuA5OciT+rUJss2Iqx2+WmpgUep/tB7eyhXbxATd3DigZqB+YeULt45B+f7W4BakfoXVG7eOR//3HOm8bLw9k+UJss2RtjnHPO+SrcZFfDpH0VbmbPScDbM0t6SO9ijF0tgOy+vBNqkrNWqE23aStqXBdj7Ha5EZcSwpbsTWlk72y22ExCJgmbhEyApZEaMskf3Lu7o6Zy1gq1y8vLetSevj912NUEXnJbunplq1Anqey3uhFyztkrUNuXO6KW46wVavf39/Wo3dx8NYwa8qYBd0Ht7IF/fOaSWNN7KaUvLy/1qJ2fn3dBrZBA8/mxFLUFWzHkTRMe4L0apXQ2m9XT9vPHr7aoneoH/Bq8qu5CAt2rh0Gt+A0qp7u7u1LUYHs9DGphGNajJgTUDsnDoNZcg/+D4L48isoO+BgM1GBDPmmVziCos4AaZEhADTIkoAYZ0lGgFscBcUgQx80iPT/aHtly9J363MeszMsa1NT3ulSvRCoNUDVC1FoNBNSMSmVoOp2u12vxe71e5y4V7wVqY5B9qEnO5Dam0laPWrJmPnFd13Vdz4+SgMj3HMd1Xc/35aLKRschQRz5niPi03WPlf4j33NEnySIC38GxPH8QA4RxXFAnCTAIUEuQAymzhCoGVUOpqlerNsGNcchARXEKI0kiCmlke85giNldeOApHyQoLBBxgqFSUtAxBDK6EqvKvSifz0gI6ws2F4dIWrqAnt+FMeR76W7lNaYbjxi76GUCg4ElFnnke/l4EuBVUYvDFrW2CTYXtmKmkiaMnvKo1uvqOWPdw1RExJJMEugQG3oCTSVZCj3HFAVpmoLapUJVE+LegJVbs8nUKmUYaBGqV2oyXcZcktr+7KjclED+aBQ8ljguq5DfMlTQlbhsJU9B6S9VRzLkt8BcbTHAqAGQb0IqEGGBNQgQwJqkCEBNciQgBpkSEANMiSgBhkSUIMM6ShQG7ZerflA6Seufj4PjK361xrU7K3C7TDQ/lAbsCTTJtTU3xZV4XYYCKgNqdFW4W6toaX6l3tRQlIszaUV39f1aeS4san610rU6LiqcJvU0Cb966ex9K7CEa2cuYDoRU2WVf8eIWp9V+FuLQHSayfTqWirmGusn0Yyrm3Vv7aiNqIq3J1RyyLKUSs/ZVpX/WsfauOrwm2yYGoCzbJqkrC0xmICLU7Dyupfm1AbZxVuo8XLjvbaVUK8kmeFiseCipJda6p/rUENsl1ADTIkoAYZElCDDAmoQYYE1CBD+g8L/zLNwqhrdQAAAABJRU5ErkJggg==" /><br />
<br />
I have this simple code in my Controller as you can see, the same code will work for both of them.<br />
<br />
public class HomeController : Controller {<br /> public ActionResult Index() { <br /> return View();<br /> }<br />}<br />
<br />
Here the result in a regular desktop browser.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
Here the result in a mobile browser.<br />
<br />
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPgAAACECAIAAAAyU3HmAAAgAElEQVR4nO2deTxV6R/HT0irNCqZTKmpkWayNowhFZqGNolpEDP9WkxpkSwZY2m5bqWFVEikiLJESiJCi3I5ptKdEgq5lgrJFi6e3x9PjnOXcy2pyPN5fV+9zvme73nO83yf93nO85x7dTFFpTnIkH3xhikqzbHMeoUM2ZdtCHRkg8IQ6MgGhSHQkQ0KQ6AjGxSGQEc2KKy7oG9llIcn47lXEquioxsiI15fCH8QcenstYzNjPLP3gZkyLq0boF+6FZuZUQkOya65VJs+6XY1pCQtuCQZh/fWs8jT48cdk/497M3AxkywdY16Ptu5r4JCmCfP98Wcu6ZhVmIwg9Hvv0meLZcvuHyNkfHhh02j7Zvc43L+uwtQYZMgHUBulVm+VNfv3cnjrcdPVpnvTVOWX7zfn/LrFdWHoGXFGa9WWXcYGFRamZyZYPlXwLnMMa2IkLCnaYR9mnbGUYTEhYRWnTBnOeQubehkLDIdG+m4BLMvQ2FhGnGfA6laRAlJ1yY3qdNg3XrML5X7/cGM9/NVvR1AknG7AL0Y5dul7o5tzk7t9nbly5f7DV50l/JTy2zXv11I8/rG6miX7QrDZZWLNa7sVDbNSCGopA0DWERIWFD/QSO/uuSrY+Q7s46cNbtQ0D/WP1kbMtRYWNb3sr3d4OjGykhaRp8uuBjJZBkaRrCIl2AHnvI+5XVpuYN6xvX/Fm8UJsmOc4y8+X6uyzTmMyN4mPC5yhFKiskqijeUFU+vNaqOx0GzdzbkB92H82IccU2ja+//4GepsFb2wFlvenijwR6GE2oS9CvbdxYabLqjfHKKkMD1i8LXMeOMb/2aMXJmDN3c0pzc1saGqqfP7t7+OCRGd/uVlHtQYclXJje4Te2FRFadEG/c25Dzg5TfxGPH6bDlkY8Cjke8fzmJ5ZhNCFhQw1bLliZ+otEhGxpGhygk6/Y6Yeg65Mu1NEfsJA0Pv1Efmr3GFnSjIhft3HPBMJoQsKG+t40kp/UkM6rk1tHMyZOTCAXDndhuy7wK4SjDhq2NMpHpYBWQwD49mwYqQTObHMOmvASNK4L8RmSugN67BJ9lt6vJQt1CrXnlS3ScRQbaXgy5kFxWUtLC5vNJv59dufOJhmZdeksvr3C7x5l6i9635Hvp+/v6wp7Ala0M6ajkTTjzhwRjWHqL+LIFJ/hGfZfGOfR92lNI4HOiRep8u/vJY7KkIHgAZ3ccKpaCbYwGgfKHWZsy4kCvDQ5uIMheEVY805Q3jeBqb+oG6AT1SY3J4zW6X9/LR7Quxqbzb0NOxJC6mWuBHbg29n1pCYTTtJRzu7gTFoXoJ/T+Omxxk85air/qii81v9l66hhp25m19fX19fXex09Bg3uhu3ZbRKT2VvQSd1JtJarDwi/IG74t5MoitTTxHYn6LxPWyKe5xBxFl/QuatBvm4PjBj2KM7tLJYzz5wp5VdVnszwB73zugRhXH6KKQpXv5OfADwwdI7BVLcHuZKkMYtiTOE/X+oC9OMac1O+l02Tm5E8feorvYVbR418XMSqqqqqqqryOnrs9evXXkePVVdXV1VV5ebkGARe7SXoHB35vmM43zmQ0sQnHRzzDQGgk+pDdH8n6Lw4En3A80AkoOELOsdjl2JOxX+OxMd4hnaOV1idoJNXrtyMkgdmCrL5gc4157FN4yiNbwkC+p2z4/i8UxIw9+u8REfe+NTtlbm3IdWg0AXoewxNQyZPipGWipg4vuwXHTsxMVZ5RWlpaXl5udfRY8S/ZWVlZWVlS32juUsgzcV5/RR4kUHnt/7jSgfHJboY0YkAUuEfC/S+fK3U2UaOyRXniN4N0Mn3Cb8T+wx0vv3O9cTryCffEZ1jOs7bOv7zcqb+Isq0dwG6Dc1n/4RxZyTEA8aK5Wmqe4wffz83v6ioqLi42OvosZKSEq+jx4qLiwsLCx88+m95QBxvCV2+deGeuhCDAdXTgM/AwPGYFgg67xuYXk1dOm9U6qlLL+YqlNbRLo4uJ12lJ6BzVJUzyaRmUoHOPZRQvV3h0++ck08+Ey2KkYLjEqRlN9dgp+FNOW/pGvS/7rLsZWftHzP6uNioqzOmXpaTDTp7IS8vLy8vj5ijw13f6+l85uhEJ1G/R+e8QckjFjyxA+KEC9P5fi7Du2QUDDp3fXqxGOVZMfMsRnnb2MO3ZmkapJu/c0FJXp+QPwXrFugdC1COePLQQM4MFegcq1vKxSi/fuee2pGSxgM6eaQgl0O1VOiYz1C9p7JN6/orABsD47ZIjHUTG+khNipR/nvf72fily8zmcycDjGZzOu37xmejFmXXkJVCOcno7yjJk2DmLDyTGO41zHcc3TSZBeW0wXoXDM5rgGP3xU7nhsana3gt8wXMAft8ejOPcvnHP/e10GjZ1MXjlUB/5Vi57tCStA56wAHV8pxlOsTcaIEUnJIr315Xltx1opjwsM1O+K4/fj0fldvXaCtPxnz56SvN44a7ig2wnbMqHUSY/1srNPi4//Nzk5NTDwaFm14Msb82qOedCQX6H34lEf2Sa1bH6X1g2p092u6G24W/rljt6na3N+kJi4dNlTnKwkt2dkLjNYs87loEs1Ye+dFr6uIQB/A1ruPCPreuv4g+fP/4QUCfWAZ12vfz025wNk5yT4/6MiQfQJDoCMbFIZARzYoDIGObFAYAh3ZoDAEOrJBYfxBt7nx1DkmAxmyL8YoR/T5SEhfkChBn4eE9AWJEnQtJKQvSJSgayIhfUGiBF0DCekLEiXoPyN96TI1Nf3777/19fW5/Fu3bjU3NxcQMBBFCfpPSANH27Ztw3Ecx/FVq1ZBz6pVq6Bn586dVGft3bsXx3ELCwuyU0dHJzMzMzw8nCqAr1JSUlJSUuD2ihUrcBz39/c3MTHBOXXt2jUYjON4SEgIcXpQUBCO48nJybyl9ZUoQVdDGjjaunUrjuMMBsPd3R16XF1dMzMzcRx3cHCgOmvPnj04jpubm3P5lyxZoqurKyCAVxBNuG1gYIDj+MmTJ/X09Nzd3Q8ePIjjeGJioru7u5OTEwzOzMxMT0/X0NBQU1ObN29eRkYGg8FITk7mLa2vRAm6KtLA0ZYtW3AcDw8Pj4yMhJ7Y2NioqCgcx+3t7VVVVdXV1Wk0Wmpqanp6uo+Pz4IFC1RVVXfv3o3j+K5du27cuHH9+nULCwtVVVUtLS0cx8+fP08ErF69WlVVdeXKlREREffu3YuPj//rr7+4KgDRhNvLly+HoMNdXV1dHMfPnTtHDo6NjcVxfM2aNaqqqmvXrr13715ERERycjJvaX0lStDnIA0cbd68GcdxOp3OYDC0tLR+/fVXHMddXV1xHLezs5szZ46joyOO40FBQYcOHcrKygoMDJwzZ86uXbtwHI+Njd2zZ8+9e/eSkpJ+/PFHTU1NCDoRYGZmpqmpmZaWdu3atfXr1585c4bBYOjp6ZErkJKScufOHQcHBwcHB3d3dxzH/fz84CEdHR0IOjn47NmziYmJR44cmTNnjqenZ2ho6IULF5KTk4mAlJSUvk0RJegqSANHVlZWOI6vW7cuKytr8+bN1tbWqamp5ubmEHQVFZWoqKjMzEx1dXUVFZXo6OiMjAw1NTXI8fr161VUVE6dOoXjuL6+voaGBgRdRUUFBpiamsKizp07Z29vf+TIERzHbWxsyBW4ceNGVlZWRkYGnIRA0OEhbW1tOCMnB4eEhOzfvz8uLu7HH39MTU11dHSMjIxMSkoiAlJSUvo2RZSgKyMNHG3atAnHcWNj4+joaF9f3zNnzpw4cWL16tU4jtva2iorK8fHx6enp8Pg4OBgHMc1NTXd3NzgzERZWdnLywvHcQMDg59//hnH8bCwMGVlZRhgYmKyfv16HMfj4uICO/S///2PXAGIJtxesmQJjuO+vr5wd/78+RB0cnBISIiFhQWO45aWlllZWbq6uhB03tL6SpSgKyINHEHQjYyMnJ2d09LSGAzGhg0bzMzMcBzfsWOHoqKin58f5FhdXT01NfXGjRuKioqQY1dX1zlz5sTGxmZmZmpoaKirq0PQiYDff/992bJlOI4HBAQoKSkpKipqaGjADUIQTbi9ePFiCDrcnTdvHgSdHBwSEqKurs5gMJKSkmJjYxUVFSHovKX1lShBV0AaONq4cSOO4ytXrjQyMsJx/N69e6qqqqamphB0BQWFJUuW3L59m8FgpKenZ2Vl2djYKCgowEn83bt309PTIccKCgo//fQTBJ0IWLVqlYKCwrFjx3AcT0hIiImJYTAYKioq5ApANOG2vr4+BB3uwtVtcHAwORjuwmcLnU5XUFCIiIhISkoiArKysu50SFlZ+cNTRAm6PNLA0bJly+h0ura2tpKSEp1Ot7Ozk5eX/+WXX+h0upGREYyZN2+eo6Ojm5vbihUroMfMzMzNzU1bW9vFxcXW1lZFRUVeXl5ZWZlOp9vY2MAAOp2uq6sL41evXr179243N7fVq1dzVcDV1dXV1RVuz507l06nb9y4Ee6qqqrS6XRra2tyMNw1MTGh0+m//vqrvLy8ra2ti4sLEUAnSUFB4cNTRAn6D0hIX5AoQf8eCekLEiXockhIX5AoQZ+JhPQFiRJ0WSSkL0iUoM9AQvqCRAn6dCSkL0iUoH+LhPQFiRL0qTyaNWvW0qVLzZCQ+p9MTEw0NTW//fZbXm6hKEGX4ZScnJyzs3NMTExSUlIyElI/U0JCQkhIiIGBwdSpU2X4iRL0KZwyNja+d+9eZWVlY2PjOySk/qTGxsb6+vqioqLQ0FBZWdkp/EQJ+jec2rFjR2VlZXt7O0BC6pdis9mPHz+eNWvWN/xECbo0pxwdHRsbGz93W5AGqZqamqIvXWpqahIQ097e/uLFCzk5OWl+ogR9Eqf+/vvvd+/efbKGISGR9YjJDAkNxbOzBYexWCw5OblJ/EQJuhSnEOhIn0ttbW0RkZEXY2IiIiPb2toERLJYrJkzZ0rxEyXoEznFBTr8E/E+aUZiYqKYmFifF8tX9+/f9/X1DQwMLCwsJPubmpr8/f0fPnzIFV9RUeHt7X3mzBlPHr1584a3/Hnz5u3bt4/Xv3z58i1btgAAUlJSJk6cyGaze1H55ORkT09PJpNJdtbU1Hh6ep45c0bwuVSJJSpM7oX+psKiotDz56Oio0PPn8/LyxMQyWKxZGVlJ/ITJeiSnBpAoNvY2PBdTvj6+oqJif3xxx+GhoYjR468efMm9JeWlmpqag4dOtTX15frlIMHD86fP3/Hjh0mJiYmJiYYhmlpacHt8vJyvpe4ffs2r58AvaioyMXFpXftsrS0HDp0qIWFBdl57tw5ERGRmTNnCj6XKrFEhfsz6Ffi4sIjI6OioyOioi5dviwgEoIuyU+UoE/g1EABvbS0VEhIqK6ujvfQ5MmTvb294faGDRuMjIwAANXV1VJSUs7Ozmpqalygt7W1fffddwEBAcQuhmGXLl3qRa0I0D9ElpaWc+fOHTduXEtLC+HU09PT09PrDuh79uwRENA/QWez2fcfPDgbEnIhIgJa8LlzWThO9UhksVjffffdBH7qA9CTk5NVVFRERUXl5OQiIyOJmMTExDlz5oiKik6ePDkmJgYAEBoaKi8vLyIiMnHiRBqNRoSRQbe2tl6yZMmwYcOmTZsGzwIA1NbWbtmyRUJCYvTo0RYWFpWVldB/5MgRaWlpERGRWbNmxcbG5ufny8jIYBg2duzYadOmAQCUlZXXrVsHgxUUFOh0Otw2NTUl/I8ePQIAyMvLc4GekZEhJibW0NAAd3lBT0xM/Omnn65fv/71119rampypSUoKOibb74ZPXr0+vXrCdDJjaVqlKqqqq+vL28SLC0traysJCUliTpUVFSMHj36+PHjBOgCyty0adOCBQuGDRumoKBw584drn4kV6yuru6vv/4SExObMGHC3r17P+U75fyCAu/jx0+eOgXNPyDgTHBw2IULBOjnw8PPBAf7BwQQMcdOnGD+9x88/SOC/uTJk+HDh4eGhjY2Nl6/fn306NGpqakAACaTOXTo0MOHD5eUlNy6daukpAQAkJaWduvWrcbGxitXrmAY9u+//wIe0CUkJJKTk2tra3fu3Dl27Fh47/75559aWlolJSWvX782NTVdsGABvISIiAiDwWhsbExKSsrNzQUA3L9/H8MwYkTX09Ozs7OD2wkJCeLi4p6entu3b58xYwaLxSKnePbs2Vygb9261dTUlNjlC7qEhMTChQvv378PSyPSwmAwhIWFIyMjGxoajh8/jmEYL+h8GwULGTduHG8SLC0tN27caGdn99tvv8FIf39/Q0PDkydPEqALKPOrr766c+dOfX29i4vL+PHj6+vrAQXoa9eu1dHRefnyZU5OjoSEBO+M7uOptbX10uXLQWfPngsL644FnT0bdfFia2srPP0jgv7PP/9oa2sT/k2bNhkaGgIAnJyctLS0BDRJUlIyNDQU8IC+Zs0auF1QUIBhWFFRUXV19ZAhQ4hBqLi4GMOw3Nzc3NxcISGhq1evkovlAp2smpqa5cuXT5w4UURExMfHh+soF+gNDQ1jxoxJTk4mPHxBxzDs2bNnvGmxt7cnIAMAyMrKcoFO1SiqJAAALC0tLS0t7927JyYmBvtCU1MzMjKSAF1wmcQTrLm5ecSIEREREYAf6DU1NUJCQnfv3oXBmzdv1tHR4U3mx1NLS0tkVFRgUFDwuXOCLejs2ZDQUPLL9Y8IurGxMdErAAAvLy8lJSUAwG+//fbnn39ytQFOXWRkZGRlZYWFhYODgwEP6K6urkSlMQzLz89/+PAhhmGvX7+G/vb2diEhoejoaABAUFCQlJSUmpralStX4FEq0FtbW+fOnWtmZtbS0pKdnT1t2jSuRSEX6NHR0TIyMuSnNl/QR40aRS6ESIuRkRG5+YsXL+YCXUCj+CYBdIDe1tY2efLksLCwwsLCsWPHNjc3E6ALLpPcXllZ2QMHDgB+oMNCyFJUVASfVk1NTWEXLgScPn0mOJjKAk6fDjh9+u3bt+QTPyLoa9as+f333wn/vn37fv75ZwCAhYWFiYkJuRJMJhPDsMsdq+Zx48bxBZ2Y4xJ9nJeXR4xqMAsYhiUmJsLd5uZmX19fcXHxI0eOAGrQs7OzyYtUOMsiB3CBvnTpUnt7e3IAX9C5FnBE/c3NzcnTHl1dXS7QBTSKbxJAB+gAABcXl2XLlnl6eq5evRoAQIAuuEwHBweiPtLS0nBdzgv606dPMQwrLi4Gn1UNDQ2nAgNPBQZCoLnsVGCgj5/fy1evuM76iKAHBwdPnTq1ubkZANDW1jZ37tzt27cDAPz8/GRkZMinxMXFDR06FE6nnj9/jmFYN0FvbW2VlpY+fvw49CcnJ48YMaKmpoY83NrZ2S1btgx03E6vOlKQnZ0NKcnJycEwjHgnePHiRUlJSXKOyKCXlZUJCwvDEwn1CHRvb+8ZM2bAuXV9ff3YsWO5QKdqFFUSAAn0+/fvjxgxYtasWQkJCYAEuuAy58+fD/3wfsjOzgb8QG9tbZWSkjp06BDRqM/1BaeExEQ/f3//gABe8/P3v9zxDCfrI4Le3NyspaWlpqZGo9GWLFkybdo0uNKvr69XUlKaPXu2g4ODqalpYGBgaWnp6NGjjYyM6HT6zz//PHPmzG6CDgC4cuWKuLj49u3bnZycxo8fDx+7UVFRS5cupdPpTk5OY8aMOX36NACgsbFRQkLC0NAQvmAZM2bMwoULAQDt7e1Lly6dOnXqrl27tm3bJi4u7uXlRc4RGXRvb2/4XCKrR6BXVVXJyMhoa2vTaLR58+bNmjWLdzHKt1ECkkCA3t7eDj8WgR8TkhejAspUVFQ0MDDYs2fPd999BwcFQLEYvXLlyqhRoywsLBwdHQ0MDPbu3cuL1CfQlbi4E76+fv7+vObj5xfD7z1v34N++PBhOJwAANhsdkhIiL29vY+PD1zLQ7179+706dN2dnYHDx6sqKgAADx+/NjJyYlGo5WWlkZERGRlZQEAnjx5snPnTt5ia2pqrK2tibE5Pz9/9+7dzs7OGRkZ0FNbW+vv729nZ+fs7EwsngAATCbTyclp//79AICgoCCiwNbW1ujo6J07d7q5uWXzfGti//79xDLuxIkT8fHxXAHt7e3W1tY5OTmEh1xz3vpXVVV5eHg4OTk9ePDg+vXrUVFRvKfwNkpAEsLDw8PDw6E/NjYW3tgAgPT0dHd39y7LZLFYV65c2blzZ2BgIPGagrgWV8WeP3/u7u5ua2t78uTJ6upq8DnkHxBw3MeHygI6mk9W34OOhPRRxWazDxw8CJn2Pn78sKenx6FDhz09vY8fh06PQ4d4v/eCQEcaYCovL9934ICXt/dhT89jJ048zMmpra3Nyck5duLEYU9PL2/v/R4eZWVlXGch0JEGmJhM5n4Pj30HDsTHx5O/8tDS0nItIYG+f/++AwcyMzO5zkKgIw0wZTAYJ3x9X5SU8D1aWlrq5+9P/jgPqg9Ad3BwQH9hhNTP9eLFiw8FfeHChVyfQiEh9Su1t7fHxcVJS0t/EOhSUlJWVlZlZWXo76OR+qHYbPbNmzeVlJT4Ut4D0CdMmCApKTlt2rTvkJD6pajG8h6DjoQ0cIVARxoUQqAjDQoh0JEGhShB10RC+oJECXpgYOCpU6e2bNni4eHh7+8fEBAQiIQ0YEUJ+tOnT588eeLo6CgjI5Oamvr48ePc3Ny8vLxnSEgDUJSg19XVvX37lkajSUhIzJgxIzc3t6ampqGhobm5uRUJaaBJEOivX7/etWvXNmvrbdu3T58+/b///nv79u27d+969z+qISF9RlGCXlVVVVJS8s8//2yztm4FYNv27XJycvn5+W/evEGsIw04UYJeUVHx7Nkze3t7CHorABssLVVUVPLz82traxHrSANLlKCXlZU9fvzYxsaGAL2JzV5pZIRYRxqIogS9pKQkJydn69atBOhcrNfV1SHWkQaKBIF+//59KysrMuhk1gsKChDrSANFgkDPzs7euHEjF+gE63p6eiwWq66urqWlBbGO1M/VG9Ah6xqamoh1pIGiXoLeCkBNXR1kvbS0FLKO/vgIqd+q96ATrOvr61dUVNTX16NBHanfqjegP3z0KCQ0dPfevWbm5j/88AOGYX/88UdNTU1TU1Nrx/91hoTUr9QD0CvfvEnPyGgFwMfXd9iwYTo6Ohs2bPD09ExNTS0uLq6qqnr37h0CHal/qrugJ9248fXXX8+Wl4fEi4uLu7i4hIaGJiYm/vvvv8+fP6+srESzF6R+K0GgP3jwwMrKau26ddusrUeOHKmnpycuLh4XH98KgNM//6iqql64cCE5OfnBgwfFxcXV1dVoREfqt6IEncViPXr0aNu2bRiGzZ49283Nbffu3YsXL16grd0KAKu8fPjw4UFBQbdv387NzS0rK3v79i2aoyP1W1GCXl5e/vTp0927d2/ZsiUsLMzPz8/T09Pd3X3YsGFZ2dmtAKz6/XcjIyMcxwsKCl6/ft3Q0IDmLUj9VpSgV1ZWFhYWPnz48NatW/Hx8ZGRkcHBwadOnVq+fLmOjs6SpUvFxMTWrVvHZDJZLNabN2/QcI7Un0UJ+ps3b8rLywsKCnJycjIyMtLS0uLj4y9evHjy5Mlvvvlm7dq1sbGxGRkZ+fn5L1++RMtQpH4uStAbGxsh60VFRfn5+UwmE8fxmzdvJiUlJSYmJiUl3blzJycnB/4OKBrOkfq5KEFvaWlpbGx8+/ZtVVXVy5cvWSxWQUEBk8nMzs7OzMzEcfzhw4fPnj0rLy+vra2Fv0r3kZSSkuLp6enp6Xns2LEugx88eODj4xMVFUW+8XpUAtIXKUrQ2Ww2m81uamp69+5dfX19TU3N69evWSxWYWFhXl6eh4eHs7Pzrl273N3dDxw4wPsjGwCA0tJST5LCwsJ6V8XNmzfDX3YdOXKk4EgWiyUiIgKDyb+l1v0Suq/g4GDYrpCQEK5DT58+JVoNf7Czra3NsxuCaXz27BnZGRMTw7cCFy9eJIc9f/6cOEQuIS8vr6+aPKBFCTo8DP+CGhIPca+srHz58qWcnBz5x4WJ37Yk69ixY+QYVVXV3lWx+5hmZGQQlzM3N+9FCd3X7NmzYZkKCgpch8LDw4lqJCUlAQDYbDbWDcHf1rt8+TLZOXnyZN6rNzc3jxkzhhwWFxdHHCWXEBkZ2VdNHtDqAnRCBO6NjY319fXff/89OcsGBga8Revo6Hxi0N+9ezdv3jwMwyQlJVNTU3tRQvf1yUDHMOy///7jusStW7e4YhDogtVd0KEg7mw2G36Xi5CEhATXYrS6ulpISOgTgw5F/m2n3pXQHfUI9La2tnUkycjIwKPDhw8n+wsKCgA/0Mk/Iwrl7OyMQO+RegY6IaKbiTlMeno6OSAmJgb6ZWVlBYCem5t74MABMzOzFStWWFtbX7t2jffHIwlMxcXFAQAMBmPTpk0GBgZOTk7Pnj0jR9bW1hJzU3J9BIOem5tLp9NNTExgHeLi4rrzBqlHoHNpxYoV8Oj48eN5jxKYEveDjo4OVwxM+6RJk4g1CQJdsD4U9PXr18MNrt9QXrduHYZhQ4YM2bFjB1/QW1tbnZ2dhwwZwjUyqaurl5eXkyMJTKWlpS9evEg+ZdSoUcTPPQMASkpKiEPOzs68JXCB3tra6uLiwluHH3/8sbS0tJsZ+Higq6urz5gxA1a7qamJCCgoKIABq1evJi6EQBesDwX96NGjcENNTY04ymazx40bh2GYkpLSrl27+IK+f/9+jEIKCgrkfiUwlZCQEBMT4wqeMmUK8buQPQX90KFDRPyYMWOmTJlC7KqqqvI+W/hm4OOBPnv2bGKYuHr1KhHg7+8PnWfPnkWgd1MfCnpAQICysjKGYSIiIjU1NfAog8GAR+3s7BwcHHhBr6ioGDp0KPRLS0uHh4ffvn3bzMyM6J6DBw8SwQSmEOvLly/fvXt3wfDWTewAAASBSURBVIIFhDMoKAhG9gj0V69eDRs2DPoNDAzg3XLp0iVigBeMCJGBiRMnunHK2Ni4T0CfPn361atX4baVlRURsHjxYgzDhg8f/uLFCwR6N9UHI7qrqyvcJt6U02g06Ll79y78/iMX6H5+fkRPxMbGQmdra+u3334LnfLy8kQwGfSLFy9CZ3FxMeE0NjaGzh6BHhAQAJ1DhgxhsViEX09PD/rNzMy6kwHB+hDQJ02a9ObNG2FhYQzDvv/+e3i0trYWjhG6urqlpaUI9G7qQ0E/ePBgamoq3CZeXSspKWEYJikp2d7eTkBGBv2PP/6ATlFRUfJLEhsbG+gXEhKqr6+HTjLoxEMDAEDcFcTkoUegr127FjpHjx4dStLSpUuhX0NDozsZ+HigT5gwAQAAX5hiGAaXDcQYf+jQIXJ7EeiC9aGge3h4NDY2Dh8+HMOwKVOmABJtJiYmgAQZGXRdXV3olJaWJhfr5eVF9FB+fj50EiUMGzaMHDx//nzoh9cFPQR90aJFghklP1UEZGD8+PHWnIJTiw8HHR718PCAuz4+PuS2FBYWItC7rz4AHQCwZMkSuPvkyRNihRQaGgooQOdlFMrb25voIeJTEirQtbW1oX/SpEnQ0yPQiZHyA0H/eItReDQzMxPurlixoq2t7euvv8YwbNasWVztRaALVt+A7uPjA3f37dtnaGiIYZioqCj8SXW+oP/222/QKSYmRv7fYIjpPoZhr169rwN56tLY2EgEE5/Ozpw5E3p6BLqRkRF0Tp06tReJ+2Sgs9ls+Gn/uHHjsrOz4aGtW7cCBHpP1DegM5lMuKuhoTFixAgMw7S0tGAkX9APHz5M9MTDhw8Jv5aWFnRKSUkRTjLoN27cgE5ilYZh2K+//gqdPQJ937590DlkyJCioqKeJu6TgQ4AMDExgZ6VK1fCjZSUFIBA74n6BvT29nYpKSmMJBqNBiP5gp6bm0u8xVu0aNHbt2/b29sjIiKI09esWUMEk0GfO3dudXU1m822t7cnnHv27IGRPQL94cOHRLCOjg58/kBVVFQcPXq0oaGhOxn4BKCT35djGPbVV1/Bz267A/r58+ebODU4/0Smb0AHAGzYsIHcGbm5udDPF3RAeumBYZioqKiEhASxO2rUKPKXS8mgYxgmLCw8cuRIYnfEiBHEy8GefmBEvPzBMExcXHz58uUrVqyQl5eHNyEZfQEZ+ASgP3/+nJwBQ0ND3vZSgc4r8iv5waM+Az0yMpJI5fTp04lIKtBra2uJJSlZw4cPj4iIIEcSJcjKynI9N8gVAD0Hva6u7pdffqECov+ADgCA3wWACgwM5G0vAl2w+gz0iooKIpWWlpZEJBXoAAA2m+3t7a2mpiYmJiYqKjplyhRzc3PiUcBbQkhISFFRkaGhobi4+NChQ3/44YfTp0+TI3sKOgCgra3t3LlzCxcunDBhgrCwsKioqLS0tL6+fkhIiOD/M/UTg058F0BYWLiyspK3vQh0weol6EhIA0sIdKRBIQQ60qAQAh1pUAiBjjQohEBHGhT6Pyq7JN8MAxloAAAAAElFTkSuQmCC" /><br />
<br />
<h3>
Adding Custom Display Modes</h3>
Additionally to the default and mobile display modes, ASP .Net 4 allows us to define custom display modes for specific devices and browsers, in this example I will add an iPhone specialized view.<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
In order to define an specialized display mode so that the <b>Razor View Engine</b> will use the index.iphone.cshtml view when the request is coming from an iPhone we will insert a new <b>Display Mode</b> in the <b>Global.asax</b><br />
<br />
Here a code sample.<br />
<br />
protected void Application_Start() {<br /> AreaRegistration.RegisterAllAreas();<br /><br /> WebApiConfig.Register(GlobalConfiguration.Configuration);<br /> FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);<br /> RouteConfig.RegisterRoutes(RouteTable.Routes);<br /><br /> DefaultDisplayMode iPhoneDisplayMode = new DefaultDisplayMode("iPhone");<br /> iPhoneDisplayMode.ContextCondition = (HttpContextBase context) => {<br /> return context.GetOverriddenUserAgent().IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) != -1;<br /> };<br /><br /> DisplayModeProvider.Instance.Modes.Insert(0, iPhoneDisplayMode);<br />}<br />
<br />
In the code sample I am declaring a new display mode called "iPhone" this will directly map with the view name it will lead to a view called index.iphone.cshtml. Other important point in this code is the <b>ContextCondition</b> property which is a delegate that is executed for each view that is being requested by the <b>Razor View Engine</b>, this delegate should point to a boolean function. In the sample I am checking if the User Agent contains the word "iPhone". Additionally we should insert it as the first one. The rule is that the most specific display modes should be inserted first and the less specific last.<br />
<br />
<h3>
Context Engine Cartridge</h3>
There is a very nice feature that was recently added to the Tridion technology stack. This feature is similar to Wurfl or Device Atlas with the difference that is integrated with Tridion via <b>Ambient Data Framework</b> using a Cartridge that will make all the device context information available in the <b>Claim Store</b>.<br />
<br />
Context Engine Cartridge uses "Aspects" to divide information, CEC comes with 3 aspects out of the box "device", "browser" and "os".<br />
<br />
Claims are identified following this naming convention.<br />
<br />
<div class="codeblock">
<b>Uri claimUri = new Uri("taf:claim:context:<ASPECTNAME>:<PROPERTYNAME>");</b></div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
I have updated the custom Display Mode for iPhone devices code to use CEC.</div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
DefaultDisplayMode iPhoneDisplayMode = new DefaultDisplayMode("iPhone");<br />iPhoneDisplayMode.ContextCondition = (HttpContextBase context) => {<br /> ClaimStore claimStore = AmbientDataContext.CurrentClaimStore;<br /> Uri mobileUri = new Uri("taf:claim:context:device:mobile");<br /> Uri modelUri = new Uri("taf:claim:context:device:model");<br /><br /> bool isMobile = claimStore.Get<string>(mobileUri).AsBool();<br /> string model = claimStore.Get<string>(modelUri);<br /><br /> return isMobile && model.Equals("iPhone");<br />};<br /><br />DisplayModeProvider.Instance.Modes.Insert(0, iPhoneDisplayMode);</div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
In the code above I am accessing to the <b>ClaimStore</b> in the <b>ContextCondition</b> delegate and checking the mobile and model device properties.</div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
Here how the page is looking in an iPhone screen.</div>
<div class="codeblock">
<br /></div>
<div class="codeblock">
<br /><img alt="" src="data:image/png;base64,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" /></div>
<pre class="codeblock">
</pre>
Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-4731557986355749702013-08-08T23:24:00.002-07:002013-08-08T23:24:51.501-07:00Developing SDL Tridion 2013 WorkflowsIn a previous post I described what is new in SDL Tridion 2013 Workflows but using a Technical Preview point of view, this time I wanted to provide some information about development of SDL Tridion 2013 GA.<br />
<br />
<h3>
<span style="font-size: large;">Classes Design</span></h3>
<span style="font-size: small;">The GA version introduced a new way of Automatic Activities development, all of them inherits from ExternalActivity, this abstract class provides basic workflow properties and functionality as shown below.</span><br />
<br />
<span style="background-color: #cccccc;"><span style="font-size: small;">public class ExternalActivity : IExternalActivity {<br /> public ExternalActivity();<br /><br /> public ActivityInstanceData ActivityInstance { get; }<br /> public SessionAwareCoreServiceClient CoreServiceClient { get; }<br /> public ProcessInstanceData ProcessInstance { get; }<br /> public StreamDownloadClient StreamDownloadClient { get; }<br /> public StreamUploadClient StreamUploadClient { get; }<br /><br /> protected virtual void Execute();<br /> protected virtual object GetSessionContextData();<br /> protected virtual void Resume(string bookmark);<br />} </span></span><br />
<br />
This class will give us direct access to the current Activity Instance as well as to the current Process Instance, additionally it gives us access to the CoreServices via three endpoints, CoreServiceClient, StreamDownloadClient, StreamUploadClient.<br />
<br />
This class also provide virtual methods (must be overridden), the most important ones are Execute and Resume, Execute contains the code that will be executed when the activity is executed, Resume contains the code that will be executed when the activity is resumed.<br />
<br />
As you might noticed, we have replaced the modular way of implementing Workflow Automatic Activities (one activity executes a method in a class) for an object oriented programming approach. It is great since it allow us now to create our own classes <span class="short_text" id="result_box" lang="en"><span class="hps">hierarchy.</span></span><br />
<br />
<h3>
<span class="short_text" id="result_box" lang="en"><span class="hps"><span style="font-size: large;">Implementing a Classes Design</span></span></span></h3>
<span class="short_text" id="result_box" lang="en"><span class="hps"><span style="font-size: small;">For this post I have implemented a light classes design that will effectively show the power of the new Workflow.</span></span></span><br />
<span class="short_text" id="result_box" lang="en"><span class="hps"><span style="font-size: small;"> </span></span></span><img alt="" src="data:image/png;base64,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" /><br />
<br />
<span class="short_text" id="result_box" lang="en"><span class="hps"><span style="font-size: small;"> </span></span></span>This is a basic classes design but it can be extended and used for production ready solutions. This classes design is intended to reuse functionality by using abstract classes. Here some explanation.<br />
<br />
<h3>
<span style="font-size: large;">BaseActivity</span></h3>
This activity inherits from the External Activity base class and is used to extend the out of the b<span style="font-size: small;">ox </span>functionality adding common used attributes and functionality.<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
This class will make available information like the current Bundle, Activity Definition, Process Definition, Last Performer and so on.<br />
<br />
<h3>
<span style="font-size: large;">BaseActivity Implementation</span></h3>
<span style="font-size: large;"><span style="background-color: #cccccc;"><span style="font-size: small;">public abstract class BaseActivity : ExternalActivity {<br /> public IEnumerable<WorkItemData> WorkItems { get; set; }<br /> public VirtualFolderData Bundle { get; set; }<br /> public TrusteeData NextAssignee { get; set; }<br /> public string FinishMessage { get; set; }<br /> public PublicationData Publication { get; set; }<br /> public ProcessDefinitionData ProcessDefinition { get; set; }<br /> public ActivityInstanceData SuspendedActivity { get; set; }<br /> public TridionActivityDefinitionData ActivityDefinition { get; set; }<br /> public WorkflowConfiguration WorkflowConfiguration { get; set; }<br /> public ReadOptions ReadOptions { get; set; }<br /><br /> public bool IsSuspended {<br /> get {<br /> return SuspendedActivity != null && SuspendedActivity.ActivityState == ActivityState.Suspended;<br /> }<br /> }<br /><br /> protected virtual void Initialize() {<br /> ReadOptions = new ReadOptions();<br /><br /> Bundle = GetBundle();<br /> Publication = GetPublication();<br /><br /> ActivityDefinition = (TridionActivityDefinitionData)CoreServiceClient.Read(ActivityInstance.ActivityDefinition.IdRef, ReadOptions);<br /> ProcessDefinition = (ProcessDefinitionData)CoreServiceClient.Read(ProcessInstance.ProcessDefinition.IdRef, ReadOptions);<br /><br /> WorkflowConfiguration = new WorkflowConfiguration(CoreServiceClient, Publication);<br /> }<br /><br /> protected virtual void FinishActivity() {<br /> if (!IsSuspended) {<br /> CoreServiceClient.FinishActivity(ActivityInstance.Id, new ActivityFinishData() {<br /> Message = FinishMessage,<br /> NextAssignee = NextAssignee != null ? new LinkToTrusteeData() { IdRef = NextAssignee.Id } : null<br /> }, ReadOptions);<br /> }<br /> }<br /><br /> protected override void Resume(string bookmark) {<br /> SuspendedActivity = (ActivityInstanceData)CoreServiceClient.Read(ActivityInstance.Id, ReadOptions);<br /> }<br /><br /> private PublicationData GetPublication() {<br /> int publicationId = new TcmUri(WorkItems.ElementAt(0).Id).PublicationId;<br /> string publicationUri = string.Format("tcm:0-{0}-1", publicationId);<br /> return (PublicationData)CoreServiceClient.Read(publicationUri, ReadOptions);<br /> }<br /><br /> private VirtualFolderData GetBundle() {<br /> WorkItemData bundleWorkItem = WorkItems.First(b => new TcmUri(b.Subject.IdRef).ItemType == ContentManager.ItemType.VirtualFolder);<br /> if (bundleWorkItem != null) {<br /> return (VirtualFolderData)CoreServiceClient.Read(bundleWorkItem.Subject.IdRef, ReadOptions);<br /> }<br /> return null;<br /> }<br /><br /> public UserData GetLastManualActivityPerformer() {<br /> ActivityInstanceData lastManualActivity = GetLastManualActivity();<br /> return (UserData)CoreServiceClient.Read(lastManualActivity.Performers.Last().IdRef, ReadOptions);<br /> }<br /><br /> public ActivityInstanceData GetLastManualActivity() {<br /> IEnumerable<ActivityInstanceData> activityInstances =<br /> ProcessInstance.Activities.OfType<ActivityInstanceData>().OrderByDescending(o => o.StartDate);<br /><br /> return activityInstances.First(a => {<br /> TridionActivityDefinitionData activityDefinition =<br /> (TridionActivityDefinitionData)CoreServiceClient.Read(a.ActivityDefinition.IdRef, ReadOptions);<br /> return string.IsNullOrEmpty(activityDefinition.Script);<br /> });<br /> }<br />}</span></span></span><br />
<span style="font-size: large;"><span style="background-color: #cccccc;"><span style="font-size: small;"><span style="background-color: #cccccc;"><span></span></span></span></span> </span><span style="font-size: large;"> </span><br />
<h3>
<span style="font-size: large;">PublisherAwareActivity </span></h3>
This class <span style="font-size: large;"><span style="font-size: small;">represents an activity that deals with the publisher, this is a base class for all Publish or Unpublish activities. This provides publisher generic information like Publisher Instructions, Publish Transactions, Publication Targets and Publish Priorities.</span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><img alt="" src="data:image/png;base64,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" /> </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-size: large;"><span style="font-size: small;"> This class is not intended to be used directly in Automatic Activities but to be a base class.</span></span><br />
<br />
<h3>
<span style="font-size: large;">PublishActivity</span></h3>
<span style="font-size: large;"><span style="font-size: small;">This class contains Publish specific functionality </span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><span style="background-color: #cccccc;">public abstract class PublishActivity : PublisherAwareActivity {<br /> protected override void Initialize() {<br /> PublisherInstructions = new PublishInstructionData();<br /> ((PublishInstructionData)PublisherInstructions).RenderInstruction = new RenderInstructionData();<br /><br /> base.Initialize();<br /> }<br /><br /> protected override void Execute() {<br /> Publish();<br /> }<br /><br /> protected void Publish() {<br /> string[] itemsToPublish = Bundle != null ? new string[] { Bundle.Id } : WorkItems.Select(s => s.Id).ToArray();<br /> string[] publicationTargets = PublicationTargets.Select(s => s.Id).ToArray();<br /><br /> PublishTransactions = CoreServiceClient.Publish(itemsToPublish, (PublishInstructionData)PublisherInstructions, publicationTargets, Priority, ReadOptions);<br /><br /> for (IEnumerator<string> e = PublishTransactionKeys.GetEnumerator(); e.MoveNext(); ) {<br /> if (!ProcessInstance.Variables.ContainsKey(e.Current)) {<br /> ProcessInstance.Variables.Add(e.Current, PublishTransactions.ElementAt(0).Id);<br /> }<br /> else {<br /> ProcessInstance.Variables[e.Current] = PublishTransactions.ElementAt(0).Id;<br /> }<br /> }<br /> }<br />}</span></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"></span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">This post is intended to be a guideline and a base for Workflow implementations, if you are interested in the full implementation please don't hesitate to contact me. </span></span><br />
<span style="font-size: large;"></span><span style="font-size: large;"> </span>Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com7tag:blogger.com,1999:blog-1400873539908712350.post-8316204439474689452013-07-23T10:41:00.000-07:002013-07-30T06:25:02.247-07:00Executing .Net Component Presentations (Web Controls) from the Broker databaseIn several .Net implementations I have received customers inputs asking why we need to deploy dynamic component presentations that contain .net code in the file system and why we don't just execute them directly form the database.<br />
<br />
Actually it is easy to accomplish by using an old .net technology called Virtual Path Provider, this technology has been there since the first days of .Net and it fits perfectly in this scenario.<br />
<br />
<h2>
<span style="font-size: large;">Solution</span></h2>
We should change both the deployer and web site configuration so that the component presentations are not stored / retrieved from the file system.<br />
<br />
<ul>
<li>deployer cd_storage_conf.xml </li>
</ul>
<Item typeMapping="ComponentPresentation" itemExtension=".Ascx" storageId="database"/><br />
<br />
<ul>
<li>web site cd_storage_conf.xml</li>
</ul>
<Item typeMapping="ComponentPresentation" itemExtension=".Ascx" storageId="database"/><br />
<br />
Once we have configured the deployer / web site to manage .Net Web Controls in the database the next step is to configure a Virtual Path Provider.<br />
<br />
A Virtual Path Provider consist in 3 pieces, a Virtual File, Cache Invalidation and a Virtual Path Provider.<br />
<br />
<h4>
Virtual File</h4>
A virtual file is an entity that indicates the ASP .Net runtime where to retrieve the .Net Web Control that needs to be compiled in order to be served to the user.<br />
<br />
Here a sample of a Virtual File for .Net Web Controls.<br />
<br />
<span style="background-color: #999999;"><span style="font-family: "Courier New",Courier,monospace;">public class TridionVirtualFile : VirtualFile {<br /> private static readonly int publicationId;<br /><br /> static TridionVirtualFile() {<br /> publicationId = int.Parse(WebConfigurationManager.AppSettings["PublicationID"]);<br /> }<br /><br /> public TridionVirtualFile(string virtualPath)<br /> : base(virtualPath) {<br /> }<br /><br /> public static bool FileExist(string virtualPath) {<br /> if (Path.GetExtension(virtualPath).Equals(".ascx")) {<br /> int componentId = 0;<br /> int templateId = 0;<br /><br /> if (TridionVirtualFile.TryGetComponentPresentationIds(virtualPath, out componentId, out templateId)) {<br /> ComponentPresentationFactory factory = new ComponentPresentationFactory(publicationId);<br /> return factory.GetComponentPresentation(componentId, templateId) != null;<br /> }<br /> }<br /> return false;<br /> }<br /><br /> public bool FileExist(string virtualPath, out ComponentPresentationMeta cpMeta) {<br /> int componentId = 0;<br /> int templateId = 0;<br /><br /> cpMeta = null;<br /> if (TridionVirtualFile.TryGetComponentPresentationIds(virtualPath, out componentId, out templateId)) {<br /> ComponentPresentationMetaFactory factory = new ComponentPresentationMetaFactory(publicationId);<br /> cpMeta = factory.GetMeta(componentId, templateId);<br /><br /> return cpMeta != null;<br /> }<br /> return false;<br /> }<br /><br /> public override Stream Open() {<br /> ComponentPresentationMeta cpMeta;<br /> if (FileExist(VirtualPath, out cpMeta)) {<br /> ComponentPresentationFactory factory = new ComponentPresentationFactory(publicationId);<br /> ComponentPresentation cp = factory.GetComponentPresentation(cpMeta.ComponentId, cpMeta.TemplateId);<br /><br /> string content = cp.GetContent(false);<br /> byte[] bytes = Encoding.UTF8.GetBytes(content);<br /> return new MemoryStream(bytes);<br /> }<br /> return new MemoryStream();<br /> }<br /><br /> private static bool TryGetComponentPresentationIds(string virtualPath, out int componentId, out int templateId) {<br /> string dcpName = Path.GetFileNameWithoutExtension(virtualPath);<br /> string[] dcpNameParts = dcpName.Split('_');<br /><br /> componentId = 0;<br /> templateId = 0;<br /><br /> if (dcpNameParts.Length == 3) {<br /> if (!int.TryParse(dcpNameParts[1], out componentId)) {<br /> return false;<br /> }<br /> if (!int.TryParse(dcpNameParts[2], out templateId)) {<br /> return false;<br /> }<br /> return true;<br /> }<br /> return false;<br /> }<br />}</span></span><br />
<br />
<h4>
Virtual Path Provider</h4>
A Virtual Path provider is the interface between the ASP .Net compiler and in this case a Tridion Virtual File (.Net Web Control), this one will check if the component presentation exist and if it should be compiled / recompiled. In this case I have defined cache invalidation based on the published date so that we will be recompiling Tridion Virtual Files (.Net Web Controls) every time it is republished.<br />
<br />
Here a sample of a Virtual Path Provider.<br />
<br />
<span style="background-color: #999999;"><span style="font-family: "Courier New",Courier,monospace;">public class TridionVirtualPathProvider : VirtualPathProvider {<br /> public override bool FileExists(string virtualPath) {<br /> if (TridionVirtualFile.FileExist(virtualPath)) {<br /> return true;<br /> }<br /> else {<br /> return Previous.FileExists(virtualPath);<br /> }<br /> }<br /><br /> public override VirtualFile GetFile(string virtualPath) {<br /> if (TridionVirtualFile.FileExist(virtualPath)) {<br /> return new TridionVirtualFile(virtualPath);<br /> }<br /> else {<br /> return Previous.GetFile(virtualPath);<br /> }<br /> }<br /><br /> public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, </span></span><br />
<span style="background-color: #999999;"><span style="font-family: "Courier New",Courier,monospace;">DateTime utcStart) {<br /> if (TridionVirtualFile.FileExist(virtualPath)) {<br /> return new CacheDependency(<br /> new string[] { HostingEnvironment.MapPath("~/Web.config") },<br /> new string[] { Path.GetFileName(virtualPath) } // Cache is dependent in those cache keys<br /> );<br /> }<br /> else {<br /> return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);<br /> }<br /> }<br />}</span></span><br />
<br />
<h4>
Execute and Retrieve Tridion .Net DCPs from the database</h4>
I was researching on which is the best place to do this without affecting current implementations, I realized that inheriting from the existing Tridion Web Controls like <tridion:ComponentPresentation> will be backwards compatible with previous implementations.<br />
<br />
Please notice that any code in this post won't be supported by Tridion R&D or Customer Support since it is a custom developed solution.<br />
<br />
I noticed that the class ComponentPresentationAssembler is actually validating if the DCP exist in the file system and failing the request in case it is not present, so the strategy I have taken is to override the Render method so that I can execute my own logic before the ComponentPresentationAssembler is executed.<br />
<br />
Here a sample.<br />
<br />
<span style="background-color: #999999;"><span style="font-family: "Courier New",Courier,monospace;">public class ComponentPresentation : TridionWeb.ComponentPresentation {<br /> protected override void Render(HtmlTextWriter writer) {<br /> if (HttpContext.Current != null && HttpContext.Current.Application != null) {<br /> DynamicContent.ComponentPresentationFactory factory = <br /> new DynamicContent.ComponentPresentationFactory(ComponentUri);<br /> <br /> DynamicContent.ComponentPresentation cp = factory.GetComponentPresentation(ComponentUri, TemplateUri);<br /> ComponentPresentationMeta cpMeta = cp.Meta;<br /><br /> if (cpMeta.ContentType.Equals("ASCX WebControl")) {<br /> TcmUri componentId = new TcmUri(ComponentUri);<br /> TcmUri templateId = new TcmUri(TemplateUri);<br /><br /> ComponentMetaFactory metaFactory = new ComponentMetaFactory(componentId.PublicationId);<br /> IComponentMeta componentMeta = metaFactory.GetMeta(componentId.ItemId);<br /><br /> string virtualPath = string.Format("dcp_{0}_{1}.ascx", componentId.ItemId, templateId.ItemId);<br /> //CacheInvalidation(virtualPath, componentMeta);<br /><br /> Control control = Page.LoadControl(virtualPath);<br /> if (control != null) {<br /> control.RenderControl(writer);<br /> }<br /> }<br /> else {<br /> writer.Write(cp.GetContent(false));<br /> }<br /><br /> this.RenderChildren(writer);<br /> }<br /> }<br />}</span></span><br />
<br />
The code above will retrieve and compile the .Net DCP for every request, so it of course is not good for performance, as mentioned before we will use a cache invalidation mechanism in order to invalidate the DCP every time it is published so that the Virtual Path Provider will process it again.<br />
<br />
Here a sample of how the cache should be invalidated, in this case I am changing a cache key every time I publish a DCP.<br />
<br />
<span style="background-color: #999999;"><span style="font-family: "Courier New",Courier,monospace;">private void CacheInvalidation(string virtualPath, IComponentMeta componentMeta) {<br /> if (HttpContext.Current.Cache[virtualPath] == null) {<br /> HttpContext.Current.Cache[virtualPath] = componentMeta.LastPublicationDate;<br /> }<br /> else {<br /> DateTime lastPublishedDate = (DateTime)HttpContext.Current.Cache[virtualPath];<br /> if (lastPublishedDate < componentMeta.LastPublicationDate) {<br /> HttpContext.Current.Cache.Remove(virtualPath);<br /> HttpContext.Current.Cache[virtualPath] = componentMeta.LastPublicationDate;<br /> }<br /> }<br />}</span></span> <br />
<br />
After enabling cache, the performance will increase since it will be just recompiled when there is a new publish date.Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-83876461107376946372013-06-25T13:03:00.000-07:002013-06-25T13:04:15.428-07:00Enabling Session Preview and Dynamic Web Sites<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:DoNotOptimizeForBrowser/>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]-->
<br />
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-justify: inter-ideograph;">
<span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">Since
the release date of the UI Update 2012 (Experience Manager or XPM) I have
noticed some challenges during implementations while integrating XPM Session
Preview with dynamic web sites or when some kind of URL Routing is used.</span></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">When I refer to dynamic web sites, I
refer to web sites using MVC and any kind of URL Routing.</span></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;">
<span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">The Problem</span><b><span style="font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";"></span></b></div>
<ul>
<li><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="font-family: "Verdana","sans-serif";">Implementers
are not aware </span><span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">that
Tridion Content Delivery API (Java or .Net) and Tridion Content Delivery Web
Service (since Tridion 2013 only) already understand when a session preview
token is available and will return the data from the right data store (preview
or regular broker) automatically.</span><span style="font-family: "Verdana","sans-serif";"></span></li>
</ul>
<ul>
<li><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">Implementers
consider that Page/Binary filters (Java) or the Session Preview Module (.Net)
are mandatory in an XPM set up while they should be considered as optional and
just useful in some scenarios. These filters and Modules </span><span style="font-family: "Verdana","sans-serif";">are </span><span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">very useful when our site is static and there is no URL
routing involved.</span><span style="font-family: "Verdana","sans-serif";"></span></li>
</ul>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;">
<span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">The Solution </span><b><span style="font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";"></span></b></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-justify: inter-ideograph;">
<span style="font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">The
solution is always to identify what is your current scenario in order to select
the correct setup and implementation, in this post I will describe some
scenarios but of course they are not a final list.</span></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-justify: inter-ideograph;">
<br /></div>
<div class="MsoListParagraphCxSpFirst" style="mso-add-space: auto; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 3; text-indent: -.25in;">
<span style="font-family: Symbol; font-size: 13.5pt; mso-bidi-font-family: Symbol; mso-bidi-font-weight: bold; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">Web Sit</span><span style="color: #1f497d; font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman"; mso-themecolor: text2;">e</span><span style="color: #1f497d; font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-themecolor: text2;"> with
fixed URLs</span><b><span style="font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";"></span></b></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<span style="color: black; font-family: "Verdana","sans-serif"; mso-bidi-font-family: "Times New Roman"; mso-fareast-font-family: "Times New Roman";">The Page/Binary filters or Session Preview Module are ideal for
this scenario, XPM will serialize temporary files by appending the session
preview token to the file names forwarding requests to these files in case a
Session Preview Toke is enabled. </span><span style="color: black; font-family: "Verdana","sans-serif";"></span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<span style="color: black; font-family: "Verdana","sans-serif";">Scenarios that fall in this category are:</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; margin-left: 1.0in; mso-add-space: auto; mso-list: l1 level2 lfo2; mso-margin-top-alt: auto; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="color: black; font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: black; font-family: "Verdana","sans-serif";">ASP .Net Web Forms without Routing.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; margin-left: 1.0in; mso-add-space: auto; mso-list: l1 level2 lfo2; mso-margin-top-alt: auto; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="color: black; font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: black; font-family: "Verdana","sans-serif";">Classic JSP Web Application without routing.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; margin-left: 1.0in; mso-add-space: auto; mso-list: l1 level2 lfo2; mso-margin-top-alt: auto; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="color: black; font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: black; font-family: "Verdana","sans-serif";">Static HTML Web Site.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-add-space: auto; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 3; text-indent: -.25in;">
<span style="font-family: Symbol; font-size: 13.5pt; mso-bidi-font-family: Symbol; mso-bidi-font-weight: bold; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: bold; mso-fareast-font-family: "Times New Roman";">Web Site with different Context
Locations</span><span style="font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: bold; mso-fareast-font-family: "Times New Roman";"></span></div>
<div class="MsoListParagraphCxSpMiddle">
<br /></div>
<div class="MsoListParagraphCxSpMiddle">
<span style="font-family: "Verdana","sans-serif";">When
I refer to different context locations I consider scenarios when in the Web
Application we use a context location that does not match with the current URL,
this scenario is not URL routing but URL forwarding. In this case the static
files exist in the file system but they are stored in a different location so
the web application needs to map the URL with the real file path and forward
the request. There is a hot fix available for this scenarios, the hot fix will
allow you to define 4 claims as defined below:</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">full_url:
The full http request URL.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">real_path:
The path in the file system for the http request.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">root_path:
The context path.</span></div>
<div class="MsoListParagraphCxSpLast" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">forwarding:
Indicates if the http request should be forwarded or not.</span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="font-family: "Verdana","sans-serif";">These
Ambient Data Framework claims should be filled using some custom logic like a
java filter or a .net http module.</span></div>
<div class="MsoListParagraphCxSpFirst" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<br /></div>
<div class="MsoListParagraphCxSpFirst" style="margin-bottom: 12.0pt; mso-add-space: auto; mso-margin-top-alt: auto;">
<span style="color: black; font-family: "Verdana","sans-serif";"> Scenarios that fall in this category are:</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">Java
Web Application with a different context location defined in the Web
Application Description.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l1 level2 lfo2; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">Java
Web Application that uses a Content Rendition Framework.</span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 1.0in; mso-add-space: auto;">
<br /></div>
<div class="MsoListParagraphCxSpLast" style="mso-add-space: auto; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 3; text-indent: -.25in;">
<span style="font-family: Symbol; font-size: 13.5pt; mso-bidi-font-family: Symbol; mso-bidi-font-weight: bold; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; mso-bidi-font-weight: bold;">Dynamic Web Sites</span></div>
<div class="MsoListParagraphCxSpLast" style="mso-add-space: auto; mso-list: l1 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 3; text-indent: -.25in;">
<br /></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="font-family: "Verdana","sans-serif";">In
this category I will group all the web sites using MVC as an implementation
pattern as well as any website using URL Routing.</span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="font-family: "Verdana","sans-serif";">For
this kind of web sites I found that the Page/Binary filters or the Session
Preview Module are not good options and we should avoid them, the solution for
those scenarios can vary depending on the nature of the implementation, it
could be as simple as just remove the filters or module from the web
application to develop mechanisms to get information from the preview data
store.</span></div>
<div class="MsoNormal" style="margin-left: .5in;">
<span style="font-family: "Verdana","sans-serif";">Scenarios
that fall in this category are:</span></div>
<div class="MsoListParagraphCxSpFirst" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l0 level1 lfo3; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">ASP
.Net MVC Web Sites</span></div>
<div class="MsoListParagraphCxSpMiddle" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l0 level1 lfo3; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">Spring
MVC Web Sites</span></div>
<div class="MsoListParagraphCxSpLast" style="line-height: 150%; margin-bottom: 6.0pt; margin-left: 1.0in; margin-right: 0in; margin-top: 12.0pt; mso-add-space: auto; mso-list: l0 level1 lfo3; text-align: justify; text-indent: -.25in; text-justify: inter-ideograph;">
<span style="font-family: "Courier New"; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7.0pt "Times New Roman";">
</span></span></span><span style="font-family: "Verdana","sans-serif";">ASP
.Net Web Forms using Routing</span></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;">
<br /></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;">
<span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";">The </span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt;">Example</span></div>
<div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;">
<span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt;"> </span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"> </span><b><span style="font-family: "Verdana","sans-serif"; font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"></span></b></div>
<div class="MsoNormal">
<span style="font-family: "Verdana","sans-serif";">For this
example I am using ASP .Net MVC 4 and I will show how to accomplish session
preview for a fully dynamic web site using a Virtual Path Provider and a
extending the existing Razor View Engine.</span></div>
<div class="MsoNormal">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Create
a Virtual File</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoListParagraphCxSpLast">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">class</span>
<span style="color: #2b91af;">TridionVirtualFile</span> : <span style="color: #2b91af;">VirtualFile</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">readonly</span> <span style="color: blue;">int</span> publicationId = 7;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span>
TridionVirtualFile(<span style="color: blue;">string</span> virtualPath) : <span style="color: blue;">base</span>(virtualPath) { </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span>
FileExist(<span style="color: blue;">string</span> virtualPath) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span> (<span style="color: #2b91af;">Path</span>.GetExtension(virtualPath).Equals(<span style="color: #a31515;">".cshtml"</span>)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">PageMetaFactory</span>
pageMetaFactory = <span style="color: blue;">new</span> <span style="color: #2b91af;">PageMetaFactory</span>(publicationId);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
pageMetaFactory.GetMetaByUrl(publicationId, virtualPath) != <span style="color: blue;">null</span>;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span> <span style="color: blue;">false</span>;<span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">bool</span> FileExist(<span style="color: blue;">string</span>
virtualPath, <span style="color: blue;">out</span> <span style="color: #2b91af;">IPageMeta</span>
pageMeta) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">PageMetaFactory</span>
pageMetaFactory = <span style="color: blue;">new</span> <span style="color: #2b91af;">PageMetaFactory</span>(publicationId);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>pageMeta =
pageMetaFactory.GetMetaByUrl(publicationId, virtualPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
pageMeta != <span style="color: blue;">null</span>;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: #2b91af;">Stream</span>
Open() {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">IPageMeta</span>
pageMeta;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(FileExist(VirtualPath, <span style="color: blue;">out</span> pageMeta)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">PageContentAssembler</span>
assembler = <span style="color: blue;">new</span> <span style="color: #2b91af;">PageContentAssembler</span>();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">string</span>
content = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="font-family: Consolas; font-size: 9.5pt;">assembler.GetContent(pageMeta.PublicationId,
pageMeta.Id);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">byte</span>[]
bytes = <span style="color: #2b91af;">Encoding</span>.UTF8.GetBytes(content);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
<span style="color: blue;">new</span> <span style="color: #2b91af;">MemoryStream</span>(bytes);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">MemoryStream</span>();<span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"> </span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Create
a Virtual Path Provider</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoListParagraphCxSpLast">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">class</span>
<span style="color: #2b91af;">TridionVirtualPathProvider</span> : <span style="color: #2b91af;">VirtualPathProvider</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: blue;">bool</span>
FileExists(<span style="color: blue;">string</span> virtualPath) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span> (<span style="color: #2b91af;">TridionVirtualFile</span>.FileExist(virtualPath)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
<span style="color: blue;">true</span>;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">else</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
Previous.FileExists(virtualPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: #2b91af;">VirtualFile</span>
GetFile(<span style="color: blue;">string</span> virtualPath) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span> (<span style="color: #2b91af;">TridionVirtualFile</span>.FileExist(virtualPath)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
<span style="color: blue;">new</span> <span style="color: #2b91af;">TridionVirtualFile</span>(virtualPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">else</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
Previous.GetFile(virtualPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: #2b91af;">CacheDependency</span>
GetCacheDependency(</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.0in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="font-family: Consolas; font-size: 9.5pt;">
virtualPath, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">IEnumerable</span><span style="font-family: Consolas; font-size: 9.5pt;">
virtualPathDependencies, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">DateTime</span><span style="font-family: Consolas; font-size: 9.5pt;">
utcStart) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span> (<span style="color: #2b91af;">TridionVirtualFile</span>.FileExist(virtualPath)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
<span style="color: blue;">new</span> <span style="color: #2b91af;">CacheDependency</span>(</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">new</span>
<span style="color: blue;">string</span>[] { <span style="color: #2b91af;">HostingEnvironment</span>.MapPath(<span style="color: #a31515;">"~/Web.config"</span>) }, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">new</span>
<span style="color: blue;">string</span>[] { virtualPath } </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">else</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
Previous.GetCacheDependency(</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 2.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="font-family: Consolas; font-size: 9.5pt;">virtualPath,
virtualPathDependencies, utcStart);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Register
the Virtual Path Provider</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">static</span>
<span style="color: blue;">void</span> RegisterVirtualPathProvider() {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">HostingEnvironment</span><span style="font-family: Consolas; font-size: 9.5pt;">.RegisterVirtualPathProvider(<span style="color: blue;">new</span>
<span style="color: #2b91af;">TridionVirtualPathProvider</span>());</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Extend
the Razor View Engine</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoListParagraphCxSpLast">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">class</span>
<span style="color: #2b91af;">TridionViewEngine</span> : <span style="color: #2b91af;">RazorViewEngine</span>
{</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">const</span> <span style="color: blue;">int</span>
publicationId = [PublicationId];</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">override</span> <span style="color: #2b91af;">ViewEngineResult</span>
FindView(</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;">ControllerContext</span><span style="font-family: Consolas; font-size: 9.5pt;"> controllerContext, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="font-family: Consolas; font-size: 9.5pt;">
viewName, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">string</span><span style="font-family: Consolas; font-size: 9.5pt;">
masterName, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">bool</span><span style="font-family: Consolas; font-size: 9.5pt;">
useCache) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">ViewEngineResult</span>
result = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">base</span><span style="font-family: Consolas; font-size: 9.5pt;">.FindView(controllerContext,
viewName, masterName, useCache);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(result.View != <span style="color: blue;">null</span>) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">string</span>
viewPath = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">((<span style="color: #2b91af;">RazorView</span>)result.View).ViewPath.Replace(<span style="color: #a31515;">"~"</span>, <span style="color: blue;">string</span>.Empty);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">PageMetaFactory</span>
pageMetaFactory = <span style="color: blue;">new</span> <span style="color: #2b91af;">PageMetaFactory</span>(publicationId);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">IPageMeta</span>
pageMeta = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 1.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="font-family: Consolas; font-size: 9.5pt;">pageMetaFactory.GetMetaByUrl(publicationId,
viewPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(pageMeta != <span style="color: blue;">null</span>) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(<span style="color: #2b91af;">HttpContext</span>.Current.Cache[viewPath] == <span style="color: blue;">null</span>) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">HttpContext</span>.Current.Cache[viewPath]
= </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 3.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">pageMeta.LastPublicationDate;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">else</span>
{</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">DateTime</span>
lastPublishedDate = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 6;"> </span>(<span style="color: #2b91af;">DateTime</span>)<span style="color: #2b91af;">HttpContext</span>.Current.Cache[viewPath];</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(lastPublishedDate < pageMeta.LastPublicationDate) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">HttpContext</span>.Current.Cache.Remove(viewPath);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>result = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 2.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">base</span><span style="font-family: Consolas; font-size: 9.5pt;">.FindView(controllerContext,
viewName, masterName, useCache);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">HttpContext</span>.Current.Cache[viewPath] = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 3.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .5in;">
<span style="font-family: Consolas; font-size: 9.5pt;">pageMeta.LastPublicationDate;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
result;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoListParagraphCxSpFirst">
<br /></div>
<div class="MsoListParagraphCxSpMiddle">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Register
our new View Engine</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoListParagraphCxSpLast">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">static</span>
<span style="color: blue;">void</span> RegisterViewEngines() {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">ViewEngines</span>.Engines.Clear();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">ViewEngines</span>.Engines.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">TridionViewEngine</span>());</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Handle
Images and Binaries</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: blue;">class</span>
<span style="color: #2b91af;">SessionPreviewBinaryModule</span> : <span style="color: #2b91af;">IHttpModule</span> {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: blue;">int</span>
publicationId = 7;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: blue;">string</span>
SessionPreviewToken = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 2.25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">"taf:claim:contentdelivery:webservice:preview:sessionid"</span><span style="font-family: Consolas; font-size: 9.5pt;">;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: blue;">string</span>
defaultVariantId = <span style="color: #a31515;">"default"</span>;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">void</span> Init(<span style="color: #2b91af;">HttpApplication</span>
context) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>context.PreRequestHandlerExecute += </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 2.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">new</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #2b91af;">EventHandler</span>(OnPreRequestHandlerExecute);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">private</span> <span style="color: blue;">void</span> OnPreRequestHandlerExecute(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span>
e) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">HttpContext</span>
httpContext = <span style="color: #2b91af;">HttpContext</span>.Current;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(httpContext != <span style="color: blue;">null</span>) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">string</span>
url = httpContext.Request.Url.AbsolutePath;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">string</span>
relativeUrl = httpContext.Request.Url.PathAndQuery;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(<span style="color: #2b91af;">Path</span>.GetExtension(url).ToLower().Equals(<span style="color: #a31515;">".jpg"</span>) ||</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">Path</span>.GetExtension(url).ToLower().Equals(<span style="color: #a31515;">".gif"</span>) ||</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">Path</span>.GetExtension(url).ToLower().Equals(<span style="color: #a31515;">".png"</span>)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">ClaimStore</span>
claimStore = <span style="color: #2b91af;">AmbientDataContext</span>.CurrentClaimStore;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">Dictionary</span><<span style="color: #2b91af;">Uri</span>, <span style="color: blue;">object</span>>
claims = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: 2.75in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none; text-indent: .25in;">
<span style="font-family: Consolas; font-size: 9.5pt;">(<span style="color: #2b91af;">Dictionary</span><<span style="color: #2b91af;">Uri</span>,
<span style="color: blue;">object</span>>)claimStore.GetAll();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">Uri</span>
sessionTokenUri = <span style="color: blue;">new</span> <span style="color: #2b91af;">Uri</span>(SessionPreviewToken);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(claims.ContainsKey(sessionTokenUri)) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">BinaryMetaFactory</span>
binaryMetaFactory = <span style="color: blue;">new</span> <span style="color: #2b91af;">BinaryMetaFactory</span>();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">BinaryMeta</span>
binaryMeta = </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 4;"> </span></span><span style="font-family: Consolas; font-size: 9.5pt;">binaryMetaFactory.GetMetaByUrl(publicationId,
relativeUrl);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">if</span>
(binaryMeta != <span style="color: blue;">null</span>) {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">BinaryFactory</span> binaryFactory = <span style="color: blue;">new</span>
<span style="color: #2b91af;">BinaryFactory</span>();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">BinaryData</span> binaryData = binaryFactory.GetBinary(publicationId, </span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: #2b91af; font-family: Consolas; font-size: 9.5pt;"><span style="mso-tab-count: 8;"> </span></span><span style="font-family: Consolas; font-size: 9.5pt;">binaryMeta.Id, defaultVariantId);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: #2b91af;">HttpResponse</span> response = httpContext.Response;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>response.Clear();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>response.ContentType =
binaryMeta.Type;</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;">
</span>response.BinaryWrite(binaryData.Bytes);</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>response.Flush();</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">public</span> <span style="color: blue;">void</span> Dispose() {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span>}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;">}</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<br /></div>
<ul>
<li><span style="font-family: Symbol; font-size: 12.0pt; line-height: 150%; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";"></span></span></span><span style="color: #0b5394; font-family: "Verdana","sans-serif"; font-size: 13.5pt; line-height: 150%; mso-bidi-font-weight: bold;">Use
our views</span><span style="font-family: "Verdana","sans-serif"; font-size: 12.0pt; line-height: 150%;"></span></li>
</ul>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt;">public</span><span style="font-family: Consolas; font-size: 9.5pt;"> <span style="color: #2b91af;">ActionResult</span>
Index() {</span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in; margin-left: .25in; margin-right: 0in; margin-top: 0in; mso-layout-grid-align: none; text-autospace: none;">
<span style="font-family: Consolas; font-size: 9.5pt;"><span style="mso-spacerun: yes;"> </span><span style="color: blue;">return</span>
View();</span></div>
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-fareast;">}</span><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0in;
mso-pagination:widow-orphan;
font-size:11.0pt;
mso-bidi-font-size:10.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com2tag:blogger.com,1999:blog-1400873539908712350.post-36025240668195160872013-04-16T09:53:00.000-07:002013-04-17T06:40:27.829-07:00Extending Tridion 2013 Workflow scripts<div style="text-align: justify;">
<a href="http://www.blogger.com/blogger.g?blogID=1400873539908712350" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>One of the most important things in technology is curiosity and this will lead you to find new ways to do things, the other day I was checking all the Tridion 2013 configuration files and I realized that the new version of <i>Tridion.ContentManager.config</i> file has a new section that allow me to register different types of Workflow Scripts.</div>
<br />
<workflowScriptTypes><br />
<add <br />
name="CSharp" <br />
<div class="separator" style="clear: both; text-align: center;">
</div>
titleResource="msgCSharpWorkflowScriptType" <br />
scriptContentHandlerType="Tridion.ContentManager.Workflow.CSharpScriptContentHandler" <br />
executorType="Tridion.ContentManager.Workflow.CSharpScriptExecutor" <br />
assemblyName="Tridion.ContentManager.Workflow, Version=7.0.0.2303, Culture=neutral, PublicKeyToken=ddfc895746e5ee6b" /><br />
<br />
<add <br />
name="ExternalActivity" <br />
titleResource="msgExternalActivityScriptType" <br />
scriptContentHandlerType="Tridion.ContentManager.Workflow.ExternalActivityScriptContentHandler" <br />
executorType="Tridion.ContentManager.Workflow.ExternalActivityExecutor" <br />
assemblyName="Tridion.ContentManager.Workflow, Version=7.0.0.2303, Culture=neutral, PublicKeyToken=ddfc895746e5ee6b" /><br />
</workflowScriptTypes><br />
<br />
This feature is not documented but with some .Net knowledge we will make it to work<br />
<br />
<h3>
What I need to create my own Workflow Script Type?</h3>
It is mandatory to develop 2 classes, one to execute your new script type and one to validate it.<br />
<br />
<h3>
Script Type Executor</h3>
In order to develop a new Script Type Executor we will need implement the IScriptExecutor interface and implement the ExecuteScript method as in the following sample.<br />
<br />
using System;<br />
using System.Collections.Generic;<br />
using System.IO;<br />
using System.Linq;<br />
using System.Reflection;<br />
using System.ServiceModel;<br />
using System.Text;<br />
using System.Text.RegularExpressions;<br />
using Tridion.ContentManager;<br />
using Tridion.ContentManager.CoreService.Client;<br />
using Tridion.ContentManager.Workflow;<br />
using Tridion.Extension.Framework.Workflow.Handlers;<br />
using Tridion.Localization;<br />
using Tridion.Logging;<br />
<br />
namespace Tridion.Extension.Framework.Workflow {<br />
public class YAWFActivityExecutor : IScriptExecutor {<br />
<br />
public string ExecuteScript(string script, string currentActivityInstanceId, string processInstanceXml) {<br />
<br />
}<br />
}<br />
}<br />
<br />
The ExecuteScript receives the following parameters.<br />
<ul>
<li>Script: the script specified in the Activity Script box.</li>
<li>currentActivityInstanceId: executing activity id, it is the starting point to start creating tridion objects.</li>
<li>processInstanceXml: process instance xml, it will allow you to manage Process Variables.</li>
</ul>
<br />
<h3>
Script Content Handler </h3>
This class will validate your script and make sure it is a valid script. The syntax depends on you since the script you are defining is your own design.<br />
<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using Tridion.ContentManager.Workflow;<br />
<br />
namespace Tridion.Extension.Framework.Workflow {<br />
public class YAWFActivityScriptContentHandler : ScriptContentHandler {<br />
public override void Validate() {<br />
<br />
}<br />
}<br />
}<br />
<br />
<h3>
Registering your Script Type</h3>
The assembly needs to have a strong name and be registered in the GAC. Once your assembly is registered in the GAC the next step is to add your script to the list of WorkflowScriptTypes.<br />
<br />
<workflowScriptTypes><br />
<add <br />
name="CSharp" <br />
titleResource="msgCSharpWorkflowScriptType" <br />
scriptContentHandlerType="Tridion.ContentManager.Workflow.CSharpScriptContentHandler" <br />
executorType="Tridion.ContentManager.Workflow.CSharpScriptExecutor" <br />
assemblyName="Tridion.ContentManager.Workflow, Version=7.0.0.2303, Culture=neutral, PublicKeyToken=ddfc895746e5ee6b" /><br />
<add <br />
name="ExternalActivity" <br />
titleResource="msgExternalActivityScriptType" <br />
scriptContentHandlerType="Tridion.ContentManager.Workflow.ExternalActivityScriptContentHandler" <br />
executorType="Tridion.ContentManager.Workflow.ExternalActivityExecutor" <br />
assemblyName="Tridion.ContentManager.Workflow, Version=7.0.0.2303, Culture=neutral, PublicKeyToken=ddfc895746e5ee6b" /><br />
<add <br />
name="YAWF ExternalActivity" <br />
scriptContentHandlerType="Tridion.Extension.Framework.Workflow.YAWFActivityScriptContentHandler" <br />
executorType="Tridion.Extension.Framework.Workflow.YAWFActivityExecutor" <br />
assemblyName="WorkflowFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=a7e94891d1e8b7e1" /><br />
</workflowScriptTypes><br />
<br />
<h3>
Using your Custom Script</h3>
You should be able to see it in the Workflow Designer in Visio.<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
And add your own script<br />
<br />
<img alt="" src="data:image/png;base64,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GSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJACkUGSKHIACkUGSCFIgOkUGSAFIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiA6RQZIAUigyQQpEBUigyQApFBkihyAApFBkghSIDpFBkgBSKDJBCkQFSKDJAigMU+b8AHMJbizz1TxSA0/HWIgNwKIoMkEKRAVIoMkAKRQZIocgAKRQZIIUiwxgqqqqqqr7vz9TvA45wdXWlyDCGqqqm/vd9YldXV8NFnvrjchNbXZFCkWEMqyJP/W/9ZFa5ebbIY/4/kkaRYTx1kac+kGko8rMUGcajyIo8TJFhPIqsyMMUGcajyIo8TJFhPIqsyMMUGcajyCdS5Ieby8ubh5+wY0WG8Yxc5Ieby/pDGeuAlCm5m1dVNb8b51ienqYq8t18+9GUQ/1tFRlOwJhFfri5rLbVuJuvolynpHn3OMYv8sPNZZnhu/mBkqzIcAJGLPLdvBXcVUTq/x09x08TFLk7nMWvDpc3D+utbuat0+jtqfX8rnzM9iGKDMdtvCJ3JONuXs3vHm4uLy8nyfHT+EV+uLkcXqe4m1fzu8aJ9PoHWeuRq+02+6x/sB3sQLcUGcYTUeTq8uamfQI9jgmK3PnXbK2vl5t1BrfcfnXSrMhwAlJWLV5w+vgzjL5qsfNNeGouoO/2t6/Ird0oMpyAoFf2pnhpL+KVvSKm62/BbpE7Vi2aP78UGU7AhO9+WwelkZJNpscyybvfGksO87un4jW7y/m8+xy5+bDmK3s7Cx0HpcgwHp8QOZFPiPw0igzjUWRFHqbIMB5FVuRhigzjUWRFHvbKIhtjjBlzFNkYY1JGkY0xJmUU2RhjUkaRjTEmZRTZGGNSRpGNMSZl1kU2xhiTMP8HWTCXMRb6ZpoAAAAASUVORK5CYII=" />Anonymoushttp://www.blogger.com/profile/00370895940423689366noreply@blogger.com1