All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.jaddress.DynamicProjectContext Maven / Gradle / Ivy

package org.unlaxer.jaddress;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.function.Predicate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.vavr.Tuple2;

public class DynamicProjectContext {
	
	static Logger logger = LoggerFactory.getLogger(DynamicProjectContext.class);
	
	
	Path projectHome;
	
	public DynamicProjectContext(Path projectHome) {
		super();
		this.projectHome = projectHome;
	}
	
	public static DynamicProjectContext fromCurrentFolder() {
		return new DynamicProjectContext(resolve());
	}
	

	public Path getProjectHome(){
		
		return projectHome;
	}
	
	
	public Path getJavaFilePath(SubProjects subProjects , GradleStructure gradleStructure , Class clazz){
		
		return getJavaFilePath(subProjects, gradleStructure, clazz.getPackage() , clazz.getSimpleName());
	}
	
	
	public  Path getJavaFilePath(SubProjects subProjects , GradleStructure gradleStructure , 
			Package targetPackage , String className){
		
		Path path = getPath(subProjects, gradleStructure, targetPackage);
		return path.resolve(className+".java");
	}
	
	public  Path getPath(SubProjects subProjects , GradleStructure gradleStructure , 
			Package targetPackage ){
		
		Path path = getProjectHome().resolve(subProjects.relativePath).resolve(gradleStructure.relativePath);

		for (String successor: targetPackage.toString().split(" ")[1].split("\\.")) {
			path = path.resolve(successor);
		}
		return path;
	}
	
	public  Path getPath(SubProjects subProjects , GradleStructure gradleStructure , 
			Package targetPackage ,String...successorPaths){
		
		Path path = getPath(subProjects , gradleStructure , targetPackage);

		return withSuccessor(path, successorPaths);
	}


	
	public  Path getPath(SubProjects subProjects , GradleStructure gradleStructure , String...successorPaths) {
		
		Path path = getProjectHome().resolve(subProjects.relativePath).resolve(gradleStructure.relativePath);
		
		for (String successor: successorPaths) {
			path = path.resolve(successor);
		}
		
		return path;
	}

	
	public  Path getPath(SubProjects subProjects , String...successorPaths){
		
		Path path = getProjectHome().resolve(subProjects.relativePath);

		return withSuccessor(path, successorPaths);
	}
	
	public Path withSuccessor(Path path , String...successorPaths) {
		
		for (String successor: successorPaths) {
			path = path.resolve(successor);
		}
		
		return path;
	}
	
	public Path switchProject(Path pathThatCreateWithThisContext , DynamicProjectContext switchToProjectContext) {
		if(false == pathThatCreateWithThisContext.startsWith(projectHome)) {

			throw new IllegalArgumentException();
		}
		
		
		int nameCount = projectHome.getNameCount();
		
		Path subpath = pathThatCreateWithThisContext.subpath(nameCount, pathThatCreateWithThisContext.getNameCount());
	
		return switchToProjectContext.getProjectHome().resolve(subpath);
	}
	
	public static Path getCurrentFolder(){
		
		return Paths.get(".").toAbsolutePath();
	}
	
	private static Path resolve(Tuple2, Integer> predicateForContainsAndMatchCount) {
		
		Optional folder = getFolder(predicateForContainsAndMatchCount);
		
		return folder.map(Path::getParent).orElseThrow();
	}

	
	
	private static Path resolve() {
		
		return resolve(gradleOrMaven);
	}
	
	static final Predicate gradleOrMavenPredicate = path->{
		
		String targetPath = path.getFileName().toString();
		return 
				targetPath.equals("src") || 
				targetPath.equals("build.gradle") || 
				targetPath.equals("pom.xml");
	} ;
	
	public static Tuple2, Integer>  gradleOrMaven = new Tuple2<>(gradleOrMavenPredicate, 2);
	
	
	public static Optional getFolder(Tuple2, Integer> predicateForContainsAndMatchCount) {
		
		Predicate predicateForContains = predicateForContainsAndMatchCount._1;
		
		Integer matchCount = predicateForContainsAndMatchCount._2;
		
		Path currentFolder = getCurrentFolder();
		
		while (true) {
			long count;
			try {
				count = Files.list(currentFolder)
						.filter(predicateForContains)
						.count();
				if(count >= matchCount) {
					return Optional.of(currentFolder);
				}
				
				if(currentFolder.getParent() == null) {
					return Optional.empty();
				}
				
				currentFolder = currentFolder.getParent();
				
			} catch (IOException e) {
				
				logger.error( "io error" , e);
				
				return Optional.empty();
			}
		}
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy