src/windows/classes/java/lang/ProcessEnvironment.java

Print this page




 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     }