127
128 private static class CheckedEntrySet
129 extends AbstractSet<Map.Entry<String,String>>
130 {
131 private final Set<Map.Entry<String,String>> s;
132 public CheckedEntrySet(Set<Map.Entry<String,String>> s) {this.s = s;}
133 public int size() {return s.size();}
134 public boolean isEmpty() {return s.isEmpty();}
135 public void clear() { s.clear();}
136 public Iterator<Map.Entry<String,String>> iterator() {
137 return new Iterator<Map.Entry<String,String>>() {
138 Iterator<Map.Entry<String,String>> i = s.iterator();
139 public boolean hasNext() { return i.hasNext();}
140 public Map.Entry<String,String> next() {
141 return new CheckedEntry(i.next());
142 }
143 public void remove() { i.remove();}
144 };
145 }
146 private static Map.Entry<String,String> checkedEntry (Object o) {
147 Map.Entry<String,String> e = (Map.Entry<String,String>) o;
148 nonNullString(e.getKey());
149 nonNullString(e.getValue());
150 return e;
151 }
152 public boolean contains(Object o) {return s.contains(checkedEntry(o));}
153 public boolean remove(Object o) {return s.remove(checkedEntry(o));}
154 }
155
156 private static class CheckedValues extends AbstractCollection<String> {
157 private final Collection<String> c;
158 public CheckedValues(Collection<String> c) {this.c = c;}
159 public int size() {return c.size();}
160 public boolean isEmpty() {return c.isEmpty();}
161 public void clear() { c.clear();}
162 public Iterator<String> iterator() {return c.iterator();}
163 public boolean contains(Object o) {return c.contains(nonNullString(o));}
164 public boolean remove(Object o) {return c.remove(nonNullString(o));}
165 }
166
278 // Only for use by System.getenv()
279 static Map<String,String> getenv() {
280 return theUnmodifiableEnvironment;
281 }
282
283 // Only for use by ProcessBuilder.environment()
284 static Map<String,String> environment() {
285 return (Map<String,String>) theEnvironment.clone();
286 }
287
288 // Only for use by Runtime.exec(...String[]envp...)
289 static Map<String,String> emptyEnvironment(int capacity) {
290 return new ProcessEnvironment(capacity);
291 }
292
293 private static native String environmentBlock();
294
295 // Only for use by ProcessImpl.start()
296 String toEnvironmentBlock() {
297 // Sort Unicode-case-insensitively by name
298 List<Map.Entry<String,String>> list = new ArrayList<>(entrySet());
299 Collections.sort(list, entryComparator);
300
301 StringBuilder sb = new StringBuilder(size()*30);
302 for (Map.Entry<String,String> e : list)
303 sb.append(e.getKey())
304 .append('=')
305 .append(e.getValue())
306 .append('\u0000');
307 // Ensure double NUL termination,
308 // even if environment is empty.
309 if (sb.length() == 0)
310 sb.append('\u0000');
311 sb.append('\u0000');
312 return sb.toString();
313 }
314
315 static String toEnvironmentBlock(Map<String,String> map) {
316 return map == null ? null :
317 ((ProcessEnvironment)map).toEnvironmentBlock();
318 }
|
127
128 private static class CheckedEntrySet
129 extends AbstractSet<Map.Entry<String,String>>
130 {
131 private final Set<Map.Entry<String,String>> s;
132 public CheckedEntrySet(Set<Map.Entry<String,String>> s) {this.s = s;}
133 public int size() {return s.size();}
134 public boolean isEmpty() {return s.isEmpty();}
135 public void clear() { s.clear();}
136 public Iterator<Map.Entry<String,String>> iterator() {
137 return new Iterator<Map.Entry<String,String>>() {
138 Iterator<Map.Entry<String,String>> i = s.iterator();
139 public boolean hasNext() { return i.hasNext();}
140 public Map.Entry<String,String> next() {
141 return new CheckedEntry(i.next());
142 }
143 public void remove() { i.remove();}
144 };
145 }
146 private static Map.Entry<String,String> checkedEntry (Object o) {
147 @SuppressWarnings("unchecked")
148 Map.Entry<String,String> e = (Map.Entry<String,String>) o;
149 nonNullString(e.getKey());
150 nonNullString(e.getValue());
151 return e;
152 }
153 public boolean contains(Object o) {return s.contains(checkedEntry(o));}
154 public boolean remove(Object o) {return s.remove(checkedEntry(o));}
155 }
156
157 private static class CheckedValues extends AbstractCollection<String> {
158 private final Collection<String> c;
159 public CheckedValues(Collection<String> c) {this.c = c;}
160 public int size() {return c.size();}
161 public boolean isEmpty() {return c.isEmpty();}
162 public void clear() { c.clear();}
163 public Iterator<String> iterator() {return c.iterator();}
164 public boolean contains(Object o) {return c.contains(nonNullString(o));}
165 public boolean remove(Object o) {return c.remove(nonNullString(o));}
166 }
167
279 // Only for use by System.getenv()
280 static Map<String,String> getenv() {
281 return theUnmodifiableEnvironment;
282 }
283
284 // Only for use by ProcessBuilder.environment()
285 static Map<String,String> environment() {
286 return (Map<String,String>) theEnvironment.clone();
287 }
288
289 // Only for use by Runtime.exec(...String[]envp...)
290 static Map<String,String> emptyEnvironment(int capacity) {
291 return new ProcessEnvironment(capacity);
292 }
293
294 private static native String environmentBlock();
295
296 // Only for use by ProcessImpl.start()
297 String toEnvironmentBlock() {
298 // Sort Unicode-case-insensitively by name
299 Set<Map.Entry<String,String>> entries = entrySet();
300 List<Map.Entry<String,String>> list = new ArrayList<>(entries);
301
302 // check for "SystemRoot". Needed by MSVCRT.DLL
303 // Environment variable names are case-insensitive.
304 // So, must do an iterative search.
305 boolean found = false;
306 for (Map.Entry<String,String> entry : entries) {
307 String key = entry.getKey();
308 if (key.equalsIgnoreCase("SystemRoot")) {
309 found = true;
310 break;
311 }
312 }
313 if (!found) {
314 list.add(new AbstractMap.SimpleEntry<String,String>(
315 "SystemRoot", getenv("SystemRoot"))
316 );
317 }
318
319 Collections.sort(list, entryComparator);
320
321 StringBuilder sb = new StringBuilder(size()*30);
322 for (Map.Entry<String,String> e : list)
323 sb.append(e.getKey())
324 .append('=')
325 .append(e.getValue())
326 .append('\u0000');
327 // Ensure double NUL termination,
328 // even if environment is empty.
329 if (sb.length() == 0)
330 sb.append('\u0000');
331 sb.append('\u0000');
332 return sb.toString();
333 }
334
335 static String toEnvironmentBlock(Map<String,String> map) {
336 return map == null ? null :
337 ((ProcessEnvironment)map).toEnvironmentBlock();
338 }
|