ESM Listener - Debugging and Code Examples
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>
Table of Contents