You are not logged in.
Fiddler is a free web debugging proxy. What that means is that if you are trying to consume a web service you can see what the details of the packet that you are sending looks like.
We can test sending data to webservices with a tool like SoapUI. SoapUI can be used to test REST and SOAP transactions to a web service. If we can successfully consume a webservice using SoapUI we should be able to see what the packet must look like (using Fiddler) and we can compare that to what we are sending from XLayer. This is obviously only if we are experiencing issues.
As Fiddler is a proxy we need to configure SoapUI to send through this proxy. To do this, in SoapUI go to
File -> Preferences -> Proxy Settings. In the dialog on the right change the following:
"ProxySetting:" to Manual
Host 127.0.0.1
Port 8888
After that start Fiddler and (pressing F12) start capturing packets. Then run your test from SoapUI and you should see the packets appearing in Fiddler.
The information was found here
When attempting to log an Incident into Heat ITSM we received a 'An item with the same key has already been added.'
This happens when the ProfileLink key was sent twice, that's why the API was unhappy. That, and CRNumber is not a valid key, although the request should still work, as the API will just ignore it.
Kevin: Will it be true to assume whenever an invalid field is passed to the API I would get this very same response?
Ruan: No, you'll get different error messages based on what is wrong, but these error messages might be misleading.
Kevin: You can telnet to confirm the SXI bridge to Heat ITSM is working:
* I imagine I can get the server and port required from the config. Yes. It is 172.24.1.109 port 9752 - you can run the telnet directly from the 56 box.
* When establishing the Telnet session is one expected to authenticate, if so how? No authentication needed. Simply copy and paste the string once connected and press Enter. You'll see an error message OR "Success - RecId: .........."
* If so, how do I see the responses returned from the API. You'll have to look in C:\Program Files (x86)\Southern X Integrators\ItsmApiService\Logs directory on 172.24.1.109
1. Does this Create(Incident) thing I am running always have the same key value pairs?
1. yes
Ruan: Great so once you get used to what is required you can begin to help yourself
what other kinds of "operations" can I make to the API, and where can I see what key value pairs those operations will require
27 mins
1. Only Create (for incidents) and Update (For Worklog updates, and Tasks)
Create -> to create new calls
Update -> everything else
Table names we use:
Incident -> new call as well as status updates (Priority, ClientReferenceNumbers etc.)
Task -> To assign an already created call
Journal -> to add a worklog to an already created call
it's very primitive but effective
replied to your mail - let me know if there's anything else
Ruan: I see thanks a mil. So you run these transactions through the API but then you still need to that extra stuff I see you doing directly to the DB
to do that
19 mins
1. for some operation types, yes. You see, Henk added additional columns to the Incident table after the API was developed, so if we try and populate those new columns, the API doesn't recognise the keys and simply ignore it. That's why I had to update the records manually afterwards with a direct SQL query...
it's terrible but it was the best we could do
Ruan •16 mins
No it is fine now that I understand it. Basically if I Create an Incident and someone says why didn't I populate a certain field it is probably because that certain field is something Henk added and I need to update that separately because the API does not know about that field
1. That's right...
Ruan • 12 mins
Kevin: Just another thing I see there is some kind of trigger to allow us to update these "henk" fields which typically causes a collector to run and subsequently a provider. I imagine we could do this with a workflow and would not need that trigger
10 mins
1. Yes again!
Ruan • 9 mins
Does the API return the reference number to the workflow to allow us to update the correct record from the workflow?
7 mins
1. It returns a RecId, in the Response, If you look at the current BCXAfgriDCX Workflow, you'll see I've configured a condition to check the response, strip off all funnies before and after the RecID and lookup the IncidentNumber. You can copy and paste that if you like
i can email you the config if you want
Ruan • 4 mins
Excellent - the only thing is that trigger still runs I suppose to service all the collector/provider interfaces so somwhere in that DB we are going to have a table that has all thses signals in it that are not being used - not a problem we can turm that trigger off when all collector/provider are changed to workflow
4 mins
1. oh ja it can be disabled easily
Limit Attachment file size to 3 Meg.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.sxi.co.za/XMLSchema" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name()='HPDWorkInfo_1000002135']">
<HPDWorkInfo_1000002135>
<xsl:for-each select="//*[local-name()='XServiceBroker']//*[local-name()='HPDWorkInfo_1000002135']">
<xsl:variable name="currentPos" select="position()"/>
<xsl:choose>
<xsl:when test="(string-length(//*[local-name()='Data'][1]) > 3000000)">
<Name>Attachment_File_Too_Big</Name>
<OrigSize>0</OrigSize>
<Data></Data>
</xsl:when>
<xsl:otherwise>
<Name><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002135']//*[local-name()='Name']"/></Name>
<OrigSize><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002135']//*[local-name()='OrigSize']"/></OrigSize>
<Data><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002135']//*[local-name()='Data']"/></Data>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</HPDWorkInfo_1000002135>
</xsl:template>
<xsl:template match="//*[local-name()='HPDWorkInfo_1000002136']">
<HPDWorkInfo_1000002136>
<xsl:for-each select="//*[local-name()='XServiceBroker']//*[local-name()='HPDWorkInfo_1000002136']">
<xsl:variable name="currentPos" select="position()"/>
<xsl:choose>
<xsl:when test="(string-length(//*[local-name()='Data'][1]) > 3000000)">
<Name>Attachment_File_Too_Big</Name>
<OrigSize>0</OrigSize>
<Data></Data>
</xsl:when>
<xsl:otherwise>
<Name><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002136']//*[local-name()='Name']"/></Name>
<OrigSize><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002136']//*[local-name()='OrigSize']"/></OrigSize>
<Data><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002136']//*[local-name()='Data']"/></Data>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</HPDWorkInfo_1000002136>
</xsl:template>
<xsl:template match="//*[local-name()='HPDWorkInfo_1000002137']">
<HPDWorkInfo_1000002137>
<xsl:for-each select="//*[local-name()='XServiceBroker']//*[local-name()='HPDWorkInfo_1000002137']">
<xsl:variable name="currentPos" select="position()"/>
<xsl:choose>
<xsl:when test="(string-length(//*[local-name()='Data'][1]) > 3000000)">
<Name>Attachment_File_Too_Big</Name>
<OrigSize>0</OrigSize>
<Data></Data>
</xsl:when>
<xsl:otherwise>
<Name><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002137']//*[local-name()='Name']"/></Name>
<OrigSize><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002137']//*[local-name()='OrigSize']"/></OrigSize>
<Data><xsl:value-of select="//*[local-name()='HPDWorkInfo_1000002137']//*[local-name()='Data']"/></Data>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</HPDWorkInfo_1000002137>
</xsl:template>
</xsl:stylesheet>
Any Character can be used in XML using its Numerical Character Reference or (NCR). For example the Euro Sign € can be represented in XML as
€
If this causes problems with the Applications we are integrating with you can always use the Stylesheet Translate command to replace or remove them entirely.
This site has a list of all the NCR's
A numeric character reference (NCR) is a common markup construct used in SGML and SGML-derived markup languages such as HTML and XML. It consists of a short sequence of characters that, in turn, represents a single character. Since WebSgml, XML and HTML 4, the code points of the Universal Character Set (UCS) of Unicode are used. NCRs are typically used in order to represent characters that are not directly encodable in a particular document (for example, because they are international characters that don't fit in the 8-bit character set being used, or because they have special syntactic meaning in the language). When the document is interpreted by a markup-aware reader, each NCR is treated as if it were the character it represents.
Occasionally the components we integrate with may not accept or users may not want to see UCS characters. These can be removed/substituted using the Stylesheet (XSLT) Translate command. The following example shows how one can change an "En Dash" to a normal "Dash" (Minus Sign)
<xsl:template match="text()">
<xsl:value-of select='translate(., "–", "-")'/>
</xsl:template>
Thank You StephanB for this
Additional Information:
https://en.wikipedia.org/wiki/Numeric_c … _reference
When Tomcat is installed as a Windows service and the Java Version is changed the Tomcat service will not start.
Set Tomcat to see the latest version as follows:
Run ..\Program Files\Apache Software Foundation\Tomcat 9.0\bin\Tomcatxw.exe and then in the Java tab set the "Java Virtual Machine" to the new Java JVM path
RemoveSoapenv.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="soapenv">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- remove all elements in the soapenv namespace -->
<xsl:template match="soapenv:*">
<xsl:apply-templates select="node()"/>
</xsl:template>
<!-- for the remaining elements (i.e. elements in the default namespace) ... -->
<xsl:template match="*">
<!-- ... create a new element with similar name in no-namespace -->
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<!-- convert attributes to elements -->
<xsl:template match="@*">
<xsl:element name="{local-name()}">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
If X-Notify service fails, the notification doc will go to the XmlError directory and does not get processed once the X-Notify service is restore.
Solution:
Create a batch file to run in X-Scheduler ever 5min or so.
Move_X-NotifyDocs.bat
@echo off
SET src_folder="X:\SXI\XPress\XmlError"
SET tar_folder="X:\SXI\XPress\XmlOut"
MOVE /Y %src_folder%\X-Notify~*.xml %tar_folder%
exit 0
Here is a REALLY simple explanation of how to add basic user authentication in Tomcat
I need to clear the SuccessStore and Exceptions list of files that are older than a week. What is the best way to do this?
How does one configure the excel connector to collect data from a particular excel file?
Firstly I notice that unlike the XML file collector and contrary to the annotation where the "lookupValue" attribute on the Collect mapping is used to define the name of the file to be used in the process (if the value specified in the "lookupValue" attribute does not exist in memory the value of the signal EntryID is used) this is not so when using the Excel Connector, and it seems when using the excel connector the name of the excel file and the path to this file are defined in the Connector node - Is there a reason for this ? How would I for instance read a file where the name I need is extracted from a previous collect?
Secondly what should I specify in the "lookupValue", "lookupField" and "source" attributes of the collect mapping when using the Excel connector? The clues given in the annotation offer little assistance in this regard.
Finally what should I be specifying in the Data Definition in order to pick up different cells from different worksheets from the input excel file? There is no mention in the annotation on what needs to be configured to achieve this.
This script relies on a utility called sc.exe and can be found here
REM
REM A trivial script to set ALL the XLayer services startup "automatic"
sc config X-Asset Client start=auto
sc config X-EventCollector start=auto
sc config X-FileTX start=auto
sc config X-HBChecker start=auto
sc config X-Notify start=auto
sc config X-Scheduler start=auto
sc config X-ServiceBroker start=auto
sc config XPressDispatch start=auto
sc config XPressStation start=auto
pause
REM To adapt the script for setting the services "manual", change the "auto" to "demand"
How do you specify the field names in the DataDefinition when collecting data from a row in a CSV file?
How do you specify the field names in the DataDefinition when collecting data from a EXCEL file?
This stylesheet take a monetary value in an element named "price" and separates the Rand and Cents values into individual elements
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:variable name="s" select="//*[local-name()='price']" />
<cents><xsl:value-of select="substring($s, string-length($s) - 1,2)" /></cents>
<Rands><xsl:value-of select="substring($s, 1, string-length($s) - 2)" /></Rands>
</xsl:template>
</xsl:stylesheet>
Goodday
Can I please ask your assist with an xpath to collect a ticket number written in memory from as a response.
Attached is an XPress document from a json string written to memory and our field of interest is the "display_value" tag
I am not sure how to pick that value.
Please assist
XPress doc
<?xml version="1.0" encoding="iso-8859-1"?>
<XServiceBroker xmlns="http://www.sxi.co.za/XMLSchema">
<XHeader>
<XPress>
<Destination>127.0.0.1</Destination>
</XPress>
<XServiceBroker>
<ActionName>Create</ActionName>
<Provider>AddtoExist</Provider>
</XServiceBroker>
</XHeader>
<ResponseMessage>
<Object xmlns="">
<import_set type="string">ISET0013048</import_set>
<result class="array">
<Element class="object">
<display_name type="string">number</display_name>
<display_value type="string">INC0068191</display_value>
<record_link type="string">https://south32uat.service-now.com/api/now/table/incident/a949c7f1db716240ca53f1fabf961943</record_link>
<status type="string">inserted</status>
<sys_id type="string">a949c7f1db716240ca53f1fabf961943</sys_id>
<table type="string">incident</table>
<transform_map type="string">Event Management Incident</transform_map>
</Element>
</result>
<staging_table type="string">u_event_mgmt</staging_table>
</Object>
</ResponseMessage>
</XServiceBroker>
Download the latest SXISOAPImporter.war file from the SXI server /opt/installers directory
Copy this file into your TOMCAT_HOME/webapps directory
Start your Apache Tomcat service
Apache Tomcat will automatically install the web service and you will then be in a position to manage the SXISOAPImporter service from the Apache Manager App .(http://localhost:8080/manager/html)
The SXISOAPImporter help page can be accessed from http://localhost:8080/SXISOAPImporter/
As described in the SXISOAPImporter help page the configuartion file SXISOAPImporter.properties is found in TOMCAT_HOME/webapps/SXISOAPImporter/WEB-INF/Classes directory
The SXISOAPImporter log file is found in TOMCAT_HOME/webapps/SXISOAPImporter/logs
This stylesheet removes namespaces from XML elements
<!-- Stylesheet to remove all namespaces from a document -->
<!-- NOTE: this will lead to attribute name clash, if an element contains
two attributes with same local name but different namespace prefix -->
<!-- Nodes that cannot have a namespace are copied as such -->
<!-- template to copy elements -->
<!-- template to copy attributes -->
<!-- template to copy the rest of the nodes -->
What are these properties for?
FieldDerivativeTables is a Global Rule, which means if enabled, this rule is applied to all the Fields in the configured Entrypoint.
For FieldDerivativeTables we need to do 2 things:
Configure the Rule
Enable the Rule
NOTE: It is strongly recommended that you use an intelligent XML Editor when editing all X-Layer configuration files.
SXI-approved XML Editors include Oxygen (requires paid license) and Microsoft Visual Studio Tools for Applications 2.0 (included in Visual Studio 2010. Also available by installing the ASP.net package on your machine).
In the configuration, after the </Actions> element, create an <sxi:Tables> element (ignore this step if the configuration already contains an <sxi:Tables> element).
Inside the <sxi:Tables> element, create an <sxi:FieldDerivativeTables> element. (If you are using Oxygen to edit the config file, the rest of the required fields would have auto-populated). Remember to close the tag with </sxi:FieldDerivativeTables> if your XML Editor has not done so already.
Create the following inside <sxi:FieldDerivativeTables>, if your XML Editor have not done so already:
<sxi:Match reference="">
<sxi:InputField name="">
<sxi:InputValue></sxi:InputValue>
</sxi:InputField>
</sxi:Match>
The above simply enables us to first identify which fields in the transaction we want to match on. For example, if we have the following:
<sxi:Match reference="Reference1">
<sxi:InputField name="Requestor">
<sxi:InputValue>Harry</sxi:InputValue>
</sxi:InputField>
</sxi:Match>
"Match reference" is the "ID" of this specific match we are configuring. You can use any value here. We will be referencing it later.
"InputField name" is the ELEMENT or TAG NAME in the transaction that will contain the value we want to match on. Example: the TAG NAME of <User>Jane Doe</User> is "User".
"InputValue" is the value inside the above element to match. If multiple "InputValues" are configured then the rule will try to match any one of them. Example:
<sxi:Match reference="Reference1">
<sxi:InputField name="Requestor">
<sxi:InputValue>Harry</sxi:InputValue>
<sxi:InputValue>Sally</sxi:InputValue>
</sxi:InputField>
</sxi:Match>
We can also match as many fields as needed. For example:
<sxi:Match reference="Reference1">
<sxi:InputField name="Requestor">
<sxi:InputValue>Harry</sxi:InputValue>
<sxi:InputValue>Sally</sxi:InputValue>
</sxi:InputField>
<sxi:InputField name="Company">
<sxi:InputValue>ABC</sxi:InputValue>
</sxi:InputField>
</sxi:Match>
To summarize the the above configuration: We have a Match reference called "Reference1", which encapsulates the following conditions: IF the transaction contains an element name called "Requestor" with a value OF EITHER "Harry" or "Sally", AND an element name called "Company" which contains a value called "ABC", then we have a match!
You can create as many Match references as needed. Keep in mind that each Match Reference must have a unique ID (example: Reference1, Reference2, Reference3, etc.). Below is an example containing 2 Match references:
<sxi:Match reference="Reference1">
<sxi:InputField name="Requestor">
<sxi:InputValue>Harry</sxi:InputValue>
<sxi:InputValue>Sally</sxi:InputValue>
</sxi:InputField>
<sxi:InputField name="Company">
<sxi:InputValue>ABC</sxi:InputValue>
</sxi:InputField>
</sxi:Match>
<sxi:Match reference="Reference2">
<sxi:InputField name="Requestor">
<sxi:InputValue>Peter</sxi:InputValue>
</sxi:InputField>
<sxi:InputField name="Company">
<sxi:InputValue>DEF</sxi:InputValue>
</sxi:InputField>
</sxi:Match>
Now we need to tell the rule which modifications must be made if we have a match. Again, if your XML Editor has not already done so, create an element called <sxi:OutputReferences> after the last </sxi:Match> element. Remember to close the tag with </sxi:OutputReferences>.
Inside </sxi:OutputReferences>, create the following (only if it did not auto-populate already):
<sxi:Reference name="">
<sxi:Fieldname name="">
<sxi:Output></sxi:Output>
</sxi:Fieldname>
</sxi:Reference>
In the "Reference name" field, put in the NAME of the "Match Reference" we used earlier. In our example this would be "Reference1". Example:
<sxi:Reference name="Reference1">
<sxi:Fieldname name="Department">
<sxi:Output>Sales</sxi:Output>
</sxi:Fieldname>
</sxi:Reference>
"Fieldname name" is the NAME of a newly created OUTPUT Field we want to add to our transaction. In the above example we are creating an element name of <Department>.
"Output" is VALUE we want to assign to this new element. In our example this would mean that we have just created an element <Department> with a value of "Sales" ie. <Department>Sales</Department>.
You can assign multiple Fields and values per match, like below:
<sxi:Reference name="Reference1">
<sxi:Fieldname name="Department">
<sxi:Output>Sales</sxi:Output>
</sxi:Fieldname>
<sxi:Fieldname name="Site">
<sxi:Output>Head Office</sxi:Output>
</sxi:Fieldname>
<sxi:Fieldname name="City">
<sxi:Output inputfield="yes">Location</sxi:Output>
</sxi:Fieldname>
</sxi:Reference>
Look at the Output of the last field: <sxi:Output inputfield="yes">Location</sxi:Output>. inputfield="yes" means that we don't want to use a hard-coded value as output, but we want the rule to fetch the value of a specific element in the transaction instead. In the above example we are telling the rule to create a new element called <City>, and assigning the value of an existing element in the transaction called <Location> to <City>.
It is also possible to have multiple <sxi:Reference> elements, which should always match the amount of <sxi:Match reference> elements.
Now that we have configured the rule, we need to tell it when it should run. This is configured at Entrypoint level. In other words, it should be enabled for each Entrypoint where we want to run this rule.
Identify the Entrypoint(s) where the FieldDerivativeTables rule should run. Then, directly under the <sxi:EntryPoint name="..." source="..."> element, add the following:
<sxi:GlobalRules>
<sxi:FieldDerivatives/>
</sxi:GlobalRules>
We can also specify that the FieldDerivativeTables rule runs BEFORE any local rules (which apply only to individual fields) are processed:
<sxi:GlobalRules>
<sxi:FieldDerivatives first="yes"></sxi:FieldDerivatives>
</sxi:GlobalRules>
Below is an example Entrypoint configuration with an enabled FieldDerivateTables rule:
<sxi:EntryPoint name="CreateIncident" source="d_serviceprovider_sd">
<sxi:GlobalRules>
<sxi:FieldDerivatives first="yes"></sxi:FieldDerivatives>
</sxi:GlobalRules>
<sxi:Fields>
<sxi:Field name="callnum">
<sxi:OutputField>TicketNumber</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Assigned_Group">
<sxi:Rules>
<sxi:Default>Support</sxi:Default>
</sxi:Rules>
<sxi:OutputField>Assigned_Group</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Name">
<sxi:OutputField>Name</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Description">
<sxi:OutputField>Description</sxi:OutputField>
</sxi:Field>
<sxi:Field name="State">
<sxi:Rules>
<sxi:Default>Assigned</sxi:Default>
</sxi:Rules>
<sxi:OutputField>State</sxi:OutputField>
</sxi:Field>
</sxi:Fields>
</sxi:EntryPoint>
2 Requirements need to be completed before a LookupTable will function correctly:
Configuring the rule
Enabling the rule for the required fields.
NOTE: It is strongly recommended that you use an intelligent XML Editor when editing all X-Layer configuration files.
SXI-approved XML Editors include Oxygen (requires paid license) and Microsoft Visual Studio Tools for Applications 2.0 (included in Visual Studio 2010. Also available by installing the ASP.net package on your machine).
In the configuration, after the </Actions> element, create an <sxi:Tables> element (ignore this step if the configuration already contains an <sxi:Tables> element).
Inside the <sxi:Tables> element, create an <sxi:LookUpTables> element. (If you are using Oxygen to edit the config file, the rest of the required fields would have auto-populated). Remember to close the tag with </sxi:LookUpTables>]if your XML Editor has not done so already.
If your XML Editor have not done so already, create the following inside <sxi:LookUpTables>:
<sxi:Table name="">
<sxi:Mapping from="" to=""/>
</sxi:Table>
<sxi:Table name=""> is the Reference to this particular table mapping. It is advisable to name it according to the type of mapping values it will contain, like "Priority", "Severity", "Urgency", etc.
<sxi:Mapping from="" to="" /> is the meat of the lookup table. It contains the actual values that we want to match (from) and transform (to). Below is an example:
<sxi:LookUpTables>
<sxi:Table name="Priority">
<sxi:Mapping from="High" to="1"/>
<sxi:Mapping from="Medium" to="2"/>
<sxi:Mapping from="Low" to="3"/>
</sxi:Table>
</sxi:LookUpTables>
Above we have a Lookup table called "Priority".
If the field against which we are applying the rule contains a value of "High", then we will change it to "1".
The same applies if the field contains a value of "Medium" (will change to "2") and "Low (will change to "3").
Now that the Table is configured, we can apply our lookup rule at Field-level in our Entrypoint.
Lets take an Example Entrypoint Configuration:
<sxi:EntryPoint name="CreateIncident" source="d_serviceprovider_sd">
<sxi:Fields>
<sxi:Field name="callnum">
<sxi:OutputField>TicketNumber</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Assigned_Group">
<sxi:Rules>
<sxi:Default>Support</sxi:Default>
</sxi:Rules>
<sxi:OutputField>Assigned_Group</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Name">
<sxi:OutputField>Name</sxi:OutputField>
</sxi:Field>
<sxi:Field name="Description">
<sxi:OutputField>Description</sxi:OutputField>
</sxi:Field>
<sxi:Field name="ClientPriority">
<sxi:Rules>
<sxi:LookUp default="2">Priority</sxi:LookUp>
</sxi:Rules>
<sxi:OutputField>Priority</sxi:OutputField>
</sxi:Field>
</sxi:Fields>
</sxi:EntryPoint>
Look at the Field called "ClientPriority":
Lets analyze it: <sxi:LookUp default="2"> means that if no match is found after iterating through the Lookup table, we will assign a value of "2" to the output field "Priority".
"Priority" is the name of the Lookup table which we want to check the value of "ClientPriority" against.
NOTE: If we don't configure a default value and no match is found in the lookup table, then the original value will be used as output value.
Self-signed certificates are helpful when a client uses an SSL web services connection to their integration partner (like BCX & BHP, Gijima & SolveDirect). When the certificate expires, the client does not always want to purchase a new certificate from a certification authority, but use a self-signed certificate instead in order to save costs.
Follow the 6 steps below to generate a self-signed certificate, and send the public one to the integration partner to implement on their side.
Normally self-signed certificates should only be used in development environments, but most of the time integration partners are running a dedicated IPSEC tunnel between them, so it should be safe to use.
Self-signed certificates are not advisable when the connection between partners are insecure.
Run the command below to generate a self-signed cert in an new empty keystore called tempks.jks (choose a new name for the keystore and fix the -dname to fit your URL):
"C:\Program Files\Southern X Integrators\jre\bin\Keytool.exe" -genkey -keyalg RSA -alias selfsigned -keystore tempks.jks -storepass T@gi2b2 -validity 365 -keysize 2048 -dname "CN=webservice.MYDOMAIN.co.za,OU=MYCOMPANY, O=MY COMPANY (Pty) Ltd, L=Midrand, ST=Gauteng, C=ZA"
Use this newly generated keystore in the configserver.xml. The server.xml in the Tomcat config directory points to the keystore to be used.
Run the command below to export the certificate, which will be sent to the Integration Partner Company (file IntPartnr.cer):
"C:\Program Files\Southern X Integrators\jre\bin\Keytool.exe" -export -alias selfsigned -file IntPartnr.cer -keystore tempks.jks
Restart the Apache TomCat service.
Then go to webservice.MYDOMAIN.co.za on an internet browser on the server where Tomcat is installed. You should get an error that the cert is not trusted. Import the Cert into the Trusted Root Certification Authorities store on that server. The reason for this is that Self-signed certificates by default gives this error and first has to be trusted.
Reconnect again to the above URL in the browser - It should now show that certificate is trusted.
For Tomcat follow any of these links -
X-ServiceBroker uses a local java keystore to store certificates it uses for it's connectors and their SSL connections, this is located in the file X-ServiceBroker/resource/sxi.jks. The Keystore is protected with a password of "The default SXI animal password"
Typically one would want to add new certificates to this keystore as new connectors are used or URL's changed, to do this, one would use the java Keytool utility, located in the java/bin directory.
The certificates:
For a new connector, you would typically be given 2 certficates (sometimes 3). These would be:
The private certificate - this is the main certificate with the full URL and details
Intermediate certificate (wont always have this one) - Links the root and private certificate
Root certificate - issued by the certificate authority
Installing the certificates into the keysyore:
Copy the keystore file (sxi.jks) to the java/bin directory (purely to make relative paths and filenames easier)
Then run the following commands:
keytool -import -alias root -keystore sxi.jks -trustcacerts -file nameOfRootCerFile.cer
keytool -import -alias inter -keystore sxi.jks -trustcacerts -file nameOfIntermediateCertificateFile.cer (If such certificate is given)
keytool -import -alias private -keystore sxi.jks -file nameOfPrivateCertficateFile.cer
The alias is just the name of the certificate in the keystore, this can be anything as long as it is unique and doesn't conflict with an existing certificate
When prompted for a password, use "The default SXI animal password"
After the following the above steps, the certificates should be imported into the keystore and ready for use, all that's left is to copy the keystore back to X-ServiceBroker/resource/ and restart the X-ServiceBroker
Inventory collection tools provide Serial numbers for entities they discover. Occasionally these serial numbers are invalid and need to be actioned as they can result in duplicates on the CMDB. The REGEX to use to determine these invalid Serial Numbers is as follows:
^w+-1234567890$|^0123456789ABCDE$|^$|serial|^none$|^null$|^MUSTEK6376$|^MST6376$|^HMUFT$|^ESL$|^n/a$|^0+$|^na$|^FVSd$|^FVSdd$|^FVS$|^*+$|^1111TEST1111$|^1234567890$|^123456789$|^12345678$|^1234567$|^123456$|^12345$|^1234$|^123$|^12$|^1$|^0123456789$|^0123456789$|^012345678$|^01234567$|^0123456$|^012345$|^01234$|^0123$|^012$|^01$|^a$|^b$|^c$|^d$|^e$|^f$|^g$|^h$|^i$|^j$|^k$|^l$|^m$|^n$|^o$|^p$|^q$|^r$|^s$|^t$|^u$|^v$|^w$|^x$|^y$|^z$|12345|^OLKG74A18SI550$|^\';OLKG74A18SI550$|^23A0703$|TO BE FILLED BY|WHAT THE|FIC-0987654321ABCDEFGHIJ|REPLAB1|ŸŸŸŸŸ
There are 2 types of requests that can be sent to a SOAP Web Service.
Simple requests.
Complex requests.
A simple request is defined such, as all the data passed for the operation is passed as a child element of the operation in question. For example:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://bin/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns0:processDoc>
<documentData>This is the data</documentData>
<messageParameters>ClientName</messageParameters>
<messageParameters>ACME</messageParameters>
</ns0:processDoc>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
In the example above the operation (method) being called by the request is <ns0:processDoc>. All the attributes passed to the the processDoc, that is <documentData>, and the <messageParameters> are children of the <ns0:processDoc> element. In this case you would configure X-ServiceBroker to construct the request in the same way as you would do for any other connector by using an XLayer DataDefinition node.
A complex request requires the data to be passed to the operation as further dependants, i.e. children, grandchildren, great grandchildren etc. For example:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns0="http://bin/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns0:processDoc>
<documentData>
<Lines>
<Line1>This is line 1</Line1>
<Line2>This is line 2</Line2>
<Line3>This is line 3</Line3>
<Line4>This is line 4</Line4>
</Lines>
</documentData>
<messageParameters>ClientName</messageParameters>
<messageParameters>ACME</messageParameters>
</ns0:processDoc>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
In the example above the operation (method) being called by the request is <ns0:processDoc>. But unlike the simple request described earlier not all the attributes passed are children of the <ns0:processDoc> element and we have some grandchildren i.e. <Line1>, <Line2>, <line3>, and <Line4>. In some extreme cases the envelop required by the SOAP Web Service you are consuming may even require different name spaces, so in these instances we certainly would not be in a position to simply configure the request using the normal Xlayer DataDefinition.
How would we configure X-ServiceBroker to generate a complex request as illustrated above?