Archive

Author Archive

Java Filter – Retrieving a File

January 13, 2012 Comments off

When within a Java Filter, one may need to get the file for a particular revision of a content item. There is a class intradoc.server.DirectoryLocator that is very helpful. From this class, we can obtain the FileStoreProvider.

FileStoreProvider fileStoreProvider = DirectoryLocator.m_fileStore;

DirectoryLocator has several static methods that can get paths within the filestore to places such as weblayout directory, the vault directory, the temporary directory, the provider directory, etc. It can provide you a String path to almost any directory you want.

IdcFileDescriptor is a class that can provide the pathing to files. From a FileStoreProvider, we can create an IdcFileDescriptor.

IdcFileDescriptor idcFileDescriptor = fileStoreProvider.createDescriptor(binder, null, context);

The first parameter is a DataBinder. This is where the paremeters that are needed to build the path to the file are set. The second parameter is not needed and can be set to null. The third parameter is the ExecutionContext.

The required parameters that need to be in the DataBinder are “RenditionId”, “dDocName”, “dDocType”, “dRevLabel”, “dSecurityGroup”, “dDocAccount”, “dID”, and “dExtension”. RenditionId should be set to “primaryFile” for the primary file and “web” for the alternateFile.

Fortunately, a lot of the time most of these required parameters are already in your the original DataBinder. If you are missing some parameters you should be able to make a service call to DOC_INFO to get a ResultSet which contains all of the necessary parameters. You can then dump these parameters into a new DataBinder and feed it to the createDescriptor method call.

The file descriptor that comes back will give you something like this:

idcFileDescriptor: intradoc.filestore.BasicIdcFileDescriptor{dWebExtension=xml, dID=80, RenditionId.path=primaryFile, dStatus=RELEASED, StorageClass=vault, RenditionId=primaryFile, dSecurityGroup=Public, dDocType=Web, dOriginalName=jh000035.xml, dExtension=xml, uniqueId=c:/oracle/ucm/server/vault/web/80.xml, fileNamePrefix=null, dReleaseState=Y, dDocAccount=, path=c:/oracle/ucm/server/vault/web/80.xml, dDocName=JH000035, dRevLabel=27, dRenditionId=primaryFile}

To get the path to the file, do the following:

fileStoreProvider.forceToFilesystemPath(idcFileDescriptor, null, context);
String filePath = fileStoreProvider.getFilesystemPath(idcFileDescriptor, context);

You can of course turn this file path into a Java object by using:

File myFile = new File(filePath);
Categories: OracleUCM

Parse Date using RIDC

October 24, 2011 Comments off

Recently, I had a need to parse a String which contained a date returned from running a UCM search. The field in question was stored as an Oracle Database TIMESTAMP datatype (in the format 2010-02-04 06:00:00Z). I spent a while trying to parse it using the usual Java approaches (java.text.SimpleDateFormat,  java.sql.Timejavax.xml.bind.DatatypeConverter). After getting nowhere but receiving several parsing exceptions, a co-worker (thanks Wes Keppy) suggested I try using oracle.stellent.ridc.model.impl.DataObjectEncodingUtils.decodeDate to transform the String (in format 2010-02-04 06:00:00Z) to a Java Calendar object and it worked perfectly.

Since I was working in SSXA, the objects were using RIDC (Remote Intradoc Client). If I was within UCM and needed to parse a date, the intradoc.common.LocaleResources has methods that should be of some help. Sometimes it is best not to reinvent the wheel.
Categories: OracleWCM

AlphabetizeMenus – 11g

September 29, 2011 1 comment

We recently updated our AlphabetizeMenus component to work with 11g. Do not worry, it is still backwards compatible with 10g. You can grab the newest version build_5_20110913 here. Sometimes a picture is worth a thousand words, so I will demonstrate with some before and after screenshots. After the screenshots will be an in-depth code review of what all is being done to accomplish menu sorting on both 10g and 11g.

Trays – Before (unsorted)

Trays – After (sorted)

