Monthly Archives: February 2009

Fallen weekend warrior

“What happened to you?”

Since my return to the office this week, it’s pretty obvious that something did, indeed, happen to me.

No, I didn’t work on “Red Dog” (i.e. Windows Azure)–for those of you were attended last year’s PDC and saw the bright red shoes worn proudly by those on the main stage during keynotes.

What you see in the picture above, unfortunately, is a cast–my second cast in a series of casts, too. Red is the color chosen by my son, who I empowered to be my “awkward restraint device” designer. Currently the leading color for my next cast is maroon–although camouflage is a close second. :-)

While playing a league basketball game on Sunday 2/8 I ruptured my Achilles tendon, as per the ER doctor’s opinion. This diagnosis was confirmed when I saw an orthopedic doctor on Tuesday 2/10. I had a successful surgery to repair my tendon on Wednesday 2/11.

By the way, if you have a ruptured Achilles tendon, you don’t want the kind I apparently have. My rupture involves my calf muscle, too (i.e. more where the tendon and muscle connect than just the tendon alone). So, my recovery time will be extended.

Yesterday I had my stitches removed–I look like Frankenstein where my incision exists–and received my second cast. Boy, did it feel good not to have anything touching my skin for that brief period of time!

Basically I’ll be in a series of casts for the next several weeks, being put into a new cast roughly every week. The goal of this process is to stretch the repaired tendon so that my foot is perpendicular to my lower leg (i.e. bent at a 90 degree angle). So, with each new cast, my foot will be positioned with more tension/stretch toward that goal. Yesterday I began at 50 degrees.

Achieving 90 degrees will allow me to proceed into my next phase of recovery: physical therapy. It will also mean the end of casts and the start of a wearing a walking boot instead.

At the outside, it will be about six months until I fully recover (i.e. I can run and play basketball again).

Fun, eh?

But I’m thankful for a very loving and supportive wife and family. My employer, EMC, and my work colleagues are great, too. I’m fortunate to have a job that doesn’t require me to be on my feet or to perform heavy physical labor–especially during these tough economic times.

Besides, this will all pass before you know it. I certainly won’t take my ability to walk unassisted let alone run anytime soon… :-)

P.S. I wasn’t fouled while playing basketball either, although I thought that someone took a bat to my leg right above my heel at the time. I understand through teammates that I was actually alone while making a defensive rebound. Regardless of playing the incident over and over in my mind, I can’t recall if the “POP!” I heard (internally) was before or after landing–just recall landing like a bag of rocks on the hardwood floor.

JIRA Client for OASIS

Thanks to a recent IT change concerning the OASIS JIRA server, I can now leverage ALM Works JIRA Client to work OASIS CMIS TC issues.

JIRA Client for OASIS splash screen

Furthermore, all OASIS Issue Trackers in the single OASIS JIRA server are available to me–or any other OASIS member!

