+
+ public static QName qnameFromArgument(StmtContext<?, ?, ?> ctx, final String value) {
+ if (Strings.isNullOrEmpty(value)) {
+ return ctx.getPublicDefinition().getStatementName();
+ }
+
+ String prefix;
+ QNameModule qNameModule = null;
+ String localName = null;
+
+ final String[] namesParts = value.split(":");
+ switch (namesParts.length) {
+ case 1:
+ localName = namesParts[0];
+ qNameModule = StmtContextUtils.getRootModuleQName(ctx);
+ break;
+ default:
+ prefix = namesParts[0];
+ localName = namesParts[1];
+ qNameModule = StmtContextUtils.getModuleQNameByPrefix(ctx, prefix);
+ // in case of unknown statement argument, we're not going to parse it
+ if (qNameModule == null
+ && ctx.getPublicDefinition().getDeclaredRepresentationClass()
+ .isAssignableFrom(UnknownStatementImpl.class)) {
+ localName = value;
+ qNameModule = StmtContextUtils.getRootModuleQName(ctx);
+ }
+ if (qNameModule == null
+ && ctx.getCopyHistory().getLastOperation() == CopyType.ADDED_BY_AUGMENTATION) {
+ ctx = ctx.getOriginalCtx();
+ qNameModule = StmtContextUtils.getModuleQNameByPrefix(ctx, prefix);
+ }
+ break;
+ }
+
+ qNameModule = InferenceException.throwIfNull(qNameModule, ctx.getStatementSourceReference(),
+ "Cannot resolve QNameModule for '%s'", value);
+
+ final QNameModule resultQNameModule;
+ if (qNameModule.getRevision() == null) {
+ resultQNameModule = QNameModule.create(qNameModule.getNamespace(), SimpleDateFormatUtil.DEFAULT_DATE_REV)
+ .intern();
+ } else {
+ resultQNameModule = qNameModule;
+ }
+
+ return ctx.getFromNamespace(QNameCacheNamespace.class, QName.create(resultQNameModule, localName));
+ }
+
+ public static QNameModule getRootModuleQName(final StmtContext<?, ?, ?> ctx) {
+ if (ctx == null) {
+ return null;
+ }
+
+ final StmtContext<?, ?, ?> rootCtx = ctx.getRoot();
+ final QNameModule qNameModule;
+
+ if (producesDeclared(rootCtx, ModuleStatement.class)) {
+ qNameModule = rootCtx.getFromNamespace(ModuleCtxToModuleQName.class, rootCtx);
+ } else if (producesDeclared(rootCtx, SubmoduleStatement.class)) {
+ final String belongsToModuleName = firstAttributeOf(rootCtx.declaredSubstatements(),
+ BelongsToStatement.class);
+ qNameModule = rootCtx.getFromNamespace(ModuleNameToModuleQName.class, belongsToModuleName);
+ } else {
+ qNameModule = null;
+ }
+
+ Preconditions.checkArgument(qNameModule != null, "Failed to look up root QNameModule for %s", ctx);
+ if (qNameModule.getRevision() != null) {
+ return qNameModule;
+ }
+
+ return QNameModule.create(qNameModule.getNamespace(), SimpleDateFormatUtil.DEFAULT_DATE_REV).intern();
+ }
+
+ public static QNameModule getModuleQNameByPrefix(final StmtContext<?, ?, ?> ctx, final String prefix) {
+ final ModuleIdentifier modId = ctx.getRoot().getFromNamespace(ImpPrefixToModuleIdentifier.class, prefix);
+ final QNameModule qNameModule = ctx.getFromNamespace(ModuleIdentifierToModuleQName.class, modId);
+
+ if (qNameModule == null && producesDeclared(ctx.getRoot(), SubmoduleStatement.class)) {
+ final String moduleName = ctx.getRoot().getFromNamespace(BelongsToPrefixToModuleName.class, prefix);
+ return ctx.getFromNamespace(ModuleNameToModuleQName.class, moduleName);
+ }
+ return qNameModule;
+ }
+
+ public static SourceIdentifier createSourceIdentifier(final StmtContext<?, ?, ?> root) {
+ final QNameModule qNameModule = root.getFromNamespace(ModuleCtxToModuleQName.class, root);
+ if (qNameModule != null) {
+ // creates SourceIdentifier for a module
+ return RevisionSourceIdentifier.create((String) root.getStatementArgument(),
+ qNameModule.getFormattedRevision());
+ }
+
+ // creates SourceIdentifier for a submodule
+ final Date revision = Optional.ofNullable(getLatestRevision(root.declaredSubstatements()))
+ .orElse(SimpleDateFormatUtil.DEFAULT_DATE_REV);
+ final String formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(revision);
+ return RevisionSourceIdentifier.create((String) root.getStatementArgument(), formattedRevision);
+ }
+
+ public static Date getLatestRevision(final Iterable<? extends StmtContext<?, ?, ?>> subStmts) {
+ Date revision = null;
+ for (final StmtContext<?, ?, ?> subStmt : subStmts) {
+ if (subStmt.getPublicDefinition().getDeclaredRepresentationClass().isAssignableFrom(RevisionStatement
+ .class)) {
+ if (revision == null && subStmt.getStatementArgument() != null) {
+ revision = (Date) subStmt.getStatementArgument();
+ } else if (subStmt.getStatementArgument() != null && ((Date) subStmt.getStatementArgument()).compareTo
+ (revision) > 0) {
+ revision = (Date) subStmt.getStatementArgument();
+ }
+ }
+ }
+ return revision;
+ }
+
+ public static boolean isUnknownNode(final StmtContext<?, ?, ?> stmtCtx) {
+ return stmtCtx != null && stmtCtx.getPublicDefinition().getDeclaredRepresentationClass()
+ .isAssignableFrom(UnknownStatementImpl.class);
+ }