Desktop Operation

Maintenance Tasks

  • Backup strategy

  • Workspace configuration

Tuning

Performance optimization of the "Documents" view

PIM - Server shows in its Documents view the content of a media asset category delivered by the integrated media asset provider.

However, the respective media asset providers vary in the data they deliver for a media asset and in the reaction time/speed.
For instance, it might be a problem to access a preview image at provider "A", or the calculation of an image dimension at provider "B" is a problem.
Therefore, the following requirement to media asset providers has been introduced:

  • The media asset provider must deliver for each media asset an (unique) identifier, the name, and size in high speed.

If this is requirement is not fulfilled, it makes no sense to integrate such a media asset provider.

Furthermore, the load of this view has been optimized so that it is based on the properties returned by the respective media asset provider:

When you are opening a media asset category, a list of all media assets contained by this category is requested from the media asset provider.
The media asset provider has to return the identifiers, the names, and the file sizes immediately.

The values for all other columns the media asset provider did not immediately, return can be returned with a "delayed" status.
In this case, the view requests these values for each row separately, when the view "scrolls" in the visible field area.
The performance of the view can be improved by hiding unimportant columns.

It is also possible to hide the preview image column. This increases the performance even more.

images/download/attachments/209753359/DocumentsView.png

Note: Thumbnails of pdf documents are not displayed in the documents view!

Filter

The Documents view provides an interface enabling to filter the content on e.g. JPEG documents. To do this, you have to register an implementation of the Interface

com.heiler.ppm.mediaasset.ui.api.IFileDataFilter

by implementing the method

com.heiler.ppm.mediaasset.ui.views.DocumentsOfCategoryTableView.registerFileDataFilter(IFileDataFilter)

of the view. This filter will then be called every time the view is populated with data. From a technical point of view this filter will be called inside the respective IContentProvider implementation.

public interface IFileDataFilter
{
public FileData[] filter( FileData[] fieldTofilter );
}

Import

When adding CSV or Excel files to an import project, per default all rows are read into heap memory in order to presort them. This speeds up processing if the data for one item is stored in rows that are spread. So when adding large CSV or Excel data files, consider to increase the client's heap size accordingly.

If presorting is not needed (because the data files are already presorted) or desired, it can be disabled by opening the "Advanced settings" dialog after selecting the CSV file, and here unchecking the checkbox "Presort rows". See also the following screenshot:
images/download/attachments/209753359/AdvancedCSVSettings_PresortRows.png
For Excel data files find the "Presort rows" checkbox directly in the Settings dialog, after selecting the Excel file:

images/download/thumbnails/209753359/ExcelSettings_PresortRows.png

This "Presort rows" settings only affects the adding of data files to the import project in P360 Desktop Client, but not the import itself. For disabling presorting rows in the import itself, please see the chapter "Server Operation" (of the Installation and Operation guide) and here the sub chapter "Import", "Preferences regarding memory usage".

Adding large data files to an import project might become slower, when presorting is deactivated (see setting above) and the import data file is not already presorted.

Trouble Shooting

  • Log Files

  • Workspace log

  • Server connection lost/reconnect

User Interface is not responding any more (client freeze)

The currently supported operating systems of the Heiler Product Manager do only support a single GUI thread. It is responsible for reading and dispatching operating system events like mouse clicks and keyboard strokes. Usually the main thread reads an event from the operating system, and dispatches this event further to whoever listenes on it (in our case SWT widgets). It then waits for all those event listeners to complete and then read again the next events from the operating system (the read-and-dispatch loop is synchronously). It performs this in an endless loop as long as the application is running.

In the PIM - Desktop this thread is also the main thread, which makes it quite easy to identify. Therefore, whenever the client stops responding it must be related to the client's main thread being busy with other things then reading and dispatching OS events. For example it's waiting on some operation to complete.

Find the problem on the client

To pinpoint the reason for the freeze you will need to know what the client is doing (or better waiting for) at the moment of the freeze. For this you will need a How to create a thread dump of the client.

  1. Perform a thread dump of the client at the moment of the freeze

  2. Find the main thread in the dump and check the stack trace - see where it ends.

  3. In case the main thread waits on the completion of a server request you will need to move your investigation to the server.
    In this case the stack trace of the client's main thread usually stops somewhere in the communication framework, e.g. ClientNodeImpl(AbstractNode).sendRequest(NodeIdentifier, Message, long)

  4. In case the stack trace makes absolutely no sense for you, don't panic, that's not unusual images/s/o7yjop/8703/51k4y0/_/images/icons/emoticons/smile.svg . With the information you collected we should be able to help you identify and fix the problem.

  5. In case the client's main thread is waiting for a server request to complete, you can move on step further and check the server's threads.

Find the problem on the server

