UPDATE! The community will be go into read-only on April 19, 8am Pacific in preparation for migration on April 21. Read more.
UPDATE! The community will be go into read-only on April 19, 8am Pacific in preparation for migration on April 21.Read more.
Absent Member.
Absent Member.
1608 views

SOAP driver - call subscriber channel XSLT from publisher

Hello,

I am in the following situation:

I have an object in eDir. The object does not have an association on the SOAP driver and therefore it becomes an add event. For the system i am integrating to, this means that i have to call the IMPORT SOAP endpoint. But, if the object actually already does exist in the connected system, I get a SOAP response on the publisher channel telling me this. Now, in an ideal world, all objects that have an association on the driver, should exist in the system. But we all know objects are deleted unintentionally or other things go wrong. So, I think that i will get into situations where the object exists in the system, but IDM thinks it doesnt.

When the object has an assoaciation, it will become a modify, and I call the MODIFY SOAP endpoint.

So my questions is, when i get an answer back on the publisher channel, telling me that the object could not be imported, because it aleady exists, is there any way for me to call the subscriber channel XSLT stylesheet, or an actual template on the subscriber channel, from the publisher channel?

I know that i can give the object an association from the publisher channel, when i get the message, but that wont trigger a sync/modify, so that it will perform a modify afterwards.

I know that i could write some attribute to the object, that another driver could trigger on, which then again sets an attriute tha the SOAP driver will trigger on. That is just so cumbersome and not very pretty.

Any ideas?

Thanks in advance,

Jacob.
Labels (1)
0 Likes
19 Replies
Knowledge Partner Knowledge Partner
Knowledge Partner

On 7/18/2018 4:34 AM, jacmarpet wrote:
>
> Hello,
>
> I am in the following situation:
>
> I have an object in eDir. The object does not have an association on the
> SOAP driver and therefore it becomes an add event. For the system i am
> integrating to, this means that i have to call the IMPORT SOAP endpoint.
> But, if the object actually already does exist in the connected system,
> I get a SOAP response on the publisher channel telling me this. Now, in
> an ideal world, all objects that have an association on the driver,
> should exist in the system. But we all know objects are deleted
> unintentionally or other things go wrong. So, I think that i will get
> into situations where the object exists in the system, but IDM thinks it
> doesnt.
>
> When the object has an assoaciation, it will become a modify, and I call
> the MODIFY SOAP endpoint.
>
> So my questions is, when i get an answer back on the publisher channel,
> telling me that the object could not be imported, because it aleady
> exists, is there any way for me to call the subscriber channel XSLT
> stylesheet, or an actual template on the subscriber channel, from the
> publisher channel?
>
> I know that i can give the object an association from the publisher
> channel, when i get the message, but that wont trigger a sync/modify, so
> that it will perform a modify afterwards.
>
> I know that i could write some attribute to the object, that another
> driver could trigger on, which then again sets an attriute tha the SOAP
> driver will trigger on. That is just so cumbersome and not very pretty.


So first, if no assoc, you get a synthetic add, so do you try a match
and fail? If not, you should try to match first.

0 Likes
Absent Member.
Absent Member.

Hmm, but matching on a SOAP driver. I would get the response on the publisher channel and would have to initiate a MODIFY on the subscriber channel.

Unless there is something that I am completely misunderstanding.
0 Likes
Knowledge Partner Knowledge Partner
Knowledge Partner

On 7/18/2018 9:24 AM, jacmarpet wrote:
>
> Hmm, but matching on a SOAP driver. I would get the response on the
> publisher channel and would have to initiate a MODIFY on the subscriber
> channel.
>
> Unless there is something that I am completely misunderstanding.


When I did my first SOAP driver, the thing I realized was that once you
implement Query in SOAP so much of the shim suddenly starts to work.

Suddenly pretty much everything else works, right up to the final
Add/Modify events being sent to SOAP.

So, make sure you get Query working and a way to match first.


0 Likes
Knowledge Partner Knowledge Partner
Knowledge Partner

jacmarpet;2484233 wrote:
Hello,

I am in the following situation:

I have an object in eDir. The object does not have an association on the SOAP driver and therefore it becomes an add event. For the system i am integrating to, this means that i have to call the IMPORT SOAP endpoint. But, if the object actually already does exist in the connected system, I get a SOAP response on the publisher channel telling me this. Now, in an ideal world, all objects that have an association on the driver, should exist in the system. But we all know objects are deleted unintentionally or other things go wrong. So, I think that i will get into situations where the object exists in the system, but IDM thinks it doesnt.

When the object has an assoaciation, it will become a modify, and I call the MODIFY SOAP endpoint.

So my questions is, when i get an answer back on the publisher channel, telling me that the object could not be imported, because it aleady exists, is there any way for me to call the subscriber channel XSLT stylesheet, or an actual template on the subscriber channel, from the publisher channel?

I know that i can give the object an association from the publisher channel, when i get the message, but that wont trigger a sync/modify, so that it will perform a modify afterwards.

I know that i could write some attribute to the object, that another driver could trigger on, which then again sets an attriute tha the SOAP driver will trigger on. That is just so cumbersome and not very pretty.

Any ideas?

Thanks in advance,

Jacob.


Post a level 3 trace of this. I don't think it'll show what you think it shows.

The error from the application will be processed through the Input Transform, but that's not the Publisher channel. It should be possible to catch it, process it, and Do The Right Thing.
0 Likes
Absent Member.
Absent Member.

dgersic;2484297 wrote:
Post a level 3 trace of this. I don't think it'll show what you think it shows.

The error from the application will be processed through the Input Transform, but that's not the Publisher channel. It should be possible to catch it, process it, and Do The Right Thing.


Ah okay. Here is a trace. It would make sense if it is like that, that would enable me to capture the specific query response in a stylesheet on the subscriber channel and not match it on the publisher.

https://pastebin.com/cAFfFmgU
0 Likes
Knowledge Partner Knowledge Partner
Knowledge Partner

On 7/19/2018 6:24 AM, jacmarpet wrote:
>
> dgersic;2484297 Wrote:
>> Post a level 3 trace of this. I don't think it'll show what you think it
>> shows.
>>
>> The error from the application will be processed through the Input
>> Transform, but that's not the Publisher channel. It should be possible
>> to catch it, process it, and Do The Right Thing.

>
> Ah okay. Here is a trace. It would make sense if it is like that, that
> would enable me to capture the specific query response in a stylesheet
> on the subscriber channel and not match it on the publisher.
>
> https://pastebin.com/cAFfFmgU


You match policy is empty. You might consider adding one.

Your Stylesheet does Op-data wrong and puts 4 or 5 copies in.

Your response Stylesheet does not turn the returned document into a
valid <status> doc.

But none of those really matter.

0 Likes
Absent Member.
Absent Member.

geoffc;2484369 wrote:
On 7/19/2018 6:24 AM, jacmarpet wrote:
>
> dgersic;2484297 Wrote:
>> Post a level 3 trace of this. I don't think it'll show what you think it
>> shows.
>>
>> The error from the application will be processed through the Input
>> Transform, but that's not the Publisher channel. It should be possible
>> to catch it, process it, and Do The Right Thing.

>
> Ah okay. Here is a trace. It would make sense if it is like that, that
> would enable me to capture the specific query response in a stylesheet
> on the subscriber channel and not match it on the publisher.
>
> https://pastebin.com/cAFfFmgU


You match policy is empty. You might consider adding one.

Your Stylesheet does Op-data wrong and puts 4 or 5 copies in.

Your response Stylesheet does not turn the returned document into a
valid <status> doc.

But none of those really matter.


Thank you for the valid input! I will have a look at adding proper matching functionality, i think it is possible. THe op-data i havent touch yet (taken over development from someone else). I didn't know about the status doc.

Thanks!

Still getting better at making SOAP drivers 🙂
0 Likes
Knowledge Partner Knowledge Partner
Knowledge Partner

jacmarpet;2484347 wrote:
Ah okay. Here is a trace. It would make sense if it is like that, that would enable me to capture the specific query response in a stylesheet on the subscriber channel and not match it on the publisher.

