LDAP-Documentum Configuration & Troubleshooting Tips

July 12th, 2010 by Zainab Mantri

Configure LDAP with Documentum.

Here are the screen shots of step by step configuration of LDAP with Documentum. It might differ depending on how you want to sync your users and groups in Active Directory with Documentum.

Go to Documentum Administrator (DA) -> Administration -> Basic Configuration -> LDAP Servers. Click on File-> New-> LDAP Server Configuration. More detailed notes can be found in the Documentum Administrator User Guide under the section of Basic Configuration.

After doing the LDAP configuration go to the Server Configuration and enable the correct LDAP server

Run the LDAP job to synchronize the users and groups. Few key points and common errors:

  • It is always one way sync. The LDAP job will never update anything in Active Directory.
  • If the user enters a wrong password 3 times the account will be locked out as it authenticates the password with AD. The account then needs to be unlocked by the System Administrator.
  • The LDAP job checks the user_name & the user_os_name. If the user_name in Documentum does not match exactly with the user_name in AD, it will throw an error. For example; if a user name in AD is Sarah McLaughlin and for some reason the user_name was created as Sarah Mclaughlin in Documentum and their user_os_name is the same the job will not synchronize. The solution for this is to reassign the user’s name to match exactly with AD. The only problem with the reassign tool is that it runs a DQL to update all the objects which are currently owned by the old user_name and reassigns them to the new user_name, hence updating the r_modify_date & r_modifier. You can run the LDAP sync job after running the Reassign User Job and see that it runs through perfectly.
  • After you run the LDAP job and on checking the log file and there is an error about a .cnt file not found you should do the following. Go to the path which is given in the log file. It should be E:\Documentum\dba\config\<docbase_name>\ ldap_0800a184802036ef.cnt. There should be older files with a different object id. Recreate a file which the job is asking for and run the job again. It should run fine now. If an older file does not exists just create a blank file with the name and run the job.
  • The main attributes to check if a user fails to update through LDAP are: user_login_domain, user_source, user_ldap_dn & user_global_uniue_id. You should check these values with a user that is working correctly.
  • If an user’s id fails even though it has the correct user_name and the error says that cannot update user as user is already configured in a separate domain you should do the following.
  • Go to IAPI and fetch the user that is failing: retrieve,c,dm_user where user_name = ‘xxx’
  • dump,c,l
  • check the user_global_unique_id
  • It should be testAD:3acb0b81-1dd211b2-80d9af5c-40c9a950.
  • If it is not then this is what is causing the error.
  • set,c,l,user_global_unique_id = ‘testAD:’
  • Run the job again and check if the user has been configured successfully and user_global_unique_id is set correctly.

Here are some of the LDAP tools that can be used for debugging purposes. These can be downloaded easily and installed. They are free

  • dsa.msc
  • adsiedit.msc
  • Softerra LDAP Browser

These 2 tools do not show the Deleted Users folder in AD. When an user is deleted in AD it remains in the Deleted Users folder for a given period of time after which it is permanently deleted. Documentum pools this folder and updates the user state as Inactive.

Other tools:

  • ldp.exe
  • adexplorer.exe show the Deleted Objects folder.

With certain tools you might have to specify the distinguished name “cn=Deleted Objects,DC=iol,DC=xxx,DC=net” when you connect because default connections usually connect to 1 of the 3 partitions in active directory, the domain, schema or configuration DN’s

Full Refresh

In the event to perform a full refresh of LDAP data, utilize the a_last_run attribute as follows to achieve it.
Note: a_last_run is defined as a string not a datetime field. LDAP Synchronization will not produce the desired results if the word “null” is present in this attribute.

Go to IAPI and run the following commands

retrieve,c,dm_ldap_config
set,c,l,a_last_run
save,c,l

Trace
You can turn on the tracing on the LDAP job by setting the trace level to 10 and viewing the trace file after the job has completed. Right click on the job in DA and click on View Trace File. You can also check the job report for errors or validation.

LDAP Job Through Command Prompt

You can also run the LDAP job through command prompt.

Go to the directory where Documentum is installed (E:\Documentum\product\6.5\bin) and then run the job:

