Skip to content

Commit

Permalink
Provide ability to add directURL
Browse files Browse the repository at this point in the history
  • Loading branch information
CyR1en committed Jun 1, 2019
1 parent 2d13ac0 commit dcd6495
Show file tree
Hide file tree
Showing 15 changed files with 318 additions and 35 deletions.
4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions build.gradle
Expand Up @@ -39,19 +39,17 @@ repositories {
dependencies {
compile 'org.atteo.classindex:classindex:3.6'
annotationProcessor 'org.atteo.classindex:classindex:3.6'
//compile 'me.lucko:jar-relocator:1.3'
//compile 'com.google.guava:guava:27.1-jre'
compile group: 'me.tongfei', name: 'progressbar', version: '0.7.1'

compileOnly 'org.slf4j:slf4j-api:1.7.25'

testCompile 'org.atteo.classindex:classindex:3.6'
testAnnotationProcessor 'org.atteo.classindex:classindex:3.6'

testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.2'
testCompile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.25'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.12.1'
testCompile 'org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-depchain:3.1.3'
}

shadowJar {
Expand Down
53 changes: 34 additions & 19 deletions src/main/java/com/cyr1en/javen/Dependency.java
Expand Up @@ -28,64 +28,79 @@

public class Dependency {

private String group;
private String name;
private String groupId;
private String artifactId;
private String version;
private String directURL;

public Dependency(String group, String name, String version) {
this.group = group;
this.name = name;
this(group, name, version, null);
}

public Dependency(String group, String name, String version, String directURL) {
this.groupId = group;
this.artifactId = name;
this.version = version;
this.directURL = directURL == null ? URLResolver.UNRESOLVED : directURL;
}

public String asURL() {
StringBuilder builder = new StringBuilder();
String formattedGroup = group.replaceAll("\\.", "/");
String artifactName = name + "-" + version;
String formattedGroup = groupId.replaceAll("\\.", "/");
String artifactName = artifactId + "-" + version;
builder.append(formattedGroup).append("/");
builder.append(name).append("/");
builder.append(artifactId).append("/");
builder.append(version).append("/").append(artifactName).append(".jar");
return builder.toString();
}

public String asJarName() {
return getName() + "-" + getVersion() + ".jar";
return getArtifactId() + "-" + getVersion() + ".jar";
}

public String getGroup() {
return group;
public String getGroupId() {
return groupId;
}

public String getName() {
return name;
public String getArtifactId() {
return artifactId;
}

public String getVersion() {
return version;
}

public String getDirectURL() {
return directURL;
}

public String getCanonicalName() {
return getGroupId() + ":" + getArtifactId() + ":" + getVersion();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Dependency)) return false;
Dependency that = (Dependency) o;
return Objects.equals(group, that.group) &&
Objects.equals(name, that.name) &&
Objects.equals(version, that.version);
return Objects.equals(groupId, that.groupId) &&
Objects.equals(artifactId, that.artifactId) &&
Objects.equals(version, that.version) &&
Objects.equals(directURL, that.directURL);
}

@Override
public int hashCode() {
return Objects.hash(group, name, version);
return Objects.hash(groupId, artifactId, version);
}

@Override
public String toString() {
return "Dependency{" +
"group='" + group + '\'' +
", name='" + name + '\'' +
"groupId='" + groupId + '\'' +
", artifactId='" + artifactId + '\'' +
", version='" + version + '\'' +
", directURL='" + directURL + '\'' +
'}';
}

}
17 changes: 15 additions & 2 deletions src/main/java/com/cyr1en/javen/Javen.java
Expand Up @@ -43,11 +43,12 @@

public class Javen {

public static Logger LOGGER;
public static final Logger LOGGER;
public static final Method ADD_URL_METHOD;

static {
try {
LOGGER = LoggerFactory.getLogger(Javen.class);
ADD_URL_METHOD = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
ADD_URL_METHOD.setAccessible(true);
} catch (NoSuchMethodException e) {
Expand All @@ -62,14 +63,26 @@ public class Javen {
private List<ClassLoader> classLoaders;

public Javen(Path libPath) {
LOGGER = LoggerFactory.getLogger(this.getClass());
repositories = new Repositories();
resolver = new URLResolver(repositories);
libsDir = new LibDirectory(libPath.toString());
loadedDependency = new LinkedHashMap<>();
classLoaders = new ArrayList<>();
}

public static synchronized void loadDependencies(File[] files) {
for (File file : files) {
String name = file.getName();
URLClassLoader cl = (URLClassLoader) Javen.class.getClassLoader();
try {
ADD_URL_METHOD.invoke(cl, file.toURI().toURL());
LOGGER.info("Successfully loaded: " + name);
} catch (IllegalAccessException | InvocationTargetException | MalformedURLException e) {
e.printStackTrace();
}
}
}

public synchronized void loadDependencies() {
downloadNeededDeps();
try {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/cyr1en/javen/LibDirectory.java
Expand Up @@ -76,7 +76,7 @@ public File[] listJarFilesMatching(Dependency dependency) {
List<File> builder = new ArrayList<>();
for(File jarFile : files) {
String jarName = FileUtil.getSimpleName(jarFile).toLowerCase();
String depName = dependency.getName().toLowerCase();
String depName = dependency.getArtifactId().toLowerCase();
if(jarName.equalsIgnoreCase(dependency.asJarName()) || jarName.contains(depName))
builder.add(jarFile);
}
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/com/cyr1en/javen/Repository.java
Expand Up @@ -36,10 +36,16 @@ public class Repository {

private String id;
private String repositoryURL;
private String layout;

public Repository(String id, String repositoryURL) {
this(id, repositoryURL, null);
}

public Repository(String id, String repositoryURL, String layout) {
this.id = id;
this.repositoryURL = prepareURL(repositoryURL);
this.layout = Objects.isNull(layout) ? "default" : layout;
}

public String getId() {
Expand All @@ -50,6 +56,10 @@ public String getRepositoryURL() {
return repositoryURL;
}

public String getLayout() {
return layout;
}

private String prepareURL(String s) {
String trimmed = s.trim();
return trimmed.endsWith("/") ?
Expand Down Expand Up @@ -79,7 +89,6 @@ public URL getURLOf(Dependency dependency) {
return null;
}


@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/cyr1en/javen/URLResolver.java
Expand Up @@ -24,6 +24,7 @@

package com.cyr1en.javen;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
Expand All @@ -32,6 +33,8 @@

public class URLResolver {

public static final String UNRESOLVED = "unresolved";

private Repositories repositories;

public URLResolver(Repositories repositories) {
Expand Down Expand Up @@ -72,6 +75,12 @@ public List<URL> resolve(Collection<? extends Dependency> dependencies) {
* @return {@link URL} if successfully resolved, null if not.
*/
public URL resolve(Dependency dependency) {
if (!dependency.getDirectURL().equals(UNRESOLVED))
try {
String dUrl = dependency.getDirectURL();
return new URL(dUrl);
} catch (MalformedURLException ignore) { }

for (Repository repo : repositories)
if (repo.contains(dependency))
return repo.getURLOf(dependency);
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/cyr1en/javen/annotation/Lib.java
Expand Up @@ -54,4 +54,12 @@
* @return Version of artifact.
*/
String version();

/**
* If Javen can't resolve your dependency,
* provide a direct download URL for the jar file.
*
* @return Link for the artifact.
*/
String directURL() default "";
}
16 changes: 10 additions & 6 deletions src/main/java/com/cyr1en/javen/util/JavenUtil.java
Expand Up @@ -88,20 +88,24 @@ public static int getFileSizeKB(URL url) {
public static List<Dependency> findAllRequestedDeps(ClassLoader... classLoaders) {
List<Dependency> builder = new ArrayList<>();
for (Class<?> c : ClassIndex.getAnnotated(Lib.class)) {
for (Lib libMeta : c.getDeclaredAnnotationsByType(Lib.class))
builder.add(new Dependency(libMeta.group(), libMeta.name(), libMeta.version()));
for (Lib libMeta : c.getDeclaredAnnotationsByType(Lib.class)) {
String url = FastStrings.isBlank(libMeta.directURL()) ? null : libMeta.directURL();
builder.add(new Dependency(libMeta.group(), libMeta.name(), libMeta.version(), url));
}
}
for(ClassLoader classLoader : classLoaders) {
for (ClassLoader classLoader : classLoaders) {
for (Class<?> c : ClassIndex.getAnnotated(Lib.class, classLoader))
for (Lib libMeta : c.getDeclaredAnnotationsByType(Lib.class))
builder.add(new Dependency(libMeta.group(), libMeta.name(), libMeta.version()));
for (Lib libMeta : c.getDeclaredAnnotationsByType(Lib.class)) {
String url = FastStrings.isBlank(libMeta.directURL()) ? null : libMeta.directURL();
builder.add(new Dependency(libMeta.group(), libMeta.name(), libMeta.version(), url));
}
}
return builder.stream().distinct().collect(Collectors.toList());
}

public static Dependency dependencyByArtifactName(String artifactName) {
return findAllRequestedDeps().stream()
.filter(d -> d.getName().equals(artifactName)).findFirst().orElse(null);
.filter(d -> d.getArtifactId().equals(artifactName)).findFirst().orElse(null);
}

public static Dependency dependencyByFileName(String fileName) {
Expand Down
11 changes: 8 additions & 3 deletions src/test/java/com/cyr1en/javen/test/JavenTest.java
Expand Up @@ -50,6 +50,7 @@ public class JavenTest {

private Dependency mavenCentralTarget;
private Dependency jCenterTarget;
private Dependency directURLTarget;

@Before
public void before() {
Expand All @@ -59,6 +60,7 @@ public void before() {
javen.addRepository(jCenterRepo);
mavenCentralTarget = new Dependency("com.google.guava", "guava", "27.1-jre");
jCenterTarget = new Dependency("net.dv8tion", "JDA", "3.8.3_462");
directURLTarget = new Dependency("de.articdive", "EnumToYAML", "1.0-20190129.130317-1", "https://nexus.articdive.de/repository/maven-public/de/articdive/EnumToYAML/1.0-SNAPSHOT/EnumToYAML-1.0-20190129.130317-1.jar");
}

@Test
Expand All @@ -69,7 +71,7 @@ public void testContainsJCenter() {
@Test
public void testRequestedIsDistinct() {
List<Dependency> requested = JavenUtil.findAllRequestedDeps();
Assertions.assertThat(requested.size()).isEqualTo(3);
Assertions.assertThat(requested.size()).isEqualTo(4);
}

@Test
Expand All @@ -82,7 +84,7 @@ public void testRequestedDeps() {
@Test
public void testGetDepsToDownload() {
Map<Dependency, URL> needToDownload = javen.getDepsToDownload();
Assertions.assertThat(needToDownload.size()).isEqualTo(2);
Assertions.assertThat(needToDownload.size()).isEqualTo(3);
Assertions.assertThat(needToDownload.containsKey(mavenCentralTarget) &&
needToDownload.containsKey(jCenterTarget)).isTrue();
}
Expand All @@ -106,17 +108,20 @@ public void testLoadDepsAfterAllTestsAreDone() {
public void after() throws IOException {
javen.getLibsDir().deleteDependency(mavenCentralTarget);
javen.getLibsDir().deleteDependency(jCenterTarget);
javen.getLibsDir().deleteDependency(directURLTarget);

Path backup = Paths.get("src/test/resources/backup/flatdb-1.0.4.jar");
Path libsDir = Paths.get("src/test/resources/testLibDir/flatdb-1.0.4.jar");
if(!Files.exists(libsDir))
if (!Files.exists(libsDir))
Files.copy(backup, libsDir);
}

@Lib(group = "com.google.guava", name = "guava", version = "27.1-jre")
@Lib(group = "com.google.guava", name = "guava", version = "27.1-jre")
@Lib(group = "com.github.cyr1en", name = "FlatDB", version = "1.0.5")
@Lib(group = "net.dv8tion", name = "JDA", version = "3.8.3_462")
@Lib(group = "de.articdive", name = "EnumToYAML", version = "1.0-20190129.130317-1",
directURL = "https://nexus.articdive.de/repository/maven-public/de/articdive/EnumToYAML/1.0-SNAPSHOT/EnumToYAML-1.0-20190129.130317-1.jar")
private class TestClass {

}
Expand Down
4 changes: 4 additions & 0 deletions src/test/java/com/cyr1en/javen/test/URLResolverTest.java
Expand Up @@ -41,11 +41,13 @@ public class URLResolverTest {

private static final URL guavaSample;
private static final URL brigadierSample;
private static final URL enumToYamlSample;

static {
try {
guavaSample = new URL("https://repo.maven.apache.org/maven2/com/google/guava/guava/27.1-jre/guava-27.1-jre.jar");
brigadierSample = new URL("https://libraries.minecraft.net/com/mojang/brigadier/1.0.14/brigadier-1.0.14.jar");
enumToYamlSample = new URL("https://nexus.articdive.de/repository/maven-public/de/articdive/EnumToYAML/1.0-SNAPSHOT/EnumToYAML-1.0-20190129.130317-1.jar");
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
Expand All @@ -63,7 +65,9 @@ public void before() {
@Test
public void testValidURLResolve() {
URL resolved = resolver.resolve(new Dependency("com.google.guava", "guava", "27.1-jre"));
URL resolved1 = resolver.resolve(new Dependency("de.articdive", "EnumToYAML", "1.0-20190129.130317-1", "https://nexus.articdive.de/repository/maven-public/de/articdive/EnumToYAML/1.0-SNAPSHOT/EnumToYAML-1.0-20190129.130317-1.jar"));
assertEquals(guavaSample, resolved);
assertEquals(enumToYamlSample, resolved1);
}

@Test
Expand Down

0 comments on commit dcd6495

Please sign in to comment.