- public static final boolean producesDeclared(StmtContext<?, ?, ?> ctx,
- Class<? extends DeclaredStatement<?>> type) {
- return type.isAssignableFrom(ctx.getPublicDefinition()
- .getDeclaredRepresentationClass());
+ public static boolean producesDeclared(final StmtContext<?, ?, ?> ctx,
+ final Class<? extends DeclaredStatement<?>> type) {
+ return type.isAssignableFrom(ctx.getPublicDefinition().getDeclaredRepresentationClass());
+ }
+
+ public static boolean isInExtensionBody(final StmtContext<?,?,?> stmtCtx) {
+ StmtContext<?,?,?> current = stmtCtx;
+ while (!current.getParentContext().isRootContext()) {
+ current = current.getParentContext();
+ if (producesDeclared(current, UnknownStatementImpl.class)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static boolean isUnknownStatement(final StmtContext<?, ?, ?> stmtCtx) {
+ return producesDeclared(stmtCtx, UnknownStatementImpl.class);
+ }
+
+ public static Collection<SchemaNodeIdentifier> replaceModuleQNameForKey(
+ final StmtContext<Collection<SchemaNodeIdentifier>, KeyStatement, ?> keyStmtCtx,
+ final QNameModule newQNameModule) {
+
+ final Builder<SchemaNodeIdentifier> builder = ImmutableSet.builder();
+ boolean replaced = false;
+ for (SchemaNodeIdentifier arg : keyStmtCtx.getStatementArgument()) {
+ final QName qname = arg.getLastComponent();
+ if (!newQNameModule.equals(qname)) {
+ final QName newQname = keyStmtCtx.getFromNamespace(QNameCacheNamespace.class,
+ QName.create(newQNameModule, qname.getLocalName()));
+ builder.add(SchemaNodeIdentifier.create(false, newQname));
+ replaced = true;
+ } else {
+ builder.add(arg);
+ }
+ }
+
+ // This makes sure we reuse the collection when a grouping is instantiated in the same module
+ return replaced ? builder.build() : keyStmtCtx.getStatementArgument();