E:\Documentum\product\6.5\bin>java com.documentum.ldap.LDAPSync -docbase_name xxx -user_name xxx -password xxx -full_sync true -method_trace_level 10 -group_save_limit 1000 -rename_user_option true -rename_group_option true -deactivate_user_option true >> C:\ldapsync_MSAD.log

LDAP-Documentum Configuration & Troubleshooting Tips

SQL Formatting Tips for Documentum

April 6th, 2010 by Zainab Mantri

Sometimes we want to play directly with the underlying database or generate outputs in tabular format. It can easily be done in dql (Documentum Query Language) and then imported into Microsoft Excel.  SQL does not generate tabular output and needs to be tweaked a little to get the desired results.

Here are some tips:

  • Set autocommit off. This will enable you to verify the changes and doing a rollback if you feel that the changes are not good enough.
  • SQL updates do not affect the modify date & modifier so if you are sure of the data that needs to be modified and wish to save the modify date etc use SQL. SQL updates can be done even when the documents are checked out.
  • For every object type, there are 2 tables and 2 views that you’ll find useful. For dm_sysobject, the tables are: dm_sysobject_s and dm_sysobject_r, while the views are dm_sysobject_sv and dm_sysobject_rv. The naming conventions are easy enough to remember, appending _s for all the single-value attributes, _r for all the repeating attributes, and an extra v if it is a view. The regular tables only allow you to deal with attributes that weren’t inherited (i.e. r_object_type is not available for dm_document_s because it is inherited from dm_sysobject_s). However, the views will allow you to select all inherited attributes as columns. So if you were doing a select, it would be more convenient to use views, but if you are doing an update, then you are stuck with the regular table and would have to join the tables.
  • The column that all 4 of tables share is the r_object_id attribute, so you will be using this in the join condition. I also highly recommend using aliases all the time because it will save you a lot of headaches. Here is a simple example to find how many my_persons have their best friend as one of their friends. A little useless, but it might be a query to verify if your data is consistent.

select count(a.r_object_id) from my_person_sv a, my_person_rv b where a.r_object_id = b.r_object_id and a.bestfriend = b.friends;

  • If you want to access more than one repeating attribute, even for the same object type, you have to do another join with that repeating table. So we extend the previous example by adding the constraint that the best friend is a colleague. It is easy to see how repeating attributes can be quite a pain.

select count(a.r_object_id) from my_person_sv a, my_person_rv b, my_person_rv c where a.r_object_id = b.r_object_id and a.r_object_id = c.r_object_id and a.bestfriend = b.friends and a.bestfriend = c.colleagues;

  • Speaking of joins, the real pain is when you want to do an update join. I can’t figure out the best way to do this in Oracle SQL, but here are some ways of doing it. This example will set some attribute by looking up a code in a control list if and only if that code exists in the control list.

update my_type_s a
set a.some_attribute = (select the_new_attribute b from my_control_list_s b where a.code = b.code)
where exists (select 1 from my_control_list_s where a.code = b.code);

The exists part performs a subquery for each occurrence and will be a source of slowdown, but if you need joined attributes in the where clause, then sometimes there might not be a better alternative. Of course, in some cases (such as this) there are ways to tweak the query in this way:

update my_type_s a
set a.some_attribute = (select the_new_attribute from my_control_list_s b where a.code = b.code)
where a.code in (select b.code from my_control_list_s b);

  • Don’t insert or remove repeating attributes in SQL unless you absolutely know what you are doing. Feel free to update them to other values, but anything else is better left for a DQL query.
  • If you are running queries in batch, use SET DEFINE OFF; to prevent ‘%’  or special characters from being treated as substitution variables.
  • You can print the results to a file by spooling the data. spool C:\temp.txt. After the output is done use spool off;
  • SET HEADING OFF will give you a clean output with the headings only once rather than being repeated every now and then.
  • set linesize 1000; (Calculate the total length of all the attributes and the line size should be more than that else it will wrap the data.)
  • set colsep “,”. (This will generate the output file with the columns separated by a ‘,’. When you will import this file in Microsoft Excel you can import it using the delimiter as ‘,’. You can use any colsep value like tab, ; , |, etc)
  • set pagesize 50000; (The value of PAGESIZE is the number of output lines to be produced on each page.)

