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 }