public void checkNode( final SNode node, LanguageErrorsComponent component, final IOperationContext operationContext, IScope scope) { if (operationContext == null) { return; } if (SNodeUtil.getMetaLevel(node) != 0) { return; } SNode concept = SNodeOperations.getConceptDeclaration(node); for (SReference ref : SNodeOperations.getReferences(node)) { SNode target = SLinkOperations.getTargetNode(ref); SNode ld = SLinkOperations.findLinkDeclaration(ref); // don't check unresolved and broken references, they should already have an error message if ((target == null) || ld == null) { continue; } component.addDependency(target); component.addDependency(ld); component.addDependency(node); component.addDependency(SNodeOperations.getParent(node)); for (SNode c : SNodeOperations.getChildren(node)) { component.addDependency(c); } String linkRole = SModelUtil.getGenuineLinkRole(ld); final SNode linkTarget = SLinkOperations.getTarget(ld, "target", false); final INodeReferentSearchScopeProvider scopeProvider = ModelConstraintsUtil.getSearchScopeProvider(concept, linkRole); SearchScopeStatus searchScopeStatus = component.runCheckingAction( new _FunctionTypes._return_P0_E0<SearchScopeStatus>() { public SearchScopeStatus invoke() { return ModelConstraintsUtil.createSearchScope( scopeProvider, SNodeOperations.getModel(node), SNodeOperations.getParent(node), node, linkTarget, operationContext); } }); if (searchScopeStatus.isError()) { component.addError( node, searchScopeStatus.getMessage(), (SNode) null, new ReferenceMessageTarget(SLinkOperations.getRole(ref))); } else if (!(searchScopeStatus.isDefault() || searchScopeStatus.getSearchScope().isInScope(target))) { String name = target.getName(); component.addError( node, "reference" + ((name == null ? "" : " " + name)) + " (" + SLinkOperations.getRole(ref) + ") is out of search scope", searchScopeStatus.getReferenceValidatorNode(), new ReferenceMessageTarget(SLinkOperations.getRole(ref))); } } }
private static List<INodeSubstituteAction> createSmartReferenceActions( final SNode smartConcept, final SNode smartReference, final SNode parentNode, final SNode currentChild, final IChildNodeSetter childSetter, final IOperationContext context) { if (parentNode == null) { return null; } // try to create referent-search-scope SNode linkDeclaration = null; int index = 0; if (currentChild != null) { linkDeclaration = currentChild.getRoleLink(); index = parentNode.getChildren(currentChild.getRoleInParent()).indexOf(currentChild); } // TODO generate wrapping setter to have access to original link // if(childSetter instanceof WrappingSetter) { // childSetter = ((WrappingSetter)childSetter).unwrap(); // } if (linkDeclaration == null && childSetter instanceof DefaultChildNodeSetter) { linkDeclaration = ((DefaultChildNodeSetter) childSetter).getLinkDeclaration(); } // TODO restore (when wrapping setter is created) // if (linkDeclaration == null) { // return null; // } ReferenceDescriptor refDescriptor = ModelConstraintsUtil.getSmartReferenceDescriptor( parentNode, linkDeclaration == null ? null : SModelUtil.getLinkDeclarationRole(linkDeclaration), index, smartConcept); if (refDescriptor == null) return null; Scope searchScope = refDescriptor.getScope(); if (searchScope == null) return null; // create smart actions final String targetConcept = NameUtil.nodeFQName(SModelUtil.getLinkDeclarationTarget(smartReference)); List<INodeSubstituteAction> actions = new ArrayList<INodeSubstituteAction>(); IReferencePresentation presentation = refDescriptor.getReferencePresentation(); Iterable<SNode> referentNodes = searchScope.getAvailableElements(null); for (SNode referentNode : referentNodes) { if (referentNode == null || !referentNode .getConcept() .isSubConceptOf(SConceptRepository.getInstance().getConcept(targetConcept))) continue; actions.add( new SmartRefChildNodeSubstituteAction( referentNode, parentNode, currentChild, childSetter, context.getScope(), smartConcept, smartReference, presentation)); } return actions; }