Since the server has no user interface, the main thread of the server is more or less irrelevant for this task. All requests from the communication framework are handled by the communication worker threads. The only problem is to find the right one. Currently you can't determine this by just looking at the thread names, you really have to check all communication framework threads. Communication worker threads are named CommunicationWorker-<Number>. Most of them should be in parking position, waiting for a request of a client (e.G. Unsafe.park(boolean, long) line: not available [native method]), those can be ignored, of course.

If you take multiple thread dumps of the server, you can check which thread "didn't move" between those dumps, making it easier to find the responsible one.

When you finally found the communication worker thread which is responsible, it might happen that this thread is itself waiting. Waiting for some other thread or the database. From there on it gets complicated and leads to debugging multi-threading issues and database locking problems. It would go beyond the scope of this wiki, so we would encourage you to contact Heiler Software Support if you need any further assistance on this.

Connection timeouts between Server and Client

In case there are connection issues between the server and the client regarding the heartbeat timeout it is possible to change the settings in the plugin_customization.ini of the client in the section "Communication CORE Settings".

If these settings do not generate the expected outcome it is also possible to change the rate in which the server checks for messages to the client. As the behavior is that if the server has nothing to send to the client in a specific time frame it will send a heartbeat object to the client. This time frame can be edited in the server's plugin_customization.ini if you add the following key:

com.heiler.ppm.communication.core/serverPollRate = 10

The value is the time in seconds which the server waits for a new message to send it to the client. Default value is 10.

When editing this value please keep in mind that it cannot be lower than the value of heartbeatInterval. Otherwise the heartbeat will fail as soon as no activity is send to the client.
If the client do not get bytes in a specific time frame from the server it marks the connection as unusable and the client disconnects from the server.

To disable the heartbeat from client to server in general you can set the heartbeatInterval to 0 in the client plugin_customization and set the serverPollRate in the server plugin_customization to 0.

Rich Text Editor

Unable to use the clipboard actions "Cut", "Copy" and "Paste"

Due to the browser setting it may be impossible to use the following RichText-Editor buttons images/download/attachments/209753359/rte_buttons.png

In this case one of the following dialogs may be shown:

images/download/thumbnails/209753359/browser_security_1.png images/download/thumbnails/209753359/browser_security_2.png

To change this behavior open the "Internet Explorer" and do following steps:

  1. Go to Tools -> Internet Options.

  2. Go to "Security" tab.

  3. Select “Internet” zone, then click on “Custom level…” button.

  4. Scroll down to “Scripting” section (at the bottom few).

  5. Under “Allow Programmatic clipboard access” option, check or select (tick) to enable

Workaround to prevent the "Invalid Certificate" error (Mozilla)

If the browser control loads any URL which uses an unsigned (or self-signed) SSL certificate, an error dialog appears:

images/download/attachments/79562235/image2015-11-19_13_54_43.png

Since there is no way to add an "exception" to the XULRunner, the following workaround can be used:

  1. Open Firefox and load the domain which uses the invalid certificate (i.e. "https://localhost:8443/")

  2. The page "This connection is untrusted" will be shown (see below):

    images/download/thumbnails/79562235/image2015-11-19_14_12_44.png
  3. Click on the button "Add exception..." and confirm the dialog which appears

  4. Go to the "Firefox" profile folder (typically "C:\Users\[USER_NAME]\AppData\Roaming\Mozilla\Firefox\Profiles\[PROFILE_NAME]\")

  5. Copy the file "cert_override.txt"

  6. Go to the XULRunner profile folder (typically "C:\Users\[USER_NAME]\AppData\Roaming\Mozilla\eclipse\")

  7. Paste the file "cert_override.txt"

Alternatively it is possible to use another workaround:

  1. Open the file "prefs.js" in the folder "C:\Users\[USER_NAME]\AppData\Roaming\Mozilla\eclipse\".

  2. Add the following line to the file and save the file:
    user_pref("network.automatic-ntlm-auth.trusted-uris", [host url of IdP server]);

Next time you start PIM Desktop the browser control will load the URL without any errors.

Alternatively just use a "trusted" certificate (see https://en.wikipedia.org/wiki/Certificate_authority) or switch the setting http.client.proxy in "server.properties" to an HTTP URL (instead of HTTPS).

Startig with 8.0.03 it is possible to login to the desktop client via SAML. In this case the same rules apply to the certificate of the SAML IDP server. Generally it is recommended to use a trusted certificate, however If necessary the workaround with the cert_override.txt can be applied here as well.

Product Paradim (EGD) limitations

Please note that the EGD (Extended Generic Data) based product paradigm, which was used in the past for the first PIM Product paradigm, ist now with PIM 7 no longer in Support. The EGD itself will remain as basis for custom entities, but without the EGDAttributeMapping entity.

This information is also about some sideeffects in the PIM 7 user interface, yet. For example you are having in the organization perspective double menu entries for product assortments. One is for the old, egd based, product assortment, one for the new product assortments. Unfortunately you cannot see the difference in one glance. Workaround until this is removed with PIM 8 is to try out default object rights on your product assortment. If it does not have the adjusted effect you have to choose the other selection in the default object rights combo box.