1 /*
   2  * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javax.tools;
  27 
  28 import javax.tools.JavaFileManager.Location;
  29 
  30 import java.util.concurrent.*;
  31 
  32 /**
  33  * Standard locations of file objects.
  34  *
  35  * @author Peter von der Ahé
  36  * @since 1.6
  37  */
  38 public enum StandardLocation implements Location {
  39 
  40     /**
  41      * Location of new class files.
  42      */
  43     CLASS_OUTPUT,
  44 
  45     /**
  46      * Location of new source files.
  47      */
  48     SOURCE_OUTPUT,
  49 
  50     /**
  51      * Location to search for user class files.
  52      */
  53     CLASS_PATH,
  54 
  55     /**
  56      * Location to search for existing source files.
  57      */
  58     SOURCE_PATH,
  59 
  60     /**
  61      * Location to search for annotation processors.
  62      */
  63     ANNOTATION_PROCESSOR_PATH,
  64 
  65     /**
  66      * Location to search for modules containing annotation processors.
  67      * @spec JPMS
  68      * @since 9
  69      */
  70     ANNOTATION_PROCESSOR_MODULE_PATH,
  71 
  72     /**
  73      * Location to search for platform classes.  Sometimes called
  74      * the boot class path.
  75      */
  76     PLATFORM_CLASS_PATH,
  77 
  78     /**
  79      * Location of new native header files.
  80      * @since 1.8
  81      */
  82     NATIVE_HEADER_OUTPUT,
  83 
  84     /**
  85      * Location to search for the source code of modules.
  86      * @spec JPMS
  87      * @since 9
  88      */
  89     MODULE_SOURCE_PATH,
  90 
  91     /**
  92      * Location to search for upgradeable system modules.
  93      * @spec JPMS
  94      * @since 9
  95      */
  96     UPGRADE_MODULE_PATH,
  97 
  98     /**
  99      * Location to search for system modules.
 100      * @spec JPMS
 101      * @since 9
 102      */
 103     SYSTEM_MODULES,
 104 
 105     /**
 106      * Location to search for precompiled user modules.
 107      * @spec JPMS
 108      * @since 9
 109      */
 110     MODULE_PATH,
 111 
 112     /**
 113      * Location to search for module patches.
 114      * @since 9
 115      * @spec JPMS
 116      */
 117     PATCH_MODULE_PATH;
 118 
 119     /**
 120      * Returns a location object with the given name.  The following
 121      * property must hold: {@code locationFor(x) ==
 122      * locationFor(y)} if and only if {@code x.equals(y)}.
 123      * The returned location will be an output location if and only if
 124      * name ends with {@code "_OUTPUT"}. It will be considered to
 125      * be a module-oriented location if the name contains the word
 126      * {@code "MODULE"}.
 127      *
 128      * @param name a name
 129      * @return a location
 130      *
 131      * @revised 9
 132      * @spec JPMS
 133      */
 134     public static Location locationFor(final String name) {
 135         if (locations.isEmpty()) {
 136             // can't use valueOf which throws IllegalArgumentException
 137             for (Location location : values())
 138                 locations.putIfAbsent(location.getName(), location);
 139         }
 140         name.getClass(); /* null-check */
 141         locations.putIfAbsent(name, new Location() {
 142                 @Override
 143                 public String getName() { return name; }
 144                 @Override
 145                 public boolean isOutputLocation() { return name.endsWith("_OUTPUT"); }
 146             });
 147         return locations.get(name);
 148     }
 149     //where
 150         private static final ConcurrentMap<String,Location> locations
 151             = new ConcurrentHashMap<>();
 152 
 153     @Override
 154     public String getName() { return name(); }
 155 
 156     @Override
 157     public boolean isOutputLocation() {
 158         switch (this) {
 159             case CLASS_OUTPUT:
 160             case SOURCE_OUTPUT:
 161             case NATIVE_HEADER_OUTPUT:
 162                 return true;
 163             default:
 164                 return false;
 165         }
 166     }
 167 
 168     @Override
 169     public boolean isModuleOrientedLocation() {
 170         switch (this) {
 171             case MODULE_SOURCE_PATH:
 172             case ANNOTATION_PROCESSOR_MODULE_PATH:
 173             case UPGRADE_MODULE_PATH:
 174             case SYSTEM_MODULES:
 175             case MODULE_PATH:
 176             case PATCH_MODULE_PATH:
 177                 return true;
 178             default:
 179                 return false;
 180         }
 181     }
 182 }