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.resourceloader.classpath.service.impl.production;
35
36 import info.magnolia.resourceloader.classpath.hierarchy.ClasspathFile;
37
38 import java.io.IOException;
39 import java.io.InputStream;
40 import java.net.URL;
41
42 import org.apache.commons.lang3.StringUtils;
43 import org.reflections.util.ClasspathHelper;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 import com.google.common.base.Objects;
48
49
50
51
52
53
54 public class ProductionModeClasspathFile implements ClasspathFile {
55
56 private static final Logger log = LoggerFactory.getLogger(ProductionModeClasspathFile.class);
57
58 private String classLoaderCompliantPath;
59
60 private URL classpathUrl = null;
61
62 public ProductionModeClasspathFile(String classLoaderCompliantPath) {
63 this.classLoaderCompliantPath = classLoaderCompliantPath;
64 }
65
66 @Override
67 public String getName() {
68 return StringUtils.substringAfterLast(getAbsolutePath(), "/");
69 }
70
71 @Override
72 public String getAbsolutePath() {
73 return "/" + classLoaderCompliantPath;
74 }
75
76 @Override
77 public InputStream openStream() throws IOException {
78 return getUrl().openStream();
79 }
80
81 @Override
82 public long getLastModified() {
83 try {
84 return getUrl().openConnection().getLastModified();
85 } catch (IOException e) {
86 log.warn("Failed to check the last modification date of a resource at [{}]: {}. Returning -1", getAbsolutePath(), e.getMessage());
87 return -1;
88 }
89 }
90
91 protected final URL getUrl() {
92 if (classpathUrl == null) {
93 classpathUrl = resolveUrl();
94 }
95 return classpathUrl;
96 }
97
98 protected final URL resolveUrl() {
99 final URL resourceUrl = ClasspathHelper.contextClassLoader().getResource(classLoaderCompliantPath);
100 if (resourceUrl == null) {
101 throw new IllegalStateException(String.format("Failed to obtain resource URL at [%s] via context class loader, probably such resource does not exist...", this.classLoaderCompliantPath));
102 }
103 return this.classpathUrl = resourceUrl;
104 }
105
106 @Override
107 public boolean equals(Object o) {
108 if (this == o) return true;
109 if (o == null || getClass() != o.getClass()) return false;
110
111 ProductionModeClasspathFile that = (ProductionModeClasspathFile) o;
112
113 return Objects.equal(getAbsolutePath(), that.getAbsolutePath());
114 }
115
116 @Override
117 public int hashCode() {
118 return Objects.hashCode(getAbsolutePath());
119 }
120 }