How to detect renames via CMIS ChangeLog in Alfresco? - alfresco

CMIS ChangeLog
I am using the ChangeLog feature of the CMIS standard to keep track of what is changing on my Alfresco server.
For instance, when I create newfile.txt the ChangeLog token (value of <cmis:latestChangeLogToken>) changes from 1713 to 1735.
Problem
When I rename newfile.txt to myfile.txt, the ChangeLog token does not change.
Question
Is there a way to make Alfresco bump the ChangeLog token whenever a rename happens?
Here is my current tomcat/shared/classes/alfresco-global.properties:
audit.enabled=true
audit.alfresco-access.enabled=true
audit.alfresco-access.sub-actions.enabled=true
audit.cmischangelog.enabled=true
audit.cmischangelog.sub-actions.enabled=true

To achieve this, you have to modify Alfresco's audit configuration file which is responsible for generating CMIS ChangeLog events. This file is alfresco-audit-cmis.xml and it can be found inside the alfresco-repository-5.2.g.jar (version number may vary) which itself is inside alfresco.war's WEB-INF/lib folder.
You have to add a PathMap and an AuditPath to that file, as described below:
<PathMap source="/alfresco-api/post/FileFolderService/rename"
target="/CMISChangeLog/UPDATED" />
... in <PathMappings>, and
<AuditPath key="fileFolderRef">
<RecordValue key="value" dataExtractor="simpleValue" />
</AuditPath>
... in the <AuditPath key="args"> of <AuditPath key="UPDATED">.
At the bottom of this answer I pasted the whole modified alfresco-audit-cmis.xml for Alfresco Community 5.2.0 201707 as an example, please note that your base file might differ, so better apply the modifications to your Alfresco's own alfresco-audit-cmis.xml.
In order to deploy that file so that it actually gets used by Alfresco, please follow the instructions at: https://stackoverflow.com/a/48221347/226958
Example:
<?xml version="1.0" encoding="UTF-8"?>
<Audit xmlns="http://www.alfresco.org/repo/audit/model/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.alfresco.org/repo/audit/model/3.2 alfresco-audit-3.2.xsd">
<DataExtractors>
<DataExtractor name="simpleValue" registeredName="auditModel.extractor.simpleValue"/>
<DataExtractor name="nullValue" registeredName="auditModel.extractor.nullValue"/>
<DataExtractor name="changeLog" registeredName="CMISChangeLogDataExtractor"/>
</DataExtractors>
<PathMappings>
<PathMap source="/CMISChangeLog" target="/CMISChangeLog" />
<PathMap source="/alfresco-api/post/FileFolderService/create" target="/CMISChangeLog/CREATED" />
<PathMap source="/alfresco-api/post/NodeService/createNode" target="/CMISChangeLog/CREATED" />
<PathMap source="/alfresco-api/post/NodeService/setProperties" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-api/post/NodeService/addProperties" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-api/post/NodeService/setProperty" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-api/post/NodeService/removeProperty" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-node/beforeDeleteNode" target="/CMISChangeLog/DELETED" />
<PathMap source="/alfresco-api/post/PermissionService/setPermission" target="/CMISChangeLog/SECURITY" />
<PathMap source="/alfresco-api/post/PermissionService/setInheritParentPermissions" target="/CMISChangeLog/SECURITY" />
<PathMap source="/alfresco-api/post/PermissionService/clearPermission" target="/CMISChangeLog/SECURITY" />
<PathMap source="/alfresco-api/post/PermissionService/deletePermission" target="/CMISChangeLog/SECURITY" />
<PathMap source="/alfresco-api/post/NodeService/moveNode" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-api/post/FileFolderService/moveFrom" target="/CMISChangeLog/UPDATED" />
<PathMap source="/alfresco-api/post/FileFolderService/rename" target="/CMISChangeLog/UPDATED" />
</PathMappings>
<Application name="CMISChangeLog" key="CMISChangeLog">
<AuditPath key="CREATED">
<AuditPath key="result">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
<AuditPath key="error">
<RecordValue key="value" dataExtractor="nullValue" />
</AuditPath>
</AuditPath>
<AuditPath key="UPDATED">
<AuditPath key="args">
<AuditPath key="nodeRef">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
<AuditPath key="nodeToMoveRef">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
<AuditPath key="sourceNodeRef">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
<AuditPath key="fileFolderRef">
<RecordValue key="value" dataExtractor="simpleValue" />
</AuditPath>
</AuditPath>
<AuditPath key="error">
<RecordValue key="value" dataExtractor="nullValue" />
</AuditPath>
</AuditPath>
<AuditPath key="DELETED">
<AuditPath key="node">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
</AuditPath>
<AuditPath key="SECURITY">
<AuditPath key="args">
<AuditPath key="nodeRef">
<RecordValue key="value" dataExtractor="changeLog" />
</AuditPath>
</AuditPath>
<AuditPath key="error">
<RecordValue key="value" dataExtractor="nullValue" />
</AuditPath>
</AuditPath>
</Application>
</Audit>
This "solution" is very inconvenient and might not be complete, so if you know any better method please post a new answer, thanks a lot! :-)

