Class: MiniAether::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/mini_aether/resolver.rb

Constant Summary collapse

RepositorySystem =
Java::OrgSonatypeAether::RepositorySystem
MavenRepositorySystemSession =
Java::OrgApacheMavenRepositoryInternal::MavenRepositorySystemSession
LocalRepository =
Java::OrgSonatypeAetherRepository::LocalRepository
DefaultServiceLocator =
Java::OrgApacheMavenRepositoryInternal::DefaultServiceLocator
RepositoryConnectorFactory =
Java::OrgSonatypeAetherSpiConnector::RepositoryConnectorFactory
AsyncRepositoryConnectorFactory =
Java::OrgSonatypeAetherConnectorAsync::AsyncRepositoryConnectorFactory
FileRepositoryConnectorFactory =
Java::OrgSonatypeAetherConnectorFile::FileRepositoryConnectorFactory
Artifact =
Java::OrgSonatypeAetherUtilArtifact::DefaultArtifact
Dependency =
Java::OrgSonatypeAetherGraph::Dependency
RemoteRepository =
Java::OrgSonatypeAetherRepository::RemoteRepository
CollectRequest =
Java::OrgSonatypeAetherCollection::CollectRequest
DependencyRequest =
Java::OrgSonatypeAetherResolution::DependencyRequest
PreorderNodeListGenerator =
Java::OrgSonatypeAetherUtilGraph::PreorderNodeListGenerator
LOCATOR =

set up connectors for service locator

DefaultServiceLocator.new
MiB_PER_BYTE =
1024.0*1024.0

Instance Method Summary collapse

Constructor Details

#initializeResolver

Returns a new instance of Resolver.



63
64
65
66
67
68
69
70
# File 'lib/mini_aether/resolver.rb', line 63

def initialize
  @logger = Java::OrgSlf4j::LoggerFactory.getLogger(self.class.to_s)
  @system = LOCATOR.getService(RepositorySystem.java_class)
  @session = MavenRepositorySystemSession.new
  local_repo = LocalRepository.new(MiniAether.local_repository_path)
  local_manager = @system.newLocalRepositoryManager(local_repo)
  @session.setLocalRepositoryManager(local_manager)
end

Instance Method Details

#new_artifact(hash) ⇒ Object



72
73
74
75
76
77
# File 'lib/mini_aether/resolver.rb', line 72

def new_artifact(hash)
  Artifact.new(hash[:group_id],
               hash[:artifact_id],
               hash[:extension] || 'jar',
               hash[:version])
end

#resolve(dep_hashes, repos) ⇒ Java::JavaUtil::List<Java::JavaIo::File>

Resolve a set of dependencies dep_hashes from repositories repos.

Parameters:

  • dep_hashes (Array<Hash>)
  • repos (Array<String>)

    urls to maven2 repositories

  • dep_hash (Hash)

    a customizable set of options

Returns:

  • (Java::JavaUtil::List<Java::JavaIo::File>)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/mini_aether/resolver.rb', line 100

def resolve(dep_hashes, repos)
  @logger.info 'resolving dependencies ({})', dep_hashes.size
  collect_req = CollectRequest.new

  dep_hashes.each do |hash|
    dep = Dependency.new new_artifact(hash), 'compile'
    collect_req.addDependency dep
    @logger.info 'requested {}', dep
  end

  repos.each do |uri|
    repo = RemoteRepository.new(uri.object_id.to_s, 'default', uri)
    collect_req.addRepository repo
    @logger.info 'added repository {}', repo
  end

  node = @system.collectDependencies(@session, collect_req).getRoot
    
  dependency_req = DependencyRequest.new(node, nil)
  @system.resolveDependencies(@session, dependency_req)
  
  nlg = PreorderNodeListGenerator.new
  node.accept nlg
  files = nlg.getFiles

  @logger.info "resolved with #{files.size} artifacts"

  if @logger.isDebugEnabled
    total_size = 0
    nlg.getArtifacts(false).each do |artifact|
      file = artifact.file
      size = File.stat(artifact.file.absolute_path).size
      total_size += size
      
      @logger.debug("%0.2fMiB %s (%s)" % [size/MiB_PER_BYTE, artifact, file.name])
    end
    @logger.debug("%0.3f MiB total" % [total_size/MiB_PER_BYTE])
  end

  files
end

#resolve_foreign(deps_data, repos_data) ⇒ Object

Load dumps of the dep_hashes and repos args using Marshal.load and then call #resolve. Useful for when the dependencies and repositories are constructed under a different Java classloader.



83
84
85
# File 'lib/mini_aether/resolver.rb', line 83

def resolve_foreign(deps_data, repos_data)
  resolve(Marshal.load(deps_data), Marshal.load(repos_data))
end