001/* 002 * JDrupes Builder 003 * Copyright (C) 2025 Michael N. Lipp 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <https://www.gnu.org/licenses/>. 017 */ 018 019package org.jdrupes.builder.java; 020 021import java.lang.reflect.Proxy; 022import java.nio.file.Path; 023import org.jdrupes.builder.api.Project; 024import org.jdrupes.builder.api.Proxyable; 025import org.jdrupes.builder.api.ResourceType; 026import org.jdrupes.builder.core.DefaultFileTree; 027import org.jdrupes.builder.core.ForwardingHandler; 028 029/// The type ClassTree. 030/// 031public class DefaultClassTree extends DefaultFileTree<ClassFile> 032 implements ClasspathElement { 033 034 /// Instantiates a new class tree. 035 /// 036 /// @param type the type 037 /// @param project the project 038 /// @param root the root 039 /// 040 protected DefaultClassTree(ResourceType<? extends ClassTree> type, 041 Project project, Path root) { 042 super(type, project, root, "**/*.class"); 043 } 044 045 /// Creates the class tree. 046 /// 047 /// @param <T> the generic type 048 /// @param type the type 049 /// @param project the project 050 /// @param path the path 051 /// @return the t 052 /// 053 @SuppressWarnings({ "unchecked" }) 054 public static <T extends ClassTree> T createClassTree(ResourceType<T> type, 055 Project project, Path path) { 056 return (T) Proxy.newProxyInstance(type.rawType().getClassLoader(), 057 new Class<?>[] { type.rawType(), Proxyable.class }, 058 new ForwardingHandler(new DefaultClassTree(type, project, path))); 059 } 060 061 @Override 062 public Path toPath() { 063 return root(); 064 } 065 066}