- public static SchemaPath getSchemaPath(final StmtContext<?, ?, ?> ctx) {
-
- if (ctx == null) {
- return null;
- }
-
- final Iterator<StmtContext<?, ?, ?>> iteratorFromRoot = ctx.getStmtContextsFromRoot().iterator();
- // skip root argument
- if (iteratorFromRoot.hasNext()) {
- iteratorFromRoot.next();
- }
-
- List<QName> qNamesFromRoot = new LinkedList<>();
- while (iteratorFromRoot.hasNext()) {
- StmtContext<?, ?, ?> nextStmtCtx = iteratorFromRoot.next();
- Object nextStmtArgument = nextStmtCtx.getStatementArgument();
- if (nextStmtArgument instanceof QName) {
- QName qname = (QName) nextStmtArgument;
- if (StmtContextUtils.producesDeclared(nextStmtCtx, UsesStatement.class)) {
- continue;
- }
- if (StmtContextUtils.producesDeclared(nextStmtCtx.getParentContext(), ChoiceStatement.class)
- && isSupportedAsShorthandCase(nextStmtCtx)) {
- qNamesFromRoot.add(qname);
- }
- qNamesFromRoot.add(qname);
- } else if (nextStmtArgument instanceof String) {
- // FIXME: This may yield illegal argument exceptions
- StatementContextBase<?, ?, ?> originalCtx = ctx
- .getOriginalCtx();
- final QName qName = (originalCtx != null) ? qNameFromArgument(
- originalCtx, (String) nextStmtArgument)
- : qNameFromArgument(ctx, (String) nextStmtArgument);
- qNamesFromRoot.add(qName);
- } else if ((StmtContextUtils.producesDeclared(nextStmtCtx, AugmentStatement.class)
- || StmtContextUtils.producesDeclared(nextStmtCtx, RefineStatement.class))
- && nextStmtArgument instanceof SchemaNodeIdentifier) {
- addQNamesFromSchemaNodeIdentifierToList(qNamesFromRoot, (SchemaNodeIdentifier) nextStmtArgument);
- } else if (isUnknownNode(nextStmtCtx)) {
- qNamesFromRoot.add(nextStmtCtx.getPublicDefinition().getStatementName());
- } else {
- return SchemaPath.SAME;
- }
- }
-
- final SchemaPath schemaPath = SchemaPath.create(qNamesFromRoot, true);
- return schemaPath;
- }
-