rename LinkEnricher to HalEnricher

This commit is contained in:
Sebastian Sdorra
2019-02-04 14:39:29 +01:00
parent 5ef99ce17b
commit a180f9b795
32 changed files with 153 additions and 158 deletions

View File

@@ -3,7 +3,7 @@ package sonia.scm.api.v2.resources;
import de.otto.edison.hal.HalRepresentation; import de.otto.edison.hal.HalRepresentation;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
public abstract class BaseMapper<T, D extends HalRepresentation> extends LinkAppenderMapper implements InstantAttributeMapper { public abstract class BaseMapper<T, D extends HalRepresentation> extends HalAppenderMapper implements InstantAttributeMapper {
@Mapping(target = "attributes", ignore = true) // We do not map HAL attributes @Mapping(target = "attributes", ignore = true) // We do not map HAL attributes
public abstract D map(T modelObject); public abstract D map(T modelObject);

View File

@@ -1,12 +1,12 @@
package sonia.scm.api.v2.resources; package sonia.scm.api.v2.resources;
/** /**
* The {@link LinkAppender} can be used within an {@link LinkEnricher} to append hateoas links to a json response. * The {@link HalAppender} can be used within an {@link HalEnricher} to append hateoas links to a json response.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 2.0.0 * @since 2.0.0
*/ */
public interface LinkAppender { public interface HalAppender {
/** /**
* Appends one link to the json response. * Appends one link to the json response.

View File

@@ -4,17 +4,17 @@ import com.google.common.annotations.VisibleForTesting;
import javax.inject.Inject; import javax.inject.Inject;
public class LinkAppenderMapper { public class HalAppenderMapper {
@Inject @Inject
private LinkEnricherRegistry registry; private HalEnricherRegistry registry;
@VisibleForTesting @VisibleForTesting
void setRegistry(LinkEnricherRegistry registry) { void setRegistry(HalEnricherRegistry registry) {
this.registry = registry; this.registry = registry;
} }
protected void appendLinks(LinkAppender appender, Object source, Object... contextEntries) { protected void appendLinks(HalAppender appender, Object source, Object... contextEntries) {
// null check is only their to not break existing tests // null check is only their to not break existing tests
if (registry != null) { if (registry != null) {
@@ -24,10 +24,10 @@ public class LinkAppenderMapper {
ctx[i + 1] = contextEntries[i]; ctx[i + 1] = contextEntries[i];
} }
LinkEnricherContext context = LinkEnricherContext.of(ctx); HalEnricherContext context = HalEnricherContext.of(ctx);
Iterable<LinkEnricher> enrichers = registry.allByType(source.getClass()); Iterable<HalEnricher> enrichers = registry.allByType(source.getClass());
for (LinkEnricher enricher : enrichers) { for (HalEnricher enricher : enrichers) {
enricher.enrich(context, appender); enricher.enrich(context, appender);
} }
} }

View File

@@ -3,8 +3,8 @@ package sonia.scm.api.v2.resources;
import sonia.scm.plugin.ExtensionPoint; import sonia.scm.plugin.ExtensionPoint;
/** /**
* A {@link LinkEnricher} can be used to append hateoas links to a specific json response. * A {@link HalEnricher} can be used to append hal specific attributes, such as links, to the json response.
* To register an enricher use the {@link Enrich} annotation or the {@link LinkEnricherRegistry} which is available * To register an enricher use the {@link Enrich} annotation or the {@link HalEnricherRegistry} which is available
* via injection. * via injection.
* *
* <b>Warning:</b> enrichers are always registered as singletons. * <b>Warning:</b> enrichers are always registered as singletons.
@@ -14,13 +14,13 @@ import sonia.scm.plugin.ExtensionPoint;
*/ */
@ExtensionPoint @ExtensionPoint
@FunctionalInterface @FunctionalInterface
public interface LinkEnricher { public interface HalEnricher {
/** /**
* Enriches the response with hateoas links. * Enriches the response with hal specific attributes.
* *
* @param context contains the source for the json mapping and related objects * @param context contains the source for the json mapping and related objects
* @param appender can be used to append links to the json response * @param appender can be used to append links or embedded objects to the json response
*/ */
void enrich(LinkEnricherContext context, LinkAppender appender); void enrich(HalEnricherContext context, HalAppender appender);
} }

View File

@@ -7,17 +7,17 @@ import java.util.NoSuchElementException;
import java.util.Optional; import java.util.Optional;
/** /**
* Context object for the {@link LinkEnricher}. The context holds the source object for the json and all related * Context object for the {@link HalEnricher}. The context holds the source object for the json and all related
* objects, which can be useful for the link creation. * objects, which can be useful for the enrichment.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 2.0.0 * @since 2.0.0
*/ */
public final class LinkEnricherContext { public final class HalEnricherContext {
private final Map<Class, Object> instanceMap; private final Map<Class, Object> instanceMap;
private LinkEnricherContext(Map<Class,Object> instanceMap) { private HalEnricherContext(Map<Class,Object> instanceMap) {
this.instanceMap = instanceMap; this.instanceMap = instanceMap;
} }
@@ -28,12 +28,12 @@ public final class LinkEnricherContext {
* *
* @return context of given entries * @return context of given entries
*/ */
public static LinkEnricherContext of(Object... instances) { public static HalEnricherContext of(Object... instances) {
ImmutableMap.Builder<Class, Object> builder = ImmutableMap.builder(); ImmutableMap.Builder<Class, Object> builder = ImmutableMap.builder();
for (Object instance : instances) { for (Object instance : instances) {
builder.put(instance.getClass(), instance); builder.put(instance.getClass(), instance);
} }
return new LinkEnricherContext(builder.build()); return new HalEnricherContext(builder.build());
} }
/** /**

View File

@@ -7,34 +7,34 @@ import sonia.scm.plugin.Extension;
import javax.inject.Singleton; import javax.inject.Singleton;
/** /**
* The {@link LinkEnricherRegistry} is responsible for binding {@link LinkEnricher} instances to their source types. * The {@link HalEnricherRegistry} is responsible for binding {@link HalEnricher} instances to their source types.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 2.0.0 * @since 2.0.0
*/ */
@Extension @Extension
@Singleton @Singleton
public final class LinkEnricherRegistry { public final class HalEnricherRegistry {
private final Multimap<Class, LinkEnricher> enrichers = HashMultimap.create(); private final Multimap<Class, HalEnricher> enrichers = HashMultimap.create();
/** /**
* Registers a new {@link LinkEnricher} for the given source type. * Registers a new {@link HalEnricher} for the given source type.
* *
* @param sourceType type of json mapping source * @param sourceType type of json mapping source
* @param enricher link enricher instance * @param enricher link enricher instance
*/ */
public void register(Class sourceType, LinkEnricher enricher) { public void register(Class sourceType, HalEnricher enricher) {
enrichers.put(sourceType, enricher); enrichers.put(sourceType, enricher);
} }
/** /**
* Returns all registered {@link LinkEnricher} for the given type. * Returns all registered {@link HalEnricher} for the given type.
* *
* @param sourceType type of json mapping source * @param sourceType type of json mapping source
* @return all registered enrichers * @return all registered enrichers
*/ */
public Iterable<LinkEnricher> allByType(Class sourceType) { public Iterable<HalEnricher> allByType(Class sourceType) {
return enrichers.get(sourceType); return enrichers.get(sourceType);
} }
} }

View File

@@ -1,7 +1,7 @@
package sonia.scm.api.v2.resources; package sonia.scm.api.v2.resources;
/** /**
* The {@link Index} object can be used to register a {@link LinkEnricher} for the index resource. * The {@link Index} object can be used to register a {@link HalEnricher} for the index resource.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 2.0.0 * @since 2.0.0

View File

@@ -1,7 +1,7 @@
package sonia.scm.api.v2.resources; package sonia.scm.api.v2.resources;
/** /**
* The {@link Me} object can be used to register a {@link LinkEnricher} for the me resource. * The {@link Me} object can be used to register a {@link HalEnricher} for the me resource.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 2.0.0 * @since 2.0.0

View File

@@ -11,18 +11,18 @@ import java.util.Optional;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
class LinkAppenderMapperTest { class HalAppenderMapperTest {
@Mock @Mock
private LinkAppender appender; private HalAppender appender;
private LinkEnricherRegistry registry; private HalEnricherRegistry registry;
private LinkAppenderMapper mapper; private HalAppenderMapper mapper;
@BeforeEach @BeforeEach
void beforeEach() { void beforeEach() {
registry = new LinkEnricherRegistry(); registry = new HalEnricherRegistry();
mapper = new LinkAppenderMapper(); mapper = new HalAppenderMapper();
mapper.setRegistry(registry); mapper.setRegistry(registry);
} }

View File

@@ -7,17 +7,17 @@ import org.junit.jupiter.api.Test;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
class LinkEnricherContextTest { class HalEnricherContextTest {
@Test @Test
void shouldCreateContextFromSingleObject() { void shouldCreateContextFromSingleObject() {
LinkEnricherContext context = LinkEnricherContext.of("hello"); HalEnricherContext context = HalEnricherContext.of("hello");
assertThat(context.oneByType(String.class)).contains("hello"); assertThat(context.oneByType(String.class)).contains("hello");
} }
@Test @Test
void shouldCreateContextFromMultipleObjects() { void shouldCreateContextFromMultipleObjects() {
LinkEnricherContext context = LinkEnricherContext.of("hello", Integer.valueOf(42), Long.valueOf(21L)); HalEnricherContext context = HalEnricherContext.of("hello", Integer.valueOf(42), Long.valueOf(21L));
assertThat(context.oneByType(String.class)).contains("hello"); assertThat(context.oneByType(String.class)).contains("hello");
assertThat(context.oneByType(Integer.class)).contains(42); assertThat(context.oneByType(Integer.class)).contains(42);
assertThat(context.oneByType(Long.class)).contains(21L); assertThat(context.oneByType(Long.class)).contains(21L);
@@ -25,19 +25,19 @@ class LinkEnricherContextTest {
@Test @Test
void shouldReturnEmptyOptionalForUnknownTypes() { void shouldReturnEmptyOptionalForUnknownTypes() {
LinkEnricherContext context = LinkEnricherContext.of(); HalEnricherContext context = HalEnricherContext.of();
assertThat(context.oneByType(String.class)).isNotPresent(); assertThat(context.oneByType(String.class)).isNotPresent();
} }
@Test @Test
void shouldReturnRequiredObject() { void shouldReturnRequiredObject() {
LinkEnricherContext context = LinkEnricherContext.of("hello"); HalEnricherContext context = HalEnricherContext.of("hello");
assertThat(context.oneRequireByType(String.class)).isEqualTo("hello"); assertThat(context.oneRequireByType(String.class)).isEqualTo("hello");
} }
@Test @Test
void shouldThrowAnNoSuchElementExceptionForUnknownTypes() { void shouldThrowAnNoSuchElementExceptionForUnknownTypes() {
LinkEnricherContext context = LinkEnricherContext.of(); HalEnricherContext context = HalEnricherContext.of();
assertThrows(NoSuchElementException.class, () -> context.oneRequireByType(String.class)); assertThrows(NoSuchElementException.class, () -> context.oneRequireByType(String.class));
} }

View File

@@ -5,54 +5,54 @@ import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class LinkEnricherRegistryTest { class HalEnricherRegistryTest {
private LinkEnricherRegistry registry; private HalEnricherRegistry registry;
@BeforeEach @BeforeEach
void setUpObjectUnderTest() { void setUpObjectUnderTest() {
registry = new LinkEnricherRegistry(); registry = new HalEnricherRegistry();
} }
@Test @Test
void shouldRegisterTheEnricher() { void shouldRegisterTheEnricher() {
SampleLinkEnricher enricher = new SampleLinkEnricher(); SampleHalEnricher enricher = new SampleHalEnricher();
registry.register(String.class, enricher); registry.register(String.class, enricher);
Iterable<LinkEnricher> enrichers = registry.allByType(String.class); Iterable<HalEnricher> enrichers = registry.allByType(String.class);
assertThat(enrichers).containsOnly(enricher); assertThat(enrichers).containsOnly(enricher);
} }
@Test @Test
void shouldRegisterMultipleEnrichers() { void shouldRegisterMultipleEnrichers() {
SampleLinkEnricher one = new SampleLinkEnricher(); SampleHalEnricher one = new SampleHalEnricher();
registry.register(String.class, one); registry.register(String.class, one);
SampleLinkEnricher two = new SampleLinkEnricher(); SampleHalEnricher two = new SampleHalEnricher();
registry.register(String.class, two); registry.register(String.class, two);
Iterable<LinkEnricher> enrichers = registry.allByType(String.class); Iterable<HalEnricher> enrichers = registry.allByType(String.class);
assertThat(enrichers).containsOnly(one, two); assertThat(enrichers).containsOnly(one, two);
} }
@Test @Test
void shouldRegisterEnrichersForDifferentTypes() { void shouldRegisterEnrichersForDifferentTypes() {
SampleLinkEnricher one = new SampleLinkEnricher(); SampleHalEnricher one = new SampleHalEnricher();
registry.register(String.class, one); registry.register(String.class, one);
SampleLinkEnricher two = new SampleLinkEnricher(); SampleHalEnricher two = new SampleHalEnricher();
registry.register(Integer.class, two); registry.register(Integer.class, two);
Iterable<LinkEnricher> enrichers = registry.allByType(String.class); Iterable<HalEnricher> enrichers = registry.allByType(String.class);
assertThat(enrichers).containsOnly(one); assertThat(enrichers).containsOnly(one);
enrichers = registry.allByType(Integer.class); enrichers = registry.allByType(Integer.class);
assertThat(enrichers).containsOnly(two); assertThat(enrichers).containsOnly(two);
} }
private static class SampleLinkEnricher implements LinkEnricher { private static class SampleHalEnricher implements HalEnricher {
@Override @Override
public void enrich(LinkEnricherContext context, LinkAppender appender) { public void enrich(HalEnricherContext context, HalAppender appender) {
} }
} }

View File

@@ -15,7 +15,7 @@ import static de.otto.edison.hal.Link.linkBuilder;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
@Mapper @Mapper
public abstract class BranchToBranchDtoMapper extends LinkAppenderMapper { public abstract class BranchToBranchDtoMapper extends HalAppenderMapper {
@Inject @Inject
private ResourceLinks resourceLinks; private ResourceLinks resourceLinks;
@@ -31,7 +31,7 @@ public abstract class BranchToBranchDtoMapper extends LinkAppenderMapper {
.single(linkBuilder("changeset", resourceLinks.changeset().changeset(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())).build()) .single(linkBuilder("changeset", resourceLinks.changeset().changeset(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())).build())
.single(linkBuilder("source", resourceLinks.source().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())).build()); .single(linkBuilder("source", resourceLinks.source().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())).build());
appendLinks(new EdisonLinkAppender(linksBuilder), source, namespaceAndName); appendLinks(new EdisonHalAppender(linksBuilder), source, namespaceAndName);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -23,7 +23,7 @@ import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
@Mapper @Mapper
public abstract class ChangesetToChangesetDtoMapper extends LinkAppenderMapper implements InstantAttributeMapper { public abstract class ChangesetToChangesetDtoMapper extends HalAppenderMapper implements InstantAttributeMapper {
@Inject @Inject
private RepositoryServiceFactory serviceFactory; private RepositoryServiceFactory serviceFactory;
@@ -68,7 +68,7 @@ public abstract class ChangesetToChangesetDtoMapper extends LinkAppenderMapper i
.single(link("diff", resourceLinks.diff().self(namespace, name, target.getId()))) .single(link("diff", resourceLinks.diff().self(namespace, name, target.getId())))
.single(link("modifications", resourceLinks.modifications().self(namespace, name, target.getId()))); .single(link("modifications", resourceLinks.modifications().self(namespace, name, target.getId())));
appendLinks(new EdisonLinkAppender(linksBuilder), source, repository); appendLinks(new EdisonHalAppender(linksBuilder), source, repository);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -6,11 +6,11 @@ import de.otto.edison.hal.Links;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
class EdisonLinkAppender implements LinkAppender { class EdisonHalAppender implements HalAppender {
private final Links.Builder builder; private final Links.Builder builder;
EdisonLinkAppender(Links.Builder builder) { EdisonHalAppender(Links.Builder builder) {
this.builder = builder; this.builder = builder;
} }

View File

@@ -12,13 +12,10 @@ import sonia.scm.repository.SubRepository;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.List;
import java.util.stream.Collectors;
import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Link.link;
@Mapper @Mapper
public abstract class FileObjectToFileObjectDtoMapper extends LinkAppenderMapper implements InstantAttributeMapper { public abstract class FileObjectToFileObjectDtoMapper extends HalAppenderMapper implements InstantAttributeMapper {
@Inject @Inject
private ResourceLinks resourceLinks; private ResourceLinks resourceLinks;
@@ -39,7 +36,7 @@ public abstract class FileObjectToFileObjectDtoMapper extends LinkAppenderMapper
links.single(link("history", resourceLinks.fileHistory().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), revision, path))); links.single(link("history", resourceLinks.fileHistory().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), revision, path)));
} }
appendLinks(new EdisonLinkAppender(links), fileObject, namespaceAndName, revision); appendLinks(new EdisonHalAppender(links), fileObject, namespaceAndName, revision);
dto.add(links.build()); dto.add(links.build());
} }

View File

@@ -36,7 +36,7 @@ public abstract class GroupToGroupDtoMapper extends BaseMapper<Group, GroupDto>
linksBuilder.single(link("permissions", resourceLinks.groupPermissions().permissions(target.getName()))); linksBuilder.single(link("permissions", resourceLinks.groupPermissions().permissions(target.getName())));
} }
appendLinks(new EdisonLinkAppender(linksBuilder), group); appendLinks(new EdisonHalAppender(linksBuilder), group);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -15,7 +15,7 @@ import java.util.List;
import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Link.link;
public class IndexDtoGenerator extends LinkAppenderMapper { public class IndexDtoGenerator extends HalAppenderMapper {
private final ResourceLinks resourceLinks; private final ResourceLinks resourceLinks;
private final SCMContextProvider scmContextProvider; private final SCMContextProvider scmContextProvider;
@@ -61,7 +61,7 @@ public class IndexDtoGenerator extends LinkAppenderMapper {
builder.single(link("login", resourceLinks.authentication().jsonLogin())); builder.single(link("login", resourceLinks.authentication().jsonLogin()));
} }
appendLinks(new EdisonLinkAppender(builder), new Index()); appendLinks(new EdisonHalAppender(builder), new Index());
return new IndexDto(scmContextProvider.getVersion(), builder.build()); return new IndexDto(scmContextProvider.getVersion(), builder.build());
} }

View File

@@ -10,30 +10,30 @@ import javax.servlet.ServletContextListener;
import java.util.Set; import java.util.Set;
/** /**
* Registers every {@link LinkEnricher} which is annotated with an {@link Enrich} annotation. * Registers every {@link HalEnricher} which is annotated with an {@link Enrich} annotation.
*/ */
@Extension @Extension
public class LinkEnricherAutoRegistration implements ServletContextListener { public class LinkEnricherAutoRegistration implements ServletContextListener {
private static final Logger LOG = LoggerFactory.getLogger(LinkEnricherAutoRegistration.class); private static final Logger LOG = LoggerFactory.getLogger(LinkEnricherAutoRegistration.class);
private final LinkEnricherRegistry registry; private final HalEnricherRegistry registry;
private final Set<LinkEnricher> enrichers; private final Set<HalEnricher> enrichers;
@Inject @Inject
public LinkEnricherAutoRegistration(LinkEnricherRegistry registry, Set<LinkEnricher> enrichers) { public LinkEnricherAutoRegistration(HalEnricherRegistry registry, Set<HalEnricher> enrichers) {
this.registry = registry; this.registry = registry;
this.enrichers = enrichers; this.enrichers = enrichers;
} }
@Override @Override
public void contextInitialized(ServletContextEvent sce) { public void contextInitialized(ServletContextEvent sce) {
for (LinkEnricher enricher : enrichers) { for (HalEnricher enricher : enrichers) {
Enrich annotation = enricher.getClass().getAnnotation(Enrich.class); Enrich annotation = enricher.getClass().getAnnotation(Enrich.class);
if (annotation != null) { if (annotation != null) {
registry.register(annotation.value(), enricher); registry.register(annotation.value(), enricher);
} else { } else {
LOG.warn("found LinkEnricher extension {} without Enrich annotation", enricher.getClass()); LOG.warn("found HalEnricher extension {} without Enrich annotation", enricher.getClass());
} }
} }
} }

View File

@@ -16,7 +16,7 @@ import java.util.Collections;
import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
public class MeDtoFactory extends LinkAppenderMapper { public class MeDtoFactory extends HalAppenderMapper {
private final ResourceLinks resourceLinks; private final ResourceLinks resourceLinks;
private final UserManager userManager; private final UserManager userManager;
@@ -73,7 +73,7 @@ public class MeDtoFactory extends LinkAppenderMapper {
linksBuilder.single(link("password", resourceLinks.me().passwordChange())); linksBuilder.single(link("password", resourceLinks.me().passwordChange()));
} }
appendLinks(new EdisonLinkAppender(linksBuilder), new Me(), user); appendLinks(new EdisonHalAppender(linksBuilder), new Me(), user);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -70,7 +70,7 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper<Reposit
linksBuilder.single(link("changesets", resourceLinks.changeset().all(target.getNamespace(), target.getName()))); linksBuilder.single(link("changesets", resourceLinks.changeset().all(target.getNamespace(), target.getName())));
linksBuilder.single(link("sources", resourceLinks.source().selfWithoutRevision(target.getNamespace(), target.getName()))); linksBuilder.single(link("sources", resourceLinks.source().selfWithoutRevision(target.getNamespace(), target.getName())));
appendLinks(new EdisonLinkAppender(linksBuilder), repository); appendLinks(new EdisonHalAppender(linksBuilder), repository);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -15,7 +15,7 @@ import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
@Mapper @Mapper
public abstract class TagToTagDtoMapper extends LinkAppenderMapper { public abstract class TagToTagDtoMapper extends HalAppenderMapper {
@Inject @Inject
private ResourceLinks resourceLinks; private ResourceLinks resourceLinks;
@@ -30,7 +30,7 @@ public abstract class TagToTagDtoMapper extends LinkAppenderMapper {
.single(link("sources", resourceLinks.source().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision()))) .single(link("sources", resourceLinks.source().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())))
.single(link("changeset", resourceLinks.changeset().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision()))); .single(link("changeset", resourceLinks.changeset().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), target.getRevision())));
appendLinks(new EdisonLinkAppender(linksBuilder), tag, namespaceAndName); appendLinks(new EdisonHalAppender(linksBuilder), tag, namespaceAndName);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -47,7 +47,7 @@ public abstract class UserToUserDtoMapper extends BaseMapper<User, UserDto> {
linksBuilder.single(link("permissions", resourceLinks.userPermissions().permissions(target.getName()))); linksBuilder.single(link("permissions", resourceLinks.userPermissions().permissions(target.getName())));
} }
appendLinks(new EdisonLinkAppender(linksBuilder), user); appendLinks(new EdisonHalAppender(linksBuilder), user);
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }

View File

@@ -24,7 +24,7 @@ class BranchToBranchDtoMapperTest {
@Test @Test
void shouldAppendLinks() { void shouldAppendLinks() {
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(Branch.class, (ctx, appender) -> { registry.register(Branch.class, (ctx, appender) -> {
NamespaceAndName namespaceAndName = ctx.oneRequireByType(NamespaceAndName.class); NamespaceAndName namespaceAndName = ctx.oneRequireByType(NamespaceAndName.class);
Branch branch = ctx.oneRequireByType(Branch.class); Branch branch = ctx.oneRequireByType(Branch.class);

View File

@@ -10,15 +10,15 @@ import java.util.List;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class EdisonLinkAppenderTest { class EdisonHalAppenderTest {
private Links.Builder builder; private Links.Builder builder;
private EdisonLinkAppender appender; private EdisonHalAppender appender;
@BeforeEach @BeforeEach
void prepare() { void prepare() {
builder = linkingTo(); builder = linkingTo();
appender = new EdisonLinkAppender(builder); appender = new EdisonHalAppender(builder);
} }
@Test @Test

View File

@@ -73,7 +73,7 @@ public class FileObjectToFileObjectDtoMapperTest {
@Test @Test
public void shouldAppendLinks() { public void shouldAppendLinks() {
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(FileObject.class, (ctx, appender) -> { registry.register(FileObject.class, (ctx, appender) -> {
NamespaceAndName repository = ctx.oneRequireByType(NamespaceAndName.class); NamespaceAndName repository = ctx.oneRequireByType(NamespaceAndName.class);
FileObject fo = ctx.oneRequireByType(FileObject.class); FileObject fo = ctx.oneRequireByType(FileObject.class);

View File

@@ -11,7 +11,6 @@ import org.mockito.InjectMocks;
import sonia.scm.group.Group; import sonia.scm.group.Group;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
@@ -91,7 +90,7 @@ public class GroupToGroupDtoMapperTest {
@Test @Test
public void shouldAppendLinks() { public void shouldAppendLinks() {
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(Group.class, (ctx, appender) -> { registry.register(Group.class, (ctx, appender) -> {
Group group = ctx.oneRequireByType(Group.class); Group group = ctx.oneRequireByType(Group.class);
appender.appendOne("some", "http://" + group.getName()); appender.appendOne("some", "http://" + group.getName());

View File

@@ -0,0 +1,64 @@
package sonia.scm.api.v2.resources;
import com.google.common.collect.ImmutableSet;
import org.junit.jupiter.api.Test;
import java.util.Set;
import static org.assertj.core.api.Java6Assertions.assertThat;
class HalEnricherAutoRegistrationTest {
@Test
void shouldRegisterAllAvailableLinkEnrichers() {
HalEnricher one = new One();
HalEnricher two = new Two();
HalEnricher three = new Three();
HalEnricher four = new Four();
Set<HalEnricher> enrichers = ImmutableSet.of(one, two, three, four);
HalEnricherRegistry registry = new HalEnricherRegistry();
LinkEnricherAutoRegistration autoRegistration = new LinkEnricherAutoRegistration(registry, enrichers);
autoRegistration.contextInitialized(null);
assertThat(registry.allByType(String.class)).containsOnly(one, two);
assertThat(registry.allByType(Integer.class)).containsOnly(three);
}
@Enrich(String.class)
public static class One implements HalEnricher {
@Override
public void enrich(HalEnricherContext context, HalAppender appender) {
}
}
@Enrich(String.class)
public static class Two implements HalEnricher {
@Override
public void enrich(HalEnricherContext context, HalAppender appender) {
}
}
@Enrich(Integer.class)
public static class Three implements HalEnricher {
@Override
public void enrich(HalEnricherContext context, HalAppender appender) {
}
}
public static class Four implements HalEnricher {
@Override
public void enrich(HalEnricherContext context, HalAppender appender) {
}
}
}

View File

@@ -1,64 +0,0 @@
package sonia.scm.api.v2.resources;
import com.google.common.collect.ImmutableSet;
import org.junit.jupiter.api.Test;
import java.util.Set;
import static org.assertj.core.api.Java6Assertions.assertThat;
class LinkEnricherAutoRegistrationTest {
@Test
void shouldRegisterAllAvailableLinkEnrichers() {
LinkEnricher one = new One();
LinkEnricher two = new Two();
LinkEnricher three = new Three();
LinkEnricher four = new Four();
Set<LinkEnricher> enrichers = ImmutableSet.of(one, two, three, four);
LinkEnricherRegistry registry = new LinkEnricherRegistry();
LinkEnricherAutoRegistration autoRegistration = new LinkEnricherAutoRegistration(registry, enrichers);
autoRegistration.contextInitialized(null);
assertThat(registry.allByType(String.class)).containsOnly(one, two);
assertThat(registry.allByType(Integer.class)).containsOnly(three);
}
@Enrich(String.class)
public static class One implements LinkEnricher {
@Override
public void enrich(LinkEnricherContext context, LinkAppender appender) {
}
}
@Enrich(String.class)
public static class Two implements LinkEnricher {
@Override
public void enrich(LinkEnricherContext context, LinkAppender appender) {
}
}
@Enrich(Integer.class)
public static class Three implements LinkEnricher {
@Override
public void enrich(LinkEnricherContext context, LinkAppender appender) {
}
}
public static class Four implements LinkEnricher {
@Override
public void enrich(LinkEnricherContext context, LinkAppender appender) {
}
}
}

View File

@@ -15,7 +15,6 @@ import org.mockito.quality.Strictness;
import sonia.scm.group.GroupNames; import sonia.scm.group.GroupNames;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserManager; import sonia.scm.user.UserManager;
import sonia.scm.user.UserPermissions;
import sonia.scm.user.UserTestData; import sonia.scm.user.UserTestData;
import java.net.URI; import java.net.URI;
@@ -170,7 +169,7 @@ class MeDtoFactoryTest {
void shouldAppendLinks() { void shouldAppendLinks() {
prepareSubject(UserTestData.createTrillian()); prepareSubject(UserTestData.createTrillian());
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
meDtoFactory.setRegistry(registry); meDtoFactory.setRegistry(registry);
registry.register(Me.class, (ctx, appender) -> { registry.register(Me.class, (ctx, appender) -> {

View File

@@ -211,7 +211,7 @@ public class RepositoryToRepositoryDtoMapperTest {
@Test @Test
public void shouldAppendLinks() { public void shouldAppendLinks() {
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(Repository.class, (ctx, appender) -> { registry.register(Repository.class, (ctx, appender) -> {
Repository repository = ctx.oneRequireByType(Repository.class); Repository repository = ctx.oneRequireByType(Repository.class);
appender.appendOne("id", "http://" + repository.getId()); appender.appendOne("id", "http://" + repository.getId());

View File

@@ -22,7 +22,7 @@ class TagToTagDtoMapperTest {
@Test @Test
void shouldAppendLinks() { void shouldAppendLinks() {
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(Tag.class, (ctx, appender) -> { registry.register(Tag.class, (ctx, appender) -> {
NamespaceAndName repository = ctx.oneRequireByType(NamespaceAndName.class); NamespaceAndName repository = ctx.oneRequireByType(NamespaceAndName.class);
Tag tag = ctx.oneRequireByType(Tag.class); Tag tag = ctx.oneRequireByType(Tag.class);

View File

@@ -155,7 +155,7 @@ public class UserToUserDtoMapperTest {
public void shouldAppendLink() { public void shouldAppendLink() {
User trillian = UserTestData.createTrillian(); User trillian = UserTestData.createTrillian();
LinkEnricherRegistry registry = new LinkEnricherRegistry(); HalEnricherRegistry registry = new HalEnricherRegistry();
registry.register(User.class, (ctx, appender) -> appender.appendOne("sample", "http://" + ctx.oneByType(User.class).get().getName())); registry.register(User.class, (ctx, appender) -> appender.appendOne("sample", "http://" + ctx.oneByType(User.class).get().getName()));
mapper.setRegistry(registry); mapper.setRegistry(registry);