Related

status="NotProcessed" for EnhancedAirBookRQ API

Can anyone help me in this regard, checking with Sabre Soap API's for booking flow. I am getting the failure in EnhancedAirBookRQ response.
I am getting the below response :
<ApplicationResults status="NotProcessed" xmlns="http://services.sabre.com/STL_Payload/v02_01">
<Error type="BusinessLogic" timeStamp="2018-10-01T05:38:45.063-05:00">
<SystemSpecificResults>
<Message code="ERR.SWS.HOST.ERROR_IN_RESPONSE">*NO FARES/RBD/CARRIER</Message>
<Message code="146">*NO FARES/RBD/CARRIER</Message>
</SystemSpecificResults>
</Error>
</ApplicationResults>
Request:
<v3:EnhancedAirBookRQ version="3.2.0" HaltOnError="true" IgnoreOnError="true">
<v3:OTA_AirBookRQ>
<v3:OriginDestinationInformation>
<v3:FlightSegment ArrivalDateTime="2018-11-11T07:38:00" DepartureDateTime="2018-11-11T06:31:00" FlightNumber="6384" NumberInParty="1" ResBookDesigCode="K" Status="NN">
<v3:DestinationLocation LocationCode="BOS" />
<v3:Equipment AirEquipType="E90" />
<v3:MarketingAirline Code="TP" FlightNumber="6384" />
<v3:MarriageGrp Ind="false" />
<v3:OperatingAirline Code="B6" />
<v3:OriginLocation LocationCode="JFK" />
</v3:FlightSegment>
<v3:FlightSegment ArrivalDateTime="2018-11-12T06:00:00" DepartureDateTime="2018-11-11T18:40:00" FlightNumber="218" NumberInParty="1" ResBookDesigCode="K" Status="NN">
<v3:DestinationLocation LocationCode="LIS" />
<v3:Equipment AirEquipType="332" />
<v3:MarketingAirline Code="TP" FlightNumber="218" />
<v3:MarriageGrp Ind="true" />
<v3:OperatingAirline Code="TP" />
<v3:OriginLocation LocationCode="BOS" />
</v3:FlightSegment>
<v3:FlightSegment ArrivalDateTime="2018-11-12T12:20:00" DepartureDateTime="2018-11-12T08:40:00" FlightNumber="6791" NumberInParty="1" ResBookDesigCode="K" Status="NN">
<v3:DestinationLocation LocationCode="LUX" />
<v3:Equipment AirEquipType="73H" />
<v3:MarketingAirline Code="TP" FlightNumber="6791" />
<v3:MarriageGrp Ind="true" />
<v3:OperatingAirline Code="LG" />
<v3:OriginLocation LocationCode="LIS" />
</v3:FlightSegment>
<v3:FlightSegment ArrivalDateTime="2018-11-15T12:25:00" DepartureDateTime="2018-11-15T10:55:00" FlightNumber="3761" NumberInParty="1" ResBookDesigCode="X" Status="NN">
<v3:DestinationLocation LocationCode="OPO" />
<v3:Equipment AirEquipType="73W" />
<v3:MarketingAirline Code="LG" FlightNumber="3761" />
<v3:MarriageGrp Ind="false" />
<v3:OperatingAirline Code="LG" />
<v3:OriginLocation LocationCode="LUX" />
</v3:FlightSegment>
<v3:FlightSegment ArrivalDateTime="2018-11-15T15:30:00" DepartureDateTime="2018-11-15T14:30:00" FlightNumber="1947" NumberInParty="1" ResBookDesigCode="W" Status="NN">
<v3:DestinationLocation LocationCode="LIS" />
<v3:Equipment AirEquipType="AT7" />
<v3:MarketingAirline Code="TP" FlightNumber="1947" />
<v3:MarriageGrp Ind="false" />
<v3:OperatingAirline Code="WI" />
<v3:OriginLocation LocationCode="OPO" />
</v3:FlightSegment>
<v3:FlightSegment ArrivalDateTime="2018-11-15T20:00:00" DepartureDateTime="2018-11-15T17:00:00" FlightNumber="209" NumberInParty="1" ResBookDesigCode="W" Status="NN">
<v3:DestinationLocation LocationCode="JFK" />
<v3:Equipment AirEquipType="332" />
<v3:MarketingAirline Code="TP" FlightNumber="209" />
<v3:MarriageGrp Ind="true" />
<v3:OperatingAirline Code="TP" />
<v3:OriginLocation LocationCode="LIS" />
</v3:FlightSegment>
</v3:OriginDestinationInformation>
</v3:OTA_AirBookRQ>
<v3:OTA_AirPriceRQ>
<!--v3:PriceComparison /-->
<v3:PriceRequestInformation Retain="true">
<v3:OptionalQualifiers>
<v3:PricingQualifiers>
<v3:PassengerType Code="ADT" Quantity="1" />
</v3:PricingQualifiers>
</v3:OptionalQualifiers>
</v3:PriceRequestInformation>
</v3:OTA_AirPriceRQ>
<v3:PostProcessing IgnoreAfter="false" />
<v3:PreProcessing IgnoreBefore="false" />
</v3:EnhancedAirBookRQ>
Checking this test step in soap ui project given by Sabre on their developer portal. Before this, checked for test-steps for create session and low fare search for flights.
Can anyone tell any way to resolve on this. Thanks for any help.
EnhancedAirBookRQ flight details are not correct. Please verify or use search API again to fetch correct details

BargainFinderMaxRQ Alternate Days Response No Availability Error

I am trying to get results from BargainFinderMaxRQ for Alternate Days, like in plus 3 days or minus 3 days. It always shows No Availability error in response. By the way, the simple request works perfectly. Please, can anyone help?
API Request:
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
</SOAP-ENV:Header><SOAP-ENV:Body><OTA_AirLowFareSearchRQ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Target="Production" Version="4.2.0" ResponseType="OTA" ResponseVersion="4.2.0">
<POS>
<Source PseudoCityCode="8YXD">
<RequestorID ID="1" Type="1">
<CompanyName Code="TN" />
</RequestorID>
</Source>
</POS>
<OriginDestinationInformation RPH="1">
<DepartureDateTime>2018-08-23T00:00:00</DepartureDateTime>
<OriginLocation LocationCode="DXB" />
<DestinationLocation LocationCode="KHI" />
<TPA_Extensions>
<DateFlexibility NbrOfDays="2"/>
<SegmentType Code="O" />
</TPA_Extensions>
</OriginDestinationInformation>
<OriginDestinationInformation RPH="2">
<DepartureDateTime>2018-08-30T00:00:00</DepartureDateTime>
<OriginLocation LocationCode="KHI" />
<DestinationLocation LocationCode="DXB" />
<TPA_Extensions>
<DateFlexibility NbrOfDays="2"/>
<SegmentType Code="O" />
</TPA_Extensions>
</OriginDestinationInformation>
<TravelPreferences ValidInterlineTicket="true" MaxStopsQuantity="0">
<CabinPref PreferLevel="Preferred" Cabin="Y" />
<TPA_Extensions>
<TripType Value="Return" />
<LongConnectTime Min="780" Max="1200" Enable="true"/>
<ExcludeCallDirectCarriers Enabled="true"/>
</TPA_Extensions>
</TravelPreferences>
<TravelerInfoSummary>
<SeatsRequested>1</SeatsRequested>
<AirTravelerAvail>
<PassengerTypeQuantity Code="ADT" Quantity="1" />
</AirTravelerAvail>
<PriceRequestInformation CurrencyCode="PKR" >
<TPA_Extensions>
</TPA_Extensions>
</PriceRequestInformation>
</TravelerInfoSummary>
<TPA_Extensions>
<IntelliSellTransaction Debug="0">
<RequestType Name="ALTDATES"/>
</IntelliSellTransaction>
</TPA_Extensions>
</OTA_AirLowFareSearchRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
This needs to be activated by the account manager as Thomas mentioned.
PLEASE MAKE THREE CHANGES AND IT WILL WORK PERFECTLY
1) SET ACTION NAME AS BargainFinderMax_ADRQ
<eb:Service eb:type="OTA">BargainFinderMax_ADRQ</eb:Service>
<eb:Action>BargainFinderMax_ADRQ</eb:Action>
2) SET NUMBER OF DAYS FOR FLEXIBILITY
<DateFlexibility NbrOfDays="1"/> OR
<DateFlexibility NbrOfDays="3"/> OR
<DateFlexibility NbrOfDays="7"/>
3) SET REQUEST TYPE NAME
<RequestType Name="AD1"/> OR
<RequestType Name="AD3"/> OR
<RequestType Name="AD7"/>

Mule - test an http get request with choice component

I have the following flow :
<flow name="SOAPWebService" doc:name="SOAPWebService">
<http:inbound-endpoint address="http://localhost:8088/esb/" exchange-pattern="request-response" doc:name="HTTP">
</http:inbound-endpoint>
<choice doc:name="Choice">
<when expression="#[payload.contains('c22')]">
<set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
<set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
<component class="com.example.components.SampleComponent" doc:name="Java"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLPort.xsl" doc:name="XSLT">
<mulexml:context-property key="paramCtr" value="#[flowVars['paramCtr']]"/>
<mulexml:context-property key="paramC" value="#[flowVars['paramC']]"/>
</mulexml:xslt-transformer>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/port" doc:name="PortWS"/>
</when>
<otherwise>
<set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
<set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
<component class="com.example.components.SampleComponent" doc:name="Java"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLDouane.xsl" doc:name="XSLT">
<mulexml:context-property key="paramCtr" value="#[flowVars['paramCtr']]"/>
<mulexml:context-property key="paramC" value="#[flowVars['paramC']]"/>
</mulexml:xslt-transformer>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/douane" doc:name="DouaneWS"/>
</otherwise>
</choice>
<byte-array-to-string-transformer doc:name="Byte Array to String" />
<file:outbound-endpoint path="C:\MuleStudio\SandBox\output" outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].xml " responseTimeout="10000" doc:name="Outgoing File"/>
I want to test if an http request like http://localhost:8088/esb/?type=xxxx&id=1234 if it contains the String xxxx in a way to route the request to the desired web service proxy.
I've tried withe the expression expression="#[string.contains['xxxxx']]" but it does not seem to work.
any idea?
thank you.
Two things: You will need to replace "string" with the property you want to execute on. Either a message property or payload etc. i.e #[payload.contains...].
"contains" is a Java method on java.lang.String so you need to use standard Java method invocation with () instead of [].
Working example:
<choice doc:name="Choice">
<when expression="#[payload.contains('xxxx')]">
<logger level="ERROR" message="YES" />
</when>
<otherwise>
<logger level="ERROR" message="NO" />
</otherwise>
</choice>
Or directly work off inbound properties for your query params:
After your http inbound use set-variable to store your query params into flow variables.
And then use the flow variales in your expression.
<set-variable value="#[message.inboundProperties['id']]" variableName="paramId"></set-variable>
<set-variable value="#[message.inboundProperties['type']]" variableName="paramType"></set-variable>
or you can directly use inbound property for comparision.
<when expression="#[message.inboundProperties['type']== 'XXXX']">

Mule - choice component issue

When I run my flow, I get the following error `
<org.apache.cxf.staxutils.DepthXMLStreamReader>
<reader class="org.mule.module.cxf.support.StreamClosingInterceptor$1">
<reader class="com.ctc.wstx.sr.ValidatingStreamReader">
<mXml11>false</mXml11>
<mInputBuffer>xmlns:ns2="http://wsdouane/"><return><douanePK><idConteneurId>ctr1</idConteneurId><idCritereId>C11</idCritereId></douanePK><valeurId>oui</valeurId></return></ns2:findResponse></S:Body></S:Envelope>.................
we can see the correct soap response starting from the <mInputBuffer>, is there a way to get only the soap response??
here is my flow
<flow name="SOAPWebService" doc:name="SOAPWebService">
<http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:8088/esb" doc:name="HTTP"/>
<object-to-string-transformer doc:name="Object to String"/>
<choice doc:name="Choice">
<when expression="#[payload.contains('C22')]">
<set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
<set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
<component class="com.example.components.SampleComponent" doc:name="Java"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLPort.xsl" doc:name="XSLT">
<mulexml:context-property key="paramCtr" value="#[flowVars['paramCtr']]" />
<mulexml:context-property key="paramC" value="#[flowVars['paramC']]" />
</mulexml:xslt-transformer>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/port" doc:name="PortWS"/>
<byte-array-to-string-transformer doc:name="Byte Array to String" />
</when>
<otherwise>
<set-variable variableName="paramCtr" value="#[message.inboundProperties['ctr']]" doc:name="conteneur"/>
<set-variable variableName="paramC" value="#[message.inboundProperties['c']]" doc:name="critere"/>
<component class="com.example.components.SampleComponent" doc:name="Java"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="C:\MuleStudio\SandBox\resources\PrepareRequestXMLDouane.xsl" doc:name="XSLT">
<mulexml:context-property key="paramCtr" value="#[flowVars['paramCtr']]" />
<mulexml:context-property key="paramC" value="#[flowVars['paramC']]" />
</mulexml:xslt-transformer>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/ClientsDB/douane" doc:name="DouaneWS"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
</otherwise>
</choice>
<xm:object-to-xml-transformer doc:name="Object to XML"/>
<file:outbound-endpoint path="C:\MuleStudio\SandBox\output" outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].xml " responseTimeout="10000" doc:name="Outgoing File"/>
</flow>
thank you.
This expression #[payload.contains('c22')] can't work because the payload is an InputStream. Aren't you seeing stack traces in Mule's logs?
In any case, try adding <object-to-string-transformer /> before the choice and see if it fixes the issue.
EDIT:
The problem is that you're using XStream (in xm:object-to-xml-transformer) to serialize the CXF response object (org.apache.cxf.staxutils.DepthXMLStreamReader) into XML. The CXF response should not be messed with and should be handled by the cxf:proxy-client in the response phase of the flow. The xm:object-to-xml-transformer and file:outbound-endpoint after the choice router are probably disturbing this mechanism. Try to wrap them in a response element above the choice router to they execute after it in the response phase.
Note that I have already given you this advice in your other question https://stackoverflow.com/a/16615537/387927 but you did not react to it.
Also I don't think byte-array-to-string-transformer does anything: the message payload after the http:outbound-endpoints should be org.apache.cxf.staxutils.DepthXMLStreamReader, preventing this transformer to fire.

Styling WPF toolkit datagrid

I hope to find an answer on customizing Datagrid from WPF toolkit 2010. I'd like to add a TITLE area to be above DataGridColumnHeaderPresenter of the datagrid. The problem is that I want it to be as a user control or data template where I can populate the title from XML. I want to have unique titles for multiple datagrids on one page getting data from one XML. I populate few datagrids in the same window. What will be the best solution to add customizable Tile area for a content populated from XML and bounded to each datagrid to avoid dublication?
Thank you in advance. I generate datagrid with columns this way:
<Custom:DataGrid Grid.Column="0" Grid.Row="1" x:Name="ServerList" ItemsSource="{Binding Source={StaticResource PagesData}, XPath=ListTiles/Tile1}">
<Custom:DataGrid.Columns>
<Custom:DataGridTextColumn Header="Name" Binding="{Binding XPath=#Name}" />
<Custom:DataGridTextColumn Header="Status" Binding="{Binding XPath=#Status}" />
<Custom:DataGridTextColumn Header="Events" Binding="{Binding XPath=#Events}" />
<Custom:DataGridTextColumn Header="Services" Binding="{Binding XPath=#Services}" />
</Custom:DataGrid.Columns>
<Custom:DataGrid x:Name="Events" Grid.Column="0" Grid.Row="2" ItemsSource="{Binding Source={StaticResource PagesData}, XPath=ListTiles/Tile2}" >
<Custom:DataGrid.Columns>
<Custom:DataGridTextColumn Header="Name" Binding="{Binding XPath=#Name}" />
<Custom:DataGridTextColumn Header="Level" Binding="{Binding XPath=#Level}" />
<Custom:DataGridTextColumn Header="Source" Binding="{Binding XPath=#Source}" />
<Custom:DataGridTextColumn Header="In last 24h" Binding="{Binding XPath=#TimeSpan}" />
</Custom:DataGrid.Columns>
<Custom:DataGrid x:Name="Services" Grid.Column="2" Grid.Row="2" ItemsSource="{Binding Source={StaticResource PagesData}, XPath=ListTiles/Tile3}">
<Custom:DataGrid.Columns>
<Custom:DataGridTextColumn Header="Name" Binding="{Binding XPath=#Name}" />
<Custom:DataGridTextColumn Header="Status" Binding="{Binding XPath=#Status}" />
<Custom:DataGridTextColumn Header="Start" Binding="{Binding XPath=#Start}" />
</Custom:DataGrid.Columns>
XML:
<?xml version="1.0" encoding="utf-8"?>
<ListTiles xmlns="">
<Tile1>
<Header Title="ROLES & GROUPS" />
<Server Name="Kim" Status="ready" Events="1" Services="1" />
<Server Name="Sherri" Status="past" Events="2" Services="1"/>
<Server Name="Mike" Status="future" Events="3" Services="1" />
</Tile1>
<Tile2>
<Header Title="EVENTS" />
<Server Name="Young" Level="average" Source="home" TimeSpan="5" />
<Server Name="Sarah" Level="Critical" Source="work" TimeSpan="6" />
<Server Name="Susan" Level="normal" Source="friend" TimeSpan="2" />
</Tile2>
<Tile3>
<Header Title="SERVICES" />
<Server Name="Josh" DisplayName="FF" Status="Running" Start="Auto" />
<Server Name="Amy" DisplayName="DD" Status="Rest" Start="Auto" />
<Server Name="Bill" DisplayName="AS" Status="Work" Start="Auto" />
</Tile3>
</ListTiles>

Resources