Skip to content

Commit

Permalink
Support engine module. Fixed #3
Browse files Browse the repository at this point in the history
  • Loading branch information
msteiger committed Aug 10, 2015
1 parent 5b55a1f commit c58c839
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 40 deletions.
20 changes: 12 additions & 8 deletions src/main/java/org/terasology/web/JettyMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,17 +97,21 @@ public static void main(String[] args) throws Exception {
String host = "http://artifactory.terasology.org/artifactory";
String releaseRepo = "terasology-release-local";
String snapshotRepo = "terasology-snapshot-local";

String modGroup = "org.terasology.modules";
String engineGroup = "org.terasology.engine";
Path cacheFolder = Paths.get("cache", "modules");

Path releaseRepoCacheFolder = cacheFolder.resolve(releaseRepo);
Path snapshotRepoCacheFolder = cacheFolder.resolve(snapshotRepo);
ArtifactoryRepo releaseRepository = ArtifactoryRepo.release(host, releaseRepo, releaseRepoCacheFolder);
ArtifactoryRepo snapshotRepository = ArtifactoryRepo.snapshot(host, snapshotRepo, snapshotRepoCacheFolder);

ModuleListModelImpl moduleListModel = new ModuleListModelImpl(cacheFolder);
moduleListModel.addRepository(releaseRepository);
moduleListModel.addRepository(snapshotRepository);
Path releaseRepoFolder = cacheFolder.resolve(releaseRepo);
Path snapshotRepoFolder = cacheFolder.resolve(snapshotRepo);

// add module repos
moduleListModel.addRepository(ArtifactoryRepo.release(host, releaseRepo, modGroup, releaseRepoFolder));
moduleListModel.addRepository(ArtifactoryRepo.snapshot(host, snapshotRepo, modGroup, snapshotRepoFolder));

// add engine repos
moduleListModel.addRepository(ArtifactoryRepo.release(host, releaseRepo, engineGroup, releaseRepoFolder));
moduleListModel.addRepository(ArtifactoryRepo.snapshot(host, snapshotRepo, engineGroup, snapshotRepoFolder));

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://" + dbUri.getHost() + ":" + dbPort + dbUri.getPath());
Expand Down
17 changes: 10 additions & 7 deletions src/main/java/org/terasology/web/artifactory/ArtifactoryRepo.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,20 @@ public final class ArtifactoryRepo implements ArtifactRepository {
private final String baseUrl;
private final Path cacheFolder;
private final String repoName;
private final String group;
private final RepoType type;

private ArtifactoryRepo(String uri, String repoName, Path cacheFolder, RepoType type) throws IOException {
private ArtifactoryRepo(String uri, String repoName, String group, Path cacheFolder, RepoType type) throws IOException {
this.cacheFolder = cacheFolder;
this.repoName = repoName;
this.type = type;
this.group = group;
String repoPath = group.replaceAll("\\.", "/");

baseUrl = uri
+ "/api/storage"
+ "/" + repoName
+ "/org/terasology/modules";
+ "/" + repoPath;

ArtifactoryItem folder = readItem(baseUrl);
for (ArtifactoryItem.Entry child : folder.children) {
Expand All @@ -79,12 +82,12 @@ private ArtifactoryRepo(String uri, String repoName, Path cacheFolder, RepoType
}
}

public static ArtifactoryRepo snapshot(String uri, String repoName, Path cacheFolder) throws IOException {
return new ArtifactoryRepo(uri, repoName, cacheFolder, RepoType.SNAPSHOT);
public static ArtifactoryRepo snapshot(String uri, String repoName, String group, Path cacheFolder) throws IOException {
return new ArtifactoryRepo(uri, repoName, group, cacheFolder, RepoType.SNAPSHOT);
}

public static ArtifactoryRepo release(String uri, String repoName, Path cacheFolder) throws IOException {
return new ArtifactoryRepo(uri, repoName, cacheFolder, RepoType.RELEASE);
public static ArtifactoryRepo release(String uri, String repoName, String group, Path cacheFolder) throws IOException {
return new ArtifactoryRepo(uri, repoName, group, cacheFolder, RepoType.RELEASE);
}

private ArtifactoryModule loadModuleFromCache(String moduleName) throws IOException {
Expand Down Expand Up @@ -162,7 +165,7 @@ public void updateModule(String moduleName) throws IOException {
GSON.toJson(module, writer);
}
} catch (FileNotFoundException e) {
logger.info("No entries for {} in {}", moduleName, repoName);
logger.info("No entries for '{}.{}' in '{}'", group, moduleName, repoName);
}
}

Expand Down
44 changes: 24 additions & 20 deletions src/main/java/org/terasology/web/model/ModuleListModelImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public class ModuleListModelImpl implements ModuleListModel {
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);

public ModuleListModelImpl(Path cacheFolder) {
this (cacheFolder, new ZipExtractor("module.txt"));
this(cacheFolder, new ZipExtractor("module.txt", "engine-module.txt"));
}

public ModuleListModelImpl(Path cacheFolder, MetadataExtractor extractor) {
Expand Down Expand Up @@ -131,7 +131,7 @@ public void updateModule(Name moduleName) {
}
}

private void updateModule(ArtifactRepository repo, String moduleName) throws IOException {
private void updateModule(ArtifactRepository repo, String moduleName) {
lock.writeLock().lock();

try {
Expand Down Expand Up @@ -172,7 +172,7 @@ private void updateModule(ArtifactRepository repo, String moduleName) throws IOE
}
}

private List<ModuleMetadata> retrieveMetadata(ArtifactRepository repository, Path repoCacheFolder, String moduleName) throws IOException {
private List<ModuleMetadata> retrieveMetadata(ArtifactRepository repository, Path repoCacheFolder, String moduleName) {
Path moduleCacheFolder = repoCacheFolder.resolve(moduleName);
moduleCacheFolder.toFile().mkdirs();

Expand All @@ -182,25 +182,29 @@ private List<ModuleMetadata> retrieveMetadata(ArtifactRepository repository, Pat

Set<String> usedCacheFiles = new HashSet<>();
for (ArtifactInfo info : repository.getModuleArtifacts(moduleName)) {
ModuleMetadata meta;
File cacheFile = moduleCacheFolder.resolve(info.getArtifact() + "_info.json").toFile();
if (cacheFile.exists()) {
try (Reader reader = Files.newReader(cacheFile, StandardCharsets.UTF_8)) {
meta = metadataAdapter.read(reader);
}
} else {
logger.debug("Downloading " + info.getDownloadUrl());

meta = extractor.loadMetaData(info.getDownloadUrl());
RemoteModuleExtension.setDownloadUrl(meta, info.getDownloadUrl());
RemoteModuleExtension.setArtifactSize(meta, info.getFileSize());
RemoteModuleExtension.setLastUpdated(meta, info.getLastUpdated());
try (Writer writer = Files.newWriter(cacheFile, StandardCharsets.UTF_8)) {
metadataAdapter.write(meta, writer);
try {
ModuleMetadata meta;
File cacheFile = moduleCacheFolder.resolve(info.getArtifact() + "_info.json").toFile();
if (cacheFile.exists()) {
try (Reader reader = Files.newReader(cacheFile, StandardCharsets.UTF_8)) {
meta = metadataAdapter.read(reader);
}
} else {
logger.debug("Downloading " + info.getDownloadUrl());

meta = extractor.loadMetaData(info.getDownloadUrl());
RemoteModuleExtension.setDownloadUrl(meta, info.getDownloadUrl());
RemoteModuleExtension.setArtifactSize(meta, info.getFileSize());
RemoteModuleExtension.setLastUpdated(meta, info.getLastUpdated());
try (Writer writer = Files.newWriter(cacheFile, StandardCharsets.UTF_8)) {
metadataAdapter.write(meta, writer);
}
}
usedCacheFiles.add(cacheFile.getName());
result.add(meta);
} catch (IOException e) {
logger.warn("Failed to parse info for '{}'", info, e);
}
usedCacheFiles.add(cacheFile.getName());
result.add(meta);
}

for (String fname : moduleCacheFolder.toFile().list()) {
Expand Down
12 changes: 7 additions & 5 deletions src/main/java/org/terasology/web/model/ZipExtractor.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.io.Reader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

Expand All @@ -35,14 +37,14 @@
*/
public class ZipExtractor implements MetadataExtractor {

private final String filename;
private final List<String> filename;
private final ModuleMetadataJsonAdapter metaReader = new ModuleMetadataJsonAdapter();

/**
* @param filename the file to
* @param filenames the collection file names that match. The first match is returned.
*/
public ZipExtractor(String filename) {
this.filename = filename;
public ZipExtractor(String... filenames) {
this.filename = Arrays.asList(filenames);
}

@Override
Expand All @@ -51,7 +53,7 @@ public ModuleMetadata loadMetaData(URL url) throws IOException {
ZipInputStream zipStream = new ZipInputStream(in)) {
ZipEntry entry;
while ((entry = zipStream.getNextEntry()) != null) {
if (entry.getName().matches(filename)) {
if (filename.contains(entry.getName())) {
return readFile(zipStream);
}
}
Expand Down

0 comments on commit c58c839

Please sign in to comment.