1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.templatingkit.resources;
35
36 import info.magnolia.cms.beans.config.URI2RepositoryManager;
37 import info.magnolia.cms.beans.config.URI2RepositoryMapping;
38 import info.magnolia.cms.core.Content;
39 import info.magnolia.context.MgnlContext;
40 import info.magnolia.jcr.util.NodeTypes;
41 import info.magnolia.jcr.util.SessionUtil;
42 import info.magnolia.link.LinkFactory;
43 import info.magnolia.link.LinkUtil;
44 import info.magnolia.templating.functions.TemplatingFunctions;
45
46 import java.util.Calendar;
47
48 import javax.inject.Inject;
49 import javax.jcr.Node;
50 import javax.jcr.PathNotFoundException;
51 import javax.jcr.RepositoryException;
52 import javax.jcr.ValueFormatException;
53
54 import org.apache.commons.lang.StringUtils;
55 import org.apache.commons.lang.time.FastDateFormat;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59
60
61
62
63 public class Resource {
64
65 private final static Logger log = LoggerFactory.getLogger(Resource.class);
66
67 private static final FastDateFormat TIME_STAMP_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd-HH-mm-ss-SSS");
68
69 private boolean farFutureCaching = false;
70
71 private String link;
72
73 private String conditionalComment;
74
75 private URI2RepositoryManager uri2RepositoryManager;
76
77 private TemplatingFunctions templatingFunctions;
78
79 @Inject
80 public Resource(URI2RepositoryManager uri2RepositoryManager , TemplatingFunctions templatingFunctions) {
81 this.templatingFunctions = templatingFunctions;
82 this.uri2RepositoryManager = uri2RepositoryManager;
83 }
84
85 public String getLink() {
86
87 if (LinkUtil.EXTERNAL_LINK_PATTERN.matcher(link).matches()) {
88 return link;
89 }
90 else {
91
92
93
94
95
96
97 final String linkPrefix;
98 if (MgnlContext.isWebContext()) {
99
100 Content page = MgnlContext.getAggregationState().getMainContent();
101
102 String fullLinkToPage = templatingFunctions.link(page.getJCRNode());
103 String pagePath = uri2RepositoryManager.getURI(LinkFactory.createLink(page));
104
105
106
107
108 linkPrefix = StringUtils.removeEnd(fullLinkToPage, pagePath);
109 }
110 else {
111 linkPrefix = MgnlContext.getContextPath();
112 }
113 String currentLink = linkPrefix + link;
114
115 if(farFutureCaching){
116 String timeStamp = null;
117 try {
118 timeStamp = getFarFutureCachingTimeStamp(currentLink);
119 } catch (Exception e) {
120 log.error("Could not determind the Modified or creation date for "+currentLink,e);
121 }
122 if(timeStamp != null){
123 String ext = StringUtils.substringAfterLast(currentLink, ".");
124 String withoutExt = StringUtils.substringBeforeLast(currentLink, ".");
125 return withoutExt + "." + timeStamp + ".cache." + ext;
126 }
127 }
128 return currentLink;
129 }
130 }
131
132 protected String getFarFutureCachingTimeStamp(String currentLink) throws PathNotFoundException, ValueFormatException, RepositoryException {
133 URI2RepositoryMapping mapping = uri2RepositoryManager.getMapping(link);
134 if(mapping != null){
135 Node content = SessionUtil.getNode(mapping.getRepository(), mapping.getHandle(link));
136 if(content != null){
137 Calendar date = NodeTypes.LastModified.getLastModified(content);
138 if (date != null){
139 return TIME_STAMP_FORMAT.format(date);
140 }
141 }
142 }
143 return null;
144 }
145
146 public void setLink(String link) {
147 this.link = link;
148 }
149
150
151 public boolean isFarFutureCaching() {
152 return farFutureCaching;
153 }
154
155 public void setFarFutureCaching(boolean farFutureCaching) {
156 this.farFutureCaching = farFutureCaching;
157 }
158
159
160 public String getConditionalComment() {
161 return conditionalComment;
162 }
163
164
165 public void setConditionalComment(String conditionalComment) {
166 this.conditionalComment = conditionalComment;
167 }
168
169 }