From 666e19032d44dad4a88f937423c27bca0eb795c6 Mon Sep 17 00:00:00 2001 From: Evgeny Goldin Date: Sun, 9 Nov 2014 22:53:35 +0100 Subject: [PATCH] BintrayResolver added --- src/example/bintray/build.xml | 23 ++ src/example/bintray/ivy.xml | 31 +++ src/example/bintray/ivysettings.xml | 37 +++ .../apache/ivy/core/settings/typedef.properties | 1 + .../ivy/plugins/resolver/BintrayResolver.java | 81 +++++++ .../ivy/plugins/resolver/BintrayResolverTest.java | 269 +++++++++++++++++++++ 6 files changed, 442 insertions(+) create mode 100644 src/example/bintray/build.xml create mode 100644 src/example/bintray/ivy.xml create mode 100644 src/example/bintray/ivysettings.xml create mode 100644 src/java/org/apache/ivy/plugins/resolver/BintrayResolver.java create mode 100644 test/java/org/apache/ivy/plugins/resolver/BintrayResolverTest.java diff --git a/src/example/bintray/build.xml b/src/example/bintray/build.xml new file mode 100644 index 0000000..c82359e --- /dev/null +++ b/src/example/bintray/build.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/src/example/bintray/ivy.xml b/src/example/bintray/ivy.xml new file mode 100644 index 0000000..120a43b --- /dev/null +++ b/src/example/bintray/ivy.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/src/example/bintray/ivysettings.xml b/src/example/bintray/ivysettings.xml new file mode 100644 index 0000000..15adc16 --- /dev/null +++ b/src/example/bintray/ivysettings.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/ivy/core/settings/typedef.properties b/src/java/org/apache/ivy/core/settings/typedef.properties index 230b928..d35183e 100644 --- a/src/java/org/apache/ivy/core/settings/typedef.properties +++ b/src/java/org/apache/ivy/core/settings/typedef.properties @@ -19,6 +19,7 @@ filesystem = org.apache.ivy.plugins.resolver.FileSystemResolver chain = org.apache.ivy.plugins.resolver.ChainResolver ibiblio = org.apache.ivy.plugins.resolver.IBiblioResolver +bintray = org.apache.ivy.plugins.resolver.BintrayResolver url = org.apache.ivy.plugins.resolver.URLResolver dual = org.apache.ivy.plugins.resolver.DualResolver ivyrep = org.apache.ivy.plugins.resolver.IvyRepResolver diff --git a/src/java/org/apache/ivy/plugins/resolver/BintrayResolver.java b/src/java/org/apache/ivy/plugins/resolver/BintrayResolver.java new file mode 100644 index 0000000..fdabfbe --- /dev/null +++ b/src/java/org/apache/ivy/plugins/resolver/BintrayResolver.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.ivy.plugins.resolver; + + +/** + * BintrayResolver is a resolver which can be used to resolve dependencies found in the Bintray artifacts repository. + */ +@SuppressWarnings( "ClassTooDeepInInheritanceTree" ) +public class BintrayResolver extends IBiblioResolver +{ + + private static final String JCENTER = "https://jcenter.bintray.com/"; + private static final String DL_BINTRAY = "https://dl.bintray.com/"; + private static final String DEFAULT_NAME = "bintray/jcenter"; + + private String subject; + private String repo; + private boolean isNameUpdatable; // Whether resolver's name was not originally specified and can be updated. + + + public BintrayResolver () { + setRoot( JCENTER ); + updateName( DEFAULT_NAME ); + setM2compatible( true ); + setUsepoms( true ); + setUseMavenMetadata( true ); + } + + + public void setSubject( String subject ) { + this.subject = subject; + updateRoot(); + } + + + public void setRepo( String repo ) { + this.repo = repo; + updateRoot(); + } + + + @SuppressWarnings( "MethodWithMultipleReturnPoints" ) + private void updateRoot() { + if ( isEmpty( subject ) || isEmpty( repo )) { return; } + + setRoot( String.format( "%s%s/%s/", DL_BINTRAY, subject, repo )); + updateName( String.format( "bintray/%s/%s", subject, repo )); + } + + + private void updateName( String defaultName ) { + if ( isEmpty( defaultName )) { + throw new IllegalArgumentException( "Default resolver name must not be null or empty" ); + } + if ( isEmpty( getName()) || isNameUpdatable ) { + isNameUpdatable = true; + setName( defaultName ); + } + } + + + private boolean isEmpty( String s ) { + return (( s == null ) || ( s.trim().length() < 1 )); + } +} diff --git a/test/java/org/apache/ivy/plugins/resolver/BintrayResolverTest.java b/test/java/org/apache/ivy/plugins/resolver/BintrayResolverTest.java new file mode 100644 index 0000000..77f1147 --- /dev/null +++ b/test/java/org/apache/ivy/plugins/resolver/BintrayResolverTest.java @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.ivy.plugins.resolver; + +import org.apache.ivy.core.IvyContext; +import org.apache.ivy.core.event.EventManager; +import org.apache.ivy.core.module.descriptor.Artifact; +import org.apache.ivy.core.module.descriptor.DefaultArtifact; +import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; +import org.apache.ivy.core.module.descriptor.DefaultIncludeRule; +import org.apache.ivy.core.module.id.ArtifactId; +import org.apache.ivy.core.module.id.ModuleRevisionId; +import org.apache.ivy.core.report.ArtifactDownloadReport; +import org.apache.ivy.core.report.DownloadReport; +import org.apache.ivy.core.report.DownloadStatus; +import org.apache.ivy.core.resolve.ResolveData; +import org.apache.ivy.core.resolve.ResolveEngine; +import org.apache.ivy.core.resolve.ResolveOptions; +import org.apache.ivy.core.resolve.ResolvedModuleRevision; +import org.apache.ivy.core.settings.IvySettings; +import org.apache.ivy.core.sort.SortEngine; +import org.apache.ivy.plugins.matcher.ExactPatternMatcher; +import org.apache.ivy.util.MockMessageLogger; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.Delete; + +import java.io.File; + +/** + * + */ +public class BintrayResolverTest extends AbstractDependencyResolverTest { + + private IvySettings _settings; + + private ResolveEngine _engine; + + private ResolveData _data; + + private File _cache; + + protected void setUp() throws Exception { + _settings = new IvySettings(); + _engine = new ResolveEngine(_settings, new EventManager(), new SortEngine(_settings)); + _cache = new File("build/cache"); + _data = new ResolveData(_engine, new ResolveOptions()); + _cache.mkdirs(); + _settings.setDefaultCache(_cache); + } + + protected void tearDown() throws Exception { + Delete del = new Delete(); + del.setProject(new Project()); + del.setDir(_cache); + del.execute(); + } + + + public void testDefaults() { + BintrayResolver resolver = new BintrayResolver(); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot()); + assertEquals( "bintray/jcenter", resolver.getName()); + } + + + public void testDefaultsWithName() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setName( "TestName" ); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot() ); + assertEquals( "TestName", resolver.getName()); + } + + + public void testSubjectOnly() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setSubject( "jfrog" ); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot()); + assertEquals( "bintray/jcenter", resolver.getName()); + } + + + public void testRepoOnly() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setRepo( "jfrog-jars" ); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot()); + assertEquals( "bintray/jcenter", resolver.getName()); + } + + + public void testSubjectOnlyWithName() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setSubject( "jfrog" ); + resolver.setName( "TestName" ); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot()); + assertEquals( "TestName", resolver.getName()); + } + + + public void testRepoOnlyWithName() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setRepo( "jfrog-jars" ); + resolver.setName( "TestName" ); + assertEquals( "http://jcenter.bintray.com/", resolver.getRoot()); + assertEquals( "TestName", resolver.getName()); + } + + + public void testSubjectAndRepo() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setSubject( "jfrog" ); + resolver.setRepo( "jfrog-jars" ); + assertEquals( "http://dl.bintray.com/jfrog/jfrog-jars/", resolver.getRoot() ); + assertEquals( "bintray/jfrog/jfrog-jars", resolver.getName()); + } + + + public void testSubjectAndRepoWithName() { + BintrayResolver resolver = new BintrayResolver(); + resolver.setSubject( "jfrog" ); + resolver.setRepo( "jfrog-jars" ); + resolver.setName( "TestName" ); + assertEquals( "http://dl.bintray.com/jfrog/jfrog-jars/", resolver.getRoot()); + assertEquals( "TestName", resolver.getName()); + } + + + public void testBintray() throws Exception { + + BintrayResolver resolver = new BintrayResolver(); + resolver.setSettings(_settings); + ModuleRevisionId mrid = ModuleRevisionId.newInstance( "org.apache.ant", "ant-antunit", "1.2" ); + ResolvedModuleRevision rmr = resolver.getDependency( new DefaultDependencyDescriptor( mrid, false ), _data); + assertNotNull(rmr); + assertEquals(mrid, rmr.getId()); + + DefaultArtifact artifact = new DefaultArtifact(mrid, rmr.getPublicationDate(), + "ant-antunit", "jar", "jar"); + DownloadReport report = resolver.download(new Artifact[] {artifact}, downloadOptions()); + assertNotNull(report); + + assertEquals(1, report.getArtifactsReports().length); + + ArtifactDownloadReport ar = report.getArtifactReport(artifact); + assertNotNull(ar); + + assertEquals(artifact, ar.getArtifact()); + assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); + + // test to ask to download again, should use cache + report = resolver.download(new Artifact[] {artifact}, downloadOptions()); + assertNotNull(report); + + assertEquals(1, report.getArtifactsReports().length); + + ar = report.getArtifactReport(artifact); + assertNotNull(ar); + + assertEquals(artifact, ar.getArtifact()); + assertEquals(DownloadStatus.NO, ar.getDownloadStatus()); + } + + + public void testErrorReport() throws Exception { + BintrayResolver resolver = new BintrayResolver(); + resolver.setSubject("unknown"); + resolver.setRepo( "unknown" ); + resolver.setName("test"); + resolver.setM2compatible(true); + resolver.setSettings(_settings); + assertEquals("test", resolver.getName()); + + MockMessageLogger mockMessageImpl = new MockMessageLogger(); + IvyContext.getContext().getIvy().getLoggerEngine().setDefaultLogger(mockMessageImpl); + + ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "commons-fileupload", + "1.0"); + ResolvedModuleRevision rmr = resolver.getDependency(new DefaultDependencyDescriptor(mrid, + false), _data); + assertNull(rmr); + + mockMessageImpl + .assertLogContains("trying http://dl.bintray.com/unknown/unknown/org/apache/commons-fileupload/1.0/commons-fileupload-1.0.jar"); + mockMessageImpl + .assertLogContains("tried http://dl.bintray.com/unknown/unknown/org/apache/commons-fileupload/1.0/commons-fileupload-1.0.jar"); + } + + public void testBintrayArtifacts() throws Exception { + BintrayResolver resolver = new BintrayResolver(); + resolver.setName("test"); + resolver.setSettings(_settings); + assertEquals("test", resolver.getName()); + + ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache.ant", "ant-antunit", "1.2"); + DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(mrid, false); + dd.addIncludeRule("default", new DefaultIncludeRule(new ArtifactId(mrid.getModuleId(), + "ant-antunit", "javadoc", "jar"), ExactPatternMatcher.INSTANCE, null)); + dd.addIncludeRule("default", new DefaultIncludeRule(new ArtifactId(mrid.getModuleId(), + "ant-antunit", "sources", "jar"), ExactPatternMatcher.INSTANCE, null)); + ResolvedModuleRevision rmr = resolver.getDependency(dd, _data); + assertNotNull(rmr); + assertEquals(mrid, rmr.getId()); + + DefaultArtifact profiler = new DefaultArtifact(mrid, rmr.getPublicationDate(), + "ant-antunit", "javadoc", "jar"); + DefaultArtifact trace = new DefaultArtifact(mrid, rmr.getPublicationDate(), + "ant-antunit", "sources", "jar"); + DownloadReport report = resolver.download(new Artifact[] {profiler, trace}, + downloadOptions()); + assertNotNull(report); + + assertEquals(2, report.getArtifactsReports().length); + + ArtifactDownloadReport ar = report.getArtifactReport(profiler); + assertNotNull(ar); + + assertEquals(profiler, ar.getArtifact()); + assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); + + ar = report.getArtifactReport(trace); + assertNotNull(ar); + + assertEquals(trace, ar.getArtifact()); + assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus()); + + // test to ask to download again, should use cache + report = resolver.download(new Artifact[] {profiler, trace}, downloadOptions()); + assertNotNull(report); + + assertEquals(2, report.getArtifactsReports().length); + + ar = report.getArtifactReport(profiler); + assertNotNull(ar); + + assertEquals(profiler, ar.getArtifact()); + assertEquals(DownloadStatus.NO, ar.getDownloadStatus()); + + ar = report.getArtifactReport(trace); + assertNotNull(ar); + + assertEquals(trace, ar.getArtifact()); + assertEquals(DownloadStatus.NO, ar.getDownloadStatus()); + } + + public void testUnknown() throws Exception { + BintrayResolver resolver = new BintrayResolver(); + resolver.setName("test"); + resolver.setSettings(_settings); + + assertNull(resolver.getDependency( + new DefaultDependencyDescriptor(ModuleRevisionId.newInstance("unknown", "unknown", + "1.0"), false), _data)); + } + +} -- 2.0.1