package aQute.bnd.repository.maven.pom.provider;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.osgi.resource.Resource;
import org.osgi.util.promise.Promise;
import aQute.bnd.http.HttpClient;
import aQute.bnd.osgi.Processor;
import aQute.bnd.osgi.repository.XMLResourceGenerator;
import aQute.bnd.osgi.repository.XMLResourceParser;
import aQute.maven.api.Archive;
import aQute.maven.api.Revision;
import aQute.maven.provider.MavenRepository;
class PomRepository extends InnerRepository {
static final String BND_MAVEN = "bnd.maven";
static final String BND_MAVEN_EXCEPTION_ATTRIBUTE = "exception";
static final String BND_MAVEN_ARCHIVE_ATTRIBUTE = "archive";
static final String BND_MAVEN_REVISION_ATTRIBUTE = "revision";
final List<Revision> revisions;
final List<URI> uris;
final HttpClient client;
PomRepository(MavenRepository repo, HttpClient client, File location) {
super(repo, location);
this.revisions = new ArrayList<>();
this.uris = new ArrayList<>();
this.client = client;
}
PomRepository revisions(Collection<Revision> revisions) throws Exception {
this.revisions.addAll(revisions);
read();
return this;
}
PomRepository uris(Collection<URI> uris) throws Exception {
this.uris.addAll(uris);
read();
return this;
}
void refresh() throws Exception {
if (!uris.isEmpty())
readUris();
else
readRevisons();
}
void readUris() throws Exception {
save(new Traverser(getMavenRepository(), client, Processor.getExecutor()).uris(uris));
}
void readRevisons() throws Exception {
save(new Traverser(getMavenRepository(), client, Processor.getExecutor()).revisions(revisions));
}
void save(Traverser traverser) throws Exception {
Promise<Map<Archive,Resource>> p = traverser.getResources();
Collection<Resource> resources = p.getValue().values();
set(resources);
save(getMavenRepository().getName(), resources, getLocation());
}
void save(String name, Collection< ? extends Resource> resources, File location) throws Exception, IOException {
XMLResourceGenerator generator = new XMLResourceGenerator();
generator.resources(resources);
generator.name(name);
generator.save(location);
}
void read() throws Exception {
if (isStale()) {
refresh();
} else {
try (XMLResourceParser parser = new XMLResourceParser(getLocation())) {
List<Resource> resources = parser.parse();
addAll(resources);
}
}
}
private boolean isStale() {
if (!getLocation().isFile())
return true;
if (!uris.isEmpty()) {
for (URI uri : uris) {
if ("file".equalsIgnoreCase(uri.getScheme())) {
File file = new File(uri);
if (file.isFile() && file.lastModified() > getLocation().lastModified()) {
return true;
}
}
}
} else {
try {
for (Revision revision : revisions) {
File file = getMavenRepository().get(revision.getPomArchive()).getValue();
if (file.isFile() && file.lastModified() > getLocation().lastModified()) {
return true;
}
}
} catch (Exception e) {
// ignore
}
}
return false;
}
}