/* * Copyright 2014 NAVER Corp. * * 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 com.navercorp.pinpoint.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.navercorp.pinpoint.profiler.util.JavaAssistUtils; import java.net.URL; /** * @author emeroad */ public class ProjectPathResolver { private final Logger logger = LoggerFactory.getLogger(this.getClass()); // maven base path resolver // extract interface ???? public ProjectPath resolvePathFromTestClass(Class testClass) { if (testClass == null) { throw new NullPointerException("testClass must not be null"); } String testClassDir = getTestClassPath(testClass); // /D:/pinpoint_project/pinpoint/profiler/target/test-classes/ String targetPath = getTargetPath(testClassDir); String modulePath = getModulePath(targetPath); String projectPath = getProjectPath(modulePath); String pinpointAgentPath = getPinpointAgentPath(projectPath); return new ProjectPath(testClassDir, targetPath, modulePath, projectPath, pinpointAgentPath); } private String getTestClassPath(Class<?> testClass) { logger.debug("testClass:{}", testClass); final ClassLoader classLoader = getDefaultClassLoader(testClass); final String testClassName = JavaAssistUtils.javaNameToJvmName(testClass.getName()) + ".class"; final URL testClassResource = classLoader.getResource(testClassName); if (testClassResource == null) { throw new IllegalArgumentException("testClassName not found." + testClassName); } logger.debug("url TestClass={}", testClassResource); final String testClassPath = testClassResource.getPath(); final int classClassDirFind = testClassPath.indexOf("/" + testClassName); if (classClassDirFind == -1) { throw new IllegalArgumentException(testClassName + "not found."); } final String testClassDir = testClassPath.substring(1, classClassDirFind); logger.debug("testClassDir:{}", testClassDir); return testClassDir; } private String getProjectPath(String modulePath) { if (modulePath == null) { throw new NullPointerException("modulePath must not be null"); } // remove last / final int projectPathFound = modulePath.lastIndexOf('/'); if (projectPathFound == -1) { throw new RuntimeException("projectPathFound not found"); } String projectPath = modulePath.substring(0, projectPathFound); logger.debug("projectPath:{}", projectPath); return projectPath; } private String getModulePath(String targetPath) { final int targetFound = targetPath.lastIndexOf("target"); if (targetFound == -1) { throw new RuntimeException("target not found "+ targetPath); } String modulePath = targetPath.substring(0, targetFound - 1); logger.debug("modulePath:{}", modulePath); return modulePath; } private String getPinpointAgentPath(String projectPath) { if (projectPath == null) { throw new NullPointerException("projectPath must not be null"); } String pinpointAgentDir = projectPath + "/profiler/target/pinpoint-agent"; logger.debug("pinpointAgentDir:{}", pinpointAgentDir); return pinpointAgentDir; } private String getTargetPath(String testClassDir) { if (testClassDir == null) { throw new NullPointerException("testClassDir must not be null"); } // remove last '/' // D:/pinpoint_project/pinpoint/profiler/target/test-classes/ -> D:/pinpoint_project/pinpoint/profiler/target/test-classes final String target = "target"; int targetFound = testClassDir.lastIndexOf(target); if (targetFound == -1) { throw new NullPointerException("targetDir not found."); } String targetDir = testClassDir.substring(0, targetFound + target.length()); logger.debug("targetDir:{}", targetDir); return targetDir; } private ClassLoader getDefaultClassLoader(Class<?> clazz) { ClassLoader classLoader = clazz.getClassLoader(); return getClassLoader(classLoader); } private static ClassLoader getClassLoader(ClassLoader classLoader) { if (classLoader == null) { return ClassLoader.getSystemClassLoader(); } return classLoader; } public static class ProjectPath { private final String testClassPath; private final String targetPath; private final String modulePath; private final String projectPath; private final String pinpointAgentPath; public ProjectPath(String testClassPath,String targetPath, String modulePath, String projectPath, String pinpointAgentPath) { this.testClassPath = testClassPath; this.targetPath = targetPath; this.modulePath = modulePath; this.projectPath = projectPath; this.pinpointAgentPath = pinpointAgentPath; } public String getTestClassPath() { return testClassPath; } public String getTargetPath() { return targetPath; } public String getModulePath() { return modulePath; } public String getProjectPath() { return projectPath; } public String getPinpointAgentPath() { return pinpointAgentPath; } @Override public String toString() { final StringBuilder sb = new StringBuilder("ProjectPath{"); sb.append("testClassPath='").append(testClassPath).append('\''); sb.append(", targetPath='").append(targetPath).append('\''); sb.append(", modulePath='").append(modulePath).append('\''); sb.append(", projectPath='").append(projectPath).append('\''); sb.append(", pinpointAgentPath='").append(pinpointAgentPath).append('\''); sb.append('}'); return sb.toString(); } } }