<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="https://hibernate.atlassian.net" />
<title>Message Title</title>
</head>
<body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<!-- header here -->
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="https://secure.gravatar.com/avatar/df12d7792bd3b7be3a4edf12cabd58cb?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" />
</td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;; color: #3b73af; text-decoration: none">Steve Ebersole</a> <strong>updated</strong> an issue
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="page-title-pattern-first-line " style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 10px"> <a href="https://hibernate.atlassian.net/browse/HHH" style="color: #3b73af; text-decoration: none">Hibernate ORM</a> / <a href="https://hibernate.atlassian.net/browse/HHH-8894" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-static-improvement-e06f295e-0cb6-47aa-be49-65359482431a" height="16" width="16" border="0" align="absmiddle" alt="Improvement" style="vertical-align: text-bottom" /></a> <a href="https://hibernate.atlassian.net/browse/HHH-8894" style="color: #3b73af; text-decoration: none">HHH-8894</a>
</td>
</tr>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-8894" style="color: #3b73af; text-decoration: none">Use an "upgrade" approach to validate and bind (JAXB) mapping XML</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand wrapper-special-margin" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 10px; padding-bottom: 5px">
<table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Change By:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;; color: #3b73af; text-decoration: none">Steve Ebersole</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 5px; padding-bottom: 10px">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0"> <span class="diffcontext">[~edalquist] was kind enough to outline the basic steps needed:<br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">{quote}<br /></span> <span class="diffcontext">So the general idea is to use StAX to read the first element of the XML file, determine the version of the file from that element and then act on it appropriately. We had this PortalDataKey concept that we would parse out of each XML file. From that we'd first go look in a Map<PortalDataKey, DataUpgrader> to see if there was a registered DataUpgrader implementation for that version of the XML file. If there was we would run it on the XML file then repeat the parsing of the first element and looking for another DataUpgrader. Once we didn't find a DataUpgrader we'd look up the DataImporter that was mapped to the PortalDataKey for the current version of the XML and run it on the contents.<br /><br />This is a much more generalized solution as it is was designed to batch parse, update and import potentially millions of XML files across 20+ different schemes from 4+ versions.<br /><br />What the process breaks down to is:<br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">*</span> <span class="diffcontext"> Parse the first bit of the XML document using StAX. StAX is used here as it only reads as much of the XML file as you request and can easily have validation disabled which you want for the first step.<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Set up the Woodstox StAX parser for reading the first element: PortalDataKeyFileProcessor.java#L63<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Read the first element and parse the type and version information from it: PortalDataKeyFileProcessor.java#L104<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> This code uses a bunch of custom StAX utility code that exists in org.jasig.portal.xml primarily to try and avoid ever reading from a file more than absolutely necessary. Not sure you'll need all of this extra logic since you're not parsing thousands or millions of files. You can simply re-create the StAX stream which is much simpler. <br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">*</span> <span class="diffcontext"> Update the XML if needed<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Most updates can be done via XSLT if you're comfortable with it<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Example of an XSLT based updater using StAX: XsltDataUpgrader.java<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Example XSLT files for chained upgrades of an XML file: https://github.com/Jasig/uPortal/tree/master/uportal-war/src/main/resources/org/jasig/portal/io/xml/portlet<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">**</span> <span class="diffcontext"> Example XML files for those XSLTs: https://github.com/Jasig/uPortal/blob/master/uportal-war/src/test/resources/org/jasig/portal/io/xml/portlet/<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">***</span> <span class="diffcontext"> Look at the files whose name starts with test-portlet-1<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">***</span> <span class="diffcontext"> You can see the upgrade path from 26 to 30 to 31 to 32 to 40<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">*</span> <span class="diffcontext"> You now have the XML in the most recent format and do whatever validation you would do on it otherwise.<br /><br /><br />The thing we got a lot of mileage from this process is that as you make changes to the XML file format you only ever have to worry about creating an XSLT to go from the most recent released XML format to the new XML format. It is also easy to write unit tests as weird cases come along to verify the XSLT for each version change is handling things correctly.<br /></span> <span class="diffaddedchars" style="background-color:#ddfade;">{quote}</span> <span class="diffcontext"><br /></span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;">Hope that wall</span> <span class="diffaddedchars" style="background-color:#ddfade;"><br />Some</span> <span class="diffcontext"> of</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"> text helps and feel free to ask more questions as you</span> <span class="diffaddedchars" style="background-color:#ddfade;"> this we already</span> <span class="diffcontext"> have</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"> them</span> <span class="diffaddedchars" style="background-color:#ddfade;"> in place, like the move to StAX and peeking at the version</span> <span class="diffcontext">.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-8894#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-cf91df66-2f79-4071-9819-12f5ee552e5d" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle" /> </a>
</td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/HHH-8894#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
This message was sent by Atlassian JIRA <span id="footer-build-information">(v6.2-OD-07-028#6211-<span title="32bd224034dbc8166466f8ba7a7b93dd06f09b50" data-commit-id="32bd224034dbc8166466f8ba7a7b93dd06f09b50}">sha1:32bd224</span>)</span>
</td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-95217df8-0841-4857-b240-c5f96f8edfd6" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>