Java tutorial
/* * Copyright (c) 2008 Kasper Nielsen. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cake.bootstrap.spi; import japa.parser.JavaParser; import japa.parser.ParseException; import japa.parser.ast.CompilationUnit; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.cakeframework.internal.util.Checks; import com.google.common.base.CaseFormat; /** * An enum that contains all currently defined source packages in this project. This is used to find the source of a * given class. * * @author Kasper Nielsen */ public enum CakeSourcePackages { // @formatter:off CAKE_BIG_API("../cake/cake-big/cake-big-api/src/main/java"), CAKE_BIG_API_TEST( "../cake/cake-big/cake-big-api/src/test/java"), CAKE_BIG_IMPL( "../cake/cake-big/cake-big-impl/src/main/java"), CAKE_BIG_IMPL_TEST( "../cake/cake-big/cake-big-impl/src/test/java"), CAKE_BIG_TCK( "../cake/cake-big/cake-big-tck/src/main/java"), CAKE_BIG_TEST_RT( "../cake/cake-big/cake-big-test-rt/src/main/java"), CAKE_QUERY_API( "../cake/cake-query/cake-query-api/src/main/java"), CAKE_QUERY_API_TEST( "../cake/cake-query/cake-query-api/src/test/java"), CAKE_QUERY_COMPILER( "../cake/cake-query/cake-query-compiler/src/main/java"), CAKE_QUERY_COMPILER_TEST( "../cake/cake-query/cake-query-compiler/src/test/java"), CAKE_QUERY_INTERPRETER( "../cake/cake-query/cake-query-interpreter/src/main/java"), CAKE_QUERY_INTERPRETER_TEST( "../cake/cake-query/cake-query-interpreter/src/test/java"), CAKE_QUERY_NODES( "../cake/cake-query/cake-query-nodes/src/main/java"), CAKE_QUERY_NODES_TEST( "../cake/cake-query/cake-query-nodes/src/test/java"), CAKE_QUERY_TEST_RT( "../cake/cake-query/cake-query-test-rt/src/main/java"), CAKE_CONTAINER_API( "../cake-container/cake-container/cake-container-api/src/main/java"), CAKE_CONTAINER_API_TEST( "../cake-container/cake-container/cake-container-api/src/test/java"), CAKE_CONTAINER_IMPL( "../cake-container/cake-container/cake-container-impl/src/main/java"), CAKE_CONTAINER_IMPL_TEST( "../cake-container/cake-container/cake-container-impl/src/test/java"), CAKE_CONTAINER_TCK( "../cake-container/cake-container/cake-container-tck/src/main/java"), CAKE_CONTAINER_TCK_HIERARCHICAL( "../cake-container/cake-container/cake-container-tck-hierarchical/src/main/java"), CAKE_MANAGEMENT( "../cake-container/cake-management/src/main/java"), CAKE_MANAGEMENT_TEST( "../cake-container/cake-management/src/test/java"), CAKE_UTIL( "../cake-container/cake-util/cake-util/src/main/java"), CAKE_UTIL_TEST( "../cake-container/cake-util/cake-util/src/test/java"), CAKE_UTIL_LOGGING( "../cake-container/cake-util/cake-util-logging/src/main/java"), CAKE_UTIL_LOGGING_TEST( "../cake-container/cake-util/cake-util-logging/src/test/java"), CAKE_TEST( "../cake-test/cake-test/src/main/java"), CAKE_TEST_TEST( "../cake-test/cake-test/src/test/java"), CAKE_TEST_STUBS( "../cake-test/cake-test-stubs/src/main/java"), CAKE_TEST_SISYPHUS( "../cake-test/cake-test-sisyphus/src/main/java"), CAKE_TEST_SISYPHUS_TEST( "../cake-test/cake-test-sisyphus/src/test/java"), CAKE_TEST_SISYPHUS_JAVACOL( "../cake-test/cake-test-sisyphus-javacol/src/main/java"), CAKE_TEST_SISYPHUS_JAVACOL_TEST( "../cake-test/cake-test-sisyphus-javacol/src/test/java"), CAKE_TEST_PETRIDISH( "../cake-test/cake-test-petridish/src/main/java"), CAKE_TEST_PETRIDISH_TEST( "../cake-test/cake-test-petridish/src/test/java"), CODEGEN( "../codegen/codegen/src/main/java"), CODEGEN_TEST( "../codegen/codegen/src/test/java"), CODEGEN_COMPILER( "../codegen/codegen-compiler/src/main/java"), CODEGEN_MODEL( "../codegen/codegen-model/src/main/java"); // @formatter:on static final Path SRC_ZIP; static { // Tries to find the location of the Java standard libraries (src.zip) Path p = Paths.get(System.getProperty("java.home")); Checks.checkPathExists(p); SRC_ZIP = p.resolve("../src.zip"); Checks.checkPathExists(SRC_ZIP); } private Path location; private CakeSourcePackages(String location) { Path root = location.contains("bootstrap") ? Paths.get("./") : Sources.CAKE_SOURCE_LOCATION; this.location = Checks.checkPathIsDirectory(root.resolve(location)); } public Set<Class<?>> getClasses() throws IOException, ClassNotFoundException { HashSet<Class<?>> s = new HashSet<>(); getClasses(location, s); return s; } private void getClasses(Path p, Set<Class<?>> set) throws IOException, ClassNotFoundException { for (Path path : Files.newDirectoryStream(p)) { if (Files.isRegularFile(path)) { if (path.toString().endsWith(".java")) { String name = path.toString().substring(location.toString().length() + 1); name = name.replace("\\", ".").replace("/", ".").replace(".java", ""); try { set.add(Class.forName(name)); } catch (RuntimeException okProbablyEnum) { } } } else { getClasses(path, set); } } } public Path getPathForClass(Class<?> clazz) { String n = clazz.getCanonicalName().replace('.', '/') + ".java"; Path pa = Paths.get("./").resolve(location).resolve(n); return Files.exists(pa) ? pa : null; } /** @return the root of the package */ public Path root() { return location; } public static Set<Class<?>> findClassesInSamePackageAs(Class<?> clazz) throws IOException, ClassNotFoundException { Path p = getAnyPathForClass(clazz); DirectoryStream<Path> newDirectoryStream = Files.newDirectoryStream(p.getParent()); LinkedHashSet<Class<?>> result = new LinkedHashSet<>(); for (Path pp : newDirectoryStream) { if (Files.isRegularFile(pp)) { Class<?> c = Class.forName( clazz.getPackage().getName() + "." + pp.getFileName().toString().replace(".java", "")); result.add(c); } } return result; } public static CakeSourcePackages findPackageFor(Class<?> clazz) { for (CakeSourcePackages p : CakeSourcePackages.values()) { Path pa = p.getPathForClass(clazz); if (pa != null) { return p; } } throw new Error("Could not find package for " + clazz); } public static CompilationUnit findSourceFor(Class<?> clazz) throws IOException, ParseException { String n = clazz.getCanonicalName().replace('.', '/') + ".java"; try (ZipFile zf = new ZipFile(SRC_ZIP.toFile())) { ZipEntry entry = zf.getEntry(n); if (entry != null) { return JavaParser.parse(zf.getInputStream(entry)); } else { return JavaParser.parse(Files.newInputStream(getAnyPathForClass(clazz))); } } } public static Path getAnyPathForClass(Class<?> clazz) { for (CakeSourcePackages p : CakeSourcePackages.values()) { Path pa = p.getPathForClass(clazz); if (pa != null) { return pa; } } throw new Error("Could not find the source for " + clazz); } public static void main(String[] args) throws Exception { createEnums("cake", Arrays.asList(Sources.CAKE_SOURCE_LOCATION.resolve(".classpath"))); createEnums("cake-container", Arrays.asList(Sources.CAKECONTAINER_SOURCE_LOCATION.resolve(".classpath"))); createEnums("cake-test", Arrays.asList(Sources.CAKETEST_SOURCE_LOCATION.resolve(".classpath"))); createEnums("codegen", Arrays.asList(Sources.CODEGEN_SOURCE_LOCATION.resolve(".classpath"))); } static void createEnums(String directory, Iterable<Path> paths) throws IOException { for (Path pp : paths) { for (String str : Files.readAllLines(pp, Charset.defaultCharset())) { if (str.contains("kind=\"src\"") && (str.contains("main") || str.contains("test")) && !str.contains("combineaccessrules") && !str.contains("private")) { String p = str.split("\"")[3]; String v = p.substring(0, p.indexOf("/src")); if (v.contains("/")) { v = v.substring(v.lastIndexOf("/") + 1); } v = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, v); p = "../" + directory + "/" + p; System.out.println(" " + v + (str.contains("main") ? "" : "_TEST") + "(\"" + p + "\"),"); } else if (str.contains("bootstrap")) { String p = str.split("\"")[3]; String v = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, p.split("/")[0]); System.out.println(" " + v + "(\"" + p + "\"),"); } } } } }