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 @Model(adaptables = {
55 SlingHttpServletRequest.class, Resource.class
56 })
57 @ProviderType
58 public final class InternalLinkType extends LinkType {
59
60
61
62
63 public static final @NotNull String ID = "internal";
64
65 private final @NotNull InternalLinkResolverOptions resolverOptions = new InternalLinkResolverOptions()
66 .primaryLinkRefProperty(getPrimaryLinkRefProperty())
67 .rewritePathToContext(true)
68 .useTargetContext(false);
69
70 @Self
71 private InternalLinkResolver internalLinkResolver;
72
73
74
75
76 @Override
77 public @NotNull String getId() {
78 return ID;
79 }
80
81 @Override
82 public @NotNull String getLabel() {
83 return "Internal (same site)";
84 }
85
86 @Override
87 public String getPrimaryLinkRefProperty() {
88 return LinkNameConstants.PN_LINK_CONTENT_REF;
89 }
90
91 @Override
92 public @Nullable String getEditComponentResourceType() {
93 return "wcm-io/handler/link/components/granite/form/linktype/internal";
94 }
95
96 @Override
97 public boolean hasRichTextPlugin() {
98 return true;
99 }
100
101 @Override
102 public boolean accepts(@NotNull String linkRef) {
103
104 return StringUtils.startsWith(linkRef, "/content/")
105 && !MediaLinkType.isDefaultMediaContentPath(linkRef);
106 }
107
108 @Override
109 public boolean accepts(@NotNull LinkRequest linkRequest) {
110 if (internalLinkResolver.acceptPage(linkRequest.getPage(), resolverOptions)) {
111
112 return true;
113 }
114
115 return super.accepts(linkRequest);
116 }
117
118 @Override
119 public @NotNull Link resolveLink(@NotNull Link link) {
120 return internalLinkResolver.resolveLink(link, resolverOptions);
121 }
122
123
124
125
126
127
128
129
130
131
132 public static @NotNull Resource getSyntheticLinkResource(@NotNull ResourceResolver resourceResolver,
133 @NotNull String path, @NotNull String pageRef) {
134 Map<String, Object> map = new HashMap<>();
135 map.put(LinkNameConstants.PN_LINK_TYPE, ID);
136 map.put(LinkNameConstants.PN_LINK_CONTENT_REF, pageRef);
137 return new SyntheticLinkResource(resourceResolver, path, map);
138 }
139
140 @Override
141 public String toString() {
142 return ID;
143 }
144
145 }