mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-02-05 14:19:18 +01:00
Add ConfigurationAdapterBase and extension points for trash bin
Adds the new abstract class ConfigurationAdapterBase to simplify the creation of global configuration views. In addition there is some cleanup, interfaces and extension points for the repository trash bin plugin. Committed-by: Eduard Heimbuch <eduard.heimbuch@cloudogu.com> Co-authored-by: Eduard Heimbuch <eduard.heimbuch@cloudogu.com> Co-authored-by: René Pfeuffer <rene.pfeuffer@cloudogu.com> Co-authored-by: Konstantin Schaper <konstantin.schaper@cloudogu.com>
This commit is contained in:
@@ -27,7 +27,7 @@ package sonia.scm.importexport;
|
||||
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
|
||||
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
|
||||
import sonia.scm.ContextEntry;
|
||||
import sonia.scm.repository.FullRepositoryExporter;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.RepositoryExportingCheck;
|
||||
import sonia.scm.repository.api.ExportFailedException;
|
||||
@@ -36,6 +36,7 @@ import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||
import sonia.scm.repository.work.WorkdirProvider;
|
||||
import sonia.scm.util.Archives;
|
||||
import sonia.scm.util.IOUtil;
|
||||
import sonia.scm.web.security.AdministrationContext;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.BufferedOutputStream;
|
||||
@@ -46,8 +47,10 @@ import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import static sonia.scm.ContextEntry.ContextBuilder.entity;
|
||||
|
||||
public class FullScmRepositoryExporter {
|
||||
|
||||
public class FullScmRepositoryExporter implements FullRepositoryExporter {
|
||||
|
||||
static final String SCM_ENVIRONMENT_FILE_NAME = "scm-environment.xml";
|
||||
static final String METADATA_FILE_NAME = "metadata.xml";
|
||||
@@ -61,6 +64,8 @@ public class FullScmRepositoryExporter {
|
||||
private final RepositoryImportExportEncryption repositoryImportExportEncryption;
|
||||
private final ExportNotificationHandler notificationHandler;
|
||||
|
||||
private final AdministrationContext administrationContext;
|
||||
|
||||
@Inject
|
||||
public FullScmRepositoryExporter(EnvironmentInformationXmlGenerator environmentGenerator,
|
||||
RepositoryMetadataXmlGenerator metadataGenerator,
|
||||
@@ -68,7 +73,7 @@ public class FullScmRepositoryExporter {
|
||||
TarArchiveRepositoryStoreExporter storeExporter,
|
||||
WorkdirProvider workdirProvider,
|
||||
RepositoryExportingCheck repositoryExportingCheck,
|
||||
RepositoryImportExportEncryption repositoryImportExportEncryption, ExportNotificationHandler notificationHandler) {
|
||||
RepositoryImportExportEncryption repositoryImportExportEncryption, ExportNotificationHandler notificationHandler, AdministrationContext administrationContext) {
|
||||
this.environmentGenerator = environmentGenerator;
|
||||
this.metadataGenerator = metadataGenerator;
|
||||
this.serviceFactory = serviceFactory;
|
||||
@@ -77,6 +82,7 @@ public class FullScmRepositoryExporter {
|
||||
this.repositoryExportingCheck = repositoryExportingCheck;
|
||||
this.repositoryImportExportEncryption = repositoryImportExportEncryption;
|
||||
this.notificationHandler = notificationHandler;
|
||||
this.administrationContext = administrationContext;
|
||||
}
|
||||
|
||||
public void export(Repository repository, OutputStream outputStream, String password) {
|
||||
@@ -99,27 +105,33 @@ public class FullScmRepositoryExporter {
|
||||
GzipCompressorOutputStream gzos = new GzipCompressorOutputStream(cos);
|
||||
TarArchiveOutputStream taos = Archives.createTarOutputStream(gzos);
|
||||
) {
|
||||
writeEnvironmentData(taos);
|
||||
writeEnvironmentData(repository, taos);
|
||||
writeMetadata(repository, taos);
|
||||
writeStoreData(repository, taos);
|
||||
writeRepository(service, taos);
|
||||
taos.finish();
|
||||
} catch (IOException e) {
|
||||
throw new ExportFailedException(
|
||||
ContextEntry.ContextBuilder.entity(repository).build(),
|
||||
entity(repository).build(),
|
||||
"Could not export repository with metadata",
|
||||
e
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void writeEnvironmentData(TarArchiveOutputStream taos) throws IOException {
|
||||
byte[] envBytes = environmentGenerator.generate();
|
||||
TarArchiveEntry entry = new TarArchiveEntry(SCM_ENVIRONMENT_FILE_NAME);
|
||||
entry.setSize(envBytes.length);
|
||||
taos.putArchiveEntry(entry);
|
||||
taos.write(envBytes);
|
||||
taos.closeArchiveEntry();
|
||||
private void writeEnvironmentData(Repository repository, TarArchiveOutputStream taos) {
|
||||
administrationContext.runAsAdmin(() -> {
|
||||
byte[] envBytes = environmentGenerator.generate();
|
||||
TarArchiveEntry entry = new TarArchiveEntry(SCM_ENVIRONMENT_FILE_NAME);
|
||||
entry.setSize(envBytes.length);
|
||||
try {
|
||||
taos.putArchiveEntry(entry);
|
||||
taos.write(envBytes);
|
||||
taos.closeArchiveEntry();
|
||||
} catch (IOException e) {
|
||||
throw new ExportFailedException(entity(repository).build(), "Failed to collect instance environment for repository export", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void writeMetadata(Repository repository, TarArchiveOutputStream taos) throws IOException {
|
||||
|
||||
@@ -32,10 +32,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import sonia.scm.ContextEntry;
|
||||
import sonia.scm.event.ScmEventBus;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.RepositoryImportEvent;
|
||||
import sonia.scm.repository.RepositoryManager;
|
||||
import sonia.scm.repository.RepositoryPermissions;
|
||||
import sonia.scm.repository.*;
|
||||
import sonia.scm.repository.api.ImportFailedException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -48,7 +45,7 @@ import static sonia.scm.ContextEntry.ContextBuilder.noContext;
|
||||
import static sonia.scm.importexport.RepositoryImportLogger.ImportType.FULL;
|
||||
import static sonia.scm.util.Archives.createTarInputStream;
|
||||
|
||||
public class FullScmRepositoryImporter {
|
||||
public class FullScmRepositoryImporter implements FullRepositoryImporter {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(FullScmRepositoryImporter.class);
|
||||
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package sonia.scm.lifecycle;
|
||||
|
||||
import sonia.scm.plugin.ExtensionPoint;
|
||||
import sonia.scm.web.security.PrivilegedAction;
|
||||
|
||||
@ExtensionPoint
|
||||
public interface PrivilegedStartupAction extends PrivilegedAction {}
|
||||
@@ -57,6 +57,8 @@ import sonia.scm.group.GroupDisplayManager;
|
||||
import sonia.scm.group.GroupManager;
|
||||
import sonia.scm.group.GroupManagerProvider;
|
||||
import sonia.scm.group.xml.XmlGroupDAO;
|
||||
import sonia.scm.importexport.FullScmRepositoryExporter;
|
||||
import sonia.scm.importexport.FullScmRepositoryImporter;
|
||||
import sonia.scm.initialization.DefaultInitializationFinisher;
|
||||
import sonia.scm.initialization.InitializationCookieIssuer;
|
||||
import sonia.scm.initialization.InitializationFinisher;
|
||||
@@ -76,24 +78,7 @@ import sonia.scm.notifications.NotificationSender;
|
||||
import sonia.scm.plugin.DefaultPluginManager;
|
||||
import sonia.scm.plugin.PluginLoader;
|
||||
import sonia.scm.plugin.PluginManager;
|
||||
import sonia.scm.repository.DefaultHealthCheckService;
|
||||
import sonia.scm.repository.DefaultNamespaceManager;
|
||||
import sonia.scm.repository.DefaultRepositoryManager;
|
||||
import sonia.scm.repository.DefaultRepositoryProvider;
|
||||
import sonia.scm.repository.DefaultRepositoryRoleManager;
|
||||
import sonia.scm.repository.HealthCheckContextListener;
|
||||
import sonia.scm.repository.HealthCheckService;
|
||||
import sonia.scm.repository.NamespaceManager;
|
||||
import sonia.scm.repository.NamespaceStrategy;
|
||||
import sonia.scm.repository.NamespaceStrategyProvider;
|
||||
import sonia.scm.repository.PermissionProvider;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.RepositoryDAO;
|
||||
import sonia.scm.repository.RepositoryManager;
|
||||
import sonia.scm.repository.RepositoryManagerProvider;
|
||||
import sonia.scm.repository.RepositoryProvider;
|
||||
import sonia.scm.repository.RepositoryRoleDAO;
|
||||
import sonia.scm.repository.RepositoryRoleManager;
|
||||
import sonia.scm.repository.*;
|
||||
import sonia.scm.repository.api.HookContextFactory;
|
||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||
import sonia.scm.repository.spi.HookEventFacade;
|
||||
@@ -297,6 +282,9 @@ class ScmServletModule extends ServletModule {
|
||||
bind(CentralWorkQueue.class, DefaultCentralWorkQueue.class);
|
||||
|
||||
bind(ContentTypeResolver.class).to(DefaultContentTypeResolver.class);
|
||||
|
||||
bind(FullRepositoryImporter.class).to(FullScmRepositoryImporter.class);
|
||||
bind(FullRepositoryExporter.class).to(FullScmRepositoryExporter.class);
|
||||
}
|
||||
|
||||
private <T> void bind(Class<T> clazz, Class<? extends T> defaultImplementation) {
|
||||
|
||||
Reference in New Issue
Block a user