<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Content on Content Management &#187; Stellent</title>
	<atom:link href="http://contentoncontentmanagement.com/category/stellent/feed/" rel="self" type="application/rss+xml" />
	<link>http://contentoncontentmanagement.com</link>
	<description></description>
	<lastBuildDate>Tue, 16 Mar 2010 04:45:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<atom:link rel="next" href="http://contentoncontentmanagement.com/category/stellent/feed/?page=2" />

		<item>
		<title>Amazon S3 File Store Provider for Oracle UCM</title>
		<link>http://contentoncontentmanagement.com/2008/02/amazon-s3-file-store-provider-for-oracle-ucm/</link>
		<comments>http://contentoncontentmanagement.com/2008/02/amazon-s3-file-store-provider-for-oracle-ucm/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 20:12:34 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[File Store]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2008/02/29/amazon-s3-file-store-provider-for-oracle-ucm/</guid>
		<description><![CDATA[A few weeks ago when I heard that Amazon launched their SimpleDB service, I have to confess that Amazon wasn&#8217;t really on my radar as technology company.  Maybe the marketing hadn&#8217;t caught up with me,  but I pretty much just &#8230; <a href="http://contentoncontentmanagement.com/2008/02/amazon-s3-file-store-provider-for-oracle-ucm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago when I heard that Amazon launched their SimpleDB service, I have to confess that Amazon wasn&#8217;t really on my radar as technology company.  Maybe the marketing hadn&#8217;t caught up with me,  but I pretty much just buy books from Amazon&#8230;.web services?  Come on.  When I started poking around, I came to realize that Amazon has some really, really cool services and that I must have been under a rock.</p>
<p>The service that perked my interest the most though was their Simple Storage Service or (S3).  S3 is, as the name indicates, a very simple storage service that allows users to store files along with up to 2k of metadata in the Amazon cloud(buzz) storage system.  Files can be as large as 5gb and are accessible via SOAP or REST services using either HTTP or bit-torrent protocols.  It&#8217;s not a free service, but the cost is very reasonable(they provide an online <a href="http://calculator.s3.amazonaws.com/calc5.html">calculator</a> to estimate your cost&#8230;I think you&#8217;ll find they are very cheap.  Total development cost for this little project was 8 cents).</p>
<p><strong>Great, but what does S3 have to do with Content Management?</strong></p>
<p>S3 is essentially a content repository as a service.  Obviously it does not meet all the requirements for a full blown content management system, but from the perspective of the things you absolutely need in a content repository(security, metadata, storage) to the things you&#8217;d like to have(high availability, high reliability, unlimited storage) it really does make for an excellent repository. </p>
<p>I also really like the concept of being able to store the metadata with the content revision, it&#8217;s certainly not a requirement or even a common practice with most CMSs, but it just adds another layer of redundancy down the road.  I&#8217;m getting a little away from the theme of the post here, but the fella over at <a href="http://lopataru.wordpress.com/2008/02/02/cm-arhitecture-content-storage/">&#8220;Me and Content Management&#8221; had a great post on this concept</a> and I have to agree with his thoughts.</p>
<p>So would it be possibly to take the robust content repository features of S3 and bundle them with a content management system?  Use the content management system as the front end, managing user security, contribution, workflows, delivery&#8230;all the great things that content management systems do, but then also utilize S3 as the content repository leveraging it&#8217;s power.</p>
<p><strong>Enter Oracle UCM File Store Providers</strong></p>
<p>One of the neat features of Oracle UCM 10gr3(also formerly known as Stellent v8), was the new concept of File Store Providers.  Earlier versions of Stellent forced a simple yet elegant configuration where the original files were stored in a protected folder structure known as the vault and the web accessible versions which might just be a copy of the original or a multitude of transformed versions are stored in a &#8220;weblayout&#8221; folder.  This set up works very well and I am sure is still employed by most Content Server instances.</p>
<p>One of the problems with this design was that it did not offer many options as far as drive space, each file has at least one copy in the vault and in the weblayout, so you automatically have to double your space projections.   Probably not a huge problem for word and text content, but start using the content server for Digital Asset Management and space requirememts definitely rise on the priority list.  Enter 10gr3 with file store providers and you now have a variety of storage options.</p>
<ul>
<li>Content can be stored without a web version</li>
<li>Content can be stored in the database</li>
<li>Content can be stored half in the database half on the file system</li>
</ul>
<p>File Store providers are essentially a configurable abstraction layer from the content server to wherever you want to store your content.  The really neat thing about them though is that they appear to be a planned area of extensibility for the content server.</p>
<p><strong>My S3 File Store Provider</strong></p>
<p>A File Store provider for Amazon S3 seemed like such a logical enhancement to the content server that I had to give it a go.  Unlike service handlers, filters and all the other goodies in <a href="http://bexhuff.com">Bex&#8217;s</a> book and the <a href="http://www.oracle.com/technology/products/content-management/ucm/samples/index.html">How to Components</a>, I know of no best practices for File Store providers, so I&#8217;m a little on my own here.  Basically, if you use my project as a template, I am not sure I did it things &#8220;Oracle way&#8221; (or even if there is one).</p>
<p>In setting up the project I tried to figure out how Oracle configured and registered it&#8217;s JDBCStorage class, which is the primary object used in the database provider.  My set up consists of a class called SimpleStorage which implements the ExternalStorageImplementor and CommonStoreImplementor interfaces.  The File Store and classes are then registered in two tables: a mergeable table located in a component resources called FSStores and a non mergeable resultset found in the defaultFileStore&#8217;s provider.hda file(an install filter in the component handles the edit for you).  Most of the methods required by the interface are pretty straightforward; store here move there, etc&#8230;though there are handful of others that represented many hours of starting at the system audit window(addFilesystemPathInfo for one).</p>
<p>For the actual S3 communication I used and bundled an open source API called <a href="http://jets3t.s3.amazonaws.com/index.html">JetS3t</a>.  JetS3t is an excellent API which I would highly recommend for all your Java/S3 needs.  In addition to the API, JetS3t includes a little GUI called Cockpit.  I&#8217;ve included it with the API in the component so you can use to take a peek at your S3 buckets.  You&#8217;ll find it in the lib/bin folder.  Site note: Thanks JetS3t team&#8230;your API worked great.</p>
<p>From a sort of overview perspective the provider works as so:</p>
<ol>
<li>A user checks in a piece of content flagged for S3 storage</li>
<li>The vault content item is immediately stored on S3 along with up to 2k of it&#8217;s metadata(a config entry determines the fields to include)</li>
<li>If all content is to be stored in S3, the web version is then also stored on S3, otherwise it is written to the web layout folder</li>
<li>When the indexer attempts to access the vault file, it is retrieved and written out to the vault folder.</li>
<li>When a user views the content information page, or tries to access the web layout rendition, the web layout version is retrieved and saved to the web layout folder</li>
<li>A scheduled task then runs behind and deletes any vault or weblayout files which are stored on S3, but have not been accessed in a preset number of minutes.</li>
</ol>
<p>Content can also be moved to and from S3 by preforming an Update and just changing the storage rule.</p>
<p><strong>So what good is this thing?</strong></p>
<p>I am pretty excited about this component because I think it&#8217;s a concept with some potential.  Couple your existing content management system with the ultimate content repository.  You get unlimited enterprise class, scalable storage at a very reasonable cost without the infrastructure and staffing requirements that go along with it.  I like to imagine future content server instances using a limited &#8220;working&#8221; storage area storing only content being actively used with terabytes of content stored out on S3.  No more SANs or the endless list of non-technology related headaches they bring.</p>
<p>I think we could also envision scenarios where content is managed in S3 by a content management system, but then read and accessed directly by other systems, potentially on different sides of the planet?  My knee-jerk reaction to that is that it sounds like a bad practice, but if it&#8217;s secured properly, why not?</p>
<p>Bandwidth and performance are probably the two things that would need to be watched in this sort of model, but I just don&#8217;t think they would prove to be much of a problem for the majority of content items.  Large files could potentially pose a performance problem, but how much more noticeable would downloading a 25mb file be if it had to come down from S3 first?  I am not sure most users would notice.</p>
<p><strong>Something that may only interest me</strong> </p>
<p>S3 is SOAP/REST based service&#8230;Imagine that, a protocol/service being used to retrieve content?  I hope the JSR170/283 fans take notice.</p>
<p><strong>How to get it</strong></p>
<p>The component is available for download here.  I should be clear that this is one of the more complex projects I&#8217;ve developed for the site and it hasn&#8217;t exactly gone through any stringent QA testing(it&#8217;s just me).  Like all my sample projects, it&#8217;s provided without warranty or support and I recommend you test it out thoroughly on a dev environment first.  My development(and testing) environment was a WIN2003 server, Oracle UCM 10GR3, Oracle 11g DB environment, but  I am fairly confident that the component will run on just about any environment that the Content Server will.  We just might need to switch out some jars.</p>
<p>You may have noticed from the nav, that this site now has a forums section.  If you do encounter an issue, please feel free to post it so the support forum.  I&#8217;ll get an email and maybe be able to help.</p>
<p>Here&#8217;s the download link:</p>
<p><a rel="attachment wp-att-56" href="http://ContentOnContentManagement.com/2008/02/29/amazon-s3-file-store-provider-for-oracle-ucm/amazon-s3-file-store-provider-for-oracle-ucm/" title="Amazon S3 File Store Provider for Oracle UCM">Amazon S3 File Store Provider for Oracle UCM</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2008/02/amazon-s3-file-store-provider-for-oracle-ucm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Site Studio Tips, Tricks and Hacks</title>
		<link>http://contentoncontentmanagement.com/2007/12/site-studio-tips-tricks-and-hacks/</link>
		<comments>http://contentoncontentmanagement.com/2007/12/site-studio-tips-tricks-and-hacks/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 04:03:23 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[Fragments]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Site Studio]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/12/05/site-studio-tips-tricks-and-hacks/</guid>
		<description><![CDATA[I thought I would throw together a list of some of the things I do when setting up or even working with Site Studio.  Nothing too crazy or ground breaking, just some things I do to make life a little &#8230; <a href="http://contentoncontentmanagement.com/2007/12/site-studio-tips-tricks-and-hacks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I thought I would throw together a list of some of the things I do when setting up or even working with Site Studio.  Nothing too crazy or ground breaking, just some things I do to make life a little easier while I&#8217;m developing.</p>
<p><strong>Use Real Names for Section IDs</strong></p>
<p>Starting work on a new site, my first step is to go through and set up the known folder structure of the site.  This usually only takes a little while, but it helps me visualize how everything will work as I&#8217;m developing.  One thing that&#8217;s very important to me during this step and really throughout the build is to ensure I&#8217;m using logical names for the section ids and not just the default numerical ones that the designer will assign.  Down the road when debugging fragments or even reviewing content in the repository, numbers as section ids can be very confusing and will probably cost more time the it takes to just give them logical names.</p>
<p><strong>Create a Templates Folder</strong></p>
<p>When I am building out the site&#8217;s folder structure I also like to create a contributor-only templates section.  There I add a section for each template the site will use, actually creating the template and assigning it to the section during the process.  Often I will break up the template sections by how they are used, adding primary and secondary template parent sections.  If I have any html ready, I paste it in to the templates, adjusting any css, javascript or image paths during the process.</p>
<p>The templates folder allows me to get all my templates in and assigned to the site, but in a central location.  Templates can be added as a site asset, so this is a bit redundant, but having them in a folder allows me to assign region content, test custom properties and potentially navigation as well.</p>
<p><strong>Use Fragments for Images, Javascript and CSS</strong></p>
<p>When I start work on a site I usually have the luxury of receiving all of my html, css and some of my javascript pre-built from our user experience group which means I am not doing any serious HTML development in Site Studio other then some simple tweaks.  Since that&#8217;s the case, there&#8217;s no good reason for me to load what could be hundreds of individual site assets in to the content server.  It&#8217;s much easier just to load each set of assets in to fragments and then check them in that way.  In addition you can preserve any folder structure the assets already have, making tweaks to the template html a bit easier too.  Loading each asset individually is perfectly fine, but I thinks far easier and a little cleaner in the content server to load them in fragments.</p>
<p>When you save the fragments it&#8217;s assets are written out to the weblayout/fragments folder.  Once those assets are there, I just create a single &#8220;head&#8221; fragment which references the nessecary items from css and javascript assets, never actually referencing the css or javascript fragments.</p>
<p><strong>One Fragment per Library</strong> </p>
<p>I&#8217;m a fan of creating a new library for each fragment in my site.  I&#8217;ve done this differently in the past, creating more contextual libraries with multiple fragments, but I&#8217;m much happier now with the one fragment per library way.  Right off it&#8217;s much easier to manage fragment development with multiple developers.  Multiple fragments in a single library means that one developer can check out a library at a time thereby preventing other developers from working on other fragments in the same library.  </p>
<p>My biggest reasoning though has to do with change management.  If there are multiple fragments in a library all of them must be production ready to deploy.  You easily can find yourself in a situation where a change is occurring on one fragment, when a bug or another emergency change needs to happen on another.  If all the fragments are in the same library it can become a confusing mess.  If you stick with one per library you may have a few more libraries in the content server, but you&#8217;ll also have a great deal more flexibility.</p>
<p><strong>Debug that JSP</strong></p>
<p>This next part can be a little tricky and from an Oracle perspective is probably a bad practice.  Generally whenever I set up a new development environment also set up eclipse to debug the content server as well.  <a href="http://bexhuff.com/">Bex Huff&#8217;s </a>book &#8220;<a href="http://www.apress.com/book/view/1590596846">The Definitive Guide to Stellent Content Server Development</a>&#8221; details how to configure eclipse for debugging so I am not going to cover that process here.  What I will talk about though is that if you are running a version of Eclipse with JSP support, you can also debug JSP fragments and layout templates just as easily as filters and service handlers.</p>
<p>This sounds great, but you have to remember that if you&#8217;re debugging and editing your fragments through eclipse, ultimately you&#8217;re also doing it in the content server&#8217;s area of the file system.  If you&#8217;re not careful this is an excellent way to loose your work.  If anyone else edits your fragment library or if they deploy your fragment through the Site Studio fragment administration page, any changes you&#8217;ve made on the file system will be immediately overwritten.  To counter the threat of loosing my changes, I make sure I always check out each item I&#8217;m debugging and frequently save my changes back to the fragment using the designer.  All that said, being able to debug with eclipse can make development so much easier the rewards far outweigh the risks. </p>
<p>To set up JSP debugging, first follow the steps in Bex&#8217;s book to set up your eclipse environment and then just link the weblayout folder to your content server project.  From there you&#8217;ll find your fragment JSPs in the weblayout/groups/[your jsp enabled security group]/WEB-INF/fragments/[fragment name] folder.</p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/12/site-studio-tips-tricks-and-hacks/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OpenWorld &#8211; Monday</title>
		<link>http://contentoncontentmanagement.com/2007/11/openworld-monday/</link>
		<comments>http://contentoncontentmanagement.com/2007/11/openworld-monday/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 22:10:05 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[Content Management]]></category>
		<category><![CDATA[OpenWorld]]></category>
		<category><![CDATA[Site Studio]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/11/13/openworld-monday/</guid>
		<description><![CDATA[Very fun stuff so far here at OpenWorld.  Not too much to report from Sunday evening, basically the standard kick off stuff.  Monday though was the start of sessions and when we started seeing what the former Stellent folks had &#8230; <a href="http://contentoncontentmanagement.com/2007/11/openworld-monday/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Very fun stuff so far here at OpenWorld.  Not too much to report from Sunday evening, basically the standard kick off stuff.  Monday though was the start of sessions and when we started seeing what the former Stellent folks had been working on.</p>
<p>Some of the highlights so far:</p>
<p>1. There is a new web-based Site Studio editor coming out in the next few months to replace the existing activex one.  Personally this was huge for me as the IE only aspect of the existing editor has always been a pain point with some of my clients who prefer macs.  In general the editor was pretty slick.  It appears as a pop-up when you click the in-context edit button and has a tabbed interface allowing you to contribute content on one tab and update metadata on the other.  They&#8217;ve also added some additional validation which can be configured to require specific standards compliance when contributing.</p>
<p> 2. The WCMA project appears to now be called Open WCM and it looks to be very cool.  Not much of a demo this time, but more of an architectural discussion.  The concept is to allow web content management delivery on any platform, using any language..hence the open part.  In addition they also would like to take the content server out of the delivery environment, moving to more of a hybrid publishing model, which can be consumed by your web app.</p>
<p> 3. During the digital asset management session, we got a nice demo of what you can do with the Folios component that was released just last week.  Folios is very, very cool new feature which allows you to relate several content items together and have them become an additional new item in the system.  You&#8217;re new folio then can be associated with metadata, sent through workflow for approvals or, depending on the formats, published as a compound document.</p>
<p>Also very cool are some of ideas on how they plan on integrating Content Server with the other application in the Fusion Middleware stack.  There seems to be a big focus on delivering personalized, targeted content using Seibel profiles and Oracle&#8217;s Real Time decisioning application(part of the BI suite).  All of that is just conjecture at this point, but still very cool to hear they were working on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/11/openworld-monday/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Script.aculo.us / Prototype Update</title>
		<link>http://contentoncontentmanagement.com/2007/11/scriptaculous-prototype-update/</link>
		<comments>http://contentoncontentmanagement.com/2007/11/scriptaculous-prototype-update/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 13:35:40 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/11/10/scriptaculous-prototype-update/</guid>
		<description><![CDATA[Script.aculo.us has a released a new version of it&#8217;s popular Javascript framework.  They are now on version 1.8, but most importantly they bundle a new Prototype version, 1.6. From what I read in the change log, Script.aculo.us has added some &#8230; <a href="http://contentoncontentmanagement.com/2007/11/scriptaculous-prototype-update/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://Script.aulo.us">Script.aculo.us</a> has a released a new version of it&#8217;s popular Javascript framework.  They are now on version 1.8, but most importantly they bundle a new <a href="http://www.prototypejs.org">Prototype </a>version, 1.6.</p>
<p>From what I read in the change log, Script.aculo.us has added some pretty cool features, but what I am most excited about is that Prototype 1.6 includes a <a href="http://www.prototypejs.org/learn/json">JSON parser</a> which was not available in the previous version.</p>
<p>I&#8217;ve updated the Oracle / Stellent Content Server script.aculo.us component available on this site.</p>
<p>Feel free to download it here:</p>
<p><a rel="attachment wp-att-31" href="http://ContentOnContentManagement.com/2007/11/10/scriptaculous-prototype-update/scriptaculous-component-for-oracle-stellent-content-server/" title="Script.aculo.us Component for Oracle / Stellent Content Server">Script.aculo.us Component for Oracle / Stellent Content Server</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/11/scriptaculous-prototype-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IDOC Developer Interface for Stellent / Oracle Content Server</title>
		<link>http://contentoncontentmanagement.com/2007/11/idoc-developer-interface-for-stellent-oracle-content-server/</link>
		<comments>http://contentoncontentmanagement.com/2007/11/idoc-developer-interface-for-stellent-oracle-content-server/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 02:36:19 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[IDOC]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/11/07/idoc-developer-interface-for-stellent-oracle-content-server/</guid>
		<description><![CDATA[I’ve been a little busy the past few weeks and that’s kept me from posting new stuff on the blog.  This past weekend though I traveled to California for a wedding, leaving me 10 or so hours of time in &#8230; <a href="http://contentoncontentmanagement.com/2007/11/idoc-developer-interface-for-stellent-oracle-content-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I’ve been a little busy the past few weeks and that’s kept me from posting new stuff on the blog.  This past weekend though I traveled to California for a wedding, leaving me 10 or so hours of time in the air to work on a new Stellent / Oracle component I’ve been thinking about for a little while.</p>
<p><o></o></p>
<p>The component adds an admin-accessible interface for developing and executing IDOC Script.  Users can enter their script in to the very simple editor(just a textarea) and then execute it.  The resulting HTML is displayed in another area below the script editor.  Where I think it gets a little cooler though, is that it also outputs all local values created in the binder as well all resultset values in to windows-like box areas off to the side.  In addition you can also run the script as another user in the system to test out permissions and security. (NOTE: <strong>nice for development but probably bad for production</strong> so please be careful where you deploy this).</p>
<p><o></o>You essentially get a pretty clear view of what’s occurring with your script, but without restarting the server, saving a resource file or even refreshing a page.  The interface uses AJAX calls to execute the script and the parse the response.  The result is a responsive interface and what I think is a smooth experience…no jumping around to different windows or adding output variables to check values.<o></o></p>
<p style="margin: 0in 0in 0pt" class="MsoNormal"><img width="473" src="http://contentoncontentmanagement.com/wp-content/uploads/2007/11/idocdeveloper.png" alt="IDOC Developer Screen Shot" height="329" /></p>
<address>Screen shot of how a doc info script might look using the interface.</address>
<p>The app leverages the <a href="http://script.aculo.us">script.aculo.us</a>/<a href="http://www.prototypejs.org/">prototype</a> javascript frameworks to handle the AJAX callbacks as well as the parsing and rendering of the data in the windows.  From an application architecture perspective, I basically added an admin only service called RUN_DEV_IDOC, which in turn calls a custom service handler class.  That class then creates and calls a new “stub” service to open up “clean” data binder and pager merger objects under the account of the requested user.  After that the IDOC script is executed, the results are returned and the data binder is parsed for local data and result sets.  All of that data is then wrapped in XML and dropped back in to the RUN_DEV_IDOC’s as a local data field.  The server then sends the response back to the page, where it’s parsed using javascript and used to create the output on the page.<o></o></p>
<p>My sort of grandiose idea on the plane was to create an editor with breakpoints, variable inspecting and watches.  I still may come back to that with a later updated version, but unfortunately the level of effort on that was a little more than two cross country trips.  Still this was a pretty fun app to work on and I personally look at it as unfinished, so check back in a few weeks and hopefully I’ll be able to add more to it.  Also if you have any ideas, I would love to hear them.<o></o></p>
<p>Feel free to download the component here:</p>
<p style="margin: 0in 0in 0pt" class="MsoNormal"><a rel="attachment wp-att-25" href="http://ContentOnContentManagement.com/2007/11/07/idoc-developer-interface-for-stellent-oracle-content-server/idoc-developer-interface/" title="IDOC Developer Interface">IDOC Developer Interface</a></p>
<p>You will also need the script.aculo.us framework, which I’ve already wrapped in a component and can be downloaded here:</p>
<p><a href="http://ContentOnContentManagement.com/2007/11/10/scriptaculous-prototype-update/scriptaculous-component-for-oracle-stellent-content-server/">Script.aculo.us Component for Oracle/Stellent<o></o> </a><o></o> <o></o> </p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/11/idoc-developer-interface-for-stellent-oracle-content-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>YUI Pop Up Preview Component</title>
		<link>http://contentoncontentmanagement.com/2007/10/yui-pop-up-preview-component/</link>
		<comments>http://contentoncontentmanagement.com/2007/10/yui-pop-up-preview-component/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 02:59:57 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[Dynamic Converter]]></category>
		<category><![CDATA[IDOC]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/10/21/yui-pop-up-preview-component/</guid>
		<description><![CDATA[I&#8217;ve been meaning to put this component together for some time. Whenever I look for a document or even a revision of a document in Stellent, I usually use the (HTML) dynamic conversion link as sort of a preview button &#8230; <a href="http://contentoncontentmanagement.com/2007/10/yui-pop-up-preview-component/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been meaning to put this component together for some time. Whenever I look for a document or even a revision of a document in Stellent, I usually use the (HTML) dynamic conversion link as sort of a preview button to see if I have what I&#8217;m looking for. The only problem is that the dynamic conversion link takes you to the output&#8217;s page requiring you to hit the browser&#8217;s back button to get back to the search results or content information pages. What I&#8217;ve been looking for is a little pop up window to appear over those pages letting me preview the dynamic conversion&#8217;s results.</p>
<p>This sample project utilizes the YUI library to create that pop up as well as to provide a &#8220;slide&#8221; effect seen when the pop up appears and disappears. I was hoping to use a variety of YUI features, but unfortunately this example turned out to be extremely simple. It uses a similar &#8220;Panel&#8221; object to the one used in the <a href="http://contentoncontentmanagement.com/2007/10/06/security-overrides-component-introduction/security-overrides-component-for-stellent-oracle/">Security Overrides example</a>, however as you&#8217;ll see from this project it does not make any Connection Manager based AJAX calls like that one does.</p>
<p><span id="more-23"></span>This component has a couple IDOC resource overrides to add Pop Up Preview links to the Stellent UI, but in terms of actual code there&#8217;s a single Javascript class with really just a single major method, callPopUpPreview:<br />
<code><br />
this.callPopUpPreview = function(id,name){<br />
 //set the dID<br />
 _dID = id;<br />
 //set the dDocName<br />
 _dDocName = name;</code><code>//start the build of our URL<br />
 var url = _httpCgiPath + "?IdcService=GET_DYNAMIC_CONVERSION"</code><code>//if we have a dID add it to the url<br />
 if(_dID)<br />
  url += "&amp;dID=" + _dID;</code><code>//if we have a dDocName add it to the url<br />
 if(_dDocName)<br />
  url += "&amp;dDocName=" + _dDocName;</code><code>//if we have a revisionselectionmethod add it to the url<br />
 if(_RevisionSelectionMethod)<br />
  url += "&amp;RevisionSelectionMethod=" + _RevisionSelectionMethod;</code><code>//if we have a conversion template add it to the url<br />
 if(_conversionTemplate)<br />
  url += "&amp;conversionTemplate=" + _conversionTemplate;</code><code>//This line create the panel object<br />
 YAHOO.popUpPreview.container.popupPreview = new YAHOO.widget.Panel("popUpPreviewDiv",<br />
 { //set the width and hieght to the values set in the class<br />
  width : _width + "px",<br />
  height : _height + "px",<br />
  //the pop up should be fixed to the center of the screen<br />
  fixedcenter : true,<br />
  //show a close link<br />
  close:true,<br />
  //don't allow dragging of the pop up<br />
  draggable:false,<br />
  //the panel starts out invisible<br />
  visible:false,<br />
  //this line sets the transision effect, where we are using the slide<br />
  //effect and setting it's duration to .25 seconds.<br />
  effect:[{effect:YAHOO.widget.ContainerEffect.SLIDE,duration:0.25}]<br />
  } );</code><code>//Sets the header / menu bar of the pop up<br />
 YAHOO.popUpPreview.container.popupPreview.setHeader("Dynamic Conversion Preview");<br />
 //Sets the body, note the use of the iframe to load the content. The onload event calls the handleiFrameLoad method to display the pop up<br />
 YAHOO.popUpPreview.container.popupPreview.setBody("&lt;iframe id='popUpPreviewBody' onload='Javascript:" + _objectName + ".handleiFrameLoad();' src='" + url + "'&gt;&lt;/iframe&gt;");<br />
 //render the panel to the page. this just starts the dynamic conversion call<br />
 YAHOO.popUpPreview.container.popupPreview.render(document.body);<br />
}}<br />
</code><br />
The code does not come through so great on the blog, but what&#8217;s occurring is the URL to the dynamic conversion is assembled and then placed in the &#8220;src&#8221; attribute of an iFrame which is then written to a YUI panel object.  Why the iFrame?  Well when I started I intended to make more of a traditional AJAX call to get the dynamic conversion.  The problem though is that the dynamic converter creates a full HTML document complete with head and body elements, which can wreak havoc on the panel&#8217;s divs.  Using the iFrame let&#8217;s us encapsulate the dynamic conversion output in it&#8217;s own private little window and protects the rest of our panel and page from the variety of HTML that may be rendered in it. </p>
<p>The callPopUpPreview method takes care of creating the URL to the dynamic conversion, creating the panel object and adding the iFrame to it, but it does not actually cause the panel display on the page.  Dynamic conversions can sometimes take a second or two to render and it&#8217;s a much nicer effect if we wait for the conversion before displayiing the pop up window.  So instead of just rendering the panel to the page, the onload event for the iFrame is used to call another method(handleiFrameLoad) in the popUpPreview class that can display the pop up once everything is loaded.  This way the pop up window will only appear once the conversion is complete.</p>
<p>Adding the actual links to the content server&#8217;s search results and content information pages requires a couple of resource include overrides: </p>
<p>Append an additional PopupProps row in the extra_setup_search_results_action_popups include to add a links in the Search Results.<code><br />
&lt;@dynamichtml extra_setup_search_results_action_popups@&gt; &lt;$exec rsAppendNewRow("PopupProps")$&gt;<br />
&lt;$exec setValue("PopupProps", "label", "Pop Up Preview")$&gt;<br />
&lt;$exec setValue("PopupProps", "function", "Javascript:popUp.callPopUpPreview('&lt;$url(dID)$&gt;','&lt;$url(dDocName)$&gt;');")$&gt;<br />
&lt;$exec setValue("PopupProps", "ifClause", "dcShowExportLink()")$&gt;<br />
&lt;$exec setValue("PopupProps", "class", "document")$&gt; &lt;$exec setValue("PopupProps","id", "popuppreview")$&gt;<br />
&lt;@end@&gt;<br />
</code><br />
The docinfo_conversion_link include can be used to add a link on the Content Information page<code><br />
&lt;@dynamichtml docinfo_conversion_link@&gt;<br />
&lt;$include super.docinfo_conversion_link$&gt;<br />
&lt;tr&gt;&lt;td nowrap align="right"&gt;&lt;span class="infoLabel"&gt;&lt;/span&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;span class="tableEntry"&gt;<br />
&lt;a href="Javascript:;" mce_href="Javascript:;" onclick="Javascript:popUp.callPopUpPreview('&lt;$dID$&gt;','&lt;$dDocName$&gt;');"&gt;Pop Up Preview&lt;/a&gt;</code><code>&lt;/span&gt;<br />
&lt;/td&gt;&lt;/tr&gt;<br />
&lt;@end@&gt;<br />
</code></p>
<p>Also of note is that I used a new editor to create the popuppreview.js file. Rather than my standard text editor, I gave Adobe&#8217;s <a href="http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/">JSEclipse</a> plug in a try. I am not sure I was using it correctly as the experience was not that much different from my text editor(only in eclipse), but as I figure out how to best use it&#8217;s features I&#8217;ll keep you informed.</p>
<p>The Pop Up Preview component is available for download here:</p>
<p><a rel="attachment wp-att-24" href="http://ContentOnContentManagement.com/2007/10/21/yui-pop-up-preview-component/pop-up-preview-component/" title="Pop Up Preview Component">Pop Up Preview Component</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/10/yui-pop-up-preview-component/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Yahoo Terms Extractor for Stellent / Oracle</title>
		<link>http://contentoncontentmanagement.com/2007/10/yahoo-terms-extractor-for-stellent-oracle/</link>
		<comments>http://contentoncontentmanagement.com/2007/10/yahoo-terms-extractor-for-stellent-oracle/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 03:55:38 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[ECM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Metadata]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>
		<category><![CDATA[Dynamic Conversion]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/10/15/yahoo-terms-extractor-for-stellent-oracle/</guid>
		<description><![CDATA[How cool is Yahoo?  I was poking around their developer network page after looking up some YUI documentation and I came across their Terms Extraction service.  The service allows you to post content to it and return a list of &#8220;significant &#8230; <a href="http://contentoncontentmanagement.com/2007/10/yahoo-terms-extractor-for-stellent-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>How cool is Yahoo?  I was poking around their <a href="http://developer.yahoo.com/search/content/V1/termExtraction.html">developer network</a> page after looking up some YUI documentation and I came across their <a href="http://developer.yahoo.com/search/content/V1/termExtraction.html">Terms Extraction</a> service.  The service allows you to post content to it and return a list of &#8220;significant words or phrases&#8221; ordered by importance.  I ran a couple test posts and sure enough it did a pretty good job figuring out the relevant terms and ranking them more or less how I probably would.  I assume it&#8217;s the same or at least a similar indexer to the one Yahoo&#8217;s own search probably uses.</p>
<p>However it&#8217;s done, I think their server has a huge amount of potential from an ECM perspective.  Nearly every client of mine has asked about offering some level of automation to their meta-tagging while contributing content.  While many of the enterprise vendors offer applications to automatically tag content, I find that they are usually focused on batch loading or migrating content, rather than assisting the every day contributor.  In my ideal world I&#8217;d love to see contribution forms come up pre-loaded with system recommended meta-data, allowing contributors to make only necessary edits and then simply approve thier submissions.</p>
<p>I was pretty pumped when I ran across Yahoo&#8217;s service, so I decided to throw together a quick component to take advantage of it for  Stellent / Oracle Universal Content Server.  Nothing too crazy here, the component basically adds an additional option to the Content Action menu called &#8220;Add Yahoo Terms&#8221;, which executes a service called &#8220;ADD_YAHOO_TERMS&#8221;.</p>
<p>The service then does the following:</p>
<ul>
<li>Performs a dynamic conversion on the document</li>
<li>Reads the contents of the resulting HCST output file</li>
<li>Posts the HTML to Yahoo&#8217;s Terms Extraction service</li>
<li>Parses(XML) the terms returned</li>
<li>Creates a comma delimited list of the best terms</li>
<li>Saves the list to the binder in a predesignated memo meta-data field(the default is xComments)</li>
</ul>
<p>The remainder of the service is basically the GET_UPDATE_FORM service, which brings up the update form.  Since the terms are in the binder as a meta-data field, the update forms comes up pre-loaded with the document&#8217;s meta-data as well as the Yahoo terms in the pre-designated field.  From there on you are on the standard Stellent / Oracle update form, so saving will commit your changes.</p>
<p>It&#8217;s a pretty simple integration, nothing revolutionary, but I think it&#8217;s a decent example of how one might integrate Stellent with Yahoo&#8217;s service.</p>
<p>Feel free to download the component here:</p>
<p><a rel="attachment wp-att-20" href="http://ContentOnContentManagement.com/2007/10/15/yahoo-terms-extractor-for-stellent-oracle/yahoo-terms-extractor-integration-for-stellent-oracle/" title="Yahoo Terms Extractor Integration for Stellent / Oracle">Yahoo Terms Extractor Integration for Stellent / Oracle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/10/yahoo-terms-extractor-for-stellent-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Security Overrides Component &#8211; Introduction</title>
		<link>http://contentoncontentmanagement.com/2007/10/security-overrides-component-introduction/</link>
		<comments>http://contentoncontentmanagement.com/2007/10/security-overrides-component-introduction/#comments</comments>
		<pubDate>Sun, 07 Oct 2007 01:26:08 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[IDOC]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/10/06/security-overrides-component-introduction/</guid>
		<description><![CDATA[I believe that IDOC script gets a bad rap.  On more then one occasion I have witnessed eyes roll when we began explaining how the Stellent scripting language can be used during an implementation.  It&#8217;s a natural reaction as most developers would &#8230; <a href="http://contentoncontentmanagement.com/2007/10/security-overrides-component-introduction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I believe that IDOC script gets a bad rap.  On more then one occasion I have witnessed eyes roll when we began explaining how the Stellent scripting language can be used during an implementation.  It&#8217;s a natural reaction as most developers would probably rather work in a more mainstream language then learning some new proprietary, sort of &#8221;cold-fusion&#8221; looking one.  And while I&#8217;m sure there are quite a few implementations done with 100% IDOC-based customizations, my personal preference is to use Java/JSP as the primary languge, with use of IDOC for presentation and configuration scripting.  In this ancillary role I&#8217;ve grown quite an affinity for the IDOC and as I&#8217;ll demonstrate in the example component(Security Overrides), try to IDOC-enable my Java-based components and customizations.</p>
<p>The concept behind the example component, Security Overrides, is an IDOC enabled version of the Security Filter example, which is part of Stellent&#8217;s HowToComponents Bundle.  Stellent&#8217;s SecurityFilter component is an example of how to use the alterUserCredentials filter to change the rights of a user during a specific service request.  The primary example is the BlackHole check in example which grants everyone write access when checking in an item using the Black Hole service.</p>
<p>Creating security filters or overrides with the alterUserCredentials can be a tricky proposition.  Depending on your implementation, you&#8217;re basically altering the behavior of the content server with no real visible indication that it&#8217;s being done.  In addition the alterUserCredentials filter is called with every service call, so it&#8217;s a great place to cause a performance problem with inefficient code, or just by adding multiple security filter components.</p>
<p>So how does the Security Overrides component and more importantly IDOC help the situation?  The component creates a central, administrator controlled, interface for creating and managing overrides. What&#8217;s more, each service configured has an IDOC script prompt, which is used in the final decisioning of whether to apply the override or not.  For example if an administrator desired to only allow the &#8220;sysadmin&#8221; account access to the providers page, they would configure an override  that removed all permissions for the &#8220;GET_ALL_PROVIDERS&#8221; service.  In the IDOC prompt script would be added to evaluate the dUser variable, ensuring it was the &#8220;sysadmin&#8221; account.</p>
<p>The beautiful thing here is that because the component is processing IDOC for it&#8217;s final decsioning logic, the override becomes extremely simple to alter as well as include addtional actions down the road if desired.  And as you&#8217;ll see in the code, creating a component which can support IDOC scripting takes very little additional work.</p>
<p>In addition to integrating IDOC scripting in a Java-based component, the component also demonstrates:</p>
<ul>
<li>Creating an installation filter, which creates a database table after start up</li>
<li>Working with the YUI library to create a model, pop-up form as well as creating and handling AJAX requests</li>
<li>The run-time creation and altering of environment variables</li>
<li>Customizing the Stellent / Oracle interface</li>
</ul>
<p>As you might have guessed from the word &#8220;Introduction&#8221; in the title, I plan on making the review of this component a multi-part series, rather then one long post.  The component along with it&#8217;s source code will be available for download <a rel="attachment wp-att-16" href="http://ContentOnContentManagement.com/2007/10/06/security-overrides-component-introduction/security-overrides-component-for-stellent-oracle/">here</a>.</p>
<p>I should also mention that Oracle has a fully supported component available for download which has some of the same features as this one.  It&#8217;s called the &#8220;Need to Know&#8221; component and if you are considering using my example in a production system, please take a look at their component first.</p>
<p><a rel="attachment wp-att-16" href="http://ContentOnContentManagement.com/2007/10/06/security-overrides-component-introduction/security-overrides-component-for-stellent-oracle/">Security Overrides Component for Stellent / Oracle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/10/security-overrides-component-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET API For Stellent / Oracle Content Server</title>
		<link>http://contentoncontentmanagement.com/2007/09/net-api-for-stellent-oracle-content-server/</link>
		<comments>http://contentoncontentmanagement.com/2007/09/net-api-for-stellent-oracle-content-server/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 03:37:21 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Stellent]]></category>
		<category><![CDATA[Web Service]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/09/30/net-api-for-stellent-oracle-content-server/</guid>
		<description><![CDATA[Stellent / Oracle Content Sever has a wonderful component which allows you wrap a WSDL around any of the app&#8217;s services.  It&#8217;s pretty easy to use and has made Visual Studio(at least for me), my preferred IDE for writing ad-hoc &#8230; <a href="http://contentoncontentmanagement.com/2007/09/net-api-for-stellent-oracle-content-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Stellent / Oracle Content Sever has a wonderful component which allows you wrap a WSDL around any of the app&#8217;s services.  It&#8217;s pretty easy to use and has made Visual Studio(at least for me), my preferred IDE for writing ad-hoc and batch applications.  In fact I have to confess that I&#8217;ve found it much simpler to write simple batchloading programs in .NET rather then using Stellent&#8217;s own batchloading tool.</p>
<p>Despite my personal fandom of the WSDL component, it does have a couple drawbacks:</p>
<p>1.  Each web service is in it&#8217;s own namespace.  This makes it a bit of a pain when working with multi-step operations, for instance if you&#8217;re calling the DocInfo service with a WSDL it will return all custom metadata in an array of IdcProperty objects.  If you&#8217;re then planning on updating that item or checking in another related item, you&#8217;ll have to copy all your original IdcProperty objects over to new IdcProperty objects specific to the Checkin/Update service&#8217;s namespace.</p>
<p>2.  Aside from the seven or so pre-defined services, you have to define any additional WSDLS you wish to consume.  Not the end of the world, but it does make the development a little tricker when you need ensure your WSDL exists on each instance you connect to and that it&#8217;s defined to your specs.</p>
<p>There is an alternative; rather then using the WSDLs, you could just add IsSoap=1 to the end of any service call, which will then return you request in SOAP format.  Of course there&#8217;s no friendly WSDL to create all your proxy classes, leaving the SOAP parsing up to you.  In addition uploading files can also be pretty tricky as you essentially need to replicate a multi-part/form upload.</p>
<p>To make my life(and potentially yours) a little easier, I&#8217;ve been experimenting and ultimately developed a simple .NET API for the Stellent / Oracle Content Server.  Modeled after the Stellent&#8217;s Java-based idcserver package, the API can make IsSoap service calls to retrieve information, or just straight HTTP calls when downloading files.  In addition since all calls are made as multipart-form/data posts, one to many files may be uploaded and checked in.</p>
<p><span id="more-13"></span>The API has two public classes, the ServerBean which is the primary interface to the API and the ServerResultSet class which acts and behaves like a Stellent Resultset.  If you think you&#8217;ve seen those class names before, it&#8217;s because you have.  I tried to replicate the functionality of the Content Server&#8217;s idcserver package in .NET.</p>
<p>Here&#8217;s an example of a search results call using the API:</p>
<p><code>//create the object<br />
ServerBean sb = new ServerBean();<br />
//set the url to the content server<br />
sb.ContentServerURL = "http://localhost/stellent/idcplg";<br />
//set our credentials<br />
sb.ContentServerCredentials = new System.Net.NetworkCredential("sysadmin", "idc");<br />
//set the service<br />
sb.putLocal("IdcService", "GET_SEARCH_RESULTS");<br />
//pass in our query<br />
sb.putLocal("QueryText", "dDocTitle &lt;substring&gt; <substring></substring>`Test`");<br />
//execute the service<br />
sb.executeService();<br />
//get our search results<br />
ServerResultSet SearchResults = sb.getResultSet("SearchResults");<br />
if (SearchResults != null)<br />
{<br />
  //loop through the search results<br />
  for(SearchResults.first();SearchResults.isRowPresent();SearchResults.next()){<br />
  //write the content id<br />
  System.Diagnostics.Debug.WriteLine(SearchResults.getStringValue("dDocName"));<br />
  }<br />
}</code> </p>
<p>As you can see the syntax is extremely similar to the Content Server&#8217;s idcserver package.  Anyone familier with JSP development in the content server, should find it very familiar.</p>
<p>Uploading files is also very easy.  I&#8217;ve overriden the &#8220;putLocal&#8221; method so that it can accept a string or a FileInfo object as a value argument.<br />
<code><br />
//create the object<br />
ServerBean sb = new ServerBean();<br />
//set our url<br />
sb.ContentServerURL = "http://localhost/stellent/idcplg";<br />
//set our credentials<br />
sb.ContentServerCredentials = new System.Net.NetworkCredential("sysadmin", "idc");<br />
//service is a check in new<br />
sb.putLocal("IdcService", "CHECKIN_NEW");<br />
//set the title and required arguments<br />
sb.putLocal("dDocTitle", "NET TEST CHECKIN");<br />
sb.putLocal("dDocType", "Document");<br />
sb.putLocal("dDocAuthor", "sysadmin");<br />
sb.putLocal("dSecurityGroup", "Public");<br />
//create to fileinfo objects based on some local files<br />
System.IO.FileInfo File1 = new System.IO.FileInfo(@"C:\Test Spreadsheet.xls");<br />
System.IO.FileInfo File2 = new System.IO.FileInfo(@"C:\Test Text File.txt");<br />
//add the files<br />
sb.putLocal("primaryFile", File1);<br />
sb.putLocal("alternateFile", File2);<br />
//execute the service<br />
sb.executeService();<br />
//check our status<br />
Console.WriteLine(sb.getLocal("StatusMessage"));<br />
</code></p>
<p>Since we also need to download files or retrieve raw results like a dynamic conversion, the underlying executeServiceEx method which is called by the executeService method and also returns a raw stream from the Content Server&#8217;s response is a public method.  Calling executeServiceEx directly will skip the lines of code realted to parsing the server&#8217;s response.</p>
<p>In this example, we perform a dynamic conversion and write the raw HTML to the console window</p>
<p><code>//Create the object<br />
ServerBean sb = new ServerBean();<br />
//set the url<br />
sb.ContentServerURL = "http://localhost/stellent/idcplg";<br />
//set our credentials<br />
sb.ContentServerCredentials = new System.Net.NetworkCredential("sysadmin", "idc");<br />
//set the dynamic conversion<br />
sb.putLocal("IdcService", "GET_DYNAMIC_CONVERSION");<br />
//set our required parameters<br />
sb.putLocal("dDocName", "[Content ID]");<br />
sb.putLocal("RevisionSelectionMethod", "LatestReleased");<br />
//call executeServiceEx, which returns the raw stream<br />
Stream resultStream = sb.executeServiceEx();<br />
//create a reader<br />
System.IO.StreamReader reader = new System.IO.StreamReader(resultStream);<br />
//read the stream<br />
String resultString = reader.ReadToEnd();<br />
//write it to the console<br />
Console.Write(resultString);</code></p>
<p><code></code>That&#8217;s the basic gist on how to work with the API, I will be following up this post with one going through the actual code.  Like any of my code examples, the API is provided without support or warrenty, but I plan keeping the API as sort of a a personal ongoing project so you can expect future versions and enhancements.  If you have any questions or ideas please let me know.  I&#8217;m really looking for some feedback on this one, so comment away.</p>
<p>I&#8217;ve bundled the source as well as an installer package together and posted them for download <a rel="attachment wp-att-14" href="http://ContentOnContentManagement.com/2007/09/30/net-api-for-stellent-oracle-content-server/net-api-for-stellent-oracle-content-server/" title=".NET API For Stellent / Oracle Content Server">here</a><a href="http://contentoncontentmanagement.com/wp-content/uploads/2007/09/simple-net-content-server-api.zip">.</a>  Once installed the API will appear in your Visual Studio add references dialog as OUCSNET.</p>
<p><a href="http://ContentOnContentManagement.com/2007/09/30/net-api-for-stellent-oracle-content-server/net-api-for-stellent-oracle-content-server/" rel="attachment wp-att-14">.NET API For Stellent / Oracle Content Server</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/09/net-api-for-stellent-oracle-content-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Script.aculo.us Component for Oracle/Stellent</title>
		<link>http://contentoncontentmanagement.com/2007/09/scriptaculous-component-for-oraclestellent/</link>
		<comments>http://contentoncontentmanagement.com/2007/09/scriptaculous-component-for-oraclestellent/#comments</comments>
		<pubDate>Sat, 08 Sep 2007 12:52:39 +0000</pubDate>
		<dc:creator>David Roe</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Site Studio]]></category>
		<category><![CDATA[Stellent]]></category>

		<guid isPermaLink="false">http://ContentOnContentManagement.com/2007/09/08/scriptaculous-component-for-oraclestellent/</guid>
		<description><![CDATA[About a year ago one of my co-workers introduced me to the Scriptaculous Javascript library.  At the time I have to admit I wasn&#8217;t very impressed by Javascript-anything, but I was working on a project which was going to require &#8230; <a href="http://contentoncontentmanagement.com/2007/09/scriptaculous-component-for-oraclestellent/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>About a year ago one of my co-workers introduced me to the <a href="http://script.aculo.us/">Scriptaculous</a> Javascript library.  At the time I have to admit I wasn&#8217;t very impressed by Javascript-anything, but I was working on a project which was going to require a moderate amount of javascript and I decided to give it a try.  I&#8217;ve been hooked ever since.  The thing I like about it is that like any good framework, you write a lot less code but gain a great deal of reliability and functionality.   And at about the time you start to appreciate how much less code you&#8217;re writing you figure out that with just one or two more lines you can make it look cool too.</p>
<p>Scriptaculous is built on <a href="http://www.prototypejs.org/">Prototype</a> which is an independent Javascript framework used by several libraries in addition to Scriptaculous. Prototype&#8217;s claim to fame is the $() function, which is used to reference html elements and is far easier to type than document.getElementById().  The framework is chock full of functionality to make your life easier and also provides an abstraction layer to the browser so Prototype handles any compatibility issues for you.</p>
<p>Here&#8217;s a couple of my favorite Prototype functions:<br />
<code><br />
//returns all elements which have a specified css class<br />
document.getElementsByClassName([class name]);</code></p>
<p><code></code><code>//attaches a function to an object event<br />
Event.observe([object],[event name],[function]);</code></p>
<p><code></code><code>//converts the input fields of a form in to an Ajax compatible query string format<br />
[Form Object].serialize();<br />
</code></p>
<p>The Scriptaculous library then has an additional set of utilities, controls and my favorite the effects.</p>
<p><span id="testdiv">Couple of my favorite Scriptaculous Functions:</span><br />
<code><br />
<a href="Javascript:;" onclick="Javascript:new Effect.Fade($('testdiv'));">Effect.Fade($("testdiv"))</a><br />
<a href="Javascript:;" onclick="Javascript:new Effect.Appear($('testdiv'));">Effect.Appear($("testdiv"))</a><br />
<a href="Javascript:;" onclick="Javascript:new Effect.BlindDown($('testdiv'));">Effect.BlindDown($("testdiv"))</a><br />
</code></p>
<p>All of this brings me to Stellent/Oracle who actually have a Javascript preference of their own, the Yahoo YUI library.  I am also a big fan of YUI, but it&#8217;s much more of a control library then a framework.  This has caused problems for me when working with 3rd party web designers who are not developing HTML specifically for YUI.  Scriptaculous on the other hand often works great regardless of how the HTML is designed.  Both libraries can live harmoniously on the same page and I&#8217;ve often found myself using the Prototype $() function to reference YUI controls.</p>
<p>Oracle/Stellent implements the YUI library using a component which places their Javascriptand CSS files in the weblayout/resources folder.  Using that same concept, I put together a quick and dirty Scriptaculous component which does the same.  In addition there&#8217;s a  resource override of the std_html_head_declarations include, where I&#8217;ve added a reference to the library, making it globally available in the Content Server UI. That component is available for download here and it includes the latest release version of Scriptaculous 1.7.0.</p>
<p>Updated: 11/10/2007 &#8211; The latest Oracle / Stellent Script.aculo.us component(version 1.8) may be downloaded here:</p>
<p><a rel="attachment wp-att-31" href="http://ContentOnContentManagement.com/2007/11/10/scriptaculous-prototype-update/scriptaculous-component-for-oracle-stellent-content-server/" title="Script.aculo.us Component for Oracle / Stellent Content Server">Script.aculo.us Component for Oracle / Stellent Content Server</a></p>
]]></content:encoded>
			<wfw:commentRss>http://contentoncontentmanagement.com/2007/09/scriptaculous-component-for-oraclestellent/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.893 seconds -->
