package aQute.bnd.repository.maven.provider;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.osgi.util.promise.Promise;
import aQute.bnd.osgi.Jar;
import aQute.bnd.repository.maven.provider.IndexFile.BundleDescriptor;
import aQute.lib.exceptions.Exceptions;
import aQute.lib.io.IO;
import aQute.maven.api.Archive;
import aQute.maven.api.IPom;
import aQute.maven.api.IPom.Dependency;
import aQute.maven.api.MavenScope;
import aQute.maven.api.Program;
import aQute.maven.api.Revision;
class RepoActions {
private MavenBndRepository repo;
RepoActions(MavenBndRepository mavenBndRepository) {
this.repo = mavenBndRepository;
}
Map<String,Runnable> getProgramActions(final String bsn) throws Exception {
Map<String,Runnable> map = new LinkedHashMap<>();
map.put("Delete All from Index", new Runnable() {
@Override
public void run() {
try {
repo.index.remove(bsn);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
return map;
}
Map<String,Runnable> getRevisionActions(final BundleDescriptor bd) throws Exception {
Map<String,Runnable> map = new LinkedHashMap<>();
map.put("Clear from Cache", new Runnable() {
@Override
public void run() {
File dir = repo.storage.toLocalFile(bd.archive).getParentFile();
IO.delete(dir);
}
});
map.put("Delete from Index", new Runnable() {
@Override
public void run() {
try {
repo.index.remove(bd.archive);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
map.put("Add Compile Dependencies", new Runnable() {
@Override
public void run() {
try {
addDependency(bd.archive, MavenScope.compile);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
map.put("Add Runtime Dependencies", new Runnable() {
@Override
public void run() {
try {
addDependency(bd.archive, MavenScope.runtime);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
map.put("Refresh", new Runnable() {
@Override
public void run() {
try {
repo.index.updateAsync(bd.archive);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
addUpdate(bd, map);
addSources(bd, map);
return map;
}
void addSources(final BundleDescriptor bd, Map<String,Runnable> map) throws Exception {
Promise<File> pBinary = repo.storage.get(bd.archive);
if (pBinary.getFailure() == null) {
final File binary = pBinary.getValue();
final File out = new File(binary.getParentFile(), "+" + binary.getName());
if (!out.isFile()) {
Archive a = bd.archive.revision.archive("jar", "sources");
Promise<File> pSources = repo.storage.get(a);
if (pSources.getFailure() == null) {
final File sources = pSources.getValue();
if (sources.isFile() && sources.length() > 1000) {
map.put("Add Sources", new Runnable() {
@Override
public void run() {
try {
try (Jar src = new Jar(sources)) {
try (Jar bin = new Jar(binary)) {
bin.setDoNotTouchManifest();
for (String path : src.getResources().keySet())
bin.putResource("OSGI-OPT/src/" + path, src.getResource(path));
bin.write(out);
}
out.setLastModified(System.currentTimeMillis());
}
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
return;
}
}
}
}
map.put("-Add Sources", null);
}
void addUpdate(final BundleDescriptor bd, Map<String,Runnable> map) throws Exception {
try {
Revision rev = bd.archive.revision;
Program prog = rev.program;
List<Revision> revisions = repo.storage.getRevisions(prog);
if (revisions.size() > 1) {
final Revision last = revisions.get(revisions.size() - 1);
if (!rev.equals(last)) {
map.put("Update to " + last, new Runnable() {
@Override
public void run() {
try {
repo.index.remove(bd.archive);
repo.index.add(last.archive(bd.archive.extension, bd.archive.classifier));
addDependency(bd.archive, MavenScope.runtime);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
});
} else
map.put("-Update", null);
}
} catch (Exception e) {
map.put("-Update [" + e + "]", null);
}
}
private void addDependency(Archive archive, MavenScope scope) throws Exception {
IPom pom = repo.storage.getPom(archive.revision);
Map<Program,Dependency> dependencies = pom.getDependencies(scope, false);
for (Dependency d : dependencies.values()) {
BundleDescriptor add = repo.index.add(d.program.version(d.version).archive("jar", null));
if (d.error != null)
add.error = d.error;
}
}
}