FI Finnish
SE Swedish
FR French
PL Polish
DE German
US English (US)

Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

English (US)
FI Finnish
SE Swedish
FR French
PL Polish
DE German
US English (US)
  • Log in
  • Home
  • Platform
  • ESM
  • Other Technical ESM Documentation
  • Listeners

ESM Listener - Debugging and Code Examples

Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

  • Service Management
    Matrix42 Professional Solution Matrix42 Core Solution Enterprise Service Management Matrix42 Intelligence
  • Identity Governance and Administration (IGA)
    IGA overview IGA solution library
  • Platform
    ESM ESS2 ESS Efecte Chat for Service Management Integrations Add-ons
  • Release Notes for M42 Professional, IGA, Conversational AI
    2026.1 2025.3 2025.2 2025.1 2024.2 2024.1 2023.4 2023.3 2023.2 2023.1 2022.4 2022.3 Release Information and Policies
  • Other Material
    Terms & Documentation Guidelines Accessibility Statements
  • Services
+ More
    • Service Management

    • Identity Governance and Administration (IGA)

    • Platform

    • Release Notes for M42 Professional, IGA, Conversational AI

    • Other Material

    • Services

ESM Listener - Debugging and Code Examples

Debugging

When new loaded, ESM validates the contents and non functional ones can’t be inserted.

  • Error message given is often uninterpretable, such as “XML cannot be empty”.
  • Check that you have closed all components </> and all field codes are correct etc.
  • Review listener documentation, that you are not trying to do stuff that is not possible, such as comparing text fields or external reference fields.
  • Try to remove or modify suspicious components and attempt without them.

You could try to extract further information by opening some of these classes for runtime logging and set DEBUG level when trying to import the XML:

  • com.bitmount.equipment.importing.ValidatingEntityXMLImporter
  • com.efecte.datamodel.entity.listener.importing.XMLActionChainImporter
  • com.efecte.datamodel.entity.listener.importing.XMLDataCardListenerImporter
  • com.efecte.datamodel.entity.listener.importing.XMLSourceConditionsImporter
  • com.efecte.datamodel.entity.listener.importing.XMLTemplatesDataCardListenerImporter
  • com.bitmount.equipment.action.TemplateListenerImport

If you have a generally acceptable listener that is not working the way to would like:

You could try to extract further information by opening the classes that match your conditions for runtime logging and set DEBUG level and you should see what triggers and what doesn’t:

  • com.efecte.datamodel.entity.listener.condition.(?????)
  • com.efecte.datamodel.entity.action.chain.condition.(?????)
  • com.efecte.datamodel.entity.action.implementations.(?????)
  • (?????) = each XML component

Remember to set logging back to INFO level after fixing the listeners or you will produce huge amounts of logfiles!!

Code Examples

Structure specialties

<?xml version="1.0" encoding="iso-8859-1"?>
<template code=”template code where listener is run">
    <listener>
        <name>Name of the listener</name>
        <trigger>post save</trigger>
        <source_conditions boolean="AND">
            <source_condition>
                ...
            </source_condition>
            <combined_source_condition boolean=”OR”>
                <source_condition>
                    ...
                </source_condition>
            </combined_source_condition>
        </source_conditions>
        <action_chain>
            <name>Set something</name>
            <root_target_condition>
                <template_condition>
                    <code>template code of target if used</code>
                </template_condition>
                <combined_target_condition boolean="AND">
                    <target_condition>
                        ...
                    </target_condition>
                </combined_target_condition>
            </root_target_condition>
            <action>
                ...
            </action>
            <action>
                ...
            </action>
        </action_chain>
    </listener>
</template>

Linking Devices to Device Models

 <template code="computer_model">
	<listener>
        <name>postsave.1.Link workstation to computer model if system type matches and no link exists</name>
        <trigger>post save</trigger>
        <source_conditions boolean="AND">
			<source_condition>
				<always_true/>
			</source_condition>
        </source_conditions>
<action_chain>
            <name>Link to computer model</name>
            <root_target_condition>
			 	<template_condition>
					<code>workstation</code>
				</template_condition>
				<combined_target_condition boolean="AND">
					<target_condition>
						<value>
							<attribute>
								<code>computer_model</code>
							</attribute>
							<operator>IS NULL</operator>
							<compared_value></compared_value>
						</value>
					</target_condition>
					<target_condition>
						<source_property>
							<attribute>
								<code>system_type</code>
							</attribute>
							<operator>=</operator>
							<compared_attribute>
								<code>sccm_model</code>
								<current_value>true</current_value>
							</compared_attribute>
						</source_property>
					</target_condition>
					<target_condition>
						<entity>
							<state>entityIsHidden</state>
							<value>false</value>
						</entity>
					</target_condition>							
				</combined_target_condition>
			</root_target_condition>
			<action>
