package de.cinovo.cloudconductor.server.repo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StreamUtils;
import de.cinovo.cloudconductor.api.MediaType;
import de.cinovo.cloudconductor.server.repo.provider.IRepoProvider;
import de.cinovo.cloudconductor.server.web.CSViewModel;
import de.cinovo.cloudconductor.server.web.helper.AWebPage;
import de.cinovo.cloudconductor.server.web.helper.NavbarHardLinks;
/**
* Copyright 2014 Hoegernet<br>
* <br>
*
* @author Thorsten Hoeger
*
*/
public class RepoImpl extends AWebPage implements IRepo {
@Autowired
private IRepoProvider provider;
@Override
public Response get(String file) {
if (file.isEmpty() || file.endsWith("/")) {
if (!this.provider.isListable()) {
return this.resultNoList(file);
}
List<RepoEntry> list = this.provider.getEntries(file);
if (list != null) {
return this.resultList(file, list);
}
throw new NotFoundException();
}
RepoEntry entry = this.provider.getEntry(file);
if (entry != null) {
return this.resultStream(this.provider.getEntryStream(file), entry);
}
throw new NotFoundException();
}
private Response resultNoList(String folder) {
CSViewModel view = this.createView("notListable");
view.addModel("folder", folder);
return Response.ok(view.render(), MediaType.TEXT_HTML).build();
}
private Response resultList(String folder, List<RepoEntry> entries) {
CSViewModel view = this.createView("list");
view.addModel("folder", folder);
view.addModel("files", entries);
view.addModel("byteTool", new ByteTool());
return Response.ok(view.render(), MediaType.TEXT_HTML).build();
}
private Response resultStream(final InputStream stream, RepoEntry entry) {
StreamingOutput out = new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
StreamUtils.copy(stream, output);
output.flush();
output.close();
}
};
return Response.ok(out, entry.getContentType()).header("Content-Length", entry.getSize()).build();
}
@Override
protected String getTemplateFolder() {
return "repo";
}
@Override
protected void init() {
this.navRegistry.registerSubMenu(NavbarHardLinks.links, "Package Repository", "/../repo/");
}
@Override
protected String getNavElementName() {
return "Repository";
}
}