1 /*
2  * Copyright (c) 2006, 2017, 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      * @spec JPMS
115      * @since 9
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      */
locationFor(final String name)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
getName()154     public String getName() { return name(); }
155 
156     @Override
isOutputLocation()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     /**
169      * {@inheritDoc}
170      * @since 9
171      */
172     @Override
isModuleOrientedLocation()173     public boolean isModuleOrientedLocation() {
174         switch (this) {
175             case MODULE_SOURCE_PATH:
176             case ANNOTATION_PROCESSOR_MODULE_PATH:
177             case UPGRADE_MODULE_PATH:
178             case SYSTEM_MODULES:
179             case MODULE_PATH:
180             case PATCH_MODULE_PATH:
181                 return true;
182             default:
183                 return false;
184         }
185     }
186 }
187