I welcome any other tips that all of us could use.

SQL Formatting Tips for Documentum

How to run multiple instances of Tomcat in one Windows machine

January 18th, 2010 by Sanjay Regmi

Sometimes, you might want to run two web applications using Tomcat on one server and want each installation to be separate. This provides isolation of the application and you can change configuration of each one of them separately. Here is a stepwise instruction for the same using Tomcat 6 on Windows 2003 server.

Assumption:
You have a working copy of Java JRE installed on your machine. If not, any JRE above version 5.0 and later is fine. Install it from here, if you need it.

The process:

1. Download Tomcat
Download Tomcat (the core, zipped version) from here and upzip in two different folders, for example c:\tc1 and c:\tc2.

2. Setup environment variable
Go to Start, Control Panel, System, Advanced, Environment Variables, System Variables. Click New. In variable name, input “CATALINA_HOME” and “c:\tc1″ in variable value, without quotes. Then press OK. Again, in System Variables, click New. In Variable name, input “CATALINA_HOME2″ and “c:\tc2″ in variable value, without quotes. Press OK thrice.

3. Setup new CATALINA_HOME variable
Go to c:\tc2\bin directory. Open startup.bat in notepad. Click on the edit menu and then replace. Find all instances of CATALINA_HOME and replace with CATALINA_HOME2. Do the same for catalina.bat and shutdown.bat in c:\tc2\bin.

4. Provide new ports.
Now go to c:\tc2\conf directory and open server.xml in notepad. There are three replacements to be done here.

    Find code fragment, “Server port=”8005″ shutdown=”SHUTDOWN”". Replace 8005 with 8105.
    Find code fragment, “Connector port=”8080″ protocol=”HTTP/1.1″”. Replace 8080 with 8100.
    Find code fragment, “Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″”. Replace 8009 with 8109.

Note: you can replace with any port number as long as you know it is free.

5. Check installation
You are done setting both the tomcats up. Goto c:\tc1\bin and double-click on startup.bat. Tomcat instance should be up and running. Open up a browser and input http://localhost:8080. You should see the familiar tomcat start page. Then goto c:\tc2\bin\ and double-click on startup.bat. Tomcat instance two should be up and running. Point your browser to http://localhost:8100 and you should again see the tomcat startup page.

You can create as many new instances of tomcat as required by repeating the above steps. Just make sure that all ports that you use (step 4) are free.

Troubleshooting:

    Make sure you downloaded the zipped version.
    Make sure step 2, which defines tomcat home is done properly.
    Check step 3 – the replacement of CATALINA_HOME to CATALINA_HOME2 should be thorough.
    The new ports in step 4 (8105, 8100, 8109 ) should all be free.

Let me know if you have a better or a quicker setup method.

How to run multiple instances of Tomcat in one Windows machine

Export Documents as ZIP in wdk applications

January 14th, 2010 by Praveena Killamsetty

We had a requirement in webtop where the client needed to export the selected documents as a zipped folder into the local client machine. It was interesting and time consuming since we did not want to write any Business Objects for this customization. I looked up a lot about this but couldn’t find a working solution. I am posting it here since it might be handy to others looking for something similar to this.

The user selects the documents needed to be exported and clicks on the menu option to export as zip.Then a jsp page pops up prompting the user to put in a name for the zipped folder.

prompt for folder name

After the user puts in a name and clicks Finish a page opens up with the zipped folder as link which the user needs to click to download it into the local client machine.

 

link to downloadWhen clicked on the link the user is prompted for a location to save the zip folder and then the folder gets saved into the given location.

I followed the following steps to achive this:

Step 1: Put in all the selected objectIds in an ArrayList.

Step 2: Use the  ContentTransferConfig object to get the ContentServer location and create a temp file in that location.

Step 3:Get the objects from the previously stored objectIds and and add them as zip entries to the temporary file created.

Step 4: Use the HTTPTransportManager to push the data and show up the links to download into the local machine.

Code:

