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 }