+ final SomeModifiersUnresolvedException buildFailure = addSourceExceptions(sourcesToProgress);
+ if (buildFailure != null) {
+ throw buildFailure;
+ }
+ }
+ }
+
+ private Set<SourceSpecificContext> getRequiredSourcesFromLib() {
+ Preconditions.checkState(currentPhase == ModelProcessingPhase.SOURCE_PRE_LINKAGE,
+ "Required library sources can be collected only in ModelProcessingPhase.SOURCE_PRE_LINKAGE phase,"
+ + " but current phase was %s", currentPhase);
+ final TreeBasedTable<String, Date, SourceSpecificContext> libSourcesTable = TreeBasedTable.create();
+ for (final SourceSpecificContext libSource : libSources) {
+ final ModuleIdentifier libSourceIdentifier = Preconditions.checkNotNull(libSource.getRootIdentifier());
+ libSourcesTable.put(libSourceIdentifier.getName(), libSourceIdentifier.getRevision(), libSource);
+ }
+
+ final Set<SourceSpecificContext> requiredLibs = new HashSet<>();
+ for (final SourceSpecificContext source : sources) {
+ collectRequiredSourcesFromLib(libSourcesTable, requiredLibs, source);
+ removeConflictingLibSources(source, requiredLibs);
+ }
+ return requiredLibs;
+ }
+
+ private void collectRequiredSourcesFromLib(
+ final TreeBasedTable<String, Date, SourceSpecificContext> libSourcesTable,
+ final Set<SourceSpecificContext> requiredLibs, final SourceSpecificContext source) {
+ final Collection<ModuleIdentifier> requiredModules = source.getRequiredModules();
+ for (final ModuleIdentifier requiredModule : requiredModules) {
+ final SourceSpecificContext libSource = getRequiredLibSource(requiredModule, libSourcesTable);
+ if (libSource != null && requiredLibs.add(libSource)) {
+ collectRequiredSourcesFromLib(libSourcesTable, requiredLibs, libSource);
+ }
+ }
+ }
+
+ private static SourceSpecificContext getRequiredLibSource(final ModuleIdentifier requiredModule,
+ final TreeBasedTable<String, Date, SourceSpecificContext> libSourcesTable) {
+ return requiredModule.getRevision() == SimpleDateFormatUtil.DEFAULT_DATE_IMP
+ || requiredModule.getRevision() == SimpleDateFormatUtil.DEFAULT_BELONGS_TO_DATE ? getLatestRevision(
+ libSourcesTable.row(requiredModule.getName())) : libSourcesTable.get(requiredModule.getName(),
+ requiredModule.getRevision());
+ }
+
+ private static SourceSpecificContext getLatestRevision(final SortedMap<Date, SourceSpecificContext> sourceMap) {
+ return sourceMap != null && !sourceMap.isEmpty() ? sourceMap.get(sourceMap.lastKey()) : null;
+ }
+
+ // removes required library sources which would cause namespace/name conflict with one of the main sources
+ // later in the parsing process. this can happen if we add a parent module or a submodule as a main source
+ // and the same parent module or submodule is added as one of the library sources.
+ // such situation may occur when using the yang-system-test artifact - if a parent module/submodule is specified
+ // as its argument and the same dir is specified as one of the library dirs through -p option).
+ private static void removeConflictingLibSources(final SourceSpecificContext source,
+ final Set<SourceSpecificContext> requiredLibs) {
+ final Iterator<SourceSpecificContext> requiredLibsIter = requiredLibs.iterator();
+ while (requiredLibsIter.hasNext()) {
+ final SourceSpecificContext currentReqSource = requiredLibsIter.next();
+ if (source.getRootIdentifier().equals(currentReqSource.getRootIdentifier())) {
+ requiredLibsIter.remove();
+ }