Skip to content

Commit eb45b17

Browse files
committed
GH-2383 - Avoid reflection in IanaLinkRelations.
1 parent e361b02 commit eb45b17

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

src/main/java/org/springframework/hateoas/IanaLinkRelations.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@
1515
*/
1616
package org.springframework.hateoas;
1717

18-
import java.util.Arrays;
1918
import java.util.Set;
20-
import java.util.stream.Collectors;
2119

2220
import org.springframework.util.Assert;
23-
import org.springframework.util.ReflectionUtils;
2421

2522
/**
2623
* Capture standard IANA-based link relations.
@@ -1224,17 +1221,17 @@ public final class IanaLinkRelations {
12241221
/**
12251222
* Consolidated collection of {@link IanaLinkRelations}s.
12261223
*/
1227-
private static final Set<LinkRelation> LINK_RELATIONS;
1228-
1229-
static {
1230-
1231-
LINK_RELATIONS = Arrays.stream(IanaLinkRelations.class.getDeclaredFields()) //
1232-
.filter(ReflectionUtils::isPublicStaticFinal) //
1233-
.filter(field -> LinkRelation.class.equals(field.getType())) //
1234-
.map(it -> ReflectionUtils.getField(it, null)) //
1235-
.map(LinkRelation.class::cast) //
1236-
.collect(Collectors.toSet());
1237-
}
1224+
private static final Set<LinkRelation> LINK_RELATIONS = Set.of(ABOUT, ALTERNATE, APPENDIX, ARCHIVES, AUTHOR,
1225+
BLOCKED_BY, BOOKMARK, CANONICAL, CHAPTER, CITE_AS, COLLECTION, CONTENTS, CONVERTED_FROM, COPYRIGHT, CREATE_FORM,
1226+
CURRENT, DESCRIBED_BY, DESCRIBES, DISCLOSURE, DNS_PREFETCH, DUPLICATE, EDIT, EDIT_FORM, EDIT_MEDIA, ENCLOSURE,
1227+
FIRST, GLOSSARY, HELP, HOSTS, HUB, ICON, INDEX, INTERVAL_AFTER, INTERVAL_BEFORE, INTERVAL_CONTAINS,
1228+
INTERVAL_DISJOINT, INTERVAL_DURING, INTERVAL_EQUALS, INTERVAL_FINISHED_BY, INTERVAL_FINISHES, INTERVAL_IN,
1229+
INTERVAL_MEETS, INTERVAL_MET_BY, INTERVAL_OVERLAPPED_BY, INTERVAL_OVERLAPS, INTERVAL_STARTED_BY, INTERVAL_STARTS,
1230+
ITEM, LAST, LATEST_VERSION, LICENSE, LRDD, MEMENTO, MONITOR, MONITOR_GROUP, NEXT, NEXT_ARCHIVE, NOFOLLOW,
1231+
NOREFERRER, ORIGINAL, PAYMENT, PINGBACK, PRECONNECT, PREDECESSOR_VERSION, PREFETCH, PRELOAD, PRERENDER, PREV,
1232+
PREVIEW, PREVIOUS, PREV_ARCHIVE, PRIVACY_POLICY, PROFILE, RELATED, RESTCONF, REPLIES, SEARCH, SECTION, SELF,
1233+
SERVICE, START, STYLESHEET, SUBSECTION, SUCCESSOR_VERSION, TAG, TERMS_OF_SERVICE, TIMEGATE, TIMEMAP, TYPE, UP,
1234+
VERSION_HISTORY, VIA, WEBMENTION, WORKING_COPY, WORKING_COPY_OF);
12381235

12391236
private IanaLinkRelations() {
12401237
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");

src/test/java/org/springframework/hateoas/IanaLinkRelationUnitTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import lombok.Value;
2121

2222
import java.util.Arrays;
23+
import java.util.Collection;
2324
import java.util.Objects;
2425
import java.util.Set;
2526
import java.util.stream.Collectors;
@@ -110,6 +111,23 @@ void testAllIanaLinkRelationsHaveStringConstant() {
110111
assertThat(linkRelations).containsExactlyElementsOf(stringConstants);
111112
}
112113

114+
@Test // GH-2381
115+
void containsAllLinkRelations() throws Exception {
116+
117+
var allDeclared = Arrays.stream(IanaLinkRelations.class.getDeclaredFields()) //
118+
.filter(ReflectionUtils::isPublicStaticFinal) //
119+
.filter(field -> LinkRelation.class.equals(field.getType())) //
120+
.map(it -> ReflectionUtils.getField(it, null)) //
121+
.map(LinkRelation.class::cast) //
122+
.toList();
123+
124+
var allRelationsField = ReflectionUtils.findField(IanaLinkRelations.class, "LINK_RELATIONS");
125+
ReflectionUtils.makeAccessible(allRelationsField);
126+
var allRelations = (Collection<LinkRelation>) ReflectionUtils.getField(allRelationsField, null);
127+
128+
assertThat(allDeclared).containsExactlyInAnyOrderElementsOf(allRelations);
129+
}
130+
113131
/**
114132
* Custom implementation of the {@link LinkRelation} interface.
115133
*/

0 commit comments

Comments
 (0)