AquaLogic a UCM Application?

There was a pretty interesting article last week from The Register.  In a somewhat over-dramatically titled article, “BEA AquaLogic SOA business dismantled”, they shared some anonymously-sourced information on Oracle’s plans for BEA.

The Register has learned from individuals close to the company that BEA’s new owner Oracle is merging the AquaLogic and WebLogic professional service teams. Oracle is also splitting the AquaLogic products between “web products” – user interaction, collaboration and the Web 2.0 suite – and AquaLogic business process management (BPM).

So no big surprises there, merging the professional services for Web and AquaLogic makes a great deal of sense(shouldn’t BEA have done that already??).  And the “splitting” of Web Products and BPM probably just means those products are being aligned with similar groups within Oracle.

What really got my attention though was:

It is understood the web products may be taken over by the Oracle team running Stellent content management, acquired by Oracle in November 2006

So the UCM team might get AquaLogic?  Wow, that’s a bit of a surprise.  I personally had not given AquaLogic’s future a lot of thought, figuring their product teams would continue to operate as normal much as Stellent’s did.  There’s of course a big “may” in that quote though, for all we know officially they could be getting ready to launch SQL Developer Web 2.0 Portal.

It’s a little funny for me actually as one of the first Stellent projects was actually a Stellent/PlumTree implementation.  At the time they were both relatively smaller companies with some pretty cool ideas and applications.  It’s crazy that they could become part of the same product line now.  Amazing how quickly things change.

Oracle Universal Content Portal?

With that little tid-bit comes the game of what-ifs.  I’m actually working on a project right now using both ALUI and UCM/Site Studio, so this news has really peeked my interest.  Up until now I’ve more or less figured that the BEA applications would become part of Fusion-Middleware, probably joining forces with their Oracle counterparts.  Oracle has made it pretty clear that they intend on developing integrations for all applications within the middleware stack, but if AquaLogic becomes a part of UCM could we expect a more unified solution?  

Could ALUI become the new presentation layer for UCM?  For Site Studio?  We’re probably a little way out from hearing, much less seeing anything, but I’m actually pretty excited about the BEA buy now.

Posted in AquaLogic, BEA, Content Management, Oracle | Leave a comment

Verity OUT! SES IN!

Oracle announced on metalink today that they will be releasing a new search component for UCM this month.  The component is called OracleTextSearch and once it is release Oracle will no longer distribute Verity for the content server.  I should stress that the announcement specifically calls out that they are only ending distribution, not support.  So if you have Verity now, rest easy, this is just for new purchases.

I am not really surprised by this move, it’s been rumored for some time that Oracle would stop shipping Verity with the content server.  Stellent after all was not competing in the search space so Verity with it’s strong market penetration and excellent performance(it is very, very fast) made perfect sense for them use as their default search engine.  Oracle of course is competing in the search market both with database search, which more or less goes up against VDK directly, as well as Secure Enterprise Search which competes with Autonomy’s other search engine(is it IDOL now?).

I have to admit that I like Verity(when I’m not rebuilding a search index) so this is a little bit of a bummer, but I’m  excited to see what’s in store next.  Oracle laid out a roadmap for how search with the content server will go.

Their plan is to first stop distributing Verity once OracleTextSearch is released, which should be this month. OracleTextSearch is a database-based search component, and according to the release it will not require a database switch.  I am sure they would prefer everyone to be using Oracle databases, but to their credit they do appear to be sticking with the “support other databases” plan.

If you do happen to have an Oracle database available and it happens to be an 11g one, you will apparently be in for a special treat as OracleTextSearch can leverage 11g’s Oracle Text features.  According the the announcement there appear to be some significant performance improvements over Verity by using Oracle Text.

The big news for me though is that when the new version of Oracle Secure Enterprise Search(11g) is released, Oracle will be distributing a limited use version specifically for the content server.  SES has quite a few features which Verity either does not have or for some reason have not been exposed.  I think there’s a fair chance we may see search features like these in the content server:

  • “Did you mean” where the search engine looks for close matches of you search term if it does not return results.
  • Stemming which searches for different variants of a word.  Basically looking for car if you search for cars
  • Synonyms which are predefined words that of course mean something else.  For instance you could define blog to mean the same as Content On Content Management and all search for blog would return references to this blog(wow that is a long name).
I am not up to fully up to speed on the features in SES, but a few months ago one of the product managers took us through a great demo of the 10g version.  I recall being pretty impressed by it’s features as well as the concept of an enterprise search that can reach in to all systems.  I’m guessing that the UCM limited license version will probably not be leveraging the enterprise connectors to index your ERP data, rather it will probably just be a localized version for the content server.  Still though it would be pretty cool to have some more modern search function integrated in to the content server.
Here’s the link to the annoucnement, of course you’ll need a metalink account to read it:
I’m off to stash a copy of VDK6 away.

 

Posted in Content Management, Oracle, Search | 2 Comments

RE: snibbling griblious

Billy Cripe and Nick Tuson published an article today looking at ways to use BI and ECM together.  The article is titled, “Envisioning Business Intelligence as More Than Reporting Dashboards and Enterprise Content Management as More Than a Bucket of Stuff”.  It’s a great title and a really exciting concept.

What they’re envisioning is using BI application to analyze ECM use, both in realtime as well as in aggregate and then use that information to make predictive content suggestions, perhaps in search and/or delivery.  

At its core, the strategic vision of EIM systems is to move from the highly accurate but reflective descriptive analyses of present day BI systems to highly accurate, persuasive and forward-looking predictive systems…

Real-time decisioning (RTD) is a BI technology that tracks user behavior and determines what information is most likely to benefit, persuade or be useful

Out at OpenWorld last November we heard quite a few rumors that the former Stellent folks were busy tinkering away with Oracle’s Real Time Decisioning application.  It was probably the most exciting tidbit of the trip as I know quite a few potential and current UCM customers who would love to see this technology become a realization.

In the article they lay out a test scenario for how a unified BI/ECM integration might work.

A user searches Google for “snibbling griblious” and selects the top result, which links the user to your organization’s web page. The page is not a simple, static HTML brochure; it is built by the web content management-enabled portions of your corporate ECM system, which is part of your larger EIM strategic infrastructure and therefore BI enabled. As the ECM system starts building the page, it sends the referring URL, search string and cookie ID to the RTD service of your EIM infrastructure. Then the ECM system indicates to the RTD service the user’s page visits. When constructing a page that includes implicit personalization, marketing or a test, the ECM system asks the RTD service to select specific content.

The ECM system asks the RTD service to select an appropriate, persuasive banner advertisement for this user. In order to determine what content is eligible for each decision, the RTD service consults the ECM system directly. As the ECM system is building the landing page for the user, the RTD service retrieves from its memory cache all the possible IDs for the banner ad in the home page. These results were previously cached by the RTD service, so performance is zippy. Based on previous BI analysis, the RTD service computes the likelihood of click through for each banner ad and selects the most appropriate one. The user views the landing page, is intrigued by the banner ad and clicks it. As soon as the user clicks, that information is returned to the RTD service, which stores the information in its own schema to use in further RTD analyses

Ok so there’s a lot going on there, but what they are laying out there is the behavior of a system that makes predictions based on historic data, real-time behavior and testing.  In the past few months we’ve seen a tremendous amount of client interest in this exact requirement.  ECM customers want the ability to target content to specific types of users, but not just with simple if/then logic that tends to silo content.  They want the system to be adaptive and most importantly for it to be able to test all content across a samplings of all users. 

I realize this is just a theoretical article with no products mentioned, but lets not kid ourselves either; This is no flying car, Oracle has these technologies right now and I would be shocked if they weren’t working on delivering integrations between RTD and UCM now.

-update.  Corrected Nick Tuson’s name.  I had him as Tuck Nelson.  how in the world did I do that.  Sorry Nick.
Posted in Content Management, Oracle | 1 Comment

Eval This! Creating Reusable Fragments with Site Studio

There’s a pretty clever function used in Site Studio JSP development called evalIdcScp. It’s a method on the idcserver.ServerBean and if you’ve worked with or implemented a JSP Site Studio site, you’ve undoutably run accross it more than once.

As you might guess evalIdcScp stands for “Evaluate Idoc Script” and it’s purpose is to allow IDOC script execution inside of a JSP page. This is great because even though IDOC/HCSP and JSP sites utilize completely different languages, the general interation with the content server can occur in a similar way.

An example of how evalIdcScp is commonly used is with fragment parameters. Consider these two examples, one in IDOC the other in JSP:

IDOC

BackgroundColor = getValue("#active",ssFragmentInstanceID + "_BackgroundColor")

JSP

String BackgroundColor = serverbean.evalIdcScp("getValue(\"#active\",ssFragmentInstanceID + \"_BackgroundColor\")");

Both examples use the IDOC function getValue to retrieve the background color parameter. While it might look a little kludgy from a Java perspective, the fact is that there are a number of functions in IDOC that are coded for specific interactions within the content server, being able to leverage those functions in Java and JSP can make things quite a bit easier.

That’s great and all but are you seriously posting about a method?

Leveraging IDOC functions in JSP is nice but hardly ground breaking. Where I think things do get a little more interesting is when you realize that evalIdcScp is less of an eval function and more of an IDOC parser.

Here’s some code for a very simple yet traditional JSP static list fragment. The fragment will render a little “call out” list, basically a vertical group of link/title and description blocks.

//get a count of the number of rows in the list
String titleCountRaw = serverbean.evalIdcScp("ssGetXmlNodeCount(SS_DATAFILE, [Root]/Title')");
//convert the count to a number
int titleCount = Integer.parseInt(titleCountRaw);

//loop through all the nodes of the static list
for(int counter=1;counter<= titleCount;counter++){
//get the title
String Title = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Title[" + counter + "]/node()')");
//get the link
String Link = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Link[" + counter + "]/node()')");
//get the description
String Desc = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Desc[" + counter + "]/node()')");
//render the html call out. note the ugly inline html.
%>
<div><h1><a href="<%=Link%>"><%=Title%></a></h1><%=Desc%></div>
<%
}

Again a pretty basic example, but one which reveals a fundamental weaknesses in many fragment designs; The HTML is often embedded in the code. This makes creating re-usable fragments much tougher and often when attempted involves just parameterizing CSS or other HTML attributes.

Using the evalIdcpScp method we may have an additional option in designing a more flexible, reusable fragment. Using out static list example from before, let’s also assume we have a BigText fragment parameter called “CallOutHTML”. We’ll also assume that when the example static list is added to a template the following mark up is placed in the parameter(notice the embedded IDOC):

<div>
<h1><a href="<$Link$>"><$Title$></a></h1>
<$Desc$>
</div>

We’ll then make some adjustments to the static list code, this time leveraging our new fragment paramter along with the evalIdcScp method.

//get the CallOutHTML html parameter
String CallOutHTML = sb.evalIdcScp("getValue('#active', ssFragmentInstanceId & '_CallOutHTML')");
//get a count of the number of rows in the list
String titleCountRaw = serverbean.evalIdcScp("ssGetXmlNodeCount(SS_DATAFILE, [Root]/Title')");
//convert the count to a number
int titleCount = Integer.parseInt(titleCountRaw);

//loop through all the nodes of the static list
for(int counter=1;counter<= titleCount;counter++){
//get the title
String Title = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Title[" + counter + "]/node()')");
//get the link
String Link = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Link[" + counter + "]/node()')");
//get the description
String Desc = sb.evalIdcScp("ssIncludeXml(SS_DATAFILE, '[Root]/Desc[" + counter + "]/node()')");

//put the title, link and desc back in to the binder as local values
sb.putLocal("Title",Title);
sb.putLocal("Title",Link);
sb.putLocal("Desc",Desc);

//and now the cool part...render the list
out.println(sb.evalIdcScp("$>" + CallOutHTML + "<$"));
}

So what just happened?

  • We defined a big text parameter called CallOutHTML that contained all the HTML needed to render a call out. In the spots where we needed output values we placed IDOC variables using the standard IDOC syntax(not the HCSP variety).
  • We began a standard loop through the static list pulling out our values from the the data file
  • Rather than rendering the values right away to the page with inline HTML, we put those values back in to the binder as local data.
  • evalIdcScp was called, passing CallOutHTML in as a parameter along with some funny syntax to close out and then open IDOC script before and after our CallOutHTML string. We did this because evalIdcScp evaluates the contents of it’s only argument as IDOC script, so immediately closing out the script allows us to pass HTML through and then only render the scripts inside the string.
  • The server bean then executes CallOutHTML as IDOC script and since our three values (Title, Link and Desc) are in the local binder, the IDOC parser evaluates them and injectes them in to the HTML.
The result is that the static list renders reach row of the static list using the HTML in the CallOutHTML parameter as it’s “template”.

That looks like security vulnerability

If this were another system, say one that used PHP or Python as it’s scripting language, I would have a real problem with this technique. If you generate presentation via a server side eval function you need to think long and hard about where the data being evaluated comes from because If it can come from a user prompt you’ve opened your application up to injection attacks.

Fortunately for us IDOC is no python. It’s a fundamentally safe language that can’t do very much other that read values you already have access to (workflow functions being the only exception). IDOC can call services but they are secured both by permissions as well as by type of use. As a general rule, if it makes a change in UCM you can’t script it.

A Simple MVC Pattern for Fragments?

In our static list example we’ve demonstrated how to separate the layer presentation from the fragment code and implemented it in more of a template-specific manner. The static list code with it’s generic Title, Link and Desc elements can now be re-used across a many different template and web sites. Very little consideration needs to be given for how the static list will be displayed, knowing that virtually any presentation requirement can be met with the fragment. As long as the situation calls for a static list with Title, Link and Description elements this fragment can be used. While I wouldn’t start calling this an MVC framework, I think we can start to see the hallmarks and benefits of MVC design.

Posted in Fragments, IDOC, JSP, Site Studio | Leave a comment

.NET API for Oracle UCM Version 2.0

The past few weeks I’ve been revisiting one of my old projects, the .NET API for Oracle UCM, which I’ve always felt was powerful but also missing some functionality.  The original project was a pretty simple API modeled after Oracle’s own idcserver package usually used in Site Studio JSP development.  I’ve always liked the simplicity of the idcserver API as you can basically make any content server service call using just a couple of simple objects.  Implementing the same design in .NET(and later Flex) turned out to be a pretty successful(I think) model as well.  The original API is one of the most popular downloads and I’ve received quite a bit of positive feedback about it.

What’s new with Version 2.0

The improvements to version 2.0 center around a couple different areas:

Direct communication with the content server

This was probably my biggest motivator towards developing a new version of the API as the web filter to content server communication is somewhat of an undocumented mystery.  I’ve written a couple custom filters to integrate UCM with some third part security/SSO providers, but never have really picked apart the actual protocol that’s going back and forth.  Turns out it’s basically just passing HTTP through, but there are a couple values you can add to set authentication.

If you’re ever curious about what happens after your request is made to the web server, you can actually connect to the content server on its listener port(usually 4444) with a telnet terminal.  If you turnon  the CGI_SEND_DUMP on from the filter administration page it will log all calls made to the content server from the web server plugin.  Those logged requests can then be copied out of the log, modified and then pasted in to the telnet window.  Make sure that if you’re using telnet or even this API that the server you are executing from is included in the host or IP filter for the content server, else you won’t be able to connect.

Asynchronous, Multithreaded Execution

I started out planning for just asynchronous execution and then broke a bit more off with the threading(threads are addictive).  What I was looking for was the capability to make a content server request and then for the result to be passed back via an event.  The previous version’s process consisted of an executeService call, waiting inline until the request is completed and then retrieving results from the ServerBean.  The entire process usually takes less than a second, but a more elegant method might be for the executeService call to be made and then for an event handler to process the results when they arrive.  This new version supports the old method and the new event handler.

In addition to the events, the API is also multi threaded so when running in asynchronous mode each content server request runs in it’s own in it’s own thread.  Calling executeService will queue up a content server request and also create and activate a new execution object for your next call.

The API has a setting for the maximum number of threads which can run concurrently.   So if you make 1000 requests the content server will not receive 1000 requests all on top of each other.  Rather it will queue up all 1000 requests, keeping only the max number of threads active during processing.

The Object Model

In copying the idcserver package, I originally figured copying the idcserver object model would make things easier to pick up and learn, but unfortunately I think it was also a little trickier to extend and customize.  The API was flexible and powerful, but if you wanted to build a more robust API, say one specific to your application or organization, things were a bit trickier to extend.

In this new version I’ve set up a more flexible object model(as well as breaking backwards compatibility..sorry about that).  Every object used in the API is referenced by interface, but also encapsulates all functionality in abstract classes.  The only class that this does not apply to is the ExecutionManagerFactory, which is basically a static class used only to create a new ExecutionManager object (the new server bean).

Some Examples

Looking at some code examples with the new API, you’ll find that for the most part they aren’t too different than the old version.  Most of the methods are still named the same only the object types have changed.

Check In New

This example is a synchronous inline operation which checks in a file.  If you compare it to code used with version 1 the similaritites should pop right out.