Top Menus – Before (unsorted)

Top Menus – After (sorted)

The first thing we do in this component is hook into the dynamichtml include for custom_finish_layout_init. We want to first call all other includes that might be using this hook by calling super.custom_finish_layout_init. Almost any time you want to add something to a dynamichtml include, the first thing you should do is call super on that include.

<@dynamichtml custom_finish_layout_init@>
  <$include super.custom_finish_layout_init$>

Next, we want to determine what version of UCM this component is installed on. There is an Idoc Script variable, ProductVersion, in 11g  that will start with 11 if the UCM instance is 11g. If it is, we call a custom include for 11g. Otherwise, we call a custom include for 10g.

<$if ProductVersion like "11*"$>
  <$include alphabetize_menus_11g$>
<$else$>
  <$include alphabetize_menus_10g$>
<$endif$>

And here is all that code put together.

<@dynamichtml custom_finish_layout_init@>
  <$include super.custom_finish_layout_init$>
  <$if isTrue(#env.EnableMenuSorting)$>
    <$if ProductVersion like "11*"$>
      <$include alphabetize_menus_11g$>
    <$else$>
      <$include alphabetize_menus_10g$>
    <$endif$>
  <$endif$>
<@end@>

10g Menus

We first create a new array. Then we get the children of the node that was passed in.

var sortData = new Array();
var children = navBuilder.getNodeById(menuID).childNodes;

Next, we want to loop through the children. If we find children of children (I suppose you would call these grandchildren), then we recursively call the sortMenu function. After we have finished dealing with any children, we build a JSON style array object containing the node object (what object type that may be) and the text label.

for (var i = 0; i < children.length; i++) {
  if (children[i].childNodes.length > 0) {
    this.sortMenu(children[i].getAttribute("id"));
  }

  sortData[sortData.length] = {
    id: children[i].getAttribute("id"),
    label: children[i].getAttribute("label")
  };
}

Next, we need to sort the array of items on the current level and we do this by defining our own JavaScript sort method.

sortData.sort (
  function (a, b) {
    if (a.label < b.label)
      return -1;
    if (a.label > b.label)
      return 1;
    return 0; [[% a == b %]]
  }
);

After our data (for the current level) is sorted, we loop over the sorted array and add/remove the items to get them in the correctly alphabetized order.

for (var i = 0; i < sortData.length; i++) {
  navBuilder.moveItemInto(menuID, sortData[i].id, false);
  if (its.safari)	{
    navBuilder.deleteItem(sortData[i].id);
  }
}

The last step is to call our menuSortingMachine.sortMenu function. Most people choose to pass in “NAVTREE” which will sort all the menus (except the menubar level items such as My Content Server, Adminsitration, Browse Content, etc.). However, you can pass in a specific “ADMINISTRATION” and that will sort only that menu and its children.

menuSortingMachine.sortMenu("NAVTREE");

And finally all the 10g  Trays and Top Menus layout sorting code together.

var menuSortingMachine = {
  sortMenu:function(menuID) {

    var sortData = new Array();

    var children = navBuilder.getNodeById(menuID).childNodes;

    for (var i = 0; i < children.length; i++) {
      if (children[i].childNodes.length > 0) {
	this.sortMenu(children[i].getAttribute("id"));
      }

      sortData[sortData.length] = {
	id: children[i].getAttribute("id"),
	label: children[i].getAttribute("label")
      };
    }

    sortData.sort (
      function (a, b) {
	if (a.label < b.label)
	  return -1;
	if (a.label > b.label)
	  return 1;
	return 0; [[% a == b %]]
      }
    );

    for (var i = 0; i < sortData.length; i++) {
      navBuilder.moveItemInto(menuID, sortData[i].id, false);
      if (its.safari)	{
	navBuilder.deleteItem(sortData[i].id);
      }
    }
  }
};
[[% menuSortingMachine.sortMenu("ADMINISTRATION"); %]]
menuSortingMachine.sortMenu("NAVTREE");

11g Menus

The navBuilder object that we used in 10g should be considered deprecated in 11g. Instead, we have new objects we can use manipulate menus such as: YAHOO.widget.MenuManagerYAHOO.widget.MenuYAHOO.widget.MenuItemYAHOO.widget.TreeViewYAHOO.widget.Node

oMenuBarA is a YAHOO.widget.MenuBar for menuA. This is the menu that contains items such(such as “Search” and “New Check In”).
oMenuBarB is a YAHOO.widget.MenuBar for menuB.
oTreeViewA is a YAHOO.idc.widget.TrayTreeView for the side tray (in Trays layout). Many of the methods from YAHOO.widget.TreeView can be used for the oTreeViewA object.

For more information on the new menu objects in 11g, seeKyle Hatlestad’s post Modifying Navigation Menus in UCM 11g.

11g Top Menus

The first thing we want to do is get the submenus or what we called children in 10g.

var subMenus = menu.getSubmenus();

Next. we want to loop through the submenus and recursively call the sortMenu function.

for (var i = 0; i < subMenus.length; i++) {
  menuSortingMachine.sortMenu(subMenus[i], new Boolean(true));
}

Next, we always add a check to make sure we want to sort this level and check to make sure the menu parent exists.

if (sortLevel == true || typeof menu.parent != "undefined") {}

Next, we get an array of the current level’s children menuItems and we also create a new array to hold our sorted data.

var items = menu.getItems();
var sortData = new Array();

Next, we want to loop through the menuItems and build a JSON style array object containing the MenuItem object and the text label.

for (var j = 0; j < items.length; j++) {
  sortData[j] = {
    element: items[j].element,
    label: items[j].cfg.getProperty("text")
  };
}

Like in 10g, we need to sort the array of items on the current level and we do this by defining our own JavaScript sort method.

sortData.sort (
  function (a, b) {
    if (a.label < b.label)
      return -1;
    if (a.label > b.label)
      return 1;
    return 0; [[% a == b %]]
  }
);

Similar to 10g, after our data (for the current level) is sorted, we loop over the sorted array and add the items to get them in the correctly alphabetized order.

for (var k = 0; k < sortData.length; k++) {
  menu.element.appendChild(sortData[k].element);
}

The last step is to call the menuSortingMachine.sortMenu function. We first check to make sure the variable (oMenuBarA or oMenuBarB has a value) and if so, we can use that menu to start sorting from. If we want the menubar level items for oMenuBarA or oMenuBarB to get sorted alphabetically, we can pass in true boolean value.

if (typeof oMenuBarA != "undefined" && oMenuBarA != undefined) {
  menuSortingMachine.sortMenu(oMenuBarA, new Boolean(false));
}
if (typeof oMenuBarB != "undefined" && oMenuBarB != undefined) {
  menuSortingMachine.sortMenu(oMenuBarB, new Boolean(false));
  [[% menuSortingMachine.sortMenu(YAHOO.widget.MenuManager.getMenu("MENU_B_ADMINISTRATION"), new Boolean(true)) %]];
}

And finally all the Top Menus layout sorting code together.

var menuSortingMachine = {
  sortMenu:function(menu, sortLevel) {

    var subMenus = menu.getSubmenus();

    for (var i = 0; i < subMenus.length; i++) {
      menuSortingMachine.sortMenu(subMenus[i], new Boolean(true));
    }

    if (sortLevel == true || typeof menu.parent != "undefined") {
      var items = menu.getItems();

      var sortData = new Array();

      for (var j = 0; j < items.length; j++) {
        sortData[j] = {
          element: items[j].element,
          label: items[j].cfg.getProperty("text")
        };
      }

      sortData.sort (
        function (a, b) {
          if (a.label < b.label) {
            return -1;
          }
          else if (a.label > b.label) {
            return 1;
          }
          return 0; [[% a == b %]]
        }
      );

      for (var k = 0; k < sortData.length; k++) {
        menu.element.appendChild(sortData[k].element);
      }
    }
  }
};
if (typeof oMenuBarA != "undefined" && oMenuBarA != undefined) {
  menuSortingMachine.sortMenu(oMenuBarA, new Boolean(false));
}
if (typeof oMenuBarB != "undefined" && oMenuBarB != undefined) {
  menuSortingMachine.sortMenu(oMenuBarB, new Boolean(false));
  [[% menuSortingMachine.sortMenu(YAHOO.widget.MenuManager.getMenu("MENU_B_ADMINISTRATION"), new Boolean(true)) %]];
}

11g Trays Menus

For Trays layout, we can do very similar code to that for 10g, except we have some different objects and method calls. We first create a new array. Then we get the children of the node that was passed in.

var sortData = new Array();
var children = node.children;

Similar to 10g, we want to loop through the children and recursively call the sortMenu function. Then we build a JSON style array object containing the YAHOO.widget.Node object and the text label.

for (var i = 0; i < children.length; i++) {
  if (children[i].children.length > 0) {
    this.sortMenu(children[i]);
  }

  sortData[sortData.length] = {
    node: children[i],
    label: children[i].label
  };
}

Like in 10g, we need to sort the array of items on the current level and we do this by defining our own JavaScript sort method.

sortData.sort (
  function (a, b) {
    if (a.label < b.label)
      return -1;
    if (a.label > b.label)
      return 1;
    return 0; [[% a == b %]]
  }
);

Similar to 10g, after our data (for the current level) is sorted, we loop over the sorted array and add/remove the items to get them in the correctly alphabetized order.

for (var i = 0; i < sortData.length; i++) {
  oTreeViewA.popNode(sortData[i].node);
  node.appendChild(sortData[i].node);
}

The last step is to call the menuSortingMachine.sortMenu function. We first check to make sure the variable (oTreeViewA has a value) and then we can use the getRoot() method on the oTreeViewA variable to get the root node to start sorting from.

if (typeof oTreeViewA != "undefined" && oTreeViewA != undefined) {
  menuSortingMachineTrays.sortMenu(oTreeViewA.getRoot());
}

And finally all the Trays layout sorting code together.

var menuSortingMachineTrays = {
  sortMenu:function(node) {

    var sortData = new Array();

    var children = node.children;

    for (var i = 0; i < children.length; i++) {
      if (children[i].children.length > 0) {
	this.sortMenu(children[i]);
      }

      sortData[sortData.length] = {
	node: children[i],
	label: children[i].label
      };
    }

    sortData.sort (
      function (a, b) {
	if (a.label < b.label)
	  return -1;
	if (a.label > b.label)
	  return 1;
	return 0; [[% a == b %]]
	}
      );

    for (var i = 0; i < sortData.length; i++) {
      oTreeViewA.popNode(sortData[i].node);
      node.appendChild(sortData[i].node);
    }
  }
};
if (typeof oTreeViewA != "undefined" && oTreeViewA != undefined) {
  menuSortingMachineTrays.sortMenu(oTreeViewA.getRoot());
}

Note: Any code you see between [[% %]] is an Idoc Script comment.

Categories: OracleUCM

11g Publish Static Files Using Custom Component

September 28, 2011 Comments off

Recently on the forums it was asked how to publish static files to the Weblayout folder using a custom component in 11g. We covered this earlier for 10g. Publishing files is slightly different for 11g. Follow the steps below to publish static files in 11g.

1. In the custom component directory, create a folder “publish”. Files that are placed within this folder will become relative to the weblayout folder.

2. In Component Wizard -> Build -> Build Settings, add a “Component Extra” entry type and link to the above path (customComponentName/publish/).

3. In Component Wizard, under the Resource Definition tab, click the “Add” button to add a new resource.

4. Check the box for “Resource – Static Table (HTML Format)”. Set the “File name” to something such as “resources/customComponent_published_static_files.htm” so that you can easily identify what this resource definition is by looking at the file name. Set the “Load Order” to “1000″. Click “Next”.

5. Set the “Table Name” to something such as “CustomComponent_PublishedStaticFiles”. Make sure the “Merge To” box is checked and set it to “PublishedStaticFiles”. Click “Finish”.

6. Edit the file that was just created with your favorite text editor. You want the second <tr> to contain something like the following:

<td>publish/resources</td>
<td>resources</td>
<td>resources:sitestudio</td>
<td>1000</td>
<td><$doPublish = 1$></td>
<td>1</td>
  1. The first <td> represents the source folder to publish
  2. The second represents the path, relative to weblayout, to place the files
  3. The third represents the “class” that controls the publishing and processing of the content
  4. The fourth is the loadOrder and should be set to 1000 (which is the highest available)
  5. The fifth is doPublish.  This is a string of iDocScript that can be used to determine whether or not this set of files should be published.  You can do fancy things like construct time of day, week or month to conduct publishing.
  6. The sixth (canDeleteDir) should be set to 1.

That is it! Build your component and try it out.

Note: If you have problems with the files publishing (for example they should publish on start-up) you can manually invoke this action by invoking Administration -> Admin Actions – > Weblayout Publishing -> Publish static, string and dynamic files.  This will likely take a few minutes to complete.

Categories: OracleUCM

Setting Memory Arguments in WebLogic Application Server

September 15, 2011 2 comments

If you need to change the memory allocation to your WebLogic administration server and/or managed server, the following guide will show you how. Note: This will raise the limit for both the WebLogic administration server and managed server. You can verify these settings by watching the server startup script. Optionally, if you are setting the memory for Oracle UCM, you can verify this setting on the System Audit Information page.

Windows

1. Open the domain environment cmd file:

<middleware home>\user_projects\domains\base_domain\bin\setDomainEnv.cmd

2. Locate the following remark, inside the cmd file: (‘Search’ -> “@REM IF USER_MEM_ARGS”)

@REM IF USER_MEM_ARGS the environment variable is set, use it to override ALL MEM_ARGS values

3. Directly after this remark, add the following line:

set USER_MEM_ARGS=-Xms256m -Xmx1024m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=512m

4. The portion of the file you have edited looks like this:

@REM IF USER_MEM_ARGS the environment variable is set, use it to override ALL MEM_ARGS values

set USER_MEM_ARGS=-Xms256m -Xmx1024m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=512m

if NOT “%USER_MEM_ARGS%”==”" (

set MEM_ARGS=%USER_MEM_ARGS

)

