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.base;
35
36 import info.magnolia.resourceloader.classpath.hierarchy.ClasspathEntry;
37 import info.magnolia.resourceloader.classpath.service.impl.devmode.DevelopmentModeClasspathFile;
38 import info.magnolia.resourceloader.classpath.service.impl.legacy.LegacyClasspathFile;
39 import info.magnolia.resourceloader.classpath.service.impl.production.ProductionModeClasspathFile;
40
41 import java.net.URL;
42
43 import org.reflections.vfs.Vfs;
44
45
46
47
48
49
50 public abstract class ClasspathFileConstructionStrategy {
51
52 public abstract ClasspathEntry buildFile(Object... args);
53
54 public static ClasspathFileConstructionStrategy productionWithVfs() {
55 return new ProductionModeConstructionStrategy();
56 }
57
58 public static ClasspathFileConstructionStrategy legacyWithVfs() {
59 return new LegacyResourcesConstructionStrategy();
60 }
61
62 public static ClasspathFileConstructionStrategy developmentModeWithVfs() {
63 return new DevelopmentModeConstructionStrategy();
64 }
65
66 private static class ProductionModeConstructionStrategy extends ClasspathFileConstructionStrategy {
67 @Override
68 public ClasspathEntry buildFile(Object... args) {
69 if (!(args[0] instanceof Vfs.File)) {
70 throw new IllegalStateException(String.format("Vfs.file has to be provided before %s construction", ProductionModeClasspathFile.class.getSimpleName()));
71 }
72 String relativePath = ((Vfs.File) args[0]).getRelativePath();
73 if (relativePath == null) {
74 throw new IllegalStateException(String.format("Path has to be specified before %s construction", ProductionModeClasspathFile.class.getSimpleName()));
75 }
76
77 return createClasspathEntry(relativePath);
78 }
79
80 protected ProductionModeClasspathFile createClasspathEntry(String relativePath) {
81 return new ProductionModeClasspathFile(relativePath);
82 }
83 }
84
85 private static class LegacyResourcesConstructionStrategy extends ProductionModeConstructionStrategy {
86 @Override
87 protected ProductionModeClasspathFile createClasspathEntry(String relativePath) {
88 return new LegacyClasspathFile(relativePath);
89 }
90 }
91
92 private static class DevelopmentModeConstructionStrategy extends ClasspathFileConstructionStrategy {
93 @Override
94 public ClasspathEntry buildFile(Object... args) {
95 if (!(args[0] instanceof Vfs.File)) {
96 throw new IllegalStateException(String.format("Vfs.file has to be provided before %s construction", DevelopmentModeClasspathFile.class.getSimpleName()));
97 }
98 if (!(args[1] instanceof URL)) {
99 throw new IllegalStateException(String.format("Classpath location has to be specified before %s construction", DevelopmentModeClasspathFile.class.getSimpleName()));
100 }
101
102 final Vfs.File jarFile = (Vfs.File) args[0];
103 final URL classpathLocation = (URL) args[1];
104 return new DevelopmentModeClasspathFile(classpathLocation, jarFile);
105 }
106 }
107 }