Remove duplicates

This commit is contained in:
René Pfeuffer
2019-01-23 12:33:34 +01:00
parent fdf4421a55
commit 69b64948a0
3 changed files with 58 additions and 22 deletions

View File

@@ -4,7 +4,6 @@ import com.google.inject.Inject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginLoader;
import sonia.scm.store.ConfigurationEntryStoreFactory;
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBException;
@@ -16,30 +15,33 @@ import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.util.Collections.unmodifiableCollection;
public class RepositoryPermissionProvider { public class RepositoryPermissionProvider {
private static final Logger logger = LoggerFactory.getLogger(RepositoryPermissionProvider.class); private static final Logger logger = LoggerFactory.getLogger(RepositoryPermissionProvider.class);
private static final String REPOSITORY_PERMISSION_DESCRIPTOR = "META-INF/scm/repository-permissions.xml"; private static final String REPOSITORY_PERMISSION_DESCRIPTOR = "META-INF/scm/repository-permissions.xml";
private final ConfigurationEntryStoreFactory storeFactory; private final Collection<String> availableVerbs;
private final AvailableRepositoryPermissions availablePermissions; private final Collection<RepositoryRole> availableRoles;
@Inject @Inject
public RepositoryPermissionProvider(ConfigurationEntryStoreFactory storeFactory, PluginLoader pluginLoader) { public RepositoryPermissionProvider(PluginLoader pluginLoader) {
this.storeFactory = storeFactory; AvailableRepositoryPermissions availablePermissions = readAvailablePermissions(pluginLoader);
this.availablePermissions = readAvailablePermissions(pluginLoader); this.availableVerbs = unmodifiableCollection(new HashSet<>(availablePermissions.availableVerbs));
this.availableRoles = unmodifiableCollection(new HashSet<>(availablePermissions.availableRoles.stream().map(r -> new RepositoryRole(r.name, r.verbs.verbs)).collect(Collectors.toList())));
} }
public Collection<String> availableVerbs() { public Collection<String> availableVerbs() {
return availablePermissions.availableVerbs; return availableVerbs;
} }
public Collection<RoleDescriptor> availableRoles() { public Collection<RepositoryRole> availableRoles() {
return availablePermissions.availableRoles; return availableRoles;
} }
private static AvailableRepositoryPermissions readAvailablePermissions(PluginLoader pluginLoader) { private static AvailableRepositoryPermissions readAvailablePermissions(PluginLoader pluginLoader) {
@@ -93,8 +95,8 @@ public class RepositoryPermissionProvider {
private final Collection<RoleDescriptor> availableRoles; private final Collection<RoleDescriptor> availableRoles;
private AvailableRepositoryPermissions(Collection<String> availableVerbs, Collection<RoleDescriptor> availableRoles) { private AvailableRepositoryPermissions(Collection<String> availableVerbs, Collection<RoleDescriptor> availableRoles) {
this.availableVerbs = Collections.unmodifiableCollection(availableVerbs); this.availableVerbs = unmodifiableCollection(availableVerbs);
this.availableRoles = Collections.unmodifiableCollection(availableRoles); this.availableRoles = unmodifiableCollection(availableRoles);
} }
} }
@@ -124,13 +126,5 @@ public class RepositoryPermissionProvider {
private String name; private String name;
@XmlElement(name = "verbs") @XmlElement(name = "verbs")
private VerbListDescriptor verbs = new VerbListDescriptor(); private VerbListDescriptor verbs = new VerbListDescriptor();
public Collection<String> getVerbs() {
return Collections.unmodifiableCollection(verbs.verbs);
}
public String toString() {
return "Role " + name + " (" + verbs.verbs.stream().collect(Collectors.joining(", ")) + ")";
}
} }
} }

View File

@@ -0,0 +1,42 @@
package sonia.scm.security;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
public class RepositoryRole {
private final String name;
private final Collection<String> verbs;
public RepositoryRole(String name, Collection<String> verbs) {
this.name = name;
this.verbs = verbs;
}
public String getName() {
return name;
}
public Collection<String> getVerbs() {
return Collections.unmodifiableCollection(verbs);
}
public String toString() {
return "Role " + name + " (" + String.join(", ", verbs) + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof RepositoryRole)) return false;
RepositoryRole that = (RepositoryRole) o;
return name.equals(that.name) &&
verbs.equals(that.verbs);
}
@Override
public int hashCode() {
return Objects.hash(name, verbs);
}
}

View File

@@ -26,7 +26,7 @@ class RepositoryPermissionProviderTest {
PluginLoader pluginLoader = mock(PluginLoader.class); PluginLoader pluginLoader = mock(PluginLoader.class);
when(pluginLoader.getUberClassLoader()).thenReturn(ClassLoaders.getContextClassLoader(DefaultSecuritySystem.class)); when(pluginLoader.getUberClassLoader()).thenReturn(ClassLoaders.getContextClassLoader(DefaultSecuritySystem.class));
ConfigurationEntryStoreFactory configurationEntryStoreFactory = mock(ConfigurationEntryStoreFactory.class); ConfigurationEntryStoreFactory configurationEntryStoreFactory = mock(ConfigurationEntryStoreFactory.class);
repositoryPermissionProvider = new RepositoryPermissionProvider(configurationEntryStoreFactory, pluginLoader); repositoryPermissionProvider = new RepositoryPermissionProvider(pluginLoader);
allVerbsFromRepositoryClass = Arrays.stream(RepositoryPermissions.class.getDeclaredFields()) allVerbsFromRepositoryClass = Arrays.stream(RepositoryPermissions.class.getDeclaredFields())
.filter(field -> field.getName().startsWith("ACTION_")) .filter(field -> field.getName().startsWith("ACTION_"))
.map(this::getString) .map(this::getString)
@@ -40,7 +40,7 @@ class RepositoryPermissionProviderTest {
assertThat(repositoryPermissionProvider.availableRoles()).allSatisfy(this::eitherStarOrOnlyAvailableVerbs); assertThat(repositoryPermissionProvider.availableRoles()).allSatisfy(this::eitherStarOrOnlyAvailableVerbs);
} }
private void eitherStarOrOnlyAvailableVerbs(RepositoryPermissionProvider.RoleDescriptor role) { private void eitherStarOrOnlyAvailableVerbs(RepositoryRole role) {
if (!role.getVerbs().contains("*") || role.getVerbs().size() > 1) { if (!role.getVerbs().contains("*") || role.getVerbs().size() > 1) {
assertThat(role.getVerbs()).isSubsetOf(allVerbsFromRepositoryClass); assertThat(role.getVerbs()).isSubsetOf(allVerbsFromRepositoryClass);
} }