Component comExport = getContainedComponent();
ArrayList comArray = new ArrayList();
ArrayList idArray = new ArrayList();
ArgumentList argList=new ArgumentList();
comArray = super.getContainedComponents();
Text zipControl=(Text) getContainedComponent().getControl(“zip_name”);
String zipName=zipControl.getValue();

for(int i=0; i<comArray.size(); i++)

{

comExport= (Component)comArray.get(i);

argList = comExport.getInitArgs();

idArray.add(argList.get(“objectId”));

}

ContentTransferConfig ctConfig = ContentTransferConfig.getConfig();
File tempFolderAppServer = ctConfig.getServerContentLocation();
File tempFile = File.createTempFile((new StringBuilder()).append(“mytempzip_”).toString(), “”, tempFolderAppServer);
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
ZipOutputStream zos = new ZipOutputStream(fileOutputStream);

for (int i = 0; i < idArray.size(); i++)

{

IDfSysObject sysObject = (IDfSysObject) getDfSession().getObject(new DfId(idArray.get(i).toString()));
String strObjectFormat=sysObject.getFormat().getDOSExtension();
ZipEntry zipAdd = new ZipEntry(sysObject.getObjectName()+”.”+strObjectFormat);
zos.putNextEntry(zipAdd);
ByteArrayInputStream stream = sysObject.getContent();
byte[] buffer = new byte[10240];

while (true)

{

int len = stream.read(buffer, 0, buffer.length);

if (len <= 0)

break;

zos.write(buffer, 0, len);

}

stream.close();

}

HttpTransportManager manager = HttpTransportManager.getManager();
List ids = new ArrayList(1);
com.documentum.web.contentxfer.http.HttpTransportManager.Content content=null;
content = new com.documentum.web.contentxfer.http.HttpTransportManager.Content(tempFile, (new StringBuilder()).append(zipName).toString(), “zip”, tempFile.getParent(), 2);
idArray.add(manager.addOutgoing(content));
String contextPath = ((HttpServletRequest)getPageContext().getRequest()).getContextPath();
manager.setClientDownloadEvent(idArray, getTopForm(), contextPath);
zos.close();
fileOutputStream.close();

tempFile.deleteOnExit();

   
Export Documents as ZIP in wdk applications

Register Custom Types for Documentum FAST Indexing

January 12th, 2010 by Zainab Mantri

By default, Index Server indexes all dm_sysobject & it’s subtypes.  All objects under that type and it’s subtypes will get full-text indexed, including dm_application, dm_job, job reports and all their attributes. If you want to limit your indexing to dm_document or only some of your custom types (only documents) you can follow the below mentioned steps.

For Documentum 6.5 & up it is a simple process. After you configure the Index Server & Index Agent do not start the Index Agent. Go to DA->Types->dm_sysobject->Properties and uncheck the check box for register for indexing. Go to your custom type and check the check box for register for indexing and start the Index Agent. It will index only those and it’s sub types documents.

Register For Indexing

Verify which types have been registered for indexing by using the following query:

  • IDQL>select name from dm_type where r_object_id in (select distinct registered_id from dmi_registry where user_name like ‘%fulltext%’)

If you already have documents indexed you will need to delete the collection and index the documents again. Please look at the section below to follow the steps.

For Documentum 5.3 & up you have to go through the following steps.

There are 2 scenarios:

Documents are already indexed and you want to rebuild your index with only custom type documents.

If the documents are already indexed and there is a requirement to index only the custom types then we need to rebuild the indexes as follows:

  • Unregister and register the super type that you want to index.

In iapi32 unregister the current events for the dm_fulltext_index_user  for  dm_sysobject.

idql32> select r_object_id from dm_type where name = ‘dm_sysobject’ – Get the object_id of the dm_sysobject

API> unregister,c,0319978f8000xxxxx,dm_save,dm_fulltext_index_user

API> unregister,c,0319978f8000xxxxx,dm_destroy,dm_fulltext_index_user

API> unregister,c,0319978f800xxxxx,dm_readonlysave,dm_fulltext_index_user

API> unregister,c,0319978f800xxxxx,dm_checkin,dm_fulltext_index_user