Here is how…

  1. Visit ALM Works and download JIRA Client.
  2. Install JIRA Client and choose “Run JIRA Client” before exiting the installer.
  3. Enter your license key. That is, download deskzilla_oasis.license to your local %USERPROFILE%\.JIRAClient directory (e.g. C:\Documents and Settings\YourUserName\.JIRAClient, on a Windows XP machine), and point your JIRA Client instance to your local license file (i.e. select it).
  4. Verify the following license data is presented upon selection:
          Site license
          Licensed to: open-source community
          Support ID: 4000383
          Supported servers:
            JIRA [http://tools.oasis-open.org/issues]
  5. Restart JIRA Client in order for this license to take effect (i.e. Start | Programs | JIRA Client | JIRA Client).
  6. Configure connection (i.e. enter your OASIS member login credentials).
  7. Connect and select the OASIS issue trackers of interest.
  8. Initialize connection, which may take a short amount of time during first-time initialization.

At this point you should be able to leverage JIRA Client against OASIS issue trackers (e.g. CMIS).

Credits…

  • A big thank you to ALM Works founder, Igor Sereda, for his support of open source projects and organizations like OASIS.
  • Thanks also go to Mary McRae of OASIS for gently vetting JIRA Client licensing details, since I’m not an OASIS employee.

Just to be clear, this ALM Works software is not being provided by, nor licensed to OASIS as an organization. The JIRA Client license from ALM Works isn’t granted to OASIS, but it’s restricted to access the OASIS JIRA repository. Each person who installs will need to determine whether or not they are able to accept the licensing agreements for their organization.

Enjoy!

Updated DFS Developer Guide on EDN

My colleague and technical writer, Joe Ferrie, just uploaded the second edition of the DFS 6.5 Development Guide to the EMC Developer Network (EDN) here. The information here is applicable to DFS 6.5 and DFS 6.5 SP1.

(I’m still working on this, but at least this content is available via EDN.)

Some highlights of this edition are as follows:

  • A new content transfer chapter, with practical information about uploading and downloading content using Base64 and MTOM, as well as using UrlContent to get content from Accelerated Content Services (ACS). Examples are provided for WSDL-based consumers, as well as productivity layer consumers. Unified Client Facilities (UCF) now gets its own chapter.
  • Details of Java productivity layer dependencies so that you can more easily understand what JAR files you need on your ClassPath given for your particular development scenario
  • A new chapter comparing DFC and DFS, which is expected to be useful for DFC developers who are ramping up with DFS and want to compare the general approach and specific operations
  • A revised explanation of the sometimes confusing restrictions on retrieving deep relationships in DataObjects.

Thanks, Joe!

Dynamic value assistance using DFS

Continuing my collaboration with John Sweeney (or his collaboration with me), today we’ll examine the DFS Schema service and do so in .NET as a direct-to-WSDL consumer. This tutorial builds upon a previous tutorial; so, if you’re not already familiar with it, please read this post and play with this sample. You’ll also need and be familiar with using Documentum Administrator (DA) and Documentum Composer 6.5 SP1.

Thanks to John for doing the legwork in this tutorial and for allowing me to share it all with you here. (Although, I’d really like to see John blog about this directly; he has a lot to share.)

Not only can the DFS Schema service return value-assist values, it also supports dynamic value assistance, including the handling of dependencies (e.g. one attribute value-assist dynamically built based on the value of another attribute).

This tutorial demonstrates how to use the DFS Schema service to perform dynamic value-assist tasks. Knowledge of Documentum Administrator, Documentum Composer 6.5 SP1, DFS 6.5 SP1, Visual Studio 2008 and WSDL-based consumption of DFS with .NET is assumed.

Before we begin, we’ll need to create users, groups and an object type to use as test data.

Step 1 – Create users and groups (to be performed with Documentum Administrator)

1. Create three groups named writers, reviewers and publishers in your repository.

2. Create six users. Name them appropriately, but for this tutorial, they will be referred to as User1–6. Put the users in the new groups, as specified in the following chart:

  Group   Members
  writers   User1, User2
  reviewers   User3, User4
  publishers   User5, User6

Step 2 – Create a new object type (to be performed with Documentum Composer 6.5 SP1)

1. Open Documentum Composer and create a new project.

2. Add a new type called kb_document with a supertype of dm_document.

3. Add a new attribute to the type named document_state (as shown in the following image).

4. Expand the document_state attribute and select Value mapping.

5. In the Conditional Assistance section, click New…

6. Add Draft,Review,Publish as values of Fixed List (as shown in the following image) and click OK.

Your Conditional Assistance section should now look like this:

7. Add another new attribute to the type named assigned_to as shown in the following image.

8. Expand the assigned_to attribute and select Value mapping.

9. In the Conditional Assistance section, click New…

10. Add the following query:

select users_names from dm_group where group_name = 'writers'

Set the other fields (as shown in the following image).

The value-assist list will be populated with users who are members of the writers group by default, when document_state does not have a value of Review or Publish.

11. In the Conditional Assistance section, click New…

12. Add the following query:

select users_names from dm_group where group_name = 'reviewers'

Set the other fields (as shown in the following image).

The value in the Expression field will cause the value-assist list to be populated with users who are members of the reviewers group, but only when document_state has a value of "Review."

13. In the Conditional Assistance section, click New…

14. Add the following query:

select users_names from dm_group where group_name = 'publishers'

Set the other fields (as shown in the following image).

The value in the Expression field will cause the value-assist list to be populated with users who are members of the publishers group, but only when document_state has a value of "Publish."

Your Conditional Assistance section should now look like the following:

15. Install the Documentum project to your repository.

Step 3 – Retrieve the value-assist list (using C# and the .NET Framework 3.0 or higher)

Note: the ServiceContextHeader class used in this tutorial comes from this prior sample, as noted above.

The following code snippet will return group members in the ValueAssist Values list. A PropertySet is created for document_state. The value of document_state will alter the dynamic-assist values for the assigned_to property.

// Get a reference to the DFS Schema service
SchemaServicePortClient schemaService =  
    new SchemaServicePortClient("SchemaServicePort"); 

StringProperty sp = new StringProperty();
sp.name = "document_state"; 
// assigned_to will have different dynamic-assist values, 
// depending upon the value set here
sp.Value = "Publish"; // or Review or Draft

// Create a PropertySet for document_state, which assigned_to depends upon
PropertySet ps = new PropertySet();
ps.Properties = new Property[1];
ps.Properties[0] = sp; 

using (OperationContextScope scope = 
           new OperationContextScope(schemaService.InnerChannel))
{
    // Add the ServiceContextHeader info to the outgoing request
    OperationContext.Current.OutgoingMessageHeaders.Add(
        new ServiceContextHeader(repositoryName, userName, password)); 

    // Get the values for the assigned_to property
    ValueAssist valueAssist = schemaService.getDynamicAssistValues(
        repositoryName, "DEFAULT", "kb_document", "assigned_to", ps, null); 

    // Display the values
    if (valueAssist != null || valueAssist.Values != null)
    {
        foreach (string s in valueAssist.Values)
            MessageBox.Show(s, "Value Assist Value");
    }
}

The following table shows the expected results:

  document_state value   assigned_to values
  Draft   User1, User2
  Review   User3, User4
  Publish   User5, User6

It is worth noting that if you execute SchemaService.getTypeInfo for kb_document, and examine the assigned_to property, you can determine that the property has dependencies. The returned TypeInfo.PropertyInfos[n].Dependencies will contain an entry for document_state. You can check this beforehand as a way of determining if setting one property (document_state) should trigger a refresh of the value list (calling getDynamicAssistValues again). This is very useful for a picklist property page where the values of one list depend on the value of another.

Here endeth the lesson… :-)

Update 2/6/2009: In order for you to spend more time understanding dynamic value assistance with DFS, I’ve uploaded a Visual Studio project to EDN here. Enjoy.