Fishbowl’s ShipIT Hackathon Event Produces Four, New, Value-Add Components for Oracle WebCenter Content

The weekend of November 10th was known as Innovation Weekend at Fishbowl Solutions. Fishbowl’s development, sales and marketing teams participated in a “ShipIT Hackathon” event to develop new Oracle WebCenter Content-based products. If you aren’t familiar with hackathons, just imagine a very intense software programming session where the end goal is to develop usable software within a set period of time – here is Wikipedia’s definition, and you may remember that Fishbowl participated in a similar hackathon at Oracle OpenWorld. Anyway, Fishbowl’s WebCenter UI and UX design extraordinaire, John Sim, was visiting from London and he was the catalyst for Fishbowl’s internal hackathon. Here were the rules that he helped establish:

  1. The new software/functionality should either support one of Fishbowl’s current products or provide new ways to interact, utilize, or provide an integration with Oracle WebCenter Content.
  2. The finished product should be deployable to Fishbowl’s internal WebCenter Content system and be usable by Fishbowl employees.
  3. Teams will have only 24 hours to complete their product.
  4. The winning team would be decided by votes from all participants, but participants could not vote for their own team.

At 3:00 PM on Friday, November 9th the hacking commenced. Fueled by Red Bull, pizza, coffee and sugar, four teams of Fishbowl employees developed the following WebCenter-based programs by 3:00 PM on Saturday, November 10th where they were presented and voted on. Here they are in order of finish:

  • 1st Place – WebCenter Content Multi-Checkin
    • Enables users to drag and drop content items directly into Oracle WebCenter Content from desktops or file shares and be tagged with keywords.
    • Checked in content bypasses the check in metadata screen and instead is grouped within a user’s “workspace”.  Users can return to their workspace at a later time to add metadata.
    • Integrates with Fishbowl’s Duplicate File Checker to ensure that duplicate content items do no enter the system.

    (The winning hackers – left to right: Paul Heupel, John Sim, Tom Jaede)

  • 2nd Place – Filtered Search Results and Grid View Metadata Updater
    • Update metadata on multiple items at once using a simple grid format.
    • Content Server query defines items to display in grid view with configurable sorting and result count.
    • Easily configure columns to view and update both standard and custom metadata values.
    • Uses Excel-like functionality within the browser such as copy, paste, drag, and fill-down.
  • 3rd Place – Duplicate File Checker Desktop Application
    • Lightweight desktop application can detect and remove duplicate content items from user desktops or network file shares.
    • Users simply browse to a folder or item and select the content they want to check against already existing in Oracle WebCenter Content. Any duplicate items are returned to the user in a grid view, and the user can select any duplicates for deletion.
  • 4th Place - WebCenter Content and Google Drive (Docs) Synchronization & Contribution
    • Provides ability to import content stored in Google Drive to Oracle Webcenter Content.
    • Google Drive files can be batch imported and their metadata can be mapped or the files can be published directly to WebCenter Content.
    • Includes ability to also link to Google Drive document directly from WebCenter Content.

Aside from some mild cases of indigestion, carpal tunnel, and weariness; the participants in Fishbowl’s ShipIT hackathon all agreed that it was a great event to be a part of. It was really exciting to see what could be developed in a limited amount of time when a group of people worked together and were driven by a deadline. The best part was ending up with four new WebCenter-based products that solve real-world problems and add immediate value. If any of these products interest you, feel free to contact us at 952-465-3400 or

You can see more pictures of Fishbowl’s ShipIT Hackathon here.

As always, your comments on this blog are appreciated.

jQuery and UCM – Client Side Ajax UCM Interaction

The web is evolving, and users are wanting better interaction with their apps within the web browser.  This means faster site loads and action feedback to the user and not a browser loading a page.

Bex recently posted about his jQuery plugin to UCM to make service calls, and I thought I’d share something that I whipped up a few months back that has been an internal project of mine.  I think it’s about time it saw the light of day and help give more options to the web developers of the world.

My prototype is a javascript service wrapper javascript object, called fb.js, creates several util functions to help aid the execution of service calls with a max of 1 line of IdocScript on your site.

The first thing to do is to set the url for the ajax call.  The preferred method is to override the variable in fb.js that holds all of this.  Do this by defining this line in your javascript file.

[sourcecode language=”javascript”]
fb.vars.cgiRoot = "<$HttpCgiRoot$>";

Now we can build out our function.  Each function takes 2 parameters objects, a callbacks object and a parameters object.  The callbacks object has the hooks into the 5 events jQuery ajax method gives you.  These are, beforeSend, success, failure, complete, and error.  By defining functions in the callback object, you can hook into any event and change you page very easily.

For example:

[sourcecode language=”javascript”]
var callbacks = new Object();
callsbacks.beforeSendFunction = function(){alert("about to ping server")};
callbacks.successFunction = function(responseText){

The second object is the parameters object.  This one is as easy as passing in parameters as you would for service calls.  For example :

[sourcecode language=”javascript”]
var parameters = new Object();
parameters.IdcService = "MY_CUSTOM_SERVICE";
parameters.MyCustomParameter = "VariableValueHere";
parameters.IsJson = "1";

Now we can execute the service.

[sourcecode language=”javascript”]
fb.util.executeService(callsbacks, parameters);

Now the real power comes when you want to start interpreting result sets.  you can use a method I created to get back a 2D array object that contains the row and then the item.  An example of this would be.

[sourcecode language=”javascript”]
var callbacks = new Object();
callbacks.successFunction = function(responseText){
var contentItem = fb.util.returnResultSetObject(responseText, "DOC_INFO");
var parameters = new Object();
parameters.dDocName = "ID_10000";
fb.util.getDocInfoByName(callbacks, parameters);

This can also be applied to search results to loop and create your table.

[sourcecode language=”javascript”]
var callbacks = new Object();
callbacks = fb.defaultCallbacks(callbacks);
callbacks.successFunction() = function(responseText){
var searchObj = fb.util.returnResultSetObject(responseText, "SearchResults");
for (var i = 0; i < searchObj.length; i++){
var htmlString = "tr td" + searchObj[i][‘dDocName’] + "/td td" + searchObj[i][‘dDocTitle’] + "/td td" + searchObj[i][‘dDocAuthor’] + "/td /tr";
$("#resultsTable > tbody:last").append(htmlString);
var parameters = new Object();
parameters.pageCount = "4";
parameters.resultCount = "50";
parameters.QueryText = "Press Release";
parameters = fb.defaultParameters(parameters);
fb.util.getSearchResults(callbacks, parameters);

Now, you may be saying at this point that this is a lot to define to execute the method.  That is why I have started some functions in the main js file called “fb.defaultParameters(parameters)” and “fb.defaultCallbacks(callbacks)”.  By passing in your objects to these methods before you run your service, it will fill in the blanks, so to speak, with default parameters needed to execute the function.

Because I have defined the GET_SEARCH_RESULTS service call within my default parameters, I know there are certain required parameters that need to passed before I execute the service.  These are, QueryText, startRow, endRow, resultCount and others.  I also decided that, I don’t really want to deal with start and end row, so I decided that when I pass in the pageNumber parameter, I calculate the start and end row based off of either the default resultCount parameter set in fb.vars or the one passed into the function.  This can be seen in the above method where I create the table rows.

I currently have 3 predefined for you to use with the ability to add execute any service you want.

[sourcecode language=”javascript”]


fb.util.getSearchResults(callbacks, parameters);

fb.util.docInfoByName(callbacks, parameters);


with the master execute service function being

[sourcecode language=”javascript”]

fb.util.executeService(callbacks, parameters);


What I have done is allow you to hook into as many events that you want with the ajax functions, but also incorporate a “defaultFunctions” and “defaultParameters” functions that will assume and fill in parameters that may have been missed or not necessary to keep defining.

For your viewing pleasure, I have set up a prototype site that is Mobile device friendly using 100% javascript hosted on a 10gR3 content server.  Keep in mind that this has not be polished, but a POC of what you can do with the proper execute service javascript wrapper calling the shots.

Please visit for the example.

UCM Workflow Explained

traffic cop

Too many people under utilize their workflow capabilities.

They create one-way dead end workflows that cannot handle exceptions (what happens if the request form is incomplete?), cannot escalate reviews if someone is out of the office (vacation,  what is that?), and cannot route information to users not otherwise listed (Bob should really take a look at this

Don’t think of the workflows as railroads that only connect Points A and Z (and dead end). Rather think of them as city streets with many intersections and a traffic cop at each intersection directing flow.

A workflow step is an intersection with a cop. Sure, it is easy to create a one way street but then you lose the flexibility to reuse that street for anything else, no matter how close (parallel) it may run.

The first step in your workflow has an initial entry criteria – think of it as a toll gate. Establish security and one additional parameter. That is just to see who gets in the door. Security is really your biggest concern here.

Continue reading

The Changing Face of Enterprise Content Management

Content management systems are increasingly becoming back end “black box” content stores. This trend towards commoditization puts a decreasing importance on the system and an increasing importance on the ways in which the system capabilities are surfaced. There are several trends that I have observed and continue to see manifest though customer interactions, blog chatter and market awareness.

I am seeing a resurgence in portal fronted web applications. The difference between these and the all-or-nothing portals that were popular 5-10 years ago is that these that leverage rich ECM capabilities on the back end to provide versioning, document libraries, digital asset management, conversion, transcoding, workflow and other “rich” ECM features.

I am seeing WCM systems that are splitting into two camps –
1. Rich WCM that is fully integrated with and takes advantage of sophisticated ECM capabilities
2. Light-Weight WCM that is more like free public blogging software that is quick, cheap and easy but lacking sophistication of top-end systems.

I am seeing “in application” ECM capabilities surface in back-office and process applications like PeopleSoft, JD Edwards and Siebel. It is noted that EMC/Documentum’s recent announcement about their change of direction alludes powerfully toward a deeper relationship with SAP.

I am also seeing something of a retrenchment in the pure-play content management space. Basic capabilities are being re-discovered, often to the exclusion of other, more advanced features. This seems to be due, in part, to three factors:

  1. The SharePoint effect: basic content management catching on with the average worker rather than just the content management professional.
  2. The rise of niche web 2.0 capabilities in the office setting that do one thing well: for example Yammer does micro-blogging in the enterprise well but is disconnected from other information management strategies
  3. The continued consolidation of software and features from the big enterprise vendors: Oracle boasts massive storage capacity and ingestion speeds when their ECM system is combined with RAC database clusters, Exadata machines, SUN servers etc.

Continue reading