1 package org.codehaus.plexus.classworlds.launcher;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.net.MalformedURLException;
23 import java.net.URL;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.codehaus.plexus.classworlds.ClassWorld;
30 import org.codehaus.plexus.classworlds.realm.ClassRealm;
31 import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
32 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
33
34
35
36
37
38
39
40 public class Configurator implements ConfigurationHandler {
41
42
43
44 private Launcher launcher;
45
46 private ClassWorld world;
47
48
49
50
51 private Map<String, ClassRealm> configuredRealms;
52
53
54
55
56 private ClassRealm curRealm;
57
58 private ClassLoader foreignClassLoader = null;
59
60
61
62
63
64
65 public Configurator(Launcher launcher) {
66 this.launcher = launcher;
67
68 configuredRealms = new HashMap<>();
69
70 if (launcher != null) {
71 this.foreignClassLoader = launcher.getSystemClassLoader();
72 }
73 }
74
75
76
77
78
79
80 public Configurator(ClassWorld world) {
81 setClassWorld(world);
82 }
83
84
85
86
87
88
89
90 public void setClassWorld(ClassWorld world) {
91 this.world = world;
92
93 configuredRealms = new HashMap<>();
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107 public void configure(InputStream is)
108 throws IOException, ConfigurationException, DuplicateRealmException, NoSuchRealmException {
109 if (world == null) {
110 world = new ClassWorld();
111 }
112
113 curRealm = null;
114
115 foreignClassLoader = null;
116
117 if (this.launcher != null) {
118 foreignClassLoader = this.launcher.getSystemClassLoader();
119 }
120
121 ConfigurationParser parser = new ConfigurationParser(this, System.getProperties());
122
123 parser.parse(is);
124
125
126 associateRealms();
127
128 if (this.launcher != null) {
129 this.launcher.setWorld(world);
130 }
131 }
132
133
134
135
136
137 public void associateRealms() {
138 List<String> sortRealmNames = new ArrayList<>(configuredRealms.keySet());
139
140
141 sortRealmNames.sort(String::compareTo);
142
143
144
145
146
147
148
149
150
151
152
153 for (String realmName : sortRealmNames) {
154 int j = realmName.lastIndexOf('.');
155
156 if (j > 0) {
157 String parentRealmName = realmName.substring(0, j);
158
159 ClassRealm parentRealm = configuredRealms.get(parentRealmName);
160
161 if (parentRealm != null) {
162 ClassRealm realm = configuredRealms.get(realmName);
163
164 realm.setParentRealm(parentRealm);
165 }
166 }
167 }
168 }
169
170 public void addImportFrom(String relamName, String importSpec) throws NoSuchRealmException {
171 curRealm.importFrom(relamName, importSpec);
172 }
173
174 public void addLoadFile(File file) {
175 try {
176 curRealm.addURL(file.toURI().toURL());
177 } catch (MalformedURLException e) {
178
179 }
180 }
181
182 public void addLoadURL(URL url) {
183 curRealm.addURL(url);
184 }
185
186 public void addRealm(String realmName) throws DuplicateRealmException {
187 curRealm = world.newRealm(realmName, foreignClassLoader);
188
189
190 configuredRealms.put(realmName, curRealm);
191 }
192
193 public void setAppMain(String mainClassName, String mainRealmName) {
194 if (this.launcher != null) {
195 this.launcher.setAppMain(mainClassName, mainRealmName);
196 }
197 }
198 }