diff --git a/scm-core/src/main/java/sonia/scm/repository/Repository.java b/scm-core/src/main/java/sonia/scm/repository/Repository.java index b0a976db55..a1ccabb0c4 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -39,24 +39,22 @@ import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; import com.google.common.base.Objects; import com.google.common.collect.Lists; - import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Source code repository. @@ -443,6 +441,10 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per || ValidationUtil.isMailAddressValid(contact)); } + public String getSpace() { + return space; + } + //~--- set methods ---------------------------------------------------------- /** @@ -570,6 +572,9 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per this.healthCheckFailures = healthCheckFailures; } + public void setSpace(String space) { + this.space = space; + } //~--- fields --------------------------------------------------------------- /** Field description */ @@ -609,4 +614,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per /** Field description */ private String type; + + private String space; } diff --git a/scm-core/src/main/java/sonia/scm/repository/SpacesStrategy.java b/scm-core/src/main/java/sonia/scm/repository/SpacesStrategy.java new file mode 100644 index 0000000000..9caa69057e --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/SpacesStrategy.java @@ -0,0 +1,8 @@ +package sonia.scm.repository; + +import sonia.scm.plugin.ExtensionPoint; + +@ExtensionPoint(multi = true) +public interface SpacesStrategy { + String getCurrentSpace(); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/StaticSpacesStrategy.java b/scm-core/src/main/java/sonia/scm/repository/StaticSpacesStrategy.java new file mode 100644 index 0000000000..27068aa6a9 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/StaticSpacesStrategy.java @@ -0,0 +1,11 @@ +package sonia.scm.repository; + +import sonia.scm.plugin.Extension; + +@Extension +public class StaticSpacesStrategy implements SpacesStrategy { + @Override + public String getCurrentSpace() { + return "test"; + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 21ca876e41..1eaef333a1 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -39,14 +39,10 @@ import com.google.common.base.Throwables; import com.google.common.collect.Lists; import com.google.inject.Injector; import com.google.inject.Module; - import org.apache.shiro.guice.web.ShiroWebModule; - +import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener; - import sonia.scm.api.v2.resources.MapperModule; import sonia.scm.cache.CacheManager; import sonia.scm.debug.DebugModule; @@ -61,14 +57,13 @@ import sonia.scm.upgrade.UpgradeManager; import sonia.scm.user.UserManager; import sonia.scm.util.IOUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.List; -import java.util.Set; -import java.util.Collections; - import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -140,7 +135,7 @@ public class ScmContextListener extends GuiceResteasyBootstrapServletContextList moduleList.add(new EagerSingletonModule()); moduleList.add(ShiroWebModule.guiceFilterModule()); moduleList.add(new WebElementModule(pluginLoader)); - moduleList.add(new ScmServletModule(context, pluginLoader, overrides)); + moduleList.add(new ScmServletModule(context, pluginLoader, overrides, pluginLoader.getExtensionProcessor())); moduleList.add( new ScmSecurityModule(context, pluginLoader.getExtensionProcessor()) ); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index a09de33465..e523c76754 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -42,10 +42,8 @@ import com.google.inject.name.Names; import com.google.inject.servlet.RequestScoped; import com.google.inject.servlet.ServletModule; import com.google.inject.throwingproviders.ThrowingProviderBinder; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.api.rest.ObjectMapperProvider; import sonia.scm.cache.CacheManager; import sonia.scm.cache.GuavaCacheManager; @@ -58,8 +56,15 @@ import sonia.scm.group.GroupManagerProvider; import sonia.scm.group.xml.XmlGroupDAO; import sonia.scm.io.DefaultFileSystem; import sonia.scm.io.FileSystem; +import sonia.scm.net.SSLContextProvider; +import sonia.scm.net.ahc.AdvancedHttpClient; +import sonia.scm.net.ahc.ContentTransformer; +import sonia.scm.net.ahc.DefaultAdvancedHttpClient; +import sonia.scm.net.ahc.JsonContentTransformer; +import sonia.scm.net.ahc.XmlContentTransformer; import sonia.scm.plugin.DefaultPluginLoader; import sonia.scm.plugin.DefaultPluginManager; +import sonia.scm.plugin.ExtensionProcessor; import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginManager; import sonia.scm.repository.DefaultRepositoryManager; @@ -70,6 +75,7 @@ import sonia.scm.repository.RepositoryDAO; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManagerProvider; import sonia.scm.repository.RepositoryProvider; +import sonia.scm.repository.SpacesStrategy; import sonia.scm.repository.api.HookContextFactory; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.repository.spi.HookEventFacade; @@ -78,19 +84,25 @@ import sonia.scm.resources.DefaultResourceManager; import sonia.scm.resources.DevelopmentResourceManager; import sonia.scm.resources.ResourceManager; import sonia.scm.resources.ScriptResourceServlet; +import sonia.scm.schedule.QuartzScheduler; +import sonia.scm.schedule.Scheduler; +import sonia.scm.security.AuthorizationChangedEventProducer; import sonia.scm.security.CipherHandler; import sonia.scm.security.CipherUtil; +import sonia.scm.security.ConfigurableLoginAttemptHandler; import sonia.scm.security.DefaultKeyGenerator; import sonia.scm.security.DefaultSecuritySystem; import sonia.scm.security.KeyGenerator; +import sonia.scm.security.LoginAttemptHandler; import sonia.scm.security.SecuritySystem; import sonia.scm.store.BlobStoreFactory; import sonia.scm.store.ConfigurationEntryStoreFactory; +import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.DataStoreFactory; import sonia.scm.store.FileBlobStoreFactory; import sonia.scm.store.JAXBConfigurationEntryStoreFactory; -import sonia.scm.store.JAXBDataStoreFactory; import sonia.scm.store.JAXBConfigurationStoreFactory; +import sonia.scm.store.JAXBDataStoreFactory; import sonia.scm.template.MustacheTemplateEngine; import sonia.scm.template.TemplateEngine; import sonia.scm.template.TemplateEngineFactory; @@ -107,31 +119,17 @@ import sonia.scm.user.UserManagerProvider; import sonia.scm.user.xml.XmlUserDAO; import sonia.scm.util.DebugServlet; import sonia.scm.util.ScmConfigurationUtil; +import sonia.scm.web.UserAgentParser; import sonia.scm.web.cgi.CGIExecutorFactory; import sonia.scm.web.cgi.DefaultCGIExecutorFactory; import sonia.scm.web.filter.LoggingFilter; import sonia.scm.web.security.AdministrationContext; import sonia.scm.web.security.DefaultAdministrationContext; -//~--- JDK imports ------------------------------------------------------------ - - -import javax.servlet.ServletContext; -import sonia.scm.store.ConfigurationStoreFactory; - import javax.net.ssl.SSLContext; -import sonia.scm.net.SSLContextProvider; -import sonia.scm.net.ahc.AdvancedHttpClient; -import sonia.scm.net.ahc.ContentTransformer; -import sonia.scm.net.ahc.DefaultAdvancedHttpClient; -import sonia.scm.net.ahc.JsonContentTransformer; -import sonia.scm.net.ahc.XmlContentTransformer; -import sonia.scm.schedule.QuartzScheduler; -import sonia.scm.schedule.Scheduler; -import sonia.scm.security.ConfigurableLoginAttemptHandler; -import sonia.scm.security.LoginAttemptHandler; -import sonia.scm.security.AuthorizationChangedEventProducer; -import sonia.scm.web.UserAgentParser; +import javax.servlet.ServletContext; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -202,17 +200,18 @@ public class ScmServletModule extends ServletModule * Constructs ... * * - * * @param servletContext * @param pluginLoader * @param overrides + * @param extensionProcessor */ ScmServletModule(ServletContext servletContext, - DefaultPluginLoader pluginLoader, ClassOverrides overrides) + DefaultPluginLoader pluginLoader, ClassOverrides overrides, ExtensionProcessor extensionProcessor) { this.servletContext = servletContext; this.pluginLoader = pluginLoader; this.overrides = overrides; + this.extensionProcessor = extensionProcessor; } //~--- methods -------------------------------------------------------------- @@ -284,6 +283,9 @@ public class ScmServletModule extends ServletModule bind(UserDAO.class, XmlUserDAO.class); bind(RepositoryDAO.class, XmlRepositoryDAO.class); + Class mySpaceStrategy = extensionProcessor.byExtensionPoint(SpacesStrategy.class).iterator().next(); + bind(SpacesStrategy.class, mySpaceStrategy); + bindDecorated(RepositoryManager.class, DefaultRepositoryManager.class, RepositoryManagerProvider.class); bindDecorated(UserManager.class, DefaultUserManager.class, @@ -476,4 +478,6 @@ public class ScmServletModule extends ServletModule /** Field description */ private final ServletContext servletContext; + + private final ExtensionProcessor extensionProcessor; } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 8ddb02d9ca..2bc04bce8e 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -41,12 +41,9 @@ import com.google.common.collect.Lists; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.apache.shiro.concurrent.SubjectAwareExecutorService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.ArgumentIsInvalidException; import sonia.scm.ConfigurationException; import sonia.scm.HandlerEventType; @@ -60,10 +57,8 @@ import sonia.scm.util.HttpUtil; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.io.IOException; - import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -76,7 +71,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import javax.servlet.http.HttpServletRequest; +//~--- JDK imports ------------------------------------------------------------ /** * Default implementation of {@link RepositoryManager}. @@ -105,17 +100,19 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager * @param repositoryDAO * @param handlerSet * @param repositoryMatcher + * @param spaceStrategy */ @Inject public DefaultRepositoryManager(ScmConfiguration configuration, SCMContextProvider contextProvider, KeyGenerator keyGenerator, - RepositoryDAO repositoryDAO, Set handlerSet, - RepositoryMatcher repositoryMatcher) + RepositoryDAO repositoryDAO, Set handlerSet, + RepositoryMatcher repositoryMatcher, SpacesStrategy spaceStrategy) { this.configuration = configuration; this.keyGenerator = keyGenerator; this.repositoryDAO = repositoryDAO; this.repositoryMatcher = repositoryMatcher; + this.spaceStrategy = spaceStrategy; //J- ThreadFactory factory = new ThreadFactoryBuilder() @@ -169,6 +166,8 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager logger.info("create repository {} of type {}", repository.getName(), repository.getType()); + repository.setSpace(spaceStrategy.getCurrentSpace()); + RepositoryPermissions.create().check(); AssertUtil.assertIsValid(repository); @@ -740,4 +739,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager /** Field description */ private RepositoryMatcher repositoryMatcher; + + private final SpacesStrategy spaceStrategy; } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java index 90a78e63c6..af7aabf78f 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java @@ -33,13 +33,6 @@ package sonia.scm.repository; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableSet; import com.google.inject.Provider; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; @@ -58,7 +51,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import static org.mockito.Mockito.*; import org.mockito.runners.MockitoJUnitRunner; import sonia.scm.SCMContextProvider; import sonia.scm.Type; @@ -67,9 +59,19 @@ import sonia.scm.config.ScmConfiguration; import sonia.scm.security.AuthorizationCollector; import sonia.scm.security.DefaultKeyGenerator; import sonia.scm.security.KeyGenerator; -import sonia.scm.security.SecuritySystem; import sonia.scm.user.UserTestData; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * Performance test for {@link RepositoryManager#getAll()}. * @@ -117,8 +119,8 @@ public class DefaultRepositoryManagerPerfTest { keyGenerator, repositoryDAO, handlerSet, - repositoryMatcher - ); + repositoryMatcher, + mock(SpacesStrategy.class)); setUpTestRepositories(); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 8c60e45b04..ac78839e72 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -31,45 +31,54 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- + import com.github.legman.Subscribe; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.collect.ImmutableSet; - +import org.apache.shiro.authz.UnauthorizedException; +import org.junit.Rule; import org.junit.Test; - +import org.junit.rules.ExpectedException; +import org.mockito.invocation.InvocationOnMock; +import sonia.scm.HandlerEventType; +import sonia.scm.Manager; +import sonia.scm.ManagerTestBase; import sonia.scm.Type; import sonia.scm.config.ScmConfiguration; +import sonia.scm.event.ScmEventBus; import sonia.scm.repository.api.HookContext; import sonia.scm.repository.api.HookContextFactory; import sonia.scm.repository.api.HookFeature; import sonia.scm.repository.spi.HookContextProvider; import sonia.scm.repository.xml.XmlRepositoryDAO; import sonia.scm.security.DefaultKeyGenerator; +import sonia.scm.security.KeyGenerator; +import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.JAXBConfigurationStoreFactory; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import static org.hamcrest.Matchers.*; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; import java.util.Collection; import java.util.Collections; - import java.util.HashSet; import java.util.Set; import java.util.Stack; -import org.apache.shiro.authz.UnauthorizedException; -import org.junit.Rule; -import org.junit.rules.ExpectedException; -import org.mockito.invocation.InvocationOnMock; -import sonia.scm.HandlerEventType; -import sonia.scm.Manager; -import sonia.scm.ManagerTestBase; -import sonia.scm.event.ScmEventBus; -import sonia.scm.security.KeyGenerator; -import sonia.scm.store.ConfigurationStoreFactory; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +//~--- JDK imports ------------------------------------------------------------ /** * Unit tests for {@link DefaultRepositoryManager}. @@ -542,7 +551,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase