Add rest endpoint for import log

This commit is contained in:
René Pfeuffer
2021-02-22 17:48:05 +01:00
parent 33cddda172
commit 074f119a0d
4 changed files with 49 additions and 3 deletions

View File

@@ -47,6 +47,7 @@ import sonia.scm.importexport.FromBundleImporter;
import sonia.scm.importexport.FromUrlImporter;
import sonia.scm.importexport.FullScmRepositoryImporter;
import sonia.scm.importexport.RepositoryImportExportEncryption;
import sonia.scm.importexport.RepositoryImportLoggerFactory;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryPermissions;
import sonia.scm.repository.api.Command;
@@ -59,14 +60,17 @@ import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.io.InputStream;
@@ -87,6 +91,7 @@ public class RepositoryImportResource {
private final RepositoryImportDtoToRepositoryImportParametersMapper importParametersMapper;
private final FromUrlImporter fromUrlImporter;
private final FromBundleImporter fromBundleImporter;
private final RepositoryImportLoggerFactory importLoggerFactory;
@Inject
public RepositoryImportResource(RepositoryDtoToRepositoryMapper mapper,
@@ -94,7 +99,8 @@ public class RepositoryImportResource {
FullScmRepositoryImporter fullScmRepositoryImporter,
RepositoryImportDtoToRepositoryImportParametersMapper importParametersMapper,
RepositoryImportExportEncryption repositoryImportExportEncryption, FromUrlImporter fromUrlImporter,
FromBundleImporter fromBundleImporter) {
FromBundleImporter fromBundleImporter,
RepositoryImportLoggerFactory importLoggerFactory) {
this.mapper = mapper;
this.resourceLinks = resourceLinks;
this.fullScmRepositoryImporter = fullScmRepositoryImporter;
@@ -102,6 +108,7 @@ public class RepositoryImportResource {
this.importParametersMapper = importParametersMapper;
this.fromUrlImporter = fromUrlImporter;
this.fromBundleImporter = fromBundleImporter;
this.importLoggerFactory = importLoggerFactory;
}
/**
@@ -254,6 +261,13 @@ public class RepositoryImportResource {
return Response.created(URI.create(resourceLinks.repository().self(createdRepository.getNamespace(), createdRepository.getName()))).build();
}
@GET
@Path("log/{logId}")
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput getImportLog(@PathParam("logId") String logId) {
return out -> importLoggerFactory.getLog(logId, out);
}
private Repository importFullRepositoryFromInput(MultipartFormDataInput input) {
Map<String, List<InputPart>> formParts = input.getFormDataMap();
InputStream inputStream = extractInputStream(formParts);

View File

@@ -35,6 +35,8 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static java.util.Collections.unmodifiableList;
@XmlRootElement(name = "import")
@@ -65,6 +67,16 @@ class RepositoryImportLog {
return unmodifiableList(entries);
}
public List<String> toLogHeader() {
return asList(
format("Import of repository %s/%s", namespace, name),
format("Repository type: %s", repositoryId),
format("Imported from: %s", type),
format("Imported by %s (%s)", userId, userName),
success ? "Finished successful" : "Import failed"
);
}
enum ImportType {
FULL, URL, DUMP
}
@@ -82,5 +94,9 @@ class RepositoryImportLog {
Entry(String message) {
this.message = message;
}
public String toLogMessage() {
return time + " - " + message;
}
}
}

View File

@@ -24,11 +24,14 @@
package sonia.scm.importexport;
import sonia.scm.NotFoundException;
import sonia.scm.store.DataStoreFactory;
import javax.inject.Inject;
import java.io.OutputStream;
import java.io.PrintStream;
class RepositoryImportLoggerFactory {
public class RepositoryImportLoggerFactory {
private final DataStoreFactory dataStoreFactory;
@@ -40,4 +43,14 @@ class RepositoryImportLoggerFactory {
RepositoryImportLogger createLogger() {
return new RepositoryImportLogger(dataStoreFactory.withType(RepositoryImportLog.class).withName("imports").build());
}
public void getLog(String logId, OutputStream out) {
RepositoryImportLog log = dataStoreFactory.withType(RepositoryImportLog.class).withName("imports").build().getOptional(logId).orElseThrow(() -> new NotFoundException("Log", logId));
PrintStream printStream = new PrintStream(out);
log.toLogHeader().forEach(printStream::println);
log.getEntries()
.stream()
.map(RepositoryImportLog.Entry::toLogMessage)
.forEach(printStream::println);
}
}

View File

@@ -53,6 +53,7 @@ import sonia.scm.importexport.FromUrlImporter;
import sonia.scm.importexport.FullScmRepositoryExporter;
import sonia.scm.importexport.FullScmRepositoryImporter;
import sonia.scm.importexport.RepositoryImportExportEncryption;
import sonia.scm.importexport.RepositoryImportLoggerFactory;
import sonia.scm.repository.CustomNamespaceStrategy;
import sonia.scm.repository.NamespaceAndName;
import sonia.scm.repository.NamespaceStrategy;
@@ -166,6 +167,8 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
@Mock
private ExportFileExtensionResolver fileExtensionResolver;
@Mock
private RepositoryImportLoggerFactory importLoggerFactory;
@Mock
private ExportService exportService;
@Captor
@@ -187,7 +190,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
super.manager = repositoryManager;
RepositoryCollectionToDtoMapper repositoryCollectionToDtoMapper = new RepositoryCollectionToDtoMapper(repositoryToDtoMapper, resourceLinks);
super.repositoryCollectionResource = new RepositoryCollectionResource(repositoryManager, repositoryCollectionToDtoMapper, dtoToRepositoryMapper, resourceLinks, repositoryInitializer);
super.repositoryImportResource = new RepositoryImportResource(dtoToRepositoryMapper, resourceLinks, fullScmRepositoryImporter, new RepositoryImportDtoToRepositoryImportParametersMapperImpl(), repositoryImportExportEncryption, fromUrlImporter, fromBundleImporter);
super.repositoryImportResource = new RepositoryImportResource(dtoToRepositoryMapper, resourceLinks, fullScmRepositoryImporter, new RepositoryImportDtoToRepositoryImportParametersMapperImpl(), repositoryImportExportEncryption, fromUrlImporter, fromBundleImporter, importLoggerFactory);
super.repositoryExportResource = new RepositoryExportResource(repositoryManager, serviceFactory, fullScmRepositoryExporter, repositoryImportExportEncryption, exportService, exportInformationToDtoMapper, fileExtensionResolver, resourceLinks);
dispatcher.addSingletonResource(getRepositoryRootResource());
when(serviceFactory.create(any(Repository.class))).thenReturn(service);