public ResolvedModuleRevision getDependency()

in src/java/org/apache/ivy/plugins/resolver/BasicResolver.java [183:340]


    public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
            throws ParseException {
        IvyContext context = IvyContext.pushNewCopyContext();
        try {
            ResolvedModuleRevision mr = data.getCurrentResolvedModuleRevision();
            if (mr != null && shouldReturnResolvedModule(dd, mr)) {
                return mr;
            }

            if (isForce()) {
                dd = dd.clone(ModuleRevisionId.newInstance(dd.getDependencyRevisionId(),
                    "latest.integration"));
            }
            DependencyDescriptor systemDd = dd;
            DependencyDescriptor nsDd = fromSystem(dd);
            context.setDependencyDescriptor(systemDd);
            context.setResolveData(data);

            clearIvyAttempts();
            clearArtifactAttempts();
            ModuleRevisionId systemMrid = systemDd.getDependencyRevisionId();
            ModuleRevisionId nsMrid = nsDd.getDependencyRevisionId();

            checkRevision(systemMrid);

            boolean isDynamic = getAndCheckIsDynamic(systemMrid);

            // we first search for the dependency in cache
            ResolvedModuleRevision rmr = findModuleInCache(systemDd, data);
            if (rmr != null) {
                if (rmr.getDescriptor().isDefault() && rmr.getResolver() != this) {
                    Message.verbose("\t" + getName() + ": found revision in cache: " + systemMrid
                            + " (resolved by " + rmr.getResolver().getName()
                            + "): but it's a default one, maybe we can find a better one");
                } else if (isForce() && rmr.getResolver() != this) {
                    Message.verbose("\t" + getName() + ": found revision in cache: " + systemMrid
                            + " (resolved by " + rmr.getResolver().getName()
                            + "): but we are in force mode, let's try to find one ourselves");
                } else {
                    Message.verbose("\t" + getName() + ": revision in cache: " + systemMrid);
                    return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data);
                }
            }
            if (data.getOptions().isUseCacheOnly()) {
                throw new UnresolvedDependencyException("\t" + getName()
                        + " (useCacheOnly) : no ivy file found for " + systemMrid, false);
            }

            checkInterrupted();

            ResolvedResource ivyRef = findIvyFileRef(nsDd, data);
            checkInterrupted();

            // get module descriptor
            ModuleDescriptor nsMd;
            ModuleDescriptor systemMd = null;
            if (ivyRef == null) {
                if (!isAllownomd()) {
                    throw new UnresolvedDependencyException("\t" + getName()
                            + ": no ivy file found for " + systemMrid, false);
                }

                nsMd = DefaultModuleDescriptor.newDefaultInstance(nsMrid,
                    nsDd.getAllDependencyArtifacts());

                ModuleDescriptor md = dd.getModuleDescriptor();
                if (md != null) {
                    Map<String, String> extraAttributesNamespaces = md.getExtraAttributesNamespaces();
                    for (Map.Entry<String, String> entry : extraAttributesNamespaces.entrySet()) {
                      ((DefaultModuleDescriptor) nsMd).addExtraAttributeNamespace(entry.getKey(), entry.getValue());
                    }
                }

                ResolvedResource artifactRef = findFirstArtifactRef(nsMd, nsDd, data);
                checkInterrupted();

                if (artifactRef == null) {
                    throw new UnresolvedDependencyException("\t" + getName()
                            + ": no ivy file nor artifact found for " + systemMrid, false);
                }

                long lastModified = artifactRef.getLastModified();
                if (lastModified != 0 && nsMd instanceof DefaultModuleDescriptor) {
                    ((DefaultModuleDescriptor) nsMd).setLastModified(lastModified);
                }
                Message.verbose("\t" + getName() + ": no ivy file found for " + systemMrid
                        + ": using default data");
                if (isDynamic) {
                    nsMd.setResolvedModuleRevisionId(ModuleRevisionId.newInstance(nsMrid,
                        artifactRef.getRevision()));
                }
                systemMd = toSystem(nsMd);
                MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport(
                        systemMd.getMetadataArtifact());
                madr.setDownloadStatus(DownloadStatus.NO);
                madr.setSearched(true);
                rmr = new ResolvedModuleRevision(this, this, systemMd, madr, isForce());
                getRepositoryCacheManager().cacheModuleDescriptor(this, artifactRef,
                    toSystem(dd), systemMd.getAllArtifacts()[0], null, getCacheOptions(data));
            } else {
                if (ivyRef instanceof MDResolvedResource) {
                    rmr = ((MDResolvedResource) ivyRef).getResolvedModuleRevision();
                }
                if (rmr == null) {
                    rmr = parse(ivyRef, systemDd, data);
                    if (rmr == null) {
                        throw new UnresolvedDependencyException();
                    }
                }
                if (!rmr.getReport().isDownloaded() && rmr.getReport().getLocalFile() != null) {
                    return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data);
                }
                nsMd = rmr.getDescriptor();

                // check descriptor data is in sync with resource revision and names
                systemMd = toSystem(nsMd);
                if (isCheckconsistency()) {
                    checkDescriptorConsistency(systemMrid, systemMd, ivyRef);
                    checkDescriptorConsistency(nsMrid, nsMd, ivyRef);
                } else {
                    if (systemMd instanceof DefaultModuleDescriptor) {
                        DefaultModuleDescriptor defaultMd = (DefaultModuleDescriptor) systemMd;
                        ModuleRevisionId revision = getRevision(ivyRef, systemMrid, systemMd);
                        defaultMd.setModuleRevisionId(revision);
                        defaultMd.setResolvedModuleRevisionId(revision);
                    } else {
                        Message.warn(
                            "consistency disabled with instance of non DefaultModuleDescriptor... module info can't be updated, so consistency check will be done");
                        checkDescriptorConsistency(nsMrid, nsMd, ivyRef);
                        checkDescriptorConsistency(systemMrid, systemMd, ivyRef);
                    }
                }
                rmr = new ResolvedModuleRevision(this, this, systemMd,
                        toSystem(rmr.getReport()), isForce());
            }

            resolveAndCheckRevision(systemMd, systemMrid, ivyRef, isDynamic);
            resolveAndCheckPublicationDate(systemDd, systemMd, systemMrid, data);
            checkNotConvertedExclusionRule(systemMd, ivyRef, data);

            if (ivyRef == null || ivyRef.getResource() != null) {
                cacheModuleDescriptor(systemMd, systemMrid, ivyRef, rmr);
            }

            return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data);
        } catch (UnresolvedDependencyException ex) {
            if (!ex.getMessage().isEmpty()) {
                if (ex.isError()) {
                    Message.error(ex.getMessage());
                } else {
                    Message.verbose(ex.getMessage());
                }
            }
            return data.getCurrentResolvedModuleRevision();
        } finally {
            IvyContext.popContext();
        }
    }