mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-15 09:46:16 +01:00
rename LinkEnricher to HalEnricher
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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) -> {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user