cake.bootstrap.spi.CakeSourcePackages.java Source code

Java tutorial

Introduction

Here is the source code for cake.bootstrap.spi.CakeSourcePackages.java

Source

/*
 * 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 + "\"),");
                }
            }
        }
    }
}