{"id":12194,"date":"2019-02-15T09:25:26","date_gmt":"2019-02-15T08:25:26","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/"},"modified":"2025-10-24T09:32:17","modified_gmt":"2025-10-24T07:32:17","slug":"a-few-scripting-languages-for-documentum","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/","title":{"rendered":"A few scripting languages for Documentum"},"content":{"rendered":"<p>Beside the obsolete dmbasic, the autistic dmawk, the verbose java with the DfCs, the limited iapi (for API) and idql (for DQL) command-line tools, Documentum does not offer any scripting language for the administrator and the out-of-the-box experience is quite frustrating in this respect. It has been so even before the java trend so it is not a maneuver to force the use of the DfCs or to rely on it for administrative tasks. It looks more like an oversight or like this was considered as a low-priority need.<br \/>\nOf course, people didn&#8217;t stop at this situation and developed their own bindings with their preferred scripting language. I found db:Documentum for perl, yours truly&#8217;s DctmAPI.py for python (refer to the article <a title=\"Adding a Documentum extension into python\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-into-python\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>), dmgawk for gawk (see <a title=\"Gawk extension\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-i\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>), and of course all the JVM-based languages that leverage the DfCs such as groovy, beanshell, jython, jruby, etc&#8230; Such JVM-based scripting languages actually only need to import the DfCs library and off they go for the next killer script. In this article, I&#8217;ll show how to set up the binding for a few of those languages under the linux O\/S. <\/p>\n<h3>db::Documentum<\/h3>\n<p>This is a perl v5 module that permits access to the Documentum api from the perl interpreter. It was developed by M. Scott Roth, see <a title=\"Db::Documentum\" href=\"https:\/\/metacpan.org\/pod\/Db::Documentum\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>, originally only for the Windows O\/S and EDMS v3.1.5. Thanks to other contributors, it is now compilable under several flavors of Unices, including Linux. It is downloadable from <a title=\"Db::Documentum on CPAN\" href=\"http:\/\/www.perl.com\/CPAN\/modules\/by-module\/Db\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<br \/>\nYou&#8217;ll need the GNU C compiler to generate the module. Here is a detailed, step by step description of the installation procedure.<br \/>\n<code><br \/>\n# download the archive Db-Documentum-1.64.tar.gz from here http:\/\/www.perl.com\/CPAN\/modules\/by-module\/Db\/<br \/>\n# decompress it in, say, db::Documentum<br \/>\ntar -zxvf Db-Documentum-1.64.tar.gz<br \/>\n&nbsp;<br \/>\n# move to the newly created directory Db-Documentum-1.64;<br \/>\ncd Db-Documentum-1.64<br \/>\n&nbsp;<br \/>\n# prepare the following needed paths;<br \/>\n# DM_HOME<br \/>\n#    path to the Documentum installation, e.g. \/home\/dmadmin\/documentum<br \/>\n# DM_LIB<br \/>\n#    path to the Documentum libdmcl.so library, e.g. ${DM_HOME}\/product\/7.3\/bin<br \/>\n#    note: there is also the obsolescent libdmcl40.so but I've encountered problems with it, mostly \"Segmentation fault (core dumped)\" crashes, so use the JNI-based libdmcl.so instead; it starts more slowly as it uses java but it is more reliable and is still supported;<br \/>\n# DM_INCLUDE<br \/>\n#    path to the include file dmapp.h, e.g. ${DM_HOME}\/share\/sdk\/include<br \/>\n&nbsp;<br \/>\n# edit the linux section in Makefile.PL and provide the above paths;<br \/>\n# also, move up the $DM_LIB initialization before the dmcl.so test and comment the line beginning with $DM_CLIENT_LIBS =<br \/>\n# here is how that section looks like after editing it:<br \/>\n<i><br \/>\nelsif ( $OS =~ \/linux\/i ) {<br \/>\n&nbsp;<br \/>\n        # The path to your Documentum client installation.<br \/>\n        $DM_HOME = '\/home\/dmadmin\/documentum';<br \/>\n&nbsp;<br \/>\n        # This is kinda a gottcha, the Linux stuff is in unix\/linux<br \/>\n        # You may have to tweak these.<br \/>\n&nbsp;<br \/>\n        # Path to documentum client libraries.<br \/>\n        #$DM_LIB = \"$DM_HOME\/unix\/linux\";<br \/>\n        $DM_LIB = \"$DM_HOME\/product\/7.3\/bin\";<br \/>\n&nbsp;<br \/>\n    # dmcl.so file<br \/>\n    if (! -e \"$DM_LIB\/libdmcl.so\") {<br \/>\n        warn \"n*** WARNING *** Could not find $DM_LIB\/libdmcl.so.nThe module will not make without \" .<br \/>\n             \"libdmcl.so.n\";<br \/>\n    }<br \/>\n&nbsp;<br \/>\n        # Path to directory where dmapp.h lives.<br \/>\n        #$DM_INCLUDE = \"-I\/documentum\/share\/sdk\/include\/\";<br \/>\n        $DM_INCLUDE = \"-I$DM_HOME\/share\/sdk\/include\/\";<br \/>\n&nbsp;<br \/>\n        #$DM_CLIENT_LIBS = \"-L$DM_LIB -ldmapi -ldmupper -ldmlower -ldmcommon -ldmupper -lcompat\";<br \/>\n        $DM_RPC_LIBS = \"-L$DM_LIB -lnwrpc -lnwstcp\";<br \/>\n        $OS_LIBS = \"-lsocket -lnsl -lintl\";<br \/>\n        $CPP_LIBS = \"-lC\";<br \/>\n        $LD_LIBS = \"-ldl\";<br \/>\n        $CPP_INC = \"\";<br \/>\n        $CCFLAGS = \"\";<br \/>\n}<br \/>\n<\/i><br \/>\n&nbsp;<br \/>\n# execute the Makefile.PL;<br \/>\nperl Makefile.PL<br \/>\n&nbsp;<br \/>\n# if the error below occurs, you must install the perl-devel module using the native package deployment tool for your distribution,<br \/>\n# e.g. sudo yum install perl-devel for centos:<br \/>\n# Can't locate ExtUtils\/MakeMaker.pm in @INC (@INC contains: \/usr\/local\/lib64\/perl5 \/usr\/local\/share\/perl5 \/usr\/lib64\/perl5\/vendor_perl \/usr\/share\/perl5\/vendor_perl \/usr\/lib64\/perl5 \/usr\/share\/perl5 .) at Makefile.PL line 1.<br \/>\n#BEGIN failed--compilation aborted at Makefile.PL line 1.<br \/>\n&nbsp;<br \/>\n# a Makefile file has been generated; correct the 2 lines below as showed;<br \/>\nEXTRALIBS = -L\/home\/dmadmin\/documentum\/product\/7.3\/bin -ldmcl<br \/>\nLDLOADLIBS = -L\/home\/dmadmin\/documentum\/product\/7.3\/bin -ldmcl -lc<br \/>\n&nbsp;<br \/>\n# use the newly produced Makefile;<br \/>\nmake<br \/>\n&nbsp;<br \/>\n# run some tests to check the new module;<br \/>\nmake test<br \/>\n&nbsp;<br \/>\n# the test completes successfully but, sometimes, it is followed by SIGSEGV in the JVM;<br \/>\n# as it occurs at program termination, it can be ignored;<br \/>\n&nbsp;<br \/>\n# install the new perl module system-wide;<br \/>\nsudo make install<br \/>\n<\/code><\/p>\n<p>Now that we have the module, let&#8217;s use it in a simple test case: dump of all the dm_sysobject linked in cabinet \/dmadmin (its id is 0c00c35080000105) in the out-of-the box dmtest repository.<\/p>\n<pre class=\"brush: perl; gutter: true; first-line: 1; highlight: []\">\nvi cat my-test.pl \n#!\/usr\/bin\/perl\n\nuse Db::Documentum qw(:all);\nuse Db::Documentum::Tools qw(:all);\n\n# print version\nDb::Documentum::version;\n\n$docbase = \"dmtest\";\n$username = \"dmadmin\";\n$password = \"dmadmin\";\n\n# connect;\n$result = dm_Connect($docbase, $username, $password) || die(\"could not connect in \" . $docbase . \" as \" . $username . \" with password \" . $password);\n\n# run the query;\n$status = dmAPIExec(\"execquery,c,,select r_object_id, r_object_type, object_name from dm_sysobject where folder(ID('0c00c35080000105'))\");\nif (1 != $status) {\n   $err_mess = dmAPIGet(\"getmessage,c\");\n   print $err_mess;\n   die();\n}\n$query_id = dmAPIGet(\"getlastcoll,c\");\nprintf \"%-16s  %-20s  %sn\", \"r_object_id\", \"r_object_type\", \"object_name\";\nwhile (dmAPIExec(\"next,c,\" . $query_id)) {\n   $r_object_id = dmAPIGet(\"get,c,\" . $query_id . \",r_object_id\");\n   $r_object_type = dmAPIGet(\"get,c,\" . $query_id . \",r_object_type\");\n   $object_name = dmAPIGet(\"get,c,\" . $query_id . \",object_name\");\n   printf \"%16s  %-20s  %sn\", $r_object_id, $r_object_type, $object_name;\n}\ndmAPIExec(\"close,c,\" . $query_id);\n\n# disconnect;\ndmAPIExec(\"disconnect,c\");\nexit;\n<\/pre>\n<p>The script is very trivial and needs little explanation. Note the new functions dm_Connect, dmAPIExec and dmAPIGet. dmAPISet, dmAPIInit and dmAPIDeInit are also available but the last two don&#8217;t need to be invoked explicitly for they are automatically at module load-time.<br \/>\nExample of execution:<br \/>\n<code><br \/>\nperl my-test.pl<br \/>\n&nbsp;<br \/>\nPerl version: 5.016003<br \/>\nDb::Documentum version: 1.64<br \/>\nDMCL version: 7.3.0000.0205<br \/>\n&nbsp;<br \/>\nr_object_id       r_object_type         object_name<br \/>\n0800c3508000019b  dm_job                dm_PropagateClientRights<br \/>\n0800c3508000019c  dm_job                dm_PostUpgradeAction<br \/>\n0800c35080000408  dmc_wfsd_type_info    integer<br \/>\n0800c35080000409  dmc_wfsd_type_info    boolean<br \/>\n0800c3508000040a  dmc_wfsd_type_info    double<br \/>\n0800c3508000040b  dmc_wfsd_type_info    string<br \/>\n0800c3508000040c  dmc_wfsd_type_info    date<br \/>\n0800c3508000040d  dmc_wfsd_type_info    repeating integer<br \/>\n0800c3508000040e  dmc_wfsd_type_info    repeating boolean<br \/>\n0800c3508000040f  dmc_wfsd_type_info    repeating double<br \/>\n0800c35080000410  dmc_wfsd_type_info    repeating string<br \/>\n0800c35080000411  dmc_wfsd_type_info    repeating date<br \/>\n0800c35080000426  dm_sysobject          dm_indexAgentAcquireLock<br \/>\n0800c35080000587  dm_client_rights      dfc_localhost_c0XP4a<br \/>\n0800c35080001065  dm_jms_config         JMS dmtest:9080 for dmtest.dmtest<br \/>\n0800c35080001066  dm_jms_config         JMS localhost.localdomain:9080 for dmtest.dmtest<br \/>\n0b00c35080000233  dm_folder             Workspace Customizations<br \/>\n1700c3508000015d  dm_outputdevice       Default LP Printer<br \/>\n3a00c3508000013f  dm_location           storage_01<br \/>\n3a00c35080000140  dm_location           common<br \/>\n3a00c35080000141  dm_location           events<br \/>\n3a00c35080000142  dm_location           log<br \/>\n3a00c35080000143  dm_location           config<br \/>\n3a00c35080000144  dm_location           dm_dba<br \/>\n3a00c35080000145  dm_location           auth_plugin<br \/>\n3a00c35080000146  dm_location           ldapcertdb_loc<br \/>\n3a00c35080000147  dm_location           temp<br \/>\n3a00c35080000148  dm_location           dm_ca_store_fetch_location<br \/>\n3a00c35080000153  dm_location           convert<br \/>\n3a00c35080000154  dm_location           dsearch<br \/>\n3a00c35080000155  dm_location           nls_chartrans<br \/>\n3a00c35080000156  dm_location           check_signature<br \/>\n3a00c35080000157  dm_location           validate_user<br \/>\n3a00c35080000158  dm_location           assume_user<br \/>\n3a00c35080000159  dm_location           secure_common_area_writer<br \/>\n3a00c3508000015a  dm_location           change_password_local<br \/>\n3a00c3508000015b  dm_location           thumbnail_storage_01<br \/>\n3a00c3508000015c  dm_location           streaming_storage_01<br \/>\n3a00c35080000226  dm_location           replicate_location<br \/>\n3a00c35080000227  dm_location           replica_storage_01<br \/>\n3e00c35080000149  dm_mount_point        share<br \/>\n6700c35080000100  dm_plugin             CSEC Plugin<br \/>\n6700c35080000101  dm_plugin             Snaplock Connector<br \/>\n<\/code><br \/>\nNow, the power of perl and its more than 25&#8217;000 modules are at our fingertips to help us tackle those hairy administrative tasks !<\/p>\n<h3>groovy<\/h3>\n<p>Being a JVM-based language, groovy runs on top of a JVM, and therefore benefits of all its advantages such as automatic garbage collection (although this is not an exclusivity of java) and portability (ditto), and can tap into the uncountable existing JAVA libraries (ditto).<br \/>\ngroovy is used in Documentum&#8217;s xPlore.<br \/>\ngroovy is a powerful, yet easy to learn, programing language still actively maintained by the Apache foundation, cf. <a title=\"groovy language\" href=\"http:\/\/groovy-lang.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. Similar to java but without its verbosity, it should instantly appeal to java developers doing Documentum administrative tasks.<br \/>\ngroovy comes with groovysh, a comfortable and powerful interactive shell for trying out statements and experimenting with the language.<br \/>\nBy importing the DfCs, we can use groovy to access Documentum repositories. Knowledge of the DfCs are required of course.<br \/>\nTo install groovy, use the distribution&#8217;s package manager; e.g. on my Ubuntu, I&#8217;ve used:<br \/>\n<code><br \/>\nsudo apt-get install groovy<br \/>\n<\/code><br \/>\nwhile on Centos, the following command will do it:<br \/>\n<code><br \/>\nsudo yum install groovy<br \/>\n<\/code><br \/>\nTo test it, let&#8217;s use the same program as for perl, but rewritten a la groovy:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1; highlight: [6,7,15,38]\">\n#! \/usr\/bin\/groovy\n\nimport System.*;\nimport java.io.*;\n\nimport com.documentum.fc.client.*;\nimport com.documentum.fc.common.*;\n\n   static void main(String[] args) {\n      docbroker = \"dmtest\";\n      docbase = \" dmtest\";\n      username = \"dmadmin\";\n      password = \"dmadmin\";\n   \n      println(\"attempting to connect to \" + docbase + \" as \" + username + \"\/\" + password + \" via docbroker \" + docbroker);\n   \n      try {\n         client = DfClient.getLocalClient();\n      \n         config = client.getClientConfig();\n         config.setString (\"primary_host\", docbroker);\n      \n         logInfo = new DfLoginInfo();\n         logInfo.setUser(username);\n         logInfo.setPassword(password);\n         docbase_session = client.newSession(docbase, logInfo);\n      \n         if (docbase_session != null) {\n            println(\"Got a session\");\n      \n            \/\/ do something in the session;\n            folderId = new DfId(\"0c00c35080000105\");\n            folder = docbase_session.getObject(folderId);\n            attrList = \"r_object_id,r_object_type,object_name\";\n            coll = folder.getContents(attrList);\n      \n            while (coll.next())\n               System.out.printf(\"ObjectId=%-16s r_object_type=%-20s ObjectName=%sn\",\n                                 coll.getString(\"r_object_id\"),\n                                 coll.getString(\"r_object_type\"),\n                                 coll.getString(\"object_name\"));\n            println(\"Finished\");\n            docbase_session.disconnect();\n         }\n         else\n            println(\"Didn't get a session\");\n      }\n      catch (e) {\n         println(\"Exception was: \" + e);\n      }\n   }\n<\/pre>\n<p>Lines 6 &amp; 7 import the DfC so don&#8217;t forget to add them to the CLASSPATH; normally they are because the execution environment is a Documentum client, e.g.:<br \/>\n<code><br \/>\nexport JAVA_HOME=\/home\/dmadmin\/documentum\/shared\/java64\/1.8.0_77<br \/>\nexport CLASSPATH=\/home\/dmadmin\/documentum\/shared\/dfc\/dfc.jar<br \/>\nexport PATH=$JAVA_HOME\/bin:$PATH<br \/>\n<\/code><br \/>\nLine 15 &amp; 38 show that besides its own built-in functions, groovy can also use equivalent functions from the java libraries.<br \/>\nTo invoke the script:<br \/>\n<code><br \/>\ngroovy tgroovy.gry<br \/>\n# or make it executable and call it:<br \/>\nchmod +x tgroovy.gry<br \/>\n.\/tgroovy.gry<br \/>\n<\/code><br \/>\nHere is its output:<br \/>\n<code><br \/>\nattempting to connect to  dmtest as dmadmin\/dmadmin via docbroker dmtest<br \/>\nGot a session<br \/>\nObjectId=0800c3508000019b r_object_type=dm_job               ObjectName=dm_PropagateClientRights<br \/>\nObjectId=0800c3508000019c r_object_type=dm_job               ObjectName=dm_PostUpgradeAction<br \/>\nObjectId=0800c35080000408 r_object_type=dmc_wfsd_type_info   ObjectName=integer<br \/>\nObjectId=0800c35080000409 r_object_type=dmc_wfsd_type_info   ObjectName=boolean<br \/>\nObjectId=0800c3508000040a r_object_type=dmc_wfsd_type_info   ObjectName=double<br \/>\n...<br \/>\nObjectId=3a00c35080000227 r_object_type=dm_location          ObjectName=replica_storage_01<br \/>\nObjectId=3e00c35080000149 r_object_type=dm_mount_point       ObjectName=share<br \/>\nObjectId=6700c35080000100 r_object_type=dm_plugin            ObjectName=CSEC Plugin<br \/>\nObjectId=6700c35080000101 r_object_type=dm_plugin            ObjectName=Snaplock Connector<br \/>\nFinished<br \/>\n<\/code><\/p>\n<h3>jython<\/h3>\n<p>jython is a python implementation written in java, see <a title=\"The jython language\" href=\"http:\/\/www.jython.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<br \/>\nA such, it offers most of the features of the powerful python language although it stays behind the latest python version (v2.5.3 vs. 3.7).<br \/>\nLike java, groovy, jruby, scala, etc \u2026, jython runs inside a JVM and can use all the java libraries such as the DfCs and become a Documentum client with no changes except adding the DfCs to the $CLASSPATH.<br \/>\njython appeals especially to people who already know python; like for groovy, a basic level knowledge of the DfCs is required.<br \/>\nTo install jython, use your distribution&#8217;s package manager, e.g.<br \/>\n<code><br \/>\n# for ubuntu:<br \/>\nsudo apt-get install jython<br \/>\n<\/code><br \/>\nMake sure the DfCs are present in $CLASSPATH, otherwise add them:<br \/>\n<code><br \/>\nexport CLASSPATH=\/home\/dmadmin\/documentum\/shared\/dfc\/dfc.jar:<br \/>\n<\/code><br \/>\nWhen runing the test script below, the DfCs complain about a bad date format:<br \/>\n<code><br \/>\n20:42:05,482 ERROR [File Watcher] com.documentum.fc.common.DfPreferences - [DFC_PREFERENCE_BAD_VALUE] Bad value for preference \"dfc.date_format\", value=\"M\/d\/yyyy, h:mm:ss a\"<br \/>\ncom.documentum.fc.common.DfException: Illegal syntax found in the date format 'M\/d\/yyyy, h:mm:ss a'. The default localized short date format will be used.<br \/>\n\tat com.documentum.fc.common.DfException.newIllegalDateFormatException(DfException.java:109)<br \/>\n<\/code><br \/>\nEvidently, they are unhappy with the default date format. The work-around is to force one in the dfc.properties file by adding the line below (choose a date format that best suits you):<br \/>\n<code><br \/>\ndfc.date_format=dd.MM.yyyy HH:mm:ss<br \/>\n<\/code><br \/>\nSince the error did not occur with groovy (nor in the provided JNI-enabled command-line tools such as iapi, idql and dmawk), it is not the DfCs per se that have this problem but the combination of java + jython + DfCs.<br \/>\nHere comes the test script:<\/p>\n<pre class=\"brush: python; gutter: true; first-line: 1; highlight: []\">\n#!\/usr\/bin\/env jython\n\n# install jython via your O\/S package manager;\n# export CLASSPATH=\/home\/dmadmin\/documentum\/shared\/dfc\/dfc.jar:$CLASSPATH\n# edit the documentum\/shared\/config\/dfc.properties and add a dfc.date property, e.g.:\n# dfc.date_format=dd.MM.yyyy HH:mm:ss\n# execute:\n#   jython test.jy\n# or:\n#   chmod +x test.jy; .\/test.jy\n# can also be execute interactively as follows:\n# start jython:\n#    jython\n# call the test script;\n#    execfile(\"\/home\/dmadmin\/test.jy\")\n\nimport traceback\nimport com.documentum.fc.client as DFCClient\nimport com.documentum.fc.common as DFCCommon\n\ndocbroker = \"dmtest\"\ndocbase = \" dmtest\"\nusername = \"dmadmin\"\npassword = \"dmadmin\"\nprint(\"attempting to connect to \" + docbase + \" as \" + username + \"\/\" + password + \" via docbroker \" + docbroker)\ntry:\n  client = DFCClient.DfClient.getLocalClient()\n\n  config = client.getClientConfig()\n  config.setString (\"primary_host\", docbroker)\n\n  logInfo = DFCCommon.DfLoginInfo()\n  logInfo.setUser(username)\n  logInfo.setPassword(password)\n  docbase_session = client.newSession(docbase, logInfo)\n\n  if docbase_session is not None:\n    print(\"Got a session\")\n    # do something in the session;\n    folderId = DFCCommon.DfId(\"0c00c35080000105\");\n    folder = docbase_session.getObject(folderId);\n    attrList = \"r_object_id,r_object_type,object_name\";\n    coll = folder.getContents(attrList);\n    while(coll.next()):\n       print(\"ObjectId=\" + \"%-16s\" % coll.getString(\"r_object_id\") + \n             \" r_object_type=\" + \"%-20s\" % coll.getString(\"r_object_type\") +\n             \" ObjectName=\" + coll.getString(\"object_name\"));\n    print(\"Finished\");\n    docbase_session.disconnect()\n  else:\n    print(\"Didn't get a session\")\nexcept Exception:\n    print(Exception)\n<\/pre>\n<p>Execution:<br \/>\n<code><br \/>\njython test.jy<br \/>\nWARNING: An illegal reflective access operation has occurred<br \/>\nWARNING: Illegal reflective access by org.python.core.PySystemState (file:\/usr\/share\/java\/jython-2.5.3.jar) to method java.io.Console.encoding()<br \/>\nWARNING: Please consider reporting this to the maintainers of org.python.core.PySystemState<br \/>\nWARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations<br \/>\nWARNING: All illegal access operations will be denied in a future release<br \/>\nattempting to connect to  dmtest as dmadmin\/dmadmin via docbroker dmtest<br \/>\nGot a session<br \/>\nObjectId=0800c3508000019b r_object_type=dm_job               ObjectName=dm_PropagateClientRights<br \/>\nObjectId=0800c3508000019c r_object_type=dm_job               ObjectName=dm_PostUpgradeAction<br \/>\nObjectId=0800c35080000408 r_object_type=dmc_wfsd_type_info   ObjectName=integer<br \/>\nObjectId=0800c35080000409 r_object_type=dmc_wfsd_type_info   ObjectName=boolean<br \/>\nObjectId=0800c3508000040a r_object_type=dmc_wfsd_type_info   ObjectName=double<br \/>\n...<br \/>\nObjectId=3a00c35080000227 r_object_type=dm_location          ObjectName=replica_storage_01<br \/>\nObjectId=3e00c35080000149 r_object_type=dm_mount_point       ObjectName=share<br \/>\nObjectId=6700c35080000100 r_object_type=dm_plugin            ObjectName=CSEC Plugin<br \/>\nObjectId=6700c35080000101 r_object_type=dm_plugin            ObjectName=Snaplock Connector<br \/>\nFinished<br \/>\n<\/code><br \/>\nIronically, the jython&#8217;s launcher is a perl script; it basically initializes java and python environment variables such as classpath, java options and jython home and path. If the initial WARNINGs are disruptive, edit that script and correct the problem or just redirect the stderr to null, e.g.:<br \/>\n<code><br \/>\njython test.jy 2&gt; \/dev\/null<br \/>\n<\/code><\/p>\n<h3>So, which one to choose ?<\/h3>\n<p>To summarize, the decision tree below may help choosing one scripting language among the preceding ones.<br \/>\n<code><br \/>\nDfCs knowledge ?:<br \/>\n   java proficiency ?:<br \/>\n      choose groovy with the DfCs<br \/>\n   else python proficiency ?:<br \/>\n      choose jython with the DfCs<br \/>\n   else select one of the following ones:<br \/>\n      get acquainted with one of the above languages<br \/>\n      | choose another JVM-based language<br \/>\n      | give up the DfCs and use DQL\/API with perl, python of gawk instead (see below)<br \/>\nelse perl proficiency ?:<br \/>\n   choose db::Documentum<br \/>\nelse python proficiency ?:<br \/>\n   choose python and DctmAPI.py<br \/>\nelse nawk\/gawk proficiency ?<br \/>\n   choose gawk and dmgawk binding<br \/>\nelse select one of the following:<br \/>\n   learn one of the above scripting languages<br \/>\n   | develop a Documentum binding for your preferred scripting language not in the list<br \/>\n   | hire dbi-services for your administrative tasks or projects ;-)<br \/>\n<\/code><br \/>\nDfCs are clearly indicated to java programmers. They are still supported and new features are always accessible from them. There are tasks which cannot be done through the API or DQL and only through the DfCs, but generally those are out of the scope of an administrator. Note that even the non java and DfCs languages still finish up invoking the DfCs in the background because they are linked with the libdmcl.so library and that one makes JNI behind-the-scene calls to the DfCs for them, thus hiding their complexity. Hopefully, this shared library will stay with us still for some time otherwise our scripting language choice will be seriously restricted to JVM-based languages and the DfCs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beside the obsolete dmbasic, the autistic dmawk, the verbose java with the DfCs, the limited iapi (for API) and idql (for DQL) command-line tools, Documentum does not offer any scripting language for the administrator and the out-of-the-box experience is quite frustrating in this respect. It has been so even before the java trend so it [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[525],"tags":[],"type_dbi":[],"class_list":["post-12194","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A few scripting languages for Documentum - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A few scripting languages for Documentum\" \/>\n<meta property=\"og:description\" content=\"Beside the obsolete dmbasic, the autistic dmawk, the verbose java with the DfCs, the limited iapi (for API) and idql (for DQL) command-line tools, Documentum does not offer any scripting language for the administrator and the out-of-the-box experience is quite frustrating in this respect. It has been so even before the java trend so it [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-15T08:25:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-24T07:32:17+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"A few scripting languages for Documentum\",\"datePublished\":\"2019-02-15T08:25:26+00:00\",\"dateModified\":\"2025-10-24T07:32:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\"},\"wordCount\":1003,\"commentCount\":0,\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\",\"name\":\"A few scripting languages for Documentum - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2019-02-15T08:25:26+00:00\",\"dateModified\":\"2025-10-24T07:32:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A few scripting languages for Documentum\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A few scripting languages for Documentum - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/","og_locale":"en_US","og_type":"article","og_title":"A few scripting languages for Documentum","og_description":"Beside the obsolete dmbasic, the autistic dmawk, the verbose java with the DfCs, the limited iapi (for API) and idql (for DQL) command-line tools, Documentum does not offer any scripting language for the administrator and the out-of-the-box experience is quite frustrating in this respect. It has been so even before the java trend so it [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/","og_site_name":"dbi Blog","article_published_time":"2019-02-15T08:25:26+00:00","article_modified_time":"2025-10-24T07:32:17+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"A few scripting languages for Documentum","datePublished":"2019-02-15T08:25:26+00:00","dateModified":"2025-10-24T07:32:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/"},"wordCount":1003,"commentCount":0,"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/","url":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/","name":"A few scripting languages for Documentum - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2019-02-15T08:25:26+00:00","dateModified":"2025-10-24T07:32:17+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-few-scripting-languages-for-documentum\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A few scripting languages for Documentum"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=12194"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12194\/revisions"}],"predecessor-version":[{"id":41189,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12194\/revisions\/41189"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=12194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=12194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=12194"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=12194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}