diff options
author | Amadornes <amadornes@gmail.com> | 2018-07-02 07:12:27 +0200 |
---|---|---|
committer | Amadornes <amadornes@gmail.com> | 2018-07-02 07:12:27 +0200 |
commit | 92b2a6669392bd410e9a60749656a49f3e309cc0 (patch) | |
tree | cae858e8f371018771f84afeef6ae059d8910e0d /src/api | |
parent | 4ffefc5676def5855d91dffa0d089fe5402364fa (diff) | |
download | Artifactural-92b2a6669392bd410e9a60749656a49f3e309cc0.tar.gz Artifactural-92b2a6669392bd410e9a60749656a49f3e309cc0.tar.bz2 Artifactural-92b2a6669392bd410e9a60749656a49f3e309cc0.zip |
Initial (untested) version of Artifactural
Diffstat (limited to 'src/api')
12 files changed, 330 insertions, 0 deletions
diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/Artifact.java b/src/api/java/com/amadornes/artifactural/api/artifact/Artifact.java new file mode 100644 index 0000000..c82bbd9 --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/Artifact.java @@ -0,0 +1,35 @@ +package com.amadornes.artifactural.api.artifact; + +import com.amadornes.artifactural.api.cache.ArtifactCache; +import com.amadornes.artifactural.api.transform.ArtifactTransformer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.function.UnaryOperator; + +public interface Artifact { + + static Artifact none() { + return Internal.NO_ARTIFACT; + } + + ArtifactIdentifier getIdentifier(); + + ArtifactMetadata getMetadata(); + + ArtifactType getType(); + + Artifact withMetadata(ArtifactMetadata metadata); + + Artifact apply(ArtifactTransformer transformer); + + Artifact cache(ArtifactCache cache, String specifier); + + boolean isPresent(); + + InputStream openStream() throws IOException, MissingArtifactException; + +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactIdentifier.java b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactIdentifier.java new file mode 100644 index 0000000..57c263a --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactIdentifier.java @@ -0,0 +1,61 @@ +package com.amadornes.artifactural.api.artifact; + +import java.util.function.Predicate; + +public interface ArtifactIdentifier { + + static ArtifactIdentifier none() { + return Internal.NO_IDENTIFIER; + } + + String getGroup(); + + String getName(); + + String getVersion(); + + String getClassifier(); + + String getExtension(); + + static Predicate<ArtifactIdentifier> groupMatches(String group) { + return identifier -> identifier.getGroup().matches(group); + } + + static Predicate<ArtifactIdentifier> nameMatches(String name) { + return identifier -> identifier.getName().matches(name); + } + + static Predicate<ArtifactIdentifier> versionMatches(String version) { + return identifier -> identifier.getVersion().matches(version); + } + + static Predicate<ArtifactIdentifier> classifierMatches(String classifier) { + return identifier -> identifier.getClassifier().matches(classifier); + } + + static Predicate<ArtifactIdentifier> extensionMatches(String extension) { + return identifier -> identifier.getExtension().matches(extension); + } + + static Predicate<ArtifactIdentifier> groupEquals(String group) { + return identifier -> identifier.getGroup().equals(group); + } + + static Predicate<ArtifactIdentifier> nameEquals(String name) { + return identifier -> identifier.getName().equals(name); + } + + static Predicate<ArtifactIdentifier> versionEquals(String version) { + return identifier -> identifier.getVersion().equals(version); + } + + static Predicate<ArtifactIdentifier> classifierEquals(String classifier) { + return identifier -> identifier.getClassifier().equals(classifier); + } + + static Predicate<ArtifactIdentifier> extensionEquals(String extension) { + return identifier -> identifier.getExtension().equals(extension); + } + +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactMetadata.java b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactMetadata.java new file mode 100644 index 0000000..1dcd838 --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactMetadata.java @@ -0,0 +1,13 @@ +package com.amadornes.artifactural.api.artifact; + +public interface ArtifactMetadata { + + static ArtifactMetadata empty() { + return (ArtifactMetadata) null; + } + + ArtifactMetadata with(String key, String value); + + String getHash(); + +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactType.java b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactType.java new file mode 100644 index 0000000..1bd0f97 --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/ArtifactType.java @@ -0,0 +1,5 @@ +package com.amadornes.artifactural.api.artifact; + +public enum ArtifactType { + BINARY, SOURCE, OTHER +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/Internal.java b/src/api/java/com/amadornes/artifactural/api/artifact/Internal.java new file mode 100644 index 0000000..41201df --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/Internal.java @@ -0,0 +1,84 @@ +package com.amadornes.artifactural.api.artifact; + +import com.amadornes.artifactural.api.cache.ArtifactCache; +import com.amadornes.artifactural.api.transform.ArtifactTransformer; + +import java.io.IOException; +import java.io.InputStream; + +class Internal { + + static final ArtifactIdentifier NO_IDENTIFIER = new ArtifactIdentifier() { + + @Override + public String getGroup() { + return "missing"; + } + + @Override + public String getName() { + return "missing"; + } + + @Override + public String getVersion() { + return "0.0.0"; + } + + @Override + public String getClassifier() { + return ""; + } + + @Override + public String getExtension() { + return "missing"; + } + + }; + + static final Artifact NO_ARTIFACT = new Artifact() { + + @Override + public ArtifactIdentifier getIdentifier() { + return ArtifactIdentifier.none(); + } + + @Override + public ArtifactMetadata getMetadata() { + return ArtifactMetadata.empty(); + } + + @Override + public ArtifactType getType() { + return ArtifactType.OTHER; + } + + @Override + public Artifact withMetadata(ArtifactMetadata metadata) { + return this; + } + + @Override + public Artifact apply(ArtifactTransformer transformer) { + return this; + } + + @Override + public Artifact cache(ArtifactCache cache, String specifier) { + return this; + } + + @Override + public boolean isPresent() { + return false; + } + + @Override + public InputStream openStream() throws MissingArtifactException { + throw new MissingArtifactException(getIdentifier()); + } + + }; + +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/MissingArtifactException.java b/src/api/java/com/amadornes/artifactural/api/artifact/MissingArtifactException.java new file mode 100644 index 0000000..479909c --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/MissingArtifactException.java @@ -0,0 +1,9 @@ +package com.amadornes.artifactural.api.artifact; + +public class MissingArtifactException extends RuntimeException { + + public MissingArtifactException(ArtifactIdentifier identifier) { + super("Could not find artifact: " + identifier); + } + +} diff --git a/src/api/java/com/amadornes/artifactural/api/artifact/Streamable.java b/src/api/java/com/amadornes/artifactural/api/artifact/Streamable.java new file mode 100644 index 0000000..1b7de8f --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/artifact/Streamable.java @@ -0,0 +1,11 @@ +package com.amadornes.artifactural.api.artifact; + +import java.io.IOException; +import java.io.InputStream; + +@FunctionalInterface +public interface Streamable { + + InputStream openStream() throws IOException; + +} diff --git a/src/api/java/com/amadornes/artifactural/api/cache/ArtifactCache.java b/src/api/java/com/amadornes/artifactural/api/cache/ArtifactCache.java new file mode 100644 index 0000000..4f86798 --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/cache/ArtifactCache.java @@ -0,0 +1,9 @@ +package com.amadornes.artifactural.api.cache; + +import com.amadornes.artifactural.api.artifact.Artifact; + +public interface ArtifactCache { + + Artifact store(Artifact artifact, String specifier); + +} diff --git a/src/api/java/com/amadornes/artifactural/api/repository/ArtifactProvider.java b/src/api/java/com/amadornes/artifactural/api/repository/ArtifactProvider.java new file mode 100644 index 0000000..c9f21ee --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/repository/ArtifactProvider.java @@ -0,0 +1,28 @@ +package com.amadornes.artifactural.api.repository; + +import com.amadornes.artifactural.api.artifact.Artifact; + +import java.util.function.Function; +import java.util.function.Predicate; + +public interface ArtifactProvider<I> { + + Artifact getArtifact(I info); + + interface Builder<S, I> { + + Builder<S, I> filter(Predicate<I> filter); + + <D> Builder<S, D> mapInfo(Function<I, D> mapper); + + Complete<S, I> provide(ArtifactProvider<I> provider); + + interface Complete<S, I> extends ArtifactProvider<S> { + + Complete<S, I> provide(ArtifactProvider<I> provider); + + } + + } + +} diff --git a/src/api/java/com/amadornes/artifactural/api/repository/Repository.java b/src/api/java/com/amadornes/artifactural/api/repository/Repository.java new file mode 100644 index 0000000..3cf456d --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/repository/Repository.java @@ -0,0 +1,10 @@ +package com.amadornes.artifactural.api.repository; + +import com.amadornes.artifactural.api.artifact.Artifact; +import com.amadornes.artifactural.api.artifact.ArtifactIdentifier; + +public interface Repository { + + Artifact getArtifact(ArtifactIdentifier identifier); + +} diff --git a/src/api/java/com/amadornes/artifactural/api/transform/ArtifactPipeline.java b/src/api/java/com/amadornes/artifactural/api/transform/ArtifactPipeline.java new file mode 100644 index 0000000..014046f --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/transform/ArtifactPipeline.java @@ -0,0 +1,11 @@ +package com.amadornes.artifactural.api.transform; + +import com.amadornes.artifactural.api.cache.ArtifactCache; + +public interface ArtifactPipeline extends ArtifactTransformer { + + ArtifactPipeline apply(ArtifactTransformer transformer); + + ArtifactPipeline cache(ArtifactCache cache, String specifier); + +} diff --git a/src/api/java/com/amadornes/artifactural/api/transform/ArtifactTransformer.java b/src/api/java/com/amadornes/artifactural/api/transform/ArtifactTransformer.java new file mode 100644 index 0000000..e24e790 --- /dev/null +++ b/src/api/java/com/amadornes/artifactural/api/transform/ArtifactTransformer.java @@ -0,0 +1,54 @@ +package com.amadornes.artifactural.api.transform; + +import com.amadornes.artifactural.api.artifact.Artifact; +import com.amadornes.artifactural.api.artifact.ArtifactMetadata; + +import java.util.Set; +import java.util.function.UnaryOperator; + +public interface ArtifactTransformer { + + static ArtifactTransformer of(UnaryOperator<Artifact> operator) { + return new ArtifactTransformer() { + @Override + public Artifact transform(Artifact artifact) { + return operator.apply(artifact); + } + + @Override + public ArtifactMetadata withInfo(ArtifactMetadata metadata) { + return metadata; + } + }; + } + + static ArtifactTransformer exclude(Set<String> filters) { + return (ArtifactTransformer) new Object(); + } + + default boolean appliesTo(Artifact artifact) { + return true; + } + + Artifact transform(Artifact artifact); + + ArtifactMetadata withInfo(ArtifactMetadata metadata); + + default ArtifactTransformer andThen(ArtifactTransformer other) { + ArtifactTransformer current = this; + return new ArtifactTransformer() { + + @Override + public Artifact transform(Artifact artifact) { + return other.transform(current.transform(artifact)); + } + + @Override + public ArtifactMetadata withInfo(ArtifactMetadata metadata) { + return other.withInfo(current.withInfo(metadata)); + } + + }; + } + +} |