package gw.quoting.impl
uses gw.api.database.Query
uses gw.api.locale.DisplayKey
uses gw.beantransfer.BeanExportHandler
uses gw.beantransfer.BeanImportHandler
uses gw.beantransfer.BeanTransferUtil
uses gw.beantransfer.impl.BeanImportGraph
uses gw.entity.IEntityType
uses gw.api.quoting.QuoteDataManagerException
uses org.w3c.dom.Document
/**
* This handler will do the bookkeeping needed to archive a {@link User} reference and be able to locate the referenced
* entity in a different system.
*
* The handler will use the following properties to uniquely key an {@link User} across the systems:
* - User.UserName
*/
@Export
class UserHandler implements BeanExportHandler, BeanImportHandler {
var _additionalInfoDoc : Document
public static final var NS : String = ArchiveXmlQuoteConverter.GW_QUOTE_SIDECAR_NS_PREFIX
construct(additionalInfoDoc : Document) {
_additionalInfoDoc = additionalInfoDoc
}
/**
* Generates a sidecar element for User references.
*
* The sidecar is of the following format:
*
* userName="{userName}" userID="{userPublicID}"
*
*/
override function handlePostExport(graph : BeanImportGraph) {
//prepare the document by adding a "User" element
var root = _additionalInfoDoc.getDocumentElement()
var userHandlerElement = _additionalInfoDoc.createElement("UserHandler")
root.appendChild(userHandlerElement)
//for each user in the graph, do a query on ID and get the user
var elements = graph.getAssignableElementsForType(User)
var users = Query.make(User).compareIn("PublicID", elements*.PublicId).select()
users.each(\userInSystem -> {
var userPublicId = userInSystem.PublicID
var userName = userInSystem.Credential.UserName
//add User Element using UserName as the unique identifier
var userElement = _additionalInfoDoc.createElement("userInSystem")
userHandlerElement.appendChild(userElement)
userElement.setAttribute("userName", userName)
userElement.setAttribute("userID", userPublicId)
})
}
override function findEntityById(entityType : IEntityType, publicId : String) : KeyableBean {
if (BeanTransferUtil.isSourceTypeAssignable(User.Type, entityType)) {
if (_additionalInfoDoc.getDocumentElement() != null) {
var locatedUser = getLocatedUserEntity(publicId)
return locatedUser
} else {
throw new QuoteDataManagerException(DisplayKey.get("Quoting.Handler.CannotLocateAdditionalInfo"))
}
}
return null
}
private function getLocatedUserEntity(publicId: String) : KeyableBean {
var userNameInDoc : String
var locatedUser : User
//Only one UserHandlerElement
var criteriaNode = createCriteriaNode(_additionalInfoDoc, ArchiveXmlQuoteConverter.createGWNamespaceContext(),
"/${NS}:AdditionalEntity/${NS}:UserHandler")
var nodeList = criteriaNode.ChildNodes
for (var i in 0..|nodeList.Length) {
var node = nodeList.item(i)
if (node.NodeName == "userInSystem" and node.Attributes.getNamedItem("userID").TextContent == publicId) {
userNameInDoc = node.Attributes.getNamedItem("userName").TextContent
}
}
if (userNameInDoc != null) {
//in order to locate the same user, we use username which is an unique identifier of User
locatedUser = Query.make(User).join("Credential", Credential, "ID")
.compare(Credential#UserName, Equals, userNameInDoc)
.select().AtMostOneRow
}
return locatedUser
}
}