https://pastebin.com/cAFfFmgU


If this service you're talking to supports queries, make a subscriber matching policy that works, and your problem goes away.

For catching the error response, notice here:


[07/19/18 12:13:19.643]:SOAP-STSORG01 ST:SOAP-STSORG01: Response Doc


it's on the subscriber thread (ST:) not the publisher. Then the Input Transform is applied:


[07/19/18 12:13:19.758]:SOAP-STSORG01 ST:Applying input transformation policies.


I can't read the doc itself, but this looks like the part you'd need to detect:


<ns4:StatusKode>49</ns4:StatusKode>
<ns4:FejlbeskedTekst>Forretningsobjekt har livscyklus som ikke tillader importer</ns4:FejlbeskedTekst>


then decide what to do about. The op-data looks like you have enough things to work with to do whatever you might need, though getting at the various bits of it with XPath may take a few trials to get right.
0 Likes
Absent Member.
Absent Member.

It does support queries, so i will go that way. And you are completely correct about the response doc coming in on the subscriber channel. Cool! And you are correct about that being the message to capture 🙂

I will have a look at it!

Thank you!
0 Likes
Absent Member.
Absent Member.

Hmm it might just be me not being very good at this, but I can't for the love of god match the response of my query on the subscriber channel.

I got the query working, and I get the response, as you usually do. I then try to match it, the same way i match my responses on the publisher channel, it is just not matched.

When i match a response, for example from an add event, i do the following:

1. I have the first XSLT stylesheet on the publisher, like so:


<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet exclude-result-prefixes="query cmd dncv soap-env" version="1.0" xmlns:cmd="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.XdsCommandProcessor" xmlns:dncv="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.DNConverter" xmlns:query="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.XdsQueryProcessor" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- parameters passed in from the Identity Manager engine -->
<xsl:param name="srcQueryProcessor"/>
<xsl:param name="destQueryProcessor"/>
<xsl:param name="srcCommandProcessor"/>
<xsl:param name="destCommandProcessor"/>
<xsl:param name="dnConverter"/>
<xsl:param name="fromNds"/>
<!-- This is for testing the stylesheet outside of Identity Manager so things are pretty to look at -->
<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="value component password check-password"/>
<xsl:output indent="yes" method="xml"/>
<!-- *********************** -->
<!-- Strip off SOAP header -->
<!-- *********************** -->
<xsl:template match="soap-env:Envelope">
<xsl:message>Input: Strip SOAP Headers</xsl:message>
<!-- ignore this element but process all children -->
<xsl:apply-templates select="soap-env:Body/*"/>
<xsl:apply-templates select="operation-data"/>
</xsl:template>
<!-- identity transformation template -->
<!-- in the absence of any other templates this will cause -->
<!-- the stylesheet to copy the input through unchanged to the output -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


All it does is match soap-env:Envelope and remove it, so that i only have the body element.

Then my second stylesheet that just has a match on the response:


<xsl:template match="ns20:ImporterResponse">


This works like a charm, and i also got associations working.

Now, what i want to do is attempt to match, on the subscriber of course, on the matching policy, like so:


<rule>
<description>Match on STSGUID</description>
<conditions>
<and>
<if-src-dn op="in-subtree">~idv.dit.data.depts~</if-src-dn>
</and>
</conditions>
<actions>
<do-find-matching-object scope="entry">
<arg-dn>
<token-unmatched-src-dn/>
</arg-dn>
<arg-match-attr name="STSGUID"/>
</do-find-matching-object>
</actions>
</rule>


And the stylesheet:


<xsl:template match="query[@class-name='OrganisationEnhed']">


And that works and the query is performed and I get my response back:


[07/24/18 14:21:36.035]:SOAP-STSORG01 ST: SOAP-STSORG01: Response code and message: 200 OK
[07/24/18 14:21:36.036]:SOAP-STSORG01 ST: SOAP-STSORG01: Response Doc
[07/24/18 14:21:36.037]:SOAP-STSORG01 ST:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<RequestHeader xmlns="http://kombit.dk/xml/schemas/RequestHeader/1/" xmlns:ns10="urn:oio:sts:organisation:1.1.2.0" xmlns:ns11="urn:oio:sts:organisation:organi
sation:1.1.2.0" xmlns:ns12="urn:oio:sts:organisation:itsystem:1.1.2.0" xmlns:ns13="urn:oio:sts:organisation:organisationfunktion:1.1.2.0" xmlns:ns14="urn:oio:sts:
organisation:bruger:1.1.2.0" xmlns:ns15="urn:oio:sts:organisation:myndighed:1.1.2.0" xmlns:ns16="urn:oio:sts:organisation:virksomhed:1.1.2.0" xmlns:ns17="urn:oio:
sts:organisation:organisationsystem:1.1.2.0" xmlns:ns18="http://serviceplatformen.dk/xml/schemas/ServiceplatformFault/1/" xmlns:ns19="urn:oio:sts:part:1.1.2.0" xm
lns:ns2="http://serviceplatformen.dk/xml/schemas/CallContext/1/" xmlns:ns20="http://serviceplatformen.dk/xml/wsdl/soap11/Organisation/OrganisationEnhed/4/" xmlns:
ns3="http://serviceplatformen.dk/xml/schemas/AuthorityContext/1/" xmlns:ns4="urn:oio:sagdok:3.0.0" xmlns:ns5="urn:oio:sts:organisation:organisationenhed:1.1.2.0"
xmlns:ns6="urn:oio:sts:organisation:adresse:1.1.2.0" xmlns:ns7="urn:oio:sts:1.1.2.0" xmlns:ns8="urn:oio:sts:organisation:person:1.1.2.0" xmlns:ns9="urn:oio:sts:or
ganisation:interessefaellesskab:1.1.2.0">
<TransactionUUID>0e8c5244-a121-42b0-a5ff-4f669421903f</TransactionUUID>
</RequestHeader>
</soap:Header>
<soap:Body>
<ns20:LaesResponse xmlns="http://kombit.dk/xml/schemas/RequestHeader/1/" xmlns:ns10="urn:oio:sts:organisation:1.1.2.0" xmlns:ns11="urn:oio:sts:organisation:or
ganisation:1.1.2.0" xmlns:ns12="urn:oio:sts:organisation:itsystem:1.1.2.0" xmlns:ns13="urn:oio:sts:organisation:organisationfunktion:1.1.2.0" xmlns:ns14="urn:oio:
sts:organisation:bruger:1.1.2.0" xmlns:ns15="urn:oio:sts:organisation:myndighed:1.1.2.0" xmlns:ns16="urn:oio:sts:organisation:virksomhed:1.1.2.0" xmlns:ns17="urn:
oio:sts:organisation:organisationsystem:1.1.2.0" xmlns:ns18="http://serviceplatformen.dk/xml/schemas/ServiceplatformFault/1/" xmlns:ns19="urn:oio:sts:part:1.1.2.0
" xmlns:ns2="http://serviceplatformen.dk/xml/schemas/CallContext/1/" xmlns:ns20="http://serviceplatformen.dk/xml/wsdl/soap11/Organisation/OrganisationEnhed/4/" xm
lns:ns3="http://serviceplatformen.dk/xml/schemas/AuthorityContext/1/" xmlns:ns4="urn:oio:sagdok:3.0.0" xmlns:ns5="urn:oio:sts:organisation:organisationenhed:1.1.2
.0" xmlns:ns6="urn:oio:sts:organisation:adresse:1.1.2.0" xmlns:ns7="urn:oio:sts:1.1.2.0" xmlns:ns8="urn:oio:sts:organisation:person:1.1.2.0" xmlns:ns9="urn:oio:st
s:organisation:interessefaellesskab:1.1.2.0">
<ns5:LaesOutput>
<ns4:StandardRetur>
<ns4:StatusKode>20</ns4:StatusKode>
<ns4:FejlbeskedTekst>OK</ns4:FejlbeskedTekst>
...


And this document is what i would like to match, on subscriber.

I have tried:

<xsl:template match="soap:Envelope">

or