API> unregister,c,0319978f800xxxxx,dm_move_content,dm_fulltext_index_user

  • Get a login ticket  for dm_fulltext_index user

API> getlogin,c,dm_fulltext_index_user – Returns a dm_ticket with many characters as shown below. This is an example ticket only.

DM_TICKET=T0JKIE5VTEwgMAoxMwp2ZXJzaW9uIElOVCBTIDAKMwpmbGFncyBJTlQgUyAwCjAKc2VxdWVuY2VfbnVtIElOVCBTIDAKMzE3OQpjcmVhdGVfdGltZSBJTlQgUyAwCjEyMjU5OTIzNTgKZXhwaXJlX3RpbWUgSU5UIFMgMAoxMjI1OTkyNjU4CmRvbWFpbi

Copy it into a notepad and remove all the extra line breaks.

  • Using the login ticket connect as dm_fulltext_index_user. Paste the login ticket as shown below. Note that USER below in blue is a superuser, typically dm_admin or similar.

API> connect,<USER>,dm_fulltext_index_user,DM_TICKET=T0JKIE5VTEwgMAoxMwp2ZXJzaW9uIElOVCBTIDAKMwpmbGFncyBJTl

… Result:

s1

  • Register events for desired types.

idql32> select r_object_id from dm_type where name = ‘<custom type>’ – Get the object_id of the custom type which you want to register.

API> register,c, 030000fb80000xxx,dm_save,,F

SET> F

Returns: OK

API> register,c, 030000fb80000xxx,dm_destroy,,F

SET> F

Returns: OK

API> register,c, 030000fb80000xxx,dm_readonlysave,,F

SET> F

Returns: OK

API>register,c, 030000fb80000xxx,dm_checkin,,F

SET> F

Returns: OK

API>register,c, 030000fb80000xxx,dm_move_content,,F

SET> F

Returns: OK

  • Stop Index Agent by either going to Windows Services or from the Index Agent Admin Page
  • Click on the Collection Overview tab on the Index Server Admin Page. Find the name of the collection associated to the repository in question.
  • Click on the trash icon “Delete Collection“.

Collection Overview

  • It will delete the index & the fixml information. Wait till it deletes all the indexes completely.Delete-Collection
  • Use the Index Agent Configuration Program delete the Index Agent associated with the repository.
  • Check if the dm_ftindex_agent_config object is still in the repository. Delete it.

API> retrieve,c,dm_ftindex_agent_config

API> destroy,c,l

  • Run the Index Agent Configuration Program to create a new Index Agent in the Normal Mode.
  • Go to  the Content Server and create a text file under C:\ called input.txt. Insert the following statement in it.

select r_object_id from <custom type> (all)

go

  • Open a command prompt. Type C:\>idql32 <repositoryname> -u<username> -p<password> -rinput.txt > ids.txt. It will create a file under C:\ with all the object id’s of all the documents of your custom types & sub types including old versions.
  • Remove the headers and footers from the ids.txt keeping only the object ids.
  • Copy this file to  \\Documentum\jboss4.2.0\server\DctmServer_IndexAgent1\deploy\IndexAgent1.war\WEB-INF\classes.
  • Start the Index Agent. It will pick this file and after it has finished indexing you will see the file has a .done extension.

Ids

Fresh Index Server Install and want to index only custom types.

In this you need to unregister and register the custom type before configuring your index agent.

Register Custom Types for Documentum FAST Indexing

Mandatory attributes in Alfresco 3.1

January 7th, 2010 by Mark Chua