UNIX/Linux

1. Open the domain environment sh file:

<middleware home>\user_projects\domains\base_domain\bin\setDomainEnv.sh

2. Locate the following remark, inside the sh file: (‘Search’ -> “#REM IF USER_MEM_ARGS”)

#REM IF USER_MEM_ARGS the environment variable is set, use it to override ALL MEM_ARGS values

3. Directly after this remark, add the following line:

USER_MEM_ARGS=-Xms256m -Xmx1024m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=512m

4. The portion of the file you have edited looks like this:

#REM IF USER_MEM_ARGS the environment variable is set, use it to override ALL MEM_ARGS values

USER_MEM_ARGS=-Xms256m -Xmx1024m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=512m

if NOT “%USER_MEM_ARGS%”==”" (

MEM_ARGS=%USER_MEM_ARGS

)

References

Note that the basic difference between Windows and UNIX/Linux regarding this issue is the use of the “set” command for the Windows environment.

Final Thoughts

This is certainly not the only way to accomplish this task, and it does affect all managed servers in the domain.  However, if you’re running a dev box with plenty of memory it is the simplest and gives you the best “umph” when running your various instances with the least amount of work.

Categories: WebLogic

Remove paragraph tag from WYSIWYG

September 14, 2011 Comments off

A question was once asked in the forums about how to stop WYSIWYG content from being wrapped in HTML p tags. Below are the steps to solve this problem.

