D2 autologin

There was a document in EDN, which now is lost, named “Useful shortcuts and urls for documentum D2”, and one of the URLs was an autologin url, quite useful for development purposes. The url shown was the following one:

D2/?_docbase=<repository>&_username=<username>&_password=<password>

However, although this works fine in D2-Config, it doesn’t work in D2 (>4.2, AFAIK) and this seems to be the case as there are several posts that seem related to this “issue”.

Well, the truth is that there’s still a way to autologin in D2:

D2/?docbase=<repository>&login=<username>&password=<password>

D2-Config DQL Editor

D2-Config (at least in D2 4.5) has a servlet (/GetData) that is used internally to run DQLs. I though when I saw it that, in the same way the REST query service is limited to run read queries, this won’t let you run write queries (you know, due to the “Get” in the name). Well, I was wrong. Any authenticated user can run any kind of query (limited by user permissions, as this is not run as superuser) by using this servlet:

D2-Config/servlet/GetData?dql1=select user_password from (select * from dm_user)&interfaceId=<my session id>&computerName=<my computer id>
D2-Config/servlet/GetData?dql1=create dm_document object set object_name='d2test' link '/Temp'&interfaceId=<my session id>&computerName=<my computer id>
D2-Config/servlet/GetData?dql1=delete dm_document object where folder('/Temp') and object_name='d2test'&interfaceId=<my session id>&computerName=<my computer id>

D2 configuration vs. Doclist widget

One weird requirement customer may want is to show different columns for different types. This kind of requirement is very difficult to meet with obsolete, difficult to customize and migrate webtop, because you’ll need to create a configuration such as:

<config version="1.0">
<scope type="custom_type">
<component id="objectlist" extends="objectlist:webtop/config/objectlist_component.xml">
<columns>
<column>
...
</column>
</columns>
</component>
</scope>
</config>

and be done with it.

Now, how can we achieve this difficult customization in our beloved, configurable, easy to migrate D2? We can’t.

Stupid Useless Limited doclist widget will store a single column preference for the widget, meaning that if you want to apply certain column configuration, it will be applied for every location, no matter the type. Besides, the configuration is stored in the format object_type.attribute. This means that, if you have inherited attributes, you can easily find yourself in the following situations:

  • If you added subtype1.attribute, supertype and other subtypes won’t show any value, and it will only work for subtype1 objects.
  • If you have different labels for the same attribute in different subtypes, only the label for the object_type.attribute you added to the column will be shown (not much of a problem yet, as you won’t see any value).

As far as I know, this has been a feature request since D2 4.5 (released on April 2015), so after almost 3 years, this hasn’t been implemented yet. Even though I’m an optimistic person, and I’m sure (not really) that the “software company” will improve D2, we can, somehow, implement this (in a very rudimentary way, to be honest).

The current behaviour of the doclist widget is basically located in com.emc.d2fs.dctm.content.FolderContent. This class receives a request to retrieve and return the contents of a folder.

The two main methods that are interesting to our requirement would be getContent and getFilteredContent.

These methods receive some parameters, and they generate a query to retrieve objects from the folder, and then return a resulset (DocItems object) with the objects from the folder.

So, in case you want to “configure” the values shown (note that you can’t, or at least I haven’t been able to, change the columns shown in the widget, so data won’t match columns names), you’ll need to:

  • Modify listColNames List of String values with only the attributes you want to retrieve.
  • Take the List of Items returned by the ContentBuilder class and, for each attribute stored, customize the attribute name with the column you want to show the value in.
  • Replace OOTB FolderContent class with your own.

Of course, you have to have this in mind when migrating to a new D2 versions, because I’m quite sure this won’t work as expected in every D2 version…

D2 configuration vs. a_is_hidden

Recently we came across a requirement that involved showing the a_is_hidden attribute in the content widget, regardless of its value.

At first glance, it seemed an easy goal to achieve, just add the attribute to the column list and it will work. Well, it doesn’t. The content widget just displays objects with a_is_hidden=false (duh!).

Next step, would be to find the configuration that manages this behaviour. Well, after looking a bit, we found the “configuration” that handles this:

com.emc.d2fs.dctm.content.FolderContent generates a DQL in order to retrieve the contents of the folder, and the method that generates this query uses com.emc.d2.api.preferences.ID2cPreferences to retrieve different preferences related to queries.

Some decompiling get us to the configurable side of things:

com.emc.d2.api.preferences.D2cPreferences:

 public DqlFilter getDqlFilter()
{
DqlFilter result = new DqlFilter(false, false);
return result;
}

com.emc.d2.api.preferences.DqlFilter:

public final class DqlFilter
{
private boolean m_showHidden;
private boolean m_showArchive;

public DqlFilter(boolean showHidden, boolean showArchive)
{
this.m_showHidden = showHidden;
this.m_showArchive = showArchive;
}

public String toString()
{
StringBuffer result = new StringBuffer();
if (!this.m_showHidden) {
result.append("a_is_hidden = false");
}
if (!this.m_showArchive)
{
if (result.length() != 0) {
result.append(" and ");
}
result.append("a_archive = false");
}
return result.toString();
}
}

So much for configurable application…

Assap 7.0 vs msg format

We’ve been facing a weird issue with assap 7.0 sp2 and .msg files in SAP GUI. Any file will open from SAP GUI (PDF, TIFF, JPEG) but trying to open a .msg file will prompt user to download an “unknown format” file named as the repository.

However, opening the .msg file from Webtop, any DFC client or the dmview client works just fine.

We tried suggestions from support page (adding mime type to server configuration, to dm_format, etc.) with no luck.

So I decompiled the servlet that sends the response (com.documentum.ei.al.SendHttpResponse):

 response.setContentLength((int)numBytesAvail);
 if (filename != null)
 {
 filename = URLEncoder.encode(filename, "UTF-8");
 String showFileOpenDialog = PropertiesManager.getALPropValue("archiving.fileOpen.confirmation");
 if ((showFileOpenDialog != null) &amp;&amp; (showFileOpenDialog.equalsIgnoreCase("true"))) {
 response.setHeader("content-disposition", "attachment; filename=" + filename);
 }
 }

 

So I decided to turn on the showFileOpenDialog option on al.properties and.. it works! However, this prompts the user with a dialog showing “open/save” options for any file.

So, what’s going on? Well, it looks like that browsers (as I can reproduce this behaviour in any browser by calling the url that SAP GUI uses) won’t handle correctly downloads with mime-types associated to external applications (because files handled by the browser work fine), unless the content-disposition header is set, so in this particular case, to just solve the problem with .msg files:

 response.setContentLength((int)numBytesAvail);
if (filename != null)
{
filename = URLEncoder.encode(filename, "UTF-8");
String showFileOpenDialog = PropertiesManager.getALPropValue("archiving.fileOpen.confirmation");
if ((showFileOpenDialog != null) && (showFileOpenDialog.equalsIgnoreCase("true"))) {
response.setHeader("content-disposition", "attachment; filename=" + filename);
}else{
if (context.getContentType().equalsIgnoreCase("application/vnd.ms-outlook")) {
response.setHeader("content-disposition", "inline; filename=" + filename);
}
}
}

and throwing the class into WEB-INF/classes solves the problem