io.imqa.injector.DependencyInjector Maven / Gradle / Ivy
package io.imqa.injector;
import org.gradle.api.Project;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.DependencySet;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.DependencyResolutionListener;
import org.gradle.api.artifacts.ResolvableDependencies;
import io.imqa.IMQAPlugin;
import io.imqa.injector.format.Version;
import io.imqa.injector.util.Logger;
import io.imqa.injector.util.BuildOption;
import java.util.Set;
import java.util.HashSet;
import java.lang.Iterable;
import java.util.Iterator;
public class DependencyInjector {
public static final String CONF_IMQA_SDK = "imqa";
DependencySet compileDeps;
private static final String IMQA_GROUP_NAME = "io.imqa";
private static final String MPM_SDK_NAME = "imqa-mpm-client";
private static final String CRASH_SDK_NAME = "imqa-crash-client";
private static final String CORE_SDK_NAME = "imqa-core";
private String MPM_SDK_INFO_FOR_DEPENDENCY = "";
private String CRASH_SDK_INFO_FOR_DEPENDENCY = "";
private String CORE_SDK_INFO_FOR_DEPENDENCY = "";
public DependencyInjector() {
// TODO local.properties 에서 가져올 것
MPM_SDK_INFO_FOR_DEPENDENCY += IMQA_GROUP_NAME +":"+ MPM_SDK_NAME +":"+ "2.19.0";
CRASH_SDK_INFO_FOR_DEPENDENCY += IMQA_GROUP_NAME +":"+ CRASH_SDK_NAME +":"+ "2.19.0";
CORE_SDK_INFO_FOR_DEPENDENCY += IMQA_GROUP_NAME +":"+ CORE_SDK_NAME +":"+ "2.19.0";
}
public void doInject(Project project) {
Logger.d("Target Projects", "project : "+project.getName());
Logger.d("IMQA Options", "imqaMpm : "+BuildOption.imqaMpm);
Logger.d("IMQA Options", "imqaCrash : "+BuildOption.imqaCrash);
Logger.d("IMQA Options", "imqaCore : "+BuildOption.imqaCore);
Set dependencyTypeSet = new HashSet();
dependencyTypeSet.add("compile");
Version gradleVersion = IMQAPlugin.getGradleVersion(project);
if (gradleVersion.majorVersion == 3) {
if (gradleVersion.minorVersion >= 1) {
dependencyTypeSet.clear();
}
dependencyTypeSet.add("implementation");
}
String dependencyType = "";
boolean hasMpmDependency = false;
boolean hasCrashDependency = false;
boolean hasCoreDependency = false;
for(Iterator depIter = dependencyTypeSet.iterator(); depIter.hasNext();) {
dependencyType = String.valueOf(depIter.next());
Logger.d("Dependency Type", dependencyType);
compileDeps = project.getConfigurations().getByName(dependencyType).getDependencies();
if (hasDependency(compileDeps, MPM_SDK_NAME) && BuildOption.imqaMpm) {
hasMpmDependency = true;
Logger.d("SDK already imported", MPM_SDK_INFO_FOR_DEPENDENCY);
}
if (hasDependency(compileDeps, CRASH_SDK_NAME) && BuildOption.imqaMpm) {
hasCrashDependency = true;
Logger.d("SDK already imported", CRASH_SDK_INFO_FOR_DEPENDENCY);
}
if (hasDependency(compileDeps, CORE_SDK_NAME) && BuildOption.imqaMpm) {
hasCoreDependency = true;
Logger.d("SDK already imported", CORE_SDK_INFO_FOR_DEPENDENCY);
}
}
if (!hasMpmDependency && BuildOption.imqaMpm) {
dynamicDependencyInject(project, dependencyType, MPM_SDK_INFO_FOR_DEPENDENCY);
}
if (!hasCrashDependency && BuildOption.imqaCrash) {
dynamicDependencyInject(project, dependencyType, CRASH_SDK_INFO_FOR_DEPENDENCY);
}
if (!hasCoreDependency && BuildOption.imqaCore) {
dynamicDependencyInject(project, dependencyType, CORE_SDK_INFO_FOR_DEPENDENCY);
}
}
private static boolean hasDependency(DependencySet compileDeps, String imqaDependency) {
// 의존성 확인
boolean hasDependency = false;
Iterator it = compileDeps.iterator();
while (it.hasNext()) {
Dependency dep = it.next();
if (dep.getGroup() != null
&& dep.getGroup().equals(IMQA_GROUP_NAME)
&& dep.getName().equals(imqaDependency)) {
hasDependency = true;
}
}
return hasDependency;
}
private static void dynamicDependencyInject(Project project, String dependencyType, String name) {
// 실시간 의존성 추가
project.getConfigurations()
.getByName(dependencyType)
.getDependencies()
.add(project.getDependencies().create(name));
Logger.d("SDK Importing", name);
}
}