<name>Link to computer model</name>
<class>com.efecte.datamodel.entity.action.implementations.CopySourceReferenceAction</class>
				<configuration_item>
					<name>Code</name>
					<value>computer_model</value>
				</configuration_item>
            </action>
        </action_chain>
    </listener>
</template>


Inserting Device Model Names When Import Created Blank New

<template code="workstation">
	<listener>
        <name>postsave.2.Insert model name from linked datacard if empty</name>
        <trigger>post save</trigger>
        <source_conditions boolean="AND">
            <source_condition>
                <value>
                    <attribute>
                        <code>workstation_model</code>
                        <current_value>true</current_value>
                    </attribute>
                    <operator>IS NOT NULL</operator>
                    <compared_value/>
                </value>
            </source_condition>
            <source_condition>
                <value>
                    <attribute>
                        <code>workstation_model_text</code>
                        <current_value>true</current_value>
                    </attribute>
                    <operator>IS NOT NULL</operator>
                    <compared_value/>
                </value>
            </source_condition>
			<source_condition>
				<reference_path_value>
					<reference>
						<path>$workstation_model:workstation_model$</path>
						<current_value>true</current_value>
					</reference>
					<operator>IS NULL</operator>
					<compared_value/>
				</reference_path_value>
			</source_condition>
        </source_conditions>
<action_chain>
            <name>Copy model name</name>
			<root_target_condition>
			 	<template_condition>
					<code>workstation_model</code>
				</template_condition>
				<combined_target_condition boolean="AND">
					<target_condition>
						<reference_from_source>
							<source_attribute>
								<code>workstation_model</code>
							</source_attribute>
						</reference_from_source>
					</target_condition>
					<target_condition>
						<entity>
							<state>entityIsHidden</state>
							<value>false</value>
						</entity>
					</target_condition>					
				</combined_target_condition>
			</root_target_condition>
<action>
<name>Copy model name</name>
              <class>com.efecte.datamodel.entity.action.implementations.CopyDataCardValuesAction</class>
                <configuration_item>
                    <name>Value</name>
                    <value>workstation_model_text</value>
                </configuration_item>
                <configuration_item>
                    <name>Code</name>
                    <value>workstation_model</value>
                </configuration_item>
            </action>
        </action_chain>
    </listener>
</template>

Sending Email

<template code="standard_change">
    <listener>
        <name>postsave.5. Notify development team on incoming email changing timestamps-04.05.2017</name>
        <trigger>post save</trigger>
        <source_conditions boolean="AND">
			<combined_source_condition boolean="OR">
				<source_condition>
					<property>
						<attribute>
							<code>implementation_start</code>
							<current_value>false</current_value>
						</attribute>
						<operator>!=</operator>
						<compared_attribute>
							<code>implementation_start</code>
							<current_value>true</current_value>
						</compared_attribute>
					</property>
				</source_condition>
				<source_condition>
					<property>
						<attribute>
							<code>implementation_end</code>
							<current_value>false</current_value>
						</attribute>
						<operator>!=</operator>
						<compared_attribute>
							<code>implementation_end</code>
							<current_value>true</current_value>
						</compared_attribute>
					</property>
				</source_condition>
				</combined_source_condition>
            <source_condition>
                <value>
                    <attribute>
                        <code>incoming_emails</code>
                        <current_value>true</current_value>
                    </attribute>
                    <operator>IS NOT NULL</operator>
                    <compared_value/>
                </value>
            </source_condition>
            <source_condition>
                <value>
                    <attribute>
                        <code>development_team</code>
                        <current_value>true</current_value>
                    </attribute>
                    <operator>IS NOT NULL</operator>
                    <compared_value/>
                </value>
            </source_condition>
        </source_conditions>
         <action_chain>
            <name>Notify</name>
			<action>
               <name>Send mail</name>
               <class>com.efecte.datamodel.entity.action.implementations.SendMailAction</class>
               <configuration_item>
                   <name>Message</name>
                   <value>Your requested Standard change $efecte_id$ has a changed scheduled datetime

Subject: $subject$
Description: $description$

Latest worklog comment:
$worklog$

This is an automatic mail from https://efecteitsm.dna.fi</value>
               </configuration_item>
               <configuration_item>
                   <name>To</name>
                   <value>$development_team:members_emails$</value>
               </configuration_item>
               <configuration_item>
                   <name>From</name>
                   <value>efecte-no-reply@dna.fi</value>
               </configuration_item>
               <configuration_item>
                   <name>Subject</name>
                   <value>Your requested Standard change $efecte_id$ has a changed scheduled datetime</value>
               </configuration_item>
           </action>
        </action_chain>
    </listener>
</template>

 

 

 

debugging examples

Was this article helpful?

Yes
No
Give feedback about this article

Table of Contents

Related Articles

  • ESM Listener Lifecycle
  • ESM Listener XML Structure
  • ESM Listener Operators and Conditionals

Copyright 2026 – Matrix42 Professional.

Matrix42 homepage


Knowledge Base Software powered by Helpjuice

0
0
Expand