1. Using JDeveloper (for 11g SSXA) or Site Studio Designer, open the element definition for the WYSIWYG in question.

2. Check the box for “Do Not Enclose Text in Editor”.

The 10gR4 Site Studio Designer Guide has this to say about the topic:

Do Not Enclose Text in Editor: Used to define how carriage returns are handled in HTML. If text is enclosed, each time the contributor enters a return, a paragraph is created. If not enclosed, a line break is inserted for each return.

Categories: OracleWCM

Customizing Workflow Forms

September 13, 2011 Comments off

Ever wanted to create a custom form with added metadata inside a workflow review? This post will show you how.  This topic has come up many times on the Oracle forums. Customizing the workflow form is not really that difficult. Below are the steps you will need to know in order to customize the workflow form.

1. Create a custom component called MyWorkflowComponent

2. Add a template which overrides WORKFLOW_REVIEW_FRAMES

3. Edit this template. Insert the following in the HTML head after this line <$include std_html_head_declarations$>


<$if dWfName like "MyWorkflow" and dWfStepName like "Data.Input"$>

   <$include my_workflow_custom_javascript$>

<$endif$>

This code checks the workflow name and step to see if they match what you want. This way you can customize the workflow form for different workflows.

Search for this line within the WORKFLOW_REVIEW_FRAMES template: <$include workflow_doc_action_forms$> There will be a </table> </td> right before this. Insert the following code before this this </table>:


<$if dWfName like "MyWorkflow" and dWfStepName like "Data.Input"$>

   <$include my_workflow_custom_forms$>

<$endif$>

Again we check to make sure this is the Workflow we want to customize. If so, we insert a custom include that we will be creating.

4. Within your component, create a Dynamic HTML resource file.

5. Edit this resource file.

Create a dynamic include for anything that should go within the HTML head (this example includes jQuery and jQueryUI.

<@dynamichtml my_workflow_custom_javascript@>
<script src="<$HttpRelativeWebRoot$>resources/CSXWorkflowEnhancements/jquery-1.4.4.min.js"></script>
<script src="<$HttpRelativeWebRoot$>resources/CSXWorkflowEnhancements/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript">
$(function(){
   $("a[href^='javascript:document.Approve_<$dID$>']").click(function() {
      $("input[name='xEmployeeID']").val($("input[id='xEmployeeID']").val());
 [[% Submit my form %]]

 $("#frm_medical").submit();

 return false;    });

});

<@end@> 

Notice the use of HttpRelativeWebRoot. When you use this, you will need to put these files within your weblayout directory. Use this blog post as a reference.

Now we will create the actual form that shows up below or Approve / Reject links.

<@dynamichtml my_workflow_custom_forms@>

<tr>

 <td style="padding-top:10px">

 <form id="frm_employee_info" method="POST" action="javascript:document.Approve_<$dID$>.submit();">

 <p><label for="xEmployeeID">Employee ID</label><input type="text" id="xEmployeeID" /></p>

 </form>

 </td>

</tr>

<@end@>

Notice the form POST action. This is where we hook into the Approve link. When someone clicks the Approve link, our form (frm_employee_info) will get submitted first. This is where we can do validation and if something is not correct we can return FALSE and stay on the page. For this blog post, we are simply going to copy the values from this form and put them in the hidden field (which we will create next) that actually gets submitted to Content Server. If our form submits fine, then we will submit the Content Server form.

Create a dynamic include that overrides workflow_doc_approve_special_parameters. Within this include, we need to place HTML input elements that will get populated from or forms above.

<@dynamichtml workflow_doc_approve_special_parameters@>

<$include super.workflow_doc_approve_special_parameters$>

 <input type="hidden" name="xEmployeeID" value="" />

<@end@>

It may look like a lot of code, but it is not too much work. Have any tips or tricks to making your own custom forms? Send them to tips@corecontentonly.com.

Categories: OracleUCM

Java Constants

June 29, 2011 Comments off

It is easy to misspell variable names in Java. Using Java static final Strings (perhaps better known as constants) are a great way to help avoid this problem. Here and here are two articles on the subject. Below is a sample class for some very commonly used metadata field names in UCM.

public class RCSConstants
{
public static final String dDocTitle = “dDocTitle”;
public static final String dDocName = “dDocName”;
public static final String dDocName_encoded = “dDocName_encoded”;
public static final String dFormat = “dFormat”;
public static final String dID = “dID”;
public static final String dDocType =”dDocType”;
public static final String dRevLabel = “dRevLabel”;
public static final String dOriginalName = “dOriginalName”;
public static final String dDocAuthor = “dDocAuthor”;
public static final String dSecurityGroup = “dSecurityGroup”;
}

These constants (strings) can now be used in other classes as follows:

RCSConstants.dDocTitle

If you are using an IDE (such as JDeveloper or Eclipse) it will only let you choose values that are spelled correctly (provided you spelled them correctly in your constants class).

Categories: OracleUCM

csCheckinIDNotUnique – Error Message of the Month (February)

February 7, 2011 Comments off

Error:

csCheckinIDNotUnique

There is actually a good Oracle Support article on this error.  There can be a variety of reasons why one might encounter this issue.  Occassionally the values in the Counters table get out of date.  Sometimes you’re attempting to check in a new piece of content with the same Content ID as an existing piece of content without knowning it.  Oftentimes this happens if you are integrating with Content Server and are attempting to generate a Content ID.

Once you’ve have fixed your core logic issue you may still be left with a “corrupted” piece of content in the system that you need to get rid of before you can make a fresh start with your updated code or process.  To take care of this situation:

Step 1 – Open Admin Applets -> Repository Manager

Step 2 – Search/Filter to find the offending Content ID.

Step 3 -Delete this revision in the system.

You should now be able to checkin content normally again without this error occurring.

UCM 11g Stand-alone Admin Applications

February 6, 2011 Comments off

Running UCM admin applications directly from the server where Content Server is installed is called running them in stand-alone mode. No longer are they called applets, since the term “applet” is usually referred to a program which is included in a web page.

Stand-alone admin applications are located here: CS_INSTALL_DIRECTORY/bin/

Executable applications are listed in this folder. If an application is not listed, it can be entered as a parameter to the IntradocApp application, as in this example: % ./IntradocApp Workflow

In Windows, you can find the applications in your Start Menu: Start, Programs, Content Server, instance, Utilities, utility

In UCM 10g, you could run these stand-alone applications with no additional setup.

In UCM 11g, due to the advent of WebLogic, these applications need some setup. You need to setup a JDBC driver to talk to the database and you will need to login with a local user.

Below are 12 simple steps to get stand-alone admin applications running.

1. Login to UCM as an administrator.

2. Navigate to Administration > Admin Applets > User Admin.

3. Find the local user “sysadmin”.

4. Click “Edit”.

5. Change the password to something secure that you will remember.

6. Click “OK” and exit User Admin.

7. Navigate to MIDDLEWARE_HOME/user_projects/domains/DOMAIN/ucm/bin/

8. Open SystemProperties.

9. Go to the “Database” tab.

10. Select Oracle Thin JDBC Driver.

  • JDBC Connection String = jdbc:oracle:thin:@localhost:1521:orcl
  • JDBC User Name = dev_urmserver (see note below)
  • JDBC User Password = oracle

Note: The user name you connect as should not be “SYS”. You want the user Content Server connects as. If you do not know what user this is, open SQL Developer and connect as “SYS”. Then you can look under “Other Users’ and find a user that looks like it might be Content Server’s user. In my example this is dev_urmserver because it was a dev instance and this was a URM server.

11. Click “OK”.

12. Now when you launch any of the stand-alone applications you will be prompted for a user name and password. Login with sysadmin and click “OK”. The application should now load.

The two stand-alone admin applications that do not need login credentials are SystemProperties and Component Wizard.

Oracle documentation on running UCM 11g stand-alone admin applications can be found here.

Categories: OracleUCM Tags: ,
Follow

Get every new post delivered to your Inbox.