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      * @since 9
  68      */
  69     ANNOTATION_PROCESSOR_MODULE_PATH,
  70 
  71     /**
  72      * Location to search for platform classes.  Sometimes called
  73      * the boot class path.
  74      */
  75     PLATFORM_CLASS_PATH,
  76 
  77     /**
  78      * Location of new native header files.
  79      * @since 1.8
  80      */
  81     NATIVE_HEADER_OUTPUT,
  82 
  83     /**
  84      * Location to search for the source code of modules.
  85      * @since 9
  86      */
  87     MODULE_SOURCE_PATH,
  88 
  89     /**
  90      * Location to search for upgradeable system modules.
  91      * @since 9
  92      */
  93     UPGRADE_MODULE_PATH,
  94 
  95     /**
  96      * Location to search for system modules.
  97      * @since 9
  98      */
  99     SYSTEM_MODULES,
 100 
 101     /**
 102      * Location to search for precompiled user modules.
 103      * @since 9
 104      */
 105     MODULE_PATH,
 106 
 107     /**
 108      * Location to search for module patches.
 109      * @since 9
 110      * @spec JPMS
 111      */
 112     PATCH_MODULE_PATH;
 113 
 114     /**
 115      * Returns a location object with the given name.  The following
 116      * property must hold: {@code locationFor(x) ==
 117      * locationFor(y)} if and only if {@code x.equals(y)}.
 118      * The returned location will be an output location if and only if
 119      * name ends with {@code "_OUTPUT"}. It will be considered to
 120      * be a module-oriented location if the name contains the word
 121      * {@code "MODULE"}.
 122      *
 123      * @param name a name
 124      * @return a location
 125      */
 126     public static Location locationFor(final String name) {
 127         if (locations.isEmpty()) {
 128             // can't use valueOf which throws IllegalArgumentException
 129             for (Location location : values())
 130                 locations.putIfAbsent(location.getName(), location);
 131         }
 132         name.getClass(); /* null-check */
 133         locations.putIfAbsent(name, new Location() {
 134                 @Override
 135                 public String getName() { return name; }
 136                 @Override
 137                 public boolean isOutputLocation() { return name.endsWith("_OUTPUT"); }
 138             });
 139         return locations.get(name);
 140     }
 141     //where
 142         private static final ConcurrentMap<String,Location> locations
 143             = new ConcurrentHashMap<>();
 144 
 145     @Override
 146     public String getName() { return name(); }
 147 
 148     @Override
 149     public boolean isOutputLocation() {
 150         switch (this) {
 151             case CLASS_OUTPUT:
 152             case SOURCE_OUTPUT:
 153             case NATIVE_HEADER_OUTPUT:
 154                 return true;
 155             default:
 156                 return false;
 157         }
 158     }
 159 
 160     @Override
 161     public boolean isModuleOrientedLocation() {
 162         switch (this) {
 163             case MODULE_SOURCE_PATH:
 164             case ANNOTATION_PROCESSOR_MODULE_PATH:
 165             case UPGRADE_MODULE_PATH:
 166             case SYSTEM_MODULES:
 167             case MODULE_PATH:
 168             case PATCH_MODULE_PATH:
 169                 return true;
 170             default:
 171                 return false;
 172         }
 173     }
 174 }