Blog posts by Mattias Lövström
2012-06-08T10:54:34.0000000Z
/blogs/Mattias-Lovstrom/
Optimizely World
Versions state graph of a page data object in the EPiServers editorial interface
/blogs/Mattias-Lovstrom/Dates/2012/6/Versions-state-graph-of-a-page-data-object-in-the-EPiServers-editorial-interface/
2012-06-08T10:54:34.0000000Z
<p>This is a follow up of my first blog post <a href="http://world.episerver.com/Blogs/Mattias-Lovstrom/Dates/2010/7/Version-state-graph-of-a-PageData-object/" target="_blank">Version state graph of a PageData</a> object and describes what save actions are taken when clicking in the EPiServers editorial interface (for EPiServer CMS 6 R2). </p> <p><a href="/link/28a0435d2f084feca407b8942e29c94d.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="PageDataVersions_editmode_01" border="0" alt="PageDataVersions_editmode_01" src="/link/03999470804e40c49f115b5a302b3247.jpg" width="547" height="767" /></a> </p> <h2>Comments to state graph</h2> <p>the descriptions only describes the most important actions taken when an action occurs, for a more detailed description please visit ny first blog post  <a href="http://world.episerver.com/Blogs/Mattias-Lovstrom/Dates/2010/7/Version-state-graph-of-a-PageData-object/" target="_blank">Version state graph of a PageData</a>.</p> <table border="1" cellspacing="0" cellpadding="0" width="544"><tbody> <tr> <td width="24" align="center"> <p style="margin-right: 0px" dir="ltr" align="center">Id</p> </td> <td width="89" align="center"> <p align="center"><strong>From state</strong></p> </td> <td width="115" align="center"> <p style="margin-right: 0px" dir="ltr" align="center"><strong>Editorial action</strong></p> </td> <td width="314" align="center"> <p align="center"><strong>Description</strong></p> </td> </tr> <tr> <td valign="top" width="24"> <p align="center">1</p> </td> <td valign="top" width="89"> </td> <td valign="top" width="115">New Page is invoked from the editorial interface.</td> <td valign="top" width="314">A page is created in the memory. the page property Pending Publish is set to true.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">2</p> </td> <td valign="top" width="89">Page only in memory</td> <td valign="top" width="115">The editor clicks save.</td> <td valign="top" width="314">The page is saved as a checked out version. <br />The Properties PageLink,PageFolderID   is set.when the page is created.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">3</p> </td> <td valign="top" width="89">Page only in memory</td> <td valign="top" width="115">The editor clicks publish.</td> <td valign="top" width="314">The page is saved as a published version. <br />The Properties PageLink,PageFolderID is set.when the page is created and the page property PendingPublish is set to false.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">4</p> </td> <td valign="top" width="89">Checked out</td> <td valign="top" width="115">The editor clicks save.</td> <td valign="top" width="314">The saved version is overwritten with a new checked out version.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">5</p> </td> <td valign="top" width="89">Checked out</td> <td valign="top" width="115">The editor click Ready to Publish.</td> <td valign="top" width="314">The page is saved as the same version as the checked in page, but with the status  checked out</td> </tr> <tr> <td valign="top" width="24"> <p align="center">6</p> </td> <td valign="top" width="89">Checked out</td> <td valign="top" width="115">The editor click publish.</td> <td valign="top" width="314">The page is saved as the same version as the checked in page, but with the status checked in</td> </tr> <tr> <td valign="top" width="24"> <p align="center">7</p> </td> <td valign="top" width="89">Checked out</td> <td valign="top" width="115">The editor deletes the page.</td> <td valign="top" width="314">The page is moved to the Recycle bin, the pages property IsDeleted is set to true.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">8</p> </td> <td valign="top" width="89">Checked In </td> <td valign="top" width="115">The editor click save.</td> <td valign="top" width="314">The page is saved as a new version with the status checked out.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">9</p> </td> <td valign="top" width="89">Checked In</td> <td valign="top" width="115">The editor clicks publish.</td> <td valign="top" width="314">The page is saved with the same version and the property PendingPublish is set to false.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">10</p> </td> <td valign="top" width="89">Checked In</td> <td valign="top" width="115">The editor delete the page.</td> <td valign="top" width="314">The page is moved to the Recycle bin, the pages property IsDeleted is set to true</td> </tr> <tr> <td valign="top" width="24"> <p align="center">11</p> </td> <td valign="top" width="89">Published</td> <td valign="top" width="115">The editor clicks save.</td> <td valign="top" width="314">A new version is created with the page property PendingPublish set to false.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">12</p> </td> <td valign="top" width="89">Published</td> <td valign="top" width="115">The editor clicks Save and publish.</td> <td valign="top" width="314">A new published version is created.</td> </tr> <tr> <td valign="top" width="24"> <p align="center">13</p> </td> <td valign="top" width="89">Published</td> <td valign="top" width="115">The editor deletes the page.</td> <td valign="top" width="314">The page is moved to the Recycle bin, the pages property IsDeleted is set to true</td> </tr> <tr> <td valign="top" width="24"> <p align="center">14</p> </td> <td valign="top" width="89">In Wastebasket</td> <td valign="top" width="115">The editor empty Recycle Bin.</td> <td valign="top" width="314">The page and all its versions are deleted from the database.</td> </tr> </tbody></table> <p> </p> <p><strong>Wastebasket</strong> </p> <p>When moving a page away from the wastebasket the page property IsDeleted will be set to false. If you manually move a page to the wastebasket IsDeleted will be set to true.</p> <h2>Published delayed pages</h2> <p>The scheduled job “Publish Delayed Page Versions“ list delayed pages in all the page providers. For the local page provider it looks at the properties DelayedPublished, ReadyToPublish and the start publish date is set for the page to be published, and then publish the page if the correct criteria is set.</p> <h2>Hiding pages that has an old StopPublish date</h2> <p>When pages are displayed to the end user all pages has to be filtered out that the current user should not see. The filter FilterForVisitors  works in most of the cases.</p>
Copy many pages in edit mode
/blogs/Mattias-Lovstrom/Dates/2010/9/Copy-many-pages-in-edit-mode/
2010-09-08T10:38:00.0000000Z
<p>We gets some complains of that is not possible to copy a lot of pages in edit mode, so I tried to run the copying functionality in a different thread - and it works better than I have expected.</p>
<p><em><strong>Remarks:</strong> This is not fully tested and should not be run in a production environment without seriously testing and documentation to the editors.</em></p>
<h3>Background</h3>
<p>When we deliver EPiServer CMS 5 a developer think that it should be cool to be able to run the copy function in a separate thread, unfortunately he was a terrible at both GUI design and user experience. So the function was horrible to use; and the function was removed – BUT the API resists.</p>
<p>Many years later we delivered Mirroring 2, enhanced editorial GUI and page providers that make it possible to test this functionality out – and it work better than I have expected! (I miss some progress indicator that tells me the status of the copying process).</p>
<h3>Requirements</h3>
<p>EPiServer CMS 6</p>
<h3>Implementation to try it out</h3>
<p>Create a page provider that inheriting from EPiServers LocalPageProvider and override the copy function to always set the argument allowThreading to true.</p>
<h4>Source code</h4>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">using</span> EPiServer;</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">namespace</span> ForceThreadedCopyPageProvider</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> OverridedLocalPageProvider : LocalPageProvider</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> {</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">override</span> EPiServer.Core.PageReference Copy(EPiServer.Core.PageReference pageLink, EPiServer.Core.PageReference destinationLink, <span style="color: #0000ff;">bool</span> publishOnDestination, <span style="color: #0000ff;">bool</span> allowThreading)</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> {</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">base</span>.Copy(pageLink, destinationLink, publishOnDestination, <span style="color: #0000ff;">true</span>);</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> }</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> }</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
<!--CRLF--></div>
</div>
<h4>Configuration in episerver.config</h4>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><episerver></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> ...</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <pageProvider></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <providers></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <add name=<span style="color: #006080;">"default"</span></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> type=<span style="color: #006080;">"ForceThreadedCopyPageProvider.OverridedLocalPageProvider, ForceThreadedCopyPageProvider"</span></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> capabilities=<span style="color: #006080;">"Create,Edit,Delete,Move,Copy,MultiLanguage,Security,Search,PageFolder"</span> /></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </providers></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pageProvider></pre>
<!--CRLF--></div>
</div>
<h3>Test it out</h3>
<p>I created a page with 13’000 sub pages (by copying the start page several times). Then I copy this page by right clicking in the editorial GUI, and paste it on the start page.</p>
<p>On my developing machine it took 23 minutes, and when it was ready it automatically updates the web tree with the copied page (even when I had worked during the operation) – Great!</p>
<h3>Download binary</h3>
<p><a href="/link/8eb723d3744a4d0a90e3c2e0228d2ab3.zip">ForcethreadedCopyPageProvider.zip</a></p>
LinqToSqlLogger as promised
/blogs/Mattias-Lovstrom/Dates/2010/9/LinqToSqlLogger-as-promised/
2010-09-03T15:14:00.0000000Z
<p>As I promise in my past blog post <a href="http://world.episerver.com/Blogs/Mattias-Lovstrom/Dates/2010/9/Troubleshooting-database-tool--SqlClientLogger/">Troubleshooting database tool – SqlClientLogger</a> that I should deliver a logger for LinqToSql also. This is done and it is also located in the <a href="http://world.episerver.com/Support/Support-Tools/">support tools area on EPiServer world</a>.</p>
<p>The changes to LinqToSqlLogger and SqlClientLogger are</p>
<p>1) The installation – it has to be configured as a Http installation Module</p>
<p>2) It requires .Net 3.5 – of cause</p>
<p>3) The log4net logger is named “LinqToSqlLogger”</p>
<h2>Known issues</h2>
<p>Transactions doesn’t work (yet), this means that saving operations break the logger.</p>
<h2>LinqToSqlLogger</h2>
<p>This tool logs every LinqToSql call to the database done by the <br />application layer with a stack trace and a time it took to execute <br />the query. The benefits of using this tool is that it prints out <br />a stack trace so it’s easy to locate what code that generates the <br />database call. The logs are written to log4net and should appear in <br />the sites log file.</p>
<h3>Requirements</h3>
<p>.Net 3.5<br />Log4Net</p>
<h3>Installation</h3>
<p>Drop the assemblies in the packages bin/ folder to your sites bin/ folder<br />Add a reference to the initialization module handler for LinqToSqlLogger in the sites</p>
<p>web.config file<br />Example:<br /><configuration><br /> …<br /> <system.webServer><br /> …<br /> <add name="LinqToSqlLoggerModule" type="LinqToSqlLogger.InitializeModule, LinqToSqlLogger" /></p>
<h3>Usage</h3>
<p>When the LinqToSqlLogger is installed on the site it is going to send <br />log4net messages using the logger “LinqToSqlLogger”.</p>
<h3>Log4Net logger levels</h3>
<p>DEBUG – prints out database command, stack trace and execution time<br />INFO – prints out database command and execution time.<br />WARN – prints out database command, stack trace and execution time the execution time is over 500 ms</p>
<p>Sample of how to configure it in the file EPiServerLog.config (or where your log4net configuration is)<br /><log4net><br /> ...<br /> <logger name="LinqToSqlLogger"><br /> <level value="DEBUG" /><br /> </logger></p>
<p>Duration threshold can be set in the appSettings in the web.config file for the keys <br />SqlClientLoggerDurationFilterMs – a threshold for all logged database calls <br />SqlClientLoggerDurationWarnFilterMs - a threshold for trigger a warning message, the default is set to 500 ms</p>
<h3>Download</h3>
<p><a href="/link/9d0a0d5a0fd045e2869d2c98356775ff.zip" target="_blank">LinqToSqlLogger.zip</a></p>
Troubleshooting database tool – SqlClientLogger
/blogs/Mattias-Lovstrom/Dates/2010/9/Troubleshooting-database-tool--SqlClientLogger/
2010-09-03T09:13:00.0000000Z
<p>This tool logs every call to the database done by the application layer with a stack trace and a time it took to execute the query. The benefits of using this tool is that it prints out a stack trace so it’s easy to locate what code that generates the database call. The logs are written to log4net and should appear in the sites log file.</p>
<h3>Download</h3>
<p><a href="/link/e5323c7a67f84bd88c79e1eb9dcd6c64.zip" target="_blank">Download SqlClientLogger</a></p>
<p>Requirements:</p>
<p>.Net 2.0</p>
<p>Log4Net</p>
<h3>Installation</h3>
<p>Drop the assembly “SqlClientLogger.dll” to your sites bin/folder</p>
<p>Replace the SqlClient database provider with the logging SqlClient database provider in web.config</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; height: 281px; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><configuration></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> ...</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <system.data></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <DbProviderFactories></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <remove invariant=<span style="color: #006080;">"System.Data.SqlClient"</span> /></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <add name=<span style="color: #006080;">"System.Data.SqlClient"</span></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> invariant=<span style="color: #006080;">"System.Data.SqlClient"</span></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> description=<span style="color: #006080;">".Net Framework Data Provider for SqlServer with logging of executed commands"</span></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> type=<span style="color: #006080;">"SqlClientLogger.DatabaseFactory, SqlClientLogger"</span>/></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </DbProviderFactories></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </system.data> </pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"></configuration></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<!--CRLF--></div>
</div>
<h3>Usage</h3>
<p>When the SqlClientLogger is installed on the site it is going to send log4net messages using the logger “SqlClientLogger”.</p>
<h4>Log4Net logger levels</h4>
<p><em>DEBUG</em> – prints out database command, stack trace and execution time</p>
<p><em>INFO</em> – prints out database command and execution time.</p>
<p><em>WARN</em> – prints out database command, stack trace and execution time the execution time is over 500 ms</p>
<h4>Sample of how to configure it in the file</h4>
<p>EPiServerLog.config (or where your log4net configuration is)</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><log4net></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> ...</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <logger name=<span style="color: #006080;">"SqlClientLogger"</span>></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <level <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"DEBUG"</span> /></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </logger></pre>
<!--CRLF--></div>
</div>
<h4>Duration Filter</h4>
<p>Duration threshold can be set in the appSettings in the web.config file for the keys</p>
<p>SqlClientLoggerDurationFilterMs – a threshold for all logged database calls</p>
<p>SqlClientLoggerDurationWarnFilterMs - a threshold for trigger a warning message, the default is set to 500 ms</p>
<p><em>Example of setting duration threshold to 10 ms and warning threshold to 100 ms</em></p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><configuration></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> ...</pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <appSettings></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <add key=<span style="color: #006080;">"SqlClientLoggerDurationFilterMs"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"10"</span>/></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> <add key=<span style="color: #006080;">"SqlClientLoggerDurationWarnFilterMs"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"100"</span>/></pre>
<!--CRLF-->
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </appSettings></pre>
<!--CRLF--></div>
</div>
<h3>Remarks</h3>
<p>SqlClientLogger are not going to work with LinqToSql sense it using the SqlClient database providers directly without looking at the configuration. To trace LinqToSql calls please use <a href="/link/9d0a0d5a0fd045e2869d2c98356775ff.zip" target="_blank">LinqToSqlLogger.zip</a></p>
<h3>Example of output:</h3>
<p>In this example we can see the stored procedure “netPropertyTree” is executed without any arguments are executed by the user control in Templates/Public/Pages/DodumentList.aspx and its takes 685 milliseconds.</p>
<p><a href="/link/76f3591145694d9a867d8e1e1e0cb3af.jpg"><img style="display: inline; border-width: 0px;" title="SqlClientLogger" src="/link/102a8b3d24bb44a08002cca59ec6d0d7.jpg" border="0" alt="SqlClientLogger" width="351" height="326" /></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:087509c9-58eb-4175-bcca-2ffe1d04caf0" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Tool">Tool</a>,<a rel="tag" href="http://technorati.com/tags/Downloadable">Downloadable</a>,<a rel="tag" href="http://technorati.com/tags/Debugging">Debugging</a>,<a rel="tag" href="http://technorati.com/tags/SQL">SQL</a>,<a rel="tag" href="http://technorati.com/tags/.NET">.NET</a>,<a rel="tag" href="http://technorati.com/tags/Troubleshooting">Troubleshooting</a></div>
Handling images in EPiServer programmatically
/blogs/Mattias-Lovstrom/Dates/2010/8/Handling-images-in-EPiServer-programmatically/
2010-08-30T09:17:00.0000000Z
<p>The image editor in edit mode uses EPiServer.ImageLibrary to transform images with the great functionality of let another process then the web application to handle it. Senses the handlings of images are heavy both for the CPU and the memory this is a great feature to be able to configure the web site to do this in another process (or another machine). But it is not yet any documentation for it…</p> <p>I talked to the EPiServer development team that said the API is stable and they agree to publish it – so I hope it will come out in the SDK son, but when we wait for this documentation I can try to describe how it is working.</p> <h4>Assembly:</h4> <p>EPiServer.ImageLibrary</p> <h4>Classes:</h4> <p>EPiServer.ImageLibrary.ImageServiceClient – The image service client to access the service with </p> <h4>Methods:</h4> <p>public ImageServiceClient(</p> <p>        string endpointConfigurationName)</p> <p>The constructor of the end point that takes a string defining the endpoints name, the name used by EPiServer are "ImageServiceClientEndPoint" and can be used if you want the same service to handle the web sites images in the same process as the image editor use.</p> <p>public byte[] RenderImage(</p> <p>          byte[] imageBuffer, </p> <p>          IEnumerable<ImageOperation> operations, </p> <p>          string mimeType, </p> <p>          float zoomFactor, </p> <p>          int jpegQuality)</p> <h5>Returns:</h5> <p>A transformed image</p> <h5>Parameters:</h5> <p><em>imageBuffer </em>– the original image</p> <p><em>operations</em> – operations for transforming the image</p> <p><em>mimeType</em> – the mime type of the image. Defined mime type are image/png, image/bmp, image/gif, image/tiff, image/jpg, image/jpeg, image/pjpeg</p> <p><em>zoomFactor</em> - the zoom factor 1 means 100% </p> <p><em>jpegQuality</em> – the Jpeg quality (if mime types is image/jpg, image/jpeg or image/pjpeg) in %</p> <p>The image operations implemented are given by the enum EPiServer.ImageLibrary.ImageEditorCommand and has the following options:</p> <p><em>None</em> - No action</p> <p><em>Grayscale</em> - Convert image to grey scale</p> <p><em>Crop</em> - Crop image</p> <p><em>FlipX</em> - Flip the image on the X axis</p> <p><em>FlipY</em> - Flip the image on the Y axis</p> <p><em>Resize</em> - Resize the image</p> <p><em>Rotate</em> - Rotate the image</p> <h3>Sample code</h3> <p>This web page rotates an image 180 degrees given its virtual path.</p> <p>Example to flip support Jens up side down (on a EPiServer sample site)</p> <p><a href="http://localhost/FlipImage.aspx?ImageVirtualPath=/Global/StartPage/cms6_headerEN.jpg">http://localhost/FlipImage.aspx?ImageVirtualPath=/Global/StartPage/cms6_headerEN.jpg</a></p> <div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"> <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><%@ Page Language=<span style="color: #006080">"C#"</span> AutoEventWireup=<span style="color: #006080">"true"</span> Inherits=<span style="color: #006080">"System.Web.UI.Page"</span> %></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><%@ Import Namespace=<span style="color: #006080">"EPiServer.ImageLibrary"</span> %></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><%TransformAndViewImage(HttpContext.Current.Request[<span style="color: #006080">"ImageVirtualPath"</span>]); %></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> </pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><script runat=<span style="color: #006080">"server"</span>></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> TransformAndViewImage(<span style="color: #0000ff">string</span> imageVirtualPath)</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> {</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #008000">// Operations used to change the image</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> ImageOperation[] operations = <span style="color: #0000ff">new</span> ImageOperation[]{</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">new</span> ImageOperation(ImageEditorCommand.Rotate) { Angle = 180 }};</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">float</span> zoomFactor = 0.5f; <span style="color: #008000">//Percent / 100</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">string</span> imageMimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">int</span> jpegQuality = 100; <span style="color: #008000">//Percent</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> </pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #008000">// ImageServiceClientEndPoint is the same endpoint name that the image editor uses </span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> ImageServiceClient imageService = <span style="color: #0000ff">new</span> ImageServiceClient(<span style="color: #006080">"ImageServiceClientEndPoint"</span>);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> </pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #008000">//// Load the image and apply requested changes</span></pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">using</span> (System.IO.Stream fileStream = System.Web.Hosting.HostingEnvironment.VirtualPathProvider.GetFile(imageVirtualPath).Open())</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> {</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">byte</span>[] orginalImage = <span style="color: #0000ff">new</span> <span style="color: #0000ff">byte</span>[fileStream.Length];</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> fileStream.Read(orginalImage, 0, (<span style="color: #0000ff">int</span>)fileStream.Length);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> <span style="color: #0000ff">byte</span>[] imageBuffer = imageService.RenderImage(</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> orginalImage,</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> operations,</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> imageMimeType,</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> zoomFactor,</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> jpegQuality);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> </pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> Response.ContentType = imageMimeType;</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> Response.OutputStream.Write(imageBuffer, 0, (<span style="color: #0000ff">int</span>)imageBuffer.Length);</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> Response.End();</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> }</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"> }</pre>
<!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"></script></pre>
<!--CRLF--></div>
</div>
TDD for your custom page providers
/blogs/Mattias-Lovstrom/Dates/2010/8/TDD-for-your-custom-page-providers/
2010-08-26T15:09:22.0000000Z
<p>I have created a project for developing page providers with test driven development, and my idée is that it should be great if we have an open source project where many EPiServer developers can contribute so the developing of custom page providers gets easier. </p> <p><strong>So please sign-up to be a contributor of this project</strong>, by sending me a <a href="https://www.codeplex.com/site/login?RedirectUrl=http%3a%2f%2fwww.codeplex.com%2fsite%2fusers%2fcontact%2fMattiasLovstrom%3fOriginalUrl%3dhttp%3a%2f%2fwww.codeplex.com%2fsite%2fusers%2fview%2fMattiasLovstrom" target="_blank">CodePlex message</a>.</p> <p>My first version of the project includes 43 integration tests and is testing the version handling of PageData objects based on the earlier blog I wrote <a href="http://world.episerver.com/Blogs/Mattias-Lovstrom/Dates/2010/7/Version-state-graph-of-a-PageData-object/">Version state graph of a PageData object</a>. Those tests uses an own MemoryPageProvider (original written by Johan Björnfot) and doesn’t requires any EPiServer database. This page provider are only changed so it fulfills the requirements in the test cases, but I hope in the end it should be a really good example for writing a custom page provider that has similar functionality as EPiServers local page provider. </p> <h2>Requirements:</h2> <p>- EPiserver CMS 6</p> <p>- MS Test (or NUnit)</p> <h2>Download source:</h2> <p><a href="http://epipageprovidertests.codeplex.com/" target="_blank">PageProviderTests for EPiServer CMS</a> on CodePlex </p>
Caching object EPiServer is easier then you probably think
/blogs/Mattias-Lovstrom/Dates/2010/7/Caching-object-EPiServer-is-easier-then-you-probably-think/
2010-07-30T11:04:45.0000000Z
<p>It very often I see EPiServer sites using the CacheManager.RuntimeCache or ASP.NET runtime cache to store “hard to get objects” in - this will not update cached objects on remote site on a web farm.</p> <p>To get the remote events to update caches on all machine a recommend to use EPiServer.CacheManagers static methods</p> <p>// To add a cached object on the local machine</p> <p>EPiServer.CacheManagers.Add(…) </p> <p>// To get a local stored cache object</p> <p>EPiServer.CacheManagers.Get(…) </p> <p>// To remove a cache object on all machines on the web farm </p> <p>EPiServer.CacheManagers.Remove(…) </p> <p>And NEVER use the methods starting with RuntimeCache… (if you are not absolutely sure that you want to use the local cache)</p>
Version state graph of a PageData object.
/blogs/Mattias-Lovstrom/Dates/2010/7/Version-state-graph-of-a-PageData-object/
2010-07-08T14:10:00.0000000Z
<p>I got several questions about versioning of the PageData object in EPiServer (mostly by people writing their own page providers). So I decided to create a simple script to find out exactly what is changed when saving a page using the Save method in DataFactory with different SaveActions..</p>
<h2>State graph</h2>
<p><a href="/link/16c943d49cc54cd297934599f4228594.jpg"><img style="display: inline; border: 0px;" title="PageDataVersions_10" src="/link/78d45ca6cd44459bb698cb9101776a36.jpg" border="0" alt="PageDataVersions_10" width="366" height="509" /></a></p>
<h4>Comments to state graph</h4>
<h5>Vocabulary:</h5>
<p>Instance - means that properties in the saved instance are changed</p>
<p>Loaded – means the properties changed when loading a saved PageDataObject from the database.</p>
<p>FCV – ForceCurrentversion</p>
<p>FNV - ForceNewVersion</p>
<p> </p>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">Id</span></td>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">From state</span></td>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">Save <br />Action </span></td>
<td colspan="2" valign="top"><span style="font-size: xx-small; font-weight: bold;">Changed built-in properties</span></td>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">New <br />ver</span>.</td>
</tr>
<tr>
<td valign="top"><span style="font-size: xx-small;"> </span></td>
<td valign="top"><span style="font-size: xx-small;"> </span></td>
<td valign="top"><span style="font-size: xx-small;"> </span></td>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">Instance</span></td>
<td valign="top"><span style="font-size: xx-small; font-weight: bold;">Loaded</span></td>
<td valign="top"><span style="font-size: xx-small;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">1</span></td>
<td valign="top"><span style="font-size: 5pt;">Created </span></td>
<td valign="top"><span style="font-size: 5pt;">None <br />Reject</span></td>
<td valign="top"><span style="font-size: 5pt;">PageURLSegment <br />PagePeerOrder</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">2</span></td>
<td valign="top"><span style="font-size: 5pt;">Created</span></td>
<td valign="top"><span style="font-size: 5pt;">Save <br />Save|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageGUID<br />PageURLSegment <br />PagePeerOrder <br />PageLinkURL </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageGUID<br />PageURLSegment <br />PagePeerOrder <br />PageLinkURL <br />PageCreated <br />PageSaved <br />PageChanged </span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">3</span></td>
<td valign="top"><span style="font-size: 5pt;">Created</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn <br />CheckIn|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageGUID<br />PageWorkStatus <br />PageURLSegment <br />PagePeerOrder <br />PageLinkURL </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageGUID<br />PageWorkStatus <br />PageURLSegment <br />PagePeerOrder <br />PageLinkURL PageCreated <br />PageSaved <br />PageChanged </span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">4</span></td>
<td valign="top"><span style="font-size: 5pt;">Created</span></td>
<td valign="top"><span style="font-size: 5pt;">Publish <br />Publish|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageURLSegment <br />PagePeerOrder PageLinkURL </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageURLSegment <br />PagePeerOrder PageLinkURL <br /></span><span style="font-size: 5pt;">PageGUID <br />PageSaved <br />PageChanged <br />PageStartPublish <br />PagePendingPublish </span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">5</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut <br />CheckedIn <br />Published</span></td>
<td valign="top"><span style="font-size: 5pt;">None <br />None|FNV <br />None|FCV <br />Reject <br />Reject|FReject|FCV</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">6</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut</span></td>
<td valign="top"><span style="font-size: 5pt;">Save</span></td>
<td valign="top"> </td>
<td valign="top"><span style="font-size: 5pt;">PageSaved</span></td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">7</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut</span></td>
<td valign="top"><span style="font-size: 5pt;">Save|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br /></span><span style="font-size: 5pt;">PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">8</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut </span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn</span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus</span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus <br /><span style="font-size: 5pt;">PageSaved</span></span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">9</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut </span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">10</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut </span></td>
<td valign="top"><span style="font-size: 5pt;">Publish|FNV </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageSaved <br />PageChanged <br />PagePendingPublish <br />PageStartPublish</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">11</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut </span></td>
<td valign="top"><span style="font-size: 5pt;">Publish <br />Publish|FCV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus</span></td>
<td valign="top"><span style="font-size: 5pt;">"PageWorkStatus<br />PageSaved<br />PageChanged<br />PagePendingPublish<br />PageStartPublish</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">12</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut</span></td>
<td valign="top"><span style="font-size: 5pt;">Save <br />Save|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;">PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">13</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedIn</span></td>
<td valign="top"><span style="font-size: 5pt;">Save|FCV <br />CheckIn|FCV</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;">PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">14</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedIn</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn <br />CheckIn|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">15</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedIn</span></td>
<td valign="top"><span style="font-size: 5pt;">Publish <br />Publish|FNV </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PagePendingPublish <br />PageSaved <br />PageChanged <br />PageStartPublish</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">16</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedIn</span></td>
<td valign="top"><span style="font-size: 5pt;">Publish|FCV </span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus <br />PagePendingPublish <br />PageSaved <br />PageChanged <br />PageStartPublish</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">17</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedIn</span></td>
<td valign="top"><span style="font-size: 5pt;">Save <br />Save|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">18</span></td>
<td valign="top"><span style="font-size: 5pt;">Published</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn <br />CheckIn|FNV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">19</span></td>
<td valign="top"><span style="font-size: 5pt;">Published</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckIn|FCV</span></td>
<td valign="top"><span style="font-size: 5pt;">PageWorkStatus</span></td>
<td valign="top"><span style="font-size: 5pt;">PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">20</span></td>
<td valign="top"><span style="font-size: 5pt;">Published</span></td>
<td valign="top"><span style="font-size: 5pt;">Save <br />Save|FNV </span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus</span></td>
<td valign="top"><span style="font-size: 5pt;">PageLink <br />PageWorkStatus <br />PageSaved</span></td>
<td valign="top"><span style="font-size: 5pt;">X</span></td>
</tr>
<tr>
<td valign="top"><span style="font-size: 5pt;">21</span></td>
<td valign="top"><span style="font-size: 5pt;">CheckedOut <br />CheckedIn <br />Published</span></td>
<td valign="top"><span style="font-size: 5pt;">Delete</span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
<td valign="top"><span style="font-size: 5pt;">PageDeleted <br />PageParentLink <br /></span></td>
<td valign="top"><span style="font-size: 5pt;"> </span></td>
</tr>
</tbody>
</table>
<p>* = when checking in a published version with SaveAction.ForceCurrentVersion the status of the version is not saved to the database it only changes on the instance.</p>
<p>*1 = when checking in a new created version with the status of the version is not saved to the database it only changes on the instance.</p>
<h3>Default PageData objects values after creation with DataFactory.</h3>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top"><span style="font-size: 5pt;">ACL</span></td>
<td><span style="font-size: 5pt;">FullAccess Administrators</span> <br /><span style="font-size: 5pt;">Read Everyone</span></td>
<td><span style="font-size: 5pt;">Value created by </span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;">Properties</span></td>
<td><span style="font-size: 5pt;">PageTypeID</span></td>
<td><span style="font-size: 5pt;">From DataFactory->CreateDefaultPageData </span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageParentLink</span></td>
<td><span style="font-size: 5pt;">From DataFactory->CreateDefaultPageData </span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PagePendingPublish</span></td>
<td><span style="font-size: 5pt;">True</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageWorkStatus</span></td>
<td><span style="font-size: 5pt;">CheckedOut</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageFolderID</span></td>
<td><span style="font-size: 5pt;">DataBase</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageTypeName</span></td>
<td><span style="font-size: 5pt;">From DataFactory->CreateDefaultPageData </span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageMasterLanguageBranch</span></td>
<td><span style="font-size: 5pt;">Parent</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageLanguageBranch</span></td>
<td><span style="font-size: 5pt;">Parent</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageVisibleInMenu</span></td>
<td><span style="font-size: 5pt;">True</span></td>
</tr>
<tr>
<td> </td>
<td><span style="font-size: 5pt;">PageChildOrderRule</span></td>
<td><span style="font-size: 5pt;">1</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageStartPublish</span></td>
<td><span style="font-size: 5pt;">Now</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageCreated</span></td>
<td><span style="font-size: 5pt;">Now</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageLinkURL</span></td>
<td><span style="font-size: 5pt;">From DataFactory->CreateDefaultPageData </span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PagePeerOrder</span></td>
<td><span style="font-size: 5pt;">Database</span></td>
</tr>
<tr>
<td><span style="font-size: 5pt;"> </span></td>
<td><span style="font-size: 5pt;">PageShortcutType</span></td>
<td><span style="font-size: 5pt;">PageShortcutType.Normal</span></td>
</tr>
</tbody>
</table>