static void CheckInAFile()
{
  //create a new execution manager object
  ICSExecutionManager em = ExecutionManagerFactory.CreateExecutionManager();
  //set the connection mode.  We're going direct to the content server
  em.ConnectionDetails.ConnectionMode = ConnectionMode.ContentServer;
  //set the host
  em.ConnectionDetails.ContentServerHost = "localhost";
  //set the relative web root
  em.ConnectionDetails.ContentServerRelativeWebRoot = "stellent";
  //set the user to run the operation under
  em.ContentServerUser = "sysadmin";
  //set the service and other metadata
  em.putLocal("IdcService", "CHECKIN_NEW");
  em.putLocal("dDocTitle", "Picture of Me");
  em.putLocal("dDocType", "Image");
  em.putLocal("dSecurityGroup", "Public");
  em.putLocal("dDocAuthor", "sysadmin");
   //set the file
   em.putLocal("primaryFile", new FileInfo(@"C:\file.jpg));
   //execute the service
   em.executeService();
   //check the response
   Console.WriteLine(em.getLocal("StatusMessage"));
 }

This example demonstrates how the asyncronous, multi-threaded execution is utilized. The code will execute three search calls as three different users on the content server. Each execution will occur in it’s own thread, with the results being handled by the same event.


static void AsyncSearchByUser(){
  //create a new execution manager object
  ICSExecutionManager em = ExecutionManagerFactory.CreateExecutionManager();
  //set the connection to the content server
  em.ConnectionDetails.ConnectionMode = ConnectionMode.ContentServer;
  //set the host
  em.ConnectionDetails.ContentServerHost = "localhost";
  //set the relative web root
  em.ConnectionDetails.ContentServerRelativeWebRoot = "stellent";
  //this will be Asynchronous execution
  em.ProcessMode = ProcessMode.Asynchronous;
  //attach a complete event
  em.OnExecutionComplete += new OUCSNET.events.ExecutionCompleteHandler(SearchOnExecutionComplete);

//first call will be as the user droe
  em.ContentServerUser = "droe";
  //set the search crtiera, we want a count of everything
  em.putLocal("IdcService", "GET_SEARCH_RESULTS");
  em.putLocal("QueryText", "");
  //execute the server.
  //Since this is Asynchronous, exection will continue right on
  //with this search result request running in it's own thread
  em.executeService();

//Once executeService is called a new Execution object is created
  //and made active in the execution manager
  //even though its the same em interface this is a new execution
  //object

//this one will run as sysadmin
  em.ContentServerUser = "sysadmin";
  em.putLocal("IdcService", "GET_SEARCH_RESULTS");
  em.putLocal("QueryText", "");
  em.executeService(); //execute and move on

//repeat running as user
  em.ContentServerUser = "user";
  em.putLocal("IdcService", "GET_SEARCH_RESULTS");
  em.putLocal("QueryText", "");
  em.executeService();

//Since we are running asynchronously
  //this should be the first line in the std out.
  Console.WriteLine("All Executions Called");
}

//The event handler for the exection object
static void SearchOnExecutionComplete(object sender, EventArgs e)
{
  //convert the sender object to an ICSExecution object
  ICSExecution execution = (ICSExecution)sender;
  //output some results
  Console.WriteLine(execution.ContentServerUser
 + " can access "
 + execution.getLocal("TotalRows")
 + " content items");
  //disposing the execution object will remove it
  //from the internal list of execution objects
  execution.Dispose();
}

Probably More Work To Do

There is an outstanding issue with the API, with regards to NTLM authentication.  The previous version utilized the .NET WebRequest object for content server communication which supported NTLM authentication.  This version, because it needs to connect to both the web server and the content server directly is using the TCPClient object which is basically one step up from a raw socket connection.  Any protocols(beyond TCP) need to be implemented manually, and NTLM has been a bit tricky to configure, basic authentication however seems to work just fine.

This version of the API obviously has quite a bit more functionality in it and I fully expect there to be some bugs that appear(though I hope they don’t).  At the very least I think there will probably be some suggestions for better behavior by API, and so if have some or if you find an issue, please let me know by posting them to the forums.

Not The Last Version

This will not be the last version of the API, so if you have any ideas I’d love to hear them.  Eventually I’m hoping this project will develop in to something close to par with Oracle’s own Content Integration Suite.  So far I am loosely planning on developing some web examples using the API with ASP.NET as well as some examples for .NET 3.5.

The new version of the API can be downloaded here:

.NET API for Oracle UCM Version 2.0

Posted in .NET, C#, Content Management | 3 Comments

Oracle 11g Secure File Features with Oracle UCM

Last week I and several others talked about Oracle’s announcement of their new product Universal Online Archive.  While UOA should be a pretty cool application, many of the features mentioned are actually available now in the 11g database and can easily be leveraged by Oracle UCM.

So what are these features?

Oracle 11g has a ton of new features, but the ones most interesting from a content repository standpoint are the new BLOB storage capabilities called SecureFiles.  What they allow you to do is create a BLOB field in a table, but instead of just saving the file in the database table, you can now:

  • Compress it
  • Encrypt it
  • Deduplicate it (ok that doesn’t make sense..but we’ll cover it soon)

Those are some pretty cool features, ones which are great from a just a database perspective, but become very pretty handy if you’re talking about a content repository.  The fact that UCM has traditionally stored it’s content on the filesystem has always been a selling point for me; small databases, better performance, what would I gain by storing my content in a database?  Bex Huff I think actually answers this best:

For the longest time, the folks at Stellent balked at using the database for file storage. Using the filesystem made much more sense because of performance reasons, which made up for the additional complexity of the architecture. However, if the user has 11g, there really is no better option than storing content items in the database.

There it is…No better option than storing content in the database?  We have to give that a go.

Giving it a go

There are a couple prerequisites required before we can store UCM content in it’s database:

  • Minimum UCM version is 10gr3
  • UCM must be running on a 11g database
  • A JDBC Filestore provider must be configured in UCM, here’s a link to the installation PDF

Step 1 – Verify if Secure File Support

The 11g database enabled SecureFile support by default, but if you want to make sure it’s working you can run the following commands as SYSDBA:

SQL>show parameter COMPATIBLE;
NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------
compatible                           string      11.1.0.0.0

The database must have a version setting higher than 11.0.0.0.0

SQL> show parameter db_securefile
NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
db_securefile                        string      PERMITTED

There are a couple different values that will work for db_securefile, PERMITTED is the default, ALWAYS or FORCE should work as well.  If you need to change this value, run:

ALTER SYSTEM SET db_securefile = 'PERMITTED';

Step 2 – Drop and Recreate the BFILEDATA Column

The FILESTORAGE table created by the file store provider is configured for BASICFILE support, which unfortunately will not allow us to take advantage of any of the new BLOB features.  Also unfortunate is that it appears the only way to enable SecureFiles is to drop and recreate the BLOB column.  

Since I’m just using my local laptop, this isn’t really a big deal for me as my table is empty.  Where I am going with this is that in these next few steps you could loose data if you’ve already stored it in the FILESTORAGE table…so be careful.  Take a back up and if you’re using JDBC storage move you data somewhere else first.

As the UCM user drop the existing BFILEDATA BLOB column:

alter table FILESTORAGE drop column BFILEDATA;

Now add the column back only this time using the SECUREFILE Store As identifier:

alter table FILESTORAGE
add ("BFILEDATA" BLOB)
LOB ("BFILEDATA") STORE AS SECUREFILE filestorageblob(
TABLESPACE "UCM_SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT));

So what we’ve done is removed the old BLOB field(which was originally configured as a BASICFILE and replaced it with a BLOB configured for SecureFile support.  Even though that’s set, we still aren’t taking advantage of new features.  That will require a couple modifications to the column.

Compression

SecureFile compression comes in a couple different flavors; None, Medium or High which correspond to the level of compression applied to the field.  SecureFile compression is completely separate from any table or index compression in place already, so if you compress the BLOB it’s just the BLOB nothing else.  You’ll want to think about performance some when setting compression, as there should be an increase in latency and also CPU utilization when enabled.

Compression can be added with any of the following:

alter table FILESTORAGE
modify LOB("BFILEDATA") (
COMPRESS HIGH
);

alter table FILESTORAGE
modify LOB("BFILEDATA") (
COMPRESS MEDIUM
);

Or removed with this one

alter table FILESTORAGE
modify LOB("BFILEDATA") (
NOCOMPRESS
);

Encryption

SecureFile encryption adds an additional layer of security to your database by encrypting your BLOB files while they reside in the Oracle data file.  The encryption is designed to prevent unauthorized access to the BLOB in case someone gets their paws on your data files.  I have to admit that this one seems like a little bit overkill considering that like compression, encryption will cause a cpu and latency hit.  I guess I just don’t think that many data files are getting hacked, but I could be wrong.

Enabling encryption requires adding a new folder named wallet to the database’s admin folder.

/oracle/product/database/admin/wallet

Then log in to the database as sysdba and run:

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "[your password here]";

Reconnect back with your UCM account and update the BLOB:

Add encryption

ALTER TABLE FILESTORAGE
MODIFY LOB("BFILEDATA")
(ENCRYPT USING 'AES256');

Remove it

ALTER TABLE FILESTORAGE
MODIFY LOB("BFILEDATA")
(DECRYPT);

Deduplication

Deduplication may be the most clever feature included in SecureFiles.  Each file checked in to a BLOB field is compared against the others, if the new file is a duplicate, only a pointer to the original is stored.  Of course you as the user never knows the difference.  Query either row and the file is returned.

The thing that is really cool about deduplication from a UCM perspective is that very often UCM actually stores duplicate files.  In addition to user’s checking in the same file twice, quite a few file formats are simply copied over to the web layout folder.  If you’re running both your vault and weblayout from the JDBC Filestore provider, even if the file type is configured to be copied out to the weblayout it will only be stored once in the database.

Adding the deduplication is pretty easy:

Enable deduplication

ALTER TABLE FILESTORAGE
MODIFY LOB("BFILEDATA") (
  DEDUPLICATE
);

Disable it

ALTER TABLE FILESTORAGE
MODIFY LOB("BFILEDATA") (
  KEEP_DUPLICATES
);

That’s it

As you can see there are quite a few options when it comes to configuring SecureFiles in general, but the integration with UCM is actually pretty simple.  I ran through a couple test check ins while writing this post(some of the items being images that went though the refinery) all of which went though smoothly, though a little slower than a standard filesystem check in.  I plan on leaving my local server with this configuration for some time, so we’ll see how it goes. 

References

www.liberidu.com

www.oracle-base.com

www.derkeiler.com

Posted in Content Management, Database, Oracle, Secure File | 7 Comments

Thursday Morning at GearUp

If you happen to be out at Interwoven’s GearUp conference this Thursday, take some time around 10:45 to check out Robert Huffstedtler’s presentation on OpenDeploy.

Getting the Most from OpenDeploy – Practical Advice on Often Overlooked Features

OD is a powerful application with options to fit almost any scenario. But, its best features often go unused.  In eight years of working with OpenDeploy, I’ve seen many of the same questions and issues arise with every customer.  In this session, we’ll unravel the complexity and explore the most frequent misunderstandings about capabilities, configuration, and problem determination.

Rob is a co-worker of mine, who’s on our Interwoven team.  I’ve seen his OpenDeploy presentation a couple times and it’s definitely worth checking out.

Posted in Uncategorized | Leave a comment

New Addition to Oracle ECM Stack

Oracle is announcing a new addition to their content management portfolio and Fusion Middleware stack today.  The product is called Universal Online Archive and if you’re having the same thought I did when I heard the name, you’re thinking its a SAAS app but it’s not(though that would be pretty cool).  Rather it’s a fairly robust content repository geared towards supporting the incredible needs of enterprise compliance and e-discoveries.

From a technical perspective, they’ve described it as “a stripped down version of Content DB”.  Content DB if you recall was Oracle’s content management system before acquiring Stellent.  I’ve only played with it briefly(and even then I was actually tinkering with Web Center), but from what I recall it was a simple content management system built on Oracle’s database.  I’m not exactly sure how successful Content DB was or was not in it’s original form, though I recall it being rated a middle of the pack player by most reviews.  In it’s new form as UOA, I think it shows a great deal of promise though, here’s why:

The 11g Database’s new SecureFiles features - I’ve found an excellent article that explains what they are and how to use them much better that I probably could but here’s the gist:  With 11g, files stored in the database can be encrypted, compressed and most importantly, de-duped.  That’s right, if two different people save the same file to the database twice, 11g will figure out that the file is a duplicate and save the file only once.

That multi-BILLION dollar compliance, retention and e-discovery industry – There is an absolutly breathtaking amount of money being spent by public, private and non-profit corporatations to:

  • Automate compliance enforcement policies
  • Store required and critical business information
  • Delete non-critical business information
  • And most expensive of all – allow the discovery lawyers find that retained information quickly…remember they bill by the hour

I tried to do a little informal research to find a dollar value for how large this industry is.  In that process I ran across a great article of e-discovery horror stories..(though it does include a Forester projection of 4.8 billion in technology spending for e-discovery by 2011).  Here’s an excerpt that caught my eye:

When a business cannot produce data subject to discovery that it should have stored, per its own policies, regulators can assess it huge fines — as Morgan Stanley and UBS, among others, have found out. In separate lawsuits, the financial institutions lost their cases because of their failures to adequately produce E-mail evidence and the resulting assumption that evidence was willfully destroyed or withheld. Laura Zubulake, a former UBS employee, was awarded $29 million in 2005 in her sexual discrimination lawsuit. And billionaire Ronald Perelman was awarded $1.45 billion in 2005 based on his claim that Morgan Stanley defrauded him in the 1998 sale of his company, Coleman.

WOW!…that’s a heck of alot of dough for some missing emails.  Regardless of whether Morgan Stanley and UBS were right or wrong in those cases, I think any of us working in a modern office could imagine how this could happen, there’s just lots of stuff everywhere.  Can you just imagine how much time, effort and money went in to trying to finding those missing emails?

Where does Universal Online Archive Fit In?

I think what Oracle is trying to do with UOA is develop an infrastructure application that will site behind all of the other systems and allow retention and retention policies to occur and be managed centrally.  Where I think they are doing it right is by not trying to force companies in to replacing their current applications.  I don’t think anyone would be interested in another exchange or another sharepoint just to implement better compliance software.  The current version of UOA will ship with an connector for email servers, but also include a connector API for developing additional custom integrations(there is also a connector for Universal Records Management).

Alan Pelz-Sharpe from CMS Watch posted an interesting quote back in Feburary from a LegalTech conference he participated in:

1GB of storage costs around 20 cents to buy — 1GB of storage costs around $3,500 to review

I’m not sure how the $3500 per gig figure was reached or even whether it was just off the cuff to make a point about the cost of information.  It’s pretty clear though that there is a significant cost beyond just hardware for retaining information, and actually a pretty significant cost as well for not retaining information too.  I think what Oracle is going for is the two pronged approach of both lowering the risk of not retaining by making it easy to do so and also lowering that per-gig cost for an e-discovery by keeping it easy to find.  Seems like a good idea…we’ll see how it goes.

Posted in Content Management, Oracle | Tagged | Leave a comment

Me, Flex and The Content Server

I’m having a little love affair lately with Adobe’s latest version of Flex.  It was released just a few months ago and since I’ve started playing with I’ve been very impressed with the language and the architecture.  Believe it or not the Flex compiler is actually now an open source application, so theoretically if you know ActionScript and/or the Flex definition schema, you can create your own applications with the free compiler.  Adobe’s Flex product at this point is actually just their IDE, Flex Builder, and that is actually just a customized, Flex-oriented version of Eclipse.

I decided to give Flex a go and in following the theme of the blog, have developed a custom Flex API and application for Oracle UCM.

Wait, I thought you didn’t like Flash?

Before I jump in to the sample project, I have to tell you that this is really a turning point for me with Flex.  For some time now I’ve usually frowned on Flex or Flash for web development.  There’s always the Flash movie or two that’s worked in to the site much the same way an image would be, but as far as using Flex or Flash for front end development, I’ve never been much of a fan.  My reasons go something like this:

  • Web crawlers like Google can’t search content and links inside a SWF file
  • It’s sometimes hard to bookmark URLs or even have URLs to specific points
  • Just about anything you can do in Flash I can do in Javascript

I know there are a ton of really cool Flash sites out there, but I’ve mostly thought of Flash as a “banner-ad” framework and assumed Flex was just Flash without the “Movie” format.  When I compare Flash sites to traditional HTML ones, they sure look really cool, but I like to copy content, download images and link to stuff.  Flash sites march to the beat of their designer and that has been a bit of a turn off for me.

So why the change of heart

Flex is really an interesting option for front end web development.  Because it runs on the Flash player, there’s less chance for browser compatibility issues.  IE6, IE7, FF?  Who cares?  As long as you have the Flash player your app should run fine.  The code for Flex(Actionscript) is also considerably more powerful than Javascript.  In addition to possessing all the qualities of Javascript like prototype inheritance and loose typing, it’s also developed the features of a strongly-typed, object oriented language like Java.  I’ve found it extremely flexible and actually pretty fun to work with.

Another thing to consider is that Flex is a web framework, but now with the introduction of Adobe’s AIR runtime,  you can run and deploy Flex applications to the desktop.  The very common sense distinction between what is a web application and desktop application suddenly becomes a little fuzzy.

What we are really seeing is the evolution of the Flash movie player in to a lightweight virtual machine and I think in that model this could be an even more successful technology than it already is.  You can make a decent argument that Flex, Flash and Air are still niche technologies, but given the Adobe competition that is forming some of the big wigs think there is a market there.

AIR was released along with Flex 3, so it’s been out for just a few months(beta has been out almost a year).  Still there’s already a pretty sizable list of applications.  Will Flex, Air and Sliverlight stay niche frameworks?  I’,m not sure yet, but I am 100% certain that there’s a point where integration with a content management will become a consideration and a priority for them.

Didn’t you mention a UCM Component?

I’m way off track and sounding like an Adobe advertisement, so back to my sample project….As I mentioned I’ve been working on a sample Flex application for Oracle UCM.  I started out developing a Flex API for UCM, along the same vein as my .NET API for UCM.  Basically I’ve mirrored the object model of Stellent/Oracle’s own idcserver package which is used for content server JSP development.  It’s a simple and yet very flexible design that allows you to make just about any service call to the content server, returning local data and/or resultsets.  Those values and resultsets can then be directly bound to Flex controls.

Here’s an example of what a service call looks like using the Actionscript API in Flex:

var sb:ServerBean = new ServerBean();

sb.putLocal(“IdcService”,”GET_SEARCH_RESULTS”);

 

 

sb.putLocal("QueryText","dDocType <matches> `Document`");

sb.executeService();

 

One interesting thing about Flex though is that its httpservice object(needed for web service calls) forces you in to asynchronous calls….great for applications…sort of a pain for example code.  Nevertheless I’ve added several events to signal when a service call is complete.  Listener methods are then attached to those events and in those listener methods, you can retrieve a value or resultset and bind it to a control.  Here’s an example of what occurs in the listener method to bind the resultset to the Flex datagrid.

var SearchResults:ServerResultSet = sb.getResultSet("SearchResults");

var rows:XMLList= SearchResults.getRows();

dgSearchResults.dataProvider = SearchResults.getRows();

I’m not showing it in the examples above, but the resultset object also has all the methods you know and love from UCM, like first(), next() and isRowPresent().

Unlike the .NET API which I more or less pushed without an example, I’ve bundled the Flex API with what I think is a somewhat useful example component called Search and Update.

Search and Update contains a bound datagrid control that displays paged search results from a search request to the content server.  In addition to being a bound display of results, the Flex datagrid control also supports editing, which is enabled and tied via Flex events to UPDATE_DOCINFO service calls.  So if you edit a cell in the datagrid, the metadata for the content item is updated as well(non-editable fields in UCM are also not editable in the datagrid).

I’ve wrapped the application in a custom component that adds a link to the administrators menu titled “Search and Replace”.  The application fits very nicely in the content server page body, though there is a slight issue when you are in “top-menus” layout, where the drop down menus render behind the Flex app.  This is just one of the fun issues of dealing with Flash….it’s always on top.

Inside the “Search and Update” component, there’s a folder called Source, which contains(you guessed it) all of the source for the API and Search and Update projects.  In addition when you unzip the download, you’ll find the component zip as well as a separate folder with a compiled version of the UCM API

Here’s a link to the sample:

Flex Search and Update Example for Oracle UCM

 

Posted in AIR, ActionScript, Content Management, Flash, Flex | Tagged , | 3 Comments

News Items – Bloggers and Component Updates

I’ve got a couple items here that I think are somewhat news-worthy, at least related to this blog.  Instead of several small posts though I thought I would combine them.

New Bloggers

I’m adding a couple new bloggers to my recommended reading section which just shows as “recommended” because of the word wrap.

Alan Evan’s blog - www.cleverthink.com.  Alan, as the blog title goes, is a pretty clever guy who writes about technology, business and many of the new trends coming our way.  He’s a pretty active blogger, posting just about every other day.  It’s kinda funny because he sits about 30 feet from me at work and I never knew…now I do and I dig his blog so give it a read.

John Sim - www.bluestudios.co.uk/blog.  John’s blog apparently has been around for some time, but it appears he’s now starting working with Oracle’s Universal Content Server.  He has quite a bit of content on a variety of subjects, but is also posting some UCM examples.

New Component Version

All of my UCM examples and components are developed right here(as if you could see me) on my local laptop.  I’m running W2K03 server R2, Oracle enterprise 11g and Oracle UCM 10gr3 1.3.3.3(something like that…just patched so it ends with 3 now).  If your environment is different most of these examples will still work, but ocassionally there are issues.  For instance,  I had a request for a Stellent 7.5.1 and JVM 1.4.2 version of the IDOC Developer interface.  I don’t have a great 751 test environment, but I managed to dig one up at work.  It needed a couple tweaks, but over all pretty much the same.  Here’s the link though if you need that earlier version(rememebr you will need scriptaculous).

idocdeveloper_stellent751_java_142

Really, Really old Refinery Example

Way back in the day I had a lot of fun playing with Stellent’s inbound refinery.  In fact the first project ever posted to content on content management was a .NET example and framework to create a custom conversion engine for the 7.5.1 refinery.  Basically it was two projects; The framework which is just an assembly that provides an abstract class you inherit to create the conversion engine and an example conversion engine using the framework.  I wrote the post, threw it up on the site(then in DotNetNuke..yuck) and proceeded to ignore the blog for the better part of a year(I am pretty sure no one ever visited the site either).  By the time I actually started blogging 10gr3 was out with it’s whole new refinery and I never re-posted the project.  Then a few weeks ago on the Oracle forums I mentioned the example and there was a bit of intrest in the project.  I’ve actually had it posted for download for a little while now, but figured I would call some attention to it with this post.

Here’s the link:

.NET Custom Refinery Converter

Posted in .NET, Blog, IDOC | 3 Comments