<xsl:template match="soapenv:Envelope">

or

<xsl:template match="soap-env:Envelope">

And even a match on everything:

<xsl:template match="/*">

The last one that matches everything, catches everything going out, exept that single response of the query.

I am confused 😕
0 Likes
Knowledge Partner Knowledge Partner
Knowledge Partner

jacmarpet;2484595 wrote:
Hmm it might just be me not being very good at this, but I can't for the love of god match the response of my query on the subscriber channel.

I got the query working, and I get the response, as you usually do. I then try to match it, the same way i match my responses on the publisher channel, it is just not matched.

When i match a response, for example from an add event, i do the following:

1. I have the first XSLT stylesheet on the publisher, like so:


<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet exclude-result-prefixes="query cmd dncv soap-env" version="1.0" xmlns:cmd="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.XdsCommandProcessor" xmlns:dncv="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.DNConverter" xmlns:query="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.XdsQueryProcessor" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- parameters passed in from the Identity Manager engine -->
<xsl:param name="srcQueryProcessor"/>
<xsl:param name="destQueryProcessor"/>
<xsl:param name="srcCommandProcessor"/>
<xsl:param name="destCommandProcessor"/>
<xsl:param name="dnConverter"/>
<xsl:param name="fromNds"/>
<!-- This is for testing the stylesheet outside of Identity Manager so things are pretty to look at -->
<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="value component password check-password"/>
<xsl:output indent="yes" method="xml"/>
<!-- *********************** -->
<!-- Strip off SOAP header -->
<!-- *********************** -->
<xsl:template match="soap-env:Envelope">
<xsl:message>Input: Strip SOAP Headers</xsl:message>
<!-- ignore this element but process all children -->
<xsl:apply-templates select="soap-env:Body/*"/>
<xsl:apply-templates select="operation-data"/>
</xsl:template>
<!-- identity transformation template -->
<!-- in the absence of any other templates this will cause -->
<!-- the stylesheet to copy the input through unchanged to the output -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


All it does is match soap-env:Envelope and remove it, so that i only have the body element.

Then my second stylesheet that just has a match on the response:


<xsl:template match="ns20:ImporterResponse">


This works like a charm, and i also got associations working.

Now, what i want to do is attempt to match, on the subscriber of course, on the matching policy, like so:


<rule>
<description>Match on STSGUID</description>
<conditions>
<and>
<if-src-dn op="in-subtree">~idv.dit.data.depts~</if-src-dn>
</and>
</conditions>
<actions>
<do-find-matching-object scope="entry">
<arg-dn>
<token-unmatched-src-dn/>
</arg-dn>
<arg-match-attr name="STSGUID"/>
</do-find-matching-object>
</actions>
</rule>


And the stylesheet:


<xsl:template match="query[@class-name='OrganisationEnhed']">


And that works and the query is performed and I get my response back:


[07/24/18 14:21:36.035]:SOAP-STSORG01 ST: SOAP-STSORG01: Response code and message: 200 OK
[07/24/18 14:21:36.036]:SOAP-STSORG01 ST: SOAP-STSORG01: Response Doc
[07/24/18 14:21:36.037]:SOAP-STSORG01 ST:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<RequestHeader xmlns="http://kombit.dk/xml/schemas/RequestHeader/1/" xmlns:ns10="urn:oio:sts:organisation:1.1.2.0" xmlns:ns11="urn:oio:sts:organisation:organi
sation:1.1.2.0" xmlns:ns12="urn:oio:sts:organisation:itsystem:1.1.2.0" xmlns:ns13="urn:oio:sts:organisation:organisationfunktion:1.1.2.0" xmlns:ns14="urn:oio:sts:
organisation:bruger:1.1.2.0" xmlns:ns15="urn:oio:sts:organisation:myndighed:1.1.2.0" xmlns:ns16="urn:oio:sts:organisation:virksomhed:1.1.2.0" xmlns:ns17="urn:oio:
sts:organisation:organisationsystem:1.1.2.0" xmlns:ns18="http://serviceplatformen.dk/xml/schemas/ServiceplatformFault/1/" xmlns:ns19="urn:oio:sts:part:1.1.2.0" xm
lns:ns2="http://serviceplatformen.dk/xml/schemas/CallContext/1/" xmlns:ns20="http://serviceplatformen.dk/xml/wsdl/soap11/Organisation/OrganisationEnhed/4/" xmlns:
ns3="http://serviceplatformen.dk/xml/schemas/AuthorityContext/1/" xmlns:ns4="urn:oio:sagdok:3.0.0" xmlns:ns5="urn:oio:sts:organisation:organisationenhed:1.1.2.0"
xmlns:ns6="urn:oio:sts:organisation:adresse:1.1.2.0" xmlns:ns7="urn:oio:sts:1.1.2.0" xmlns:ns8="urn:oio:sts:organisation:person:1.1.2.0" xmlns:ns9="urn:oio:sts:or
ganisation:interessefaellesskab:1.1.2.0">
<TransactionUUID>0e8c5244-a121-42b0-a5ff-4f669421903f</TransactionUUID>
</RequestHeader>
</soap:Header>
<soap:Body>
<ns20:LaesResponse xmlns="http://kombit.dk/xml/schemas/RequestHeader/1/" xmlns:ns10="urn:oio:sts:organisation:1.1.2.0" xmlns:ns11="urn:oio:sts:organisation:or
ganisation:1.1.2.0" xmlns:ns12="urn:oio:sts:organisation:itsystem:1.1.2.0" xmlns:ns13="urn:oio:sts:organisation:organisationfunktion:1.1.2.0" xmlns:ns14="urn:oio:
sts:organisation:bruger:1.1.2.0" xmlns:ns15="urn:oio:sts:organisation:myndighed:1.1.2.0" xmlns:ns16="urn:oio:sts:organisation:virksomhed:1.1.2.0" xmlns:ns17="urn:
oio:sts:organisation:organisationsystem:1.1.2.0" xmlns:ns18="http://serviceplatformen.dk/xml/schemas/ServiceplatformFault/1/" xmlns:ns19="urn:oio:sts:part:1.1.2.0
" xmlns:ns2="http://serviceplatformen.dk/xml/schemas/CallContext/1/" xmlns:ns20="http://serviceplatformen.dk/xml/wsdl/soap11/Organisation/OrganisationEnhed/4/" xm
lns:ns3="http://serviceplatformen.dk/xml/schemas/AuthorityContext/1/" xmlns:ns4="urn:oio:sagdok:3.0.0" xmlns:ns5="urn:oio:sts:organisation:organisationenhed:1.1.2
.0" xmlns:ns6="urn:oio:sts:organisation:adresse:1.1.2.0" xmlns:ns7="urn:oio:sts:1.1.2.0" xmlns:ns8="urn:oio:sts:organisation:person:1.1.2.0" xmlns:ns9="urn:oio:st
s:organisation:interessefaellesskab:1.1.2.0">
<ns5:LaesOutput>
<ns4:StandardRetur>
<ns4:StatusKode>20</ns4:StatusKode>
<ns4:FejlbeskedTekst>OK</ns4:FejlbeskedTekst>
...


And this document is what i would like to match, on subscriber.

I have tried:

<xsl:template match="soap:Envelope">

or

<xsl:template match="soapenv:Envelope">

or

<xsl:template match="soap-env:Envelope">

And even a match on everything:

<xsl:template match="/*">

The last one that matches everything, catches everything going out, exept that single response of the query.

I am confused 😕


Level 3 trace of the whole query / response so we can see it?
0 Likes
The opinions expressed above are the personal opinions of the authors, not of Micro Focus. By using this site, you accept the Terms of Use and Rules of Participation. Certain versions of content ("Material") accessible here may contain branding from Hewlett-Packard Company (now HP Inc.) and Hewlett Packard Enterprise Company. As of September 1, 2017, the Material is now offered by Micro Focus, a separately owned and operated company. Any reference to the HP and Hewlett Packard Enterprise/HPE marks is historical in nature, and the HP and Hewlett Packard Enterprise/HPE marks are the property of their respective owners.