We ran into some issues with mandatory attributes in Alfresco 3.1 while working on a project for a client. When designing the content model in Alfresco, you can set a property to be mandatory by using this tag <mandatory enforced=”true”>true</mandatory>. The enforced attribute means enforced by the repository, while the value between the tags merely means enforced by the web client. There is an inherent problem with setting enforced=”true”, which is that when creating new content in Alfresco, you do not get a chance to fill out any attributes except what you see there. This means that if you have a custom attribute that is set to mandatory and you go through the wizard, you will get an integrity error from the repository. What is happening is that Alfresco is attempting to create content, but since the mandatory attribute was never filled, there is a problem. The only real way to fix this is to customise the content create/import screens to contain those mandatory attributes. Of course, if we are willing to relax the requirements, there are a couple alternatives. One is to set a default value for the attribute, which may suffice for some cases. The other is to forgo enforcing in the repository and do it only in the web client. This will allow the content to be created, but properties cannot be updated unless all the mandatory attributes that show up in the edit details screen are filled. After creating content, there is an option to edit the properties right away. With repository enforcement, we would never reach this screen to fill out the mandatory attributes. The problem is that the user can still press cancel and be left with the document with unfilled properties, but at least there are no errors and any attempts to update the properties would at least require filling out the mandatory values. This is what we went with for that project.

There are a few more quirks that need to be sorted out. When dealing with mandatory single select drop-downs (from list constraints), one would notice that even a blank value is considered filled. Essentially what it implies is that if you are using a list constraint, mandatory loses its meaning. Looking at the code it seems that Alfresco assumes these drop-downs are always filled and so forgo any mandatory checks in the User Interface. In our case, the client wanted a blank entry selected by default so that users can consciously select from the list without having a default entry selected for them, which is a perfectly understandable requirement. The way we solved this problem is by overriding the default TextFieldGenerator so that it will add checks when a dropdown is rendered. We would just make it add the same checks it would have added if it were one of the other UI widgets, with small changes to account for it being a dropdown. To make the blank entry, just add an empty value at the top of your list constraint.

The code is provided below and hopefully should be self explanatory. Basically, we override the set up of mandatory validations and check if the component is a dropdown so that we can execute our code. Then we perform the same operations the grandfather class would do, and then add an event listener when the dropdown box is change. I hope that you’re able to find this short article useful in some way.

   <managed-bean>
      <description>
         Bean that generates a text field component
      </description>
      <managed-bean-name>TextFieldGenerator</managed-bean-name>
      <managed-bean-class>com.company.CustomTextFieldGenerator</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
   </managed-bean>
      
public class CustomTextFieldGenerator extends TextFieldGenerator {

	@SuppressWarnings("unchecked")
	protected void setupMandatoryValidation(FacesContext context,
			UIPropertySheet propertySheet, PropertySheetItem item,
			UIComponent component, boolean realTimeChecking,
			String idSuffix)
	{
		if (component instanceof UISelectOne) {
			/* What follows is taken from the grandfather class */
			List<String> params = new ArrayList<String>(3);

			// add the value parameter
			StringBuilder value = new StringBuilder("(tempElement = document.getElementById('");

			value.append(component.getClientId(context));
			if (idSuffix != null)
			{
				value.append(idSuffix);
			}

			value.append("'),");
			value.append("tempElement.options[tempElement.selectedIndex]");
			value.append(")");
			params.add(value.toString());

			// add the validation failed message to show (use the value of the
			// label component of the given item)
			String msg = Application.getMessage(context, "validation_mandatory");
			addStringConstraintParam(params,
					MessageFormat.format(msg, new Object[] {item.getResolvedDisplayLabel()}));

			// add the validation case to the property sheet
			propertySheet.addClientValidation(new ClientValidation("validateMandatory",
					params, true));

			if (!component.getAttributes().containsKey("onchange")) {
				component.getAttributes().put("onchange", "processButtonState();");
			} else {
			}
		} else {
			super.setupMandatoryValidation(context, propertySheet, item, component, realTimeChecking, idSuffix);
		}
	}
}
<managed-bean>
<description>
Bean that generates a text field component
</description>
<managed-bean-name>TextFieldGenerator</managed-bean-name>
<managed-bean-class>com.ifds.web.CustomTextFieldGenerator</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<!–
<managed-property>
<property-name>size</property-name>
<value>35</value>
</managed-property>
–>
</managed-bean>
Mandatory attributes in Alfresco 3.1

Why Enterprise Content Management (ECM) for Small and Mid-size businesses?

November 30th, 2009 by Sanjay Regmi

Two of the most frequent answers you get if you ask Small and Mid-size businesses why they are not using Enterprise Content Management are – they think they don’t need it and they ‘know’ it is expensive. I will show you how you can save money through ECM and why it is not costly anymore.

ECM Savings
A traditional company handles a lot of paper. Research has shown that:

  • $20 is needed to file each paper document
  • $120 is required for searching a misfiled one and
  • An invoice costs $8 to process 70% of which is related to paper handling.

Now, take a workflow document in your organization.  Think of the number of people and processes it has to go through before the process gets done and multiply the costs associated each time with ones mentioned above. Do you see how costly handling paper is?

Instead, if you use ECM, there is no need to know who the document should be sent to, annotations, comments and changes can be done within the electronic document and your paper handling costs are eliminated completely as you are doing it all electronically. Now think of how much you could save in paper handling costs alone even when efficiencies obtained through making the process faster and easier are yet to be incorporated.

Costly Enterprise Content Management?
With the open source community in the mainstream now, electronic content management has suddenly become accessible and that you are not required to shell out hundreds of thousands in license fees. Open source offerings like Alfresco are for free to use with no hassle of licenses.

But don’t you have to customize the software?
In many cases yes, you have to customize it. But for an SMB, we suggest you first take the plunge and use out of the box features. Once you realize the potential and when your employees get comfortable with the application, you can then go out and have simple customizations like specific kind of reports or added functionality.

If you need more information and need to discuss about your specific needs, contact any ECM vendor and they should be able to give you all the details. Or you can give us a call anytime and we will be glad to assist you.

Why Enterprise Content Management (ECM) for Small and Mid-size businesses?

John Mancini Delivers 8 Reasons

October 8th, 2009 by Reva Customer Care

I recently had an opportunity to meet AIIM President John Mancini at the recent AIIM Conference in Western Canada where he delivered the keynote address and summarized the content in his latest eBook “8 reasons you need a strategy for managing information — before it’s too late”.

The presentation, along with the released eBook deliverers thought-provoking comments and understanding on how to get started in managing your organizations information. Looking at the TOC, you would be delighted to know that the content is just as interesting and edgy as the headings:

8 reasons you need a strategy for managing information — before it’s too late

1. A tidal wave of information
2. Ubiquitous computing
3. Social everything
4. Collaboration without governance is a disaster
5. The era of simplicity
6. The Tree-Hugger’s Time Has Come
7. You can no longer do this manually
8. Mismanagement risks are rising

I hope everyone enjoys this first of series eBook by John and his team as much as I did.

John Mancini Delivers 8 Reasons

Changing the Starts With Filter in a Webtop 6.5 Object Locator into a Contains Filter

October 5th, 2009 by Mark Chua

I’ve been working on some interesting and useful Webtop customizations for a client that I think many developers may find handy. One of them is customizing the locator component to use a contains filter instead of a starts with filter. The locator component is the component that lets you select one or more objects from a list. The screenshot depicts one such locator instance with the focus of our efforts encircled below. Now you’d expect this was easily configurable via xml, as did I, but you’ll quickly find that it’s actually not. However, it’s quite easily achieved via Java as I’ll soon show you.

Webtop Locator

Webtop Locator

Read the rest of this entry »

Changing the Starts With Filter in a Webtop 6.5 Object Locator into a Contains Filter

Documentum Jobs & Methods

October 2nd, 2009 by Praveena Killamsetty

I spent quite some time writing methods in D6.5. Here are some of the pointers I found very useful.

Methods:

A method is an object in the docbase that lets you launch a program on the server without being logged into the server. Methods enable custom code to run on behalf of the Content Server. They allow normal users to execute a command that only a superuser can execute, off load processor-intensive tasks from the client to the server so that they can be run on the background during the off peak time.They are typically implemented in docbasic or Java but can also be written in any other programming language.

Implementation :

The IDmMethod interface is the interface that a method must implement to be invoked via the method server. This interface is located in the method server JAR file (mthdservlet.jar) which is found on the Content Server. The IDmMethod interface has a single method execute which operates very similarly to the main method in traditional Java-based method implementations. The parameters argument is a Map containing the method parameters (Strings) keyed by their names (Strings).

Read the rest of this entry »

Documentum Jobs & Methods