1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package io.wcm.handler.link.type;
21
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import org.apache.commons.lang3.StringUtils;
26 import org.apache.sling.api.SlingHttpServletRequest;
27 import org.apache.sling.api.resource.Resource;
28 import org.apache.sling.api.resource.ResourceResolver;
29 import org.apache.sling.models.annotations.Model;
30 import org.apache.sling.models.annotations.injectorspecific.Self;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33 import org.osgi.annotation.versioning.ProviderType;
34
35 import io.wcm.handler.link.Link;
36 import io.wcm.handler.link.LinkNameConstants;
37 import io.wcm.handler.link.LinkRequest;
38 import io.wcm.handler.link.SyntheticLinkResource;
39 import io.wcm.handler.link.spi.LinkType;
40 import io.wcm.handler.link.type.helpers.InternalLinkResolver;
41 import io.wcm.handler.link.type.helpers.InternalLinkResolverOptions;
42 import io.wcm.handler.url.UrlHandler;
43
44
45
46
47
48
49
50
51
52
53
54
55 @Model(adaptables = {
56 SlingHttpServletRequest.class, Resource.class
57 })
58 @ProviderType
59 public final class InternalLinkType extends LinkType {
60
61
62
63
64 public static final @NotNull String ID = "internal";
65
66 private final @NotNull InternalLinkResolverOptions resolverOptions = new InternalLinkResolverOptions()
67 .primaryLinkRefProperty(getPrimaryLinkRefProperty())
68 .rewritePathToContext(true)
69 .useTargetContext(false);
70
71 @Self
72 private InternalLinkResolver internalLinkResolver;
73
74
75
76
77 @Override
78 public @NotNull String getId() {
79 return ID;
80 }
81
82 @Override
83 public @NotNull String getLabel() {
84 return "Internal (same site)";
85 }
86
87 @Override
88 public String getPrimaryLinkRefProperty() {
89 return LinkNameConstants.PN_LINK_CONTENT_REF;
90 }
91
92 @Override
93 public @Nullable String getEditComponentResourceType() {
94 return "wcm-io/handler/link/components/granite/form/linktype/internal";
95 }
96
97 @Override
98 public boolean hasRichTextPlugin() {
99 return true;
100 }
101
102 @Override
103 public boolean accepts(@NotNull String linkRef) {
104
105 return StringUtils.startsWith(linkRef, "/content/")
106 && !MediaLinkType.isDefaultMediaContentPath(linkRef);
107 }
108
109 @Override
110 public boolean accepts(@NotNull LinkRequest linkRequest) {
111 if (internalLinkResolver.acceptPage(linkRequest.getPage(), resolverOptions)) {
112
113 return true;
114 }
115
116 return super.accepts(linkRequest);
117 }
118
119 @Override
120 public @NotNull Link resolveLink(@NotNull Link link) {
121 return internalLinkResolver.resolveLink(link, resolverOptions);
122 }
123
124
125
126
127
128
129
130
131
132
133 public static @NotNull Resource getSyntheticLinkResource(@NotNull ResourceResolver resourceResolver,
134 @NotNull String path, @NotNull String pageRef) {
135 Map<String, Object> map = new HashMap<>();
136 map.put(LinkNameConstants.PN_LINK_TYPE, ID);
137 map.put(LinkNameConstants.PN_LINK_CONTENT_REF, pageRef);
138 return new SyntheticLinkResource(resourceResolver, path, map);
139 }
140
141 @Override
142 public String toString() {
143 return ID;
144 }
145
146 }