boolean valid = true;
if (expression.hasStateFieldPathExpression()) {
// Retrieve the state field path expression
StateFieldPathExpression pathExpression = getStateFieldPathExpression(expression.getStateFieldPathExpression());
if ((pathExpression != null) &&
(pathExpression.hasIdentificationVariable() ||
pathExpression.hasVirtualIdentificationVariable())) {
// Start traversing the path expression by first retrieving the managed type
Object managedType = helper.getManagedType(pathExpression.getIdentificationVariable());
if (managedType != null) {
// Continue to traverse the path expression
for (int index = pathExpression.hasVirtualIdentificationVariable() ? 0 : 1, count = pathExpression.pathSize(); index < count; index++) {
// Retrieve the mapping
String path = pathExpression.getPath(index);
Object mapping = helper.getMappingNamed(managedType, path);
// Not resolvable
if (mapping == null) {
addProblem(pathExpression, UpdateItem_NotResolvable, pathExpression.toParsedText());
valid = false;
break;
}
// A collection mapping cannot be traversed or a value cannot be assigned to it
else if (helper.isCollectionMapping(mapping)) {
addProblem(pathExpression, UpdateItem_RelationshipPathExpression);
valid = false;
break;
}
// Validate an intermediate path (n + 1, ..., n - 2)
else if (index + 1 < count) {
// A relationship mapping cannot be traversed
if (helper.isRelationshipMapping(mapping)) {
addProblem(pathExpression, UpdateItem_RelationshipPathExpression);
valid = false;
break;
}
// A basic mapping cannot be traversed
else if (helper.isPropertyMapping(mapping)) {
addProblem(pathExpression, UpdateItem_RelationshipPathExpression);
valid = false;
break;
}
// Retrieve the embeddable mapping's reference managed type
else {
managedType = helper.getReferenceManagedType(mapping);
if (managedType == null) {
addProblem(pathExpression, UpdateItem_NotResolvable, pathExpression.toParsedText());
valid = false;
break;
}
}
}
}
}
else {
addProblem(pathExpression, UpdateItem_NotResolvable, pathExpression.toParsedText());
valid = false;
}
}
else {
addProblem(pathExpression, UpdateItem_NotResolvable, expression.getStateFieldPathExpression().toParsedText());