aboutsummaryrefslogtreecommitdiff
path: root/src/shared/java/net/minecraftforge/artifactural/base/cache
diff options
context:
space:
mode:
authorLexManos <LexManos@gmail.com>2021-01-17 17:35:01 -0800
committerLexManos <LexManos@gmail.com>2021-01-17 17:40:39 -0800
commit4089917696fffbd4b818fb90958d20f0714f93fb (patch)
tree1f5de4972d9afe0328d7d0ce929aac06c3bca15e /src/shared/java/net/minecraftforge/artifactural/base/cache
parent631cd05e726092c51e95b52bb8a8bb6a2ae2cc42 (diff)
downloadArtifactural-4089917696fffbd4b818fb90958d20f0714f93fb.tar.gz
Artifactural-4089917696fffbd4b818fb90958d20f0714f93fb.tar.bz2
Artifactural-4089917696fffbd4b818fb90958d20f0714f93fb.zip
Move to net.minecraftforge package, and update license headers.
Diffstat (limited to 'src/shared/java/net/minecraftforge/artifactural/base/cache')
-rw-r--r--src/shared/java/net/minecraftforge/artifactural/base/cache/ArtifactCacheBase.java129
-rw-r--r--src/shared/java/net/minecraftforge/artifactural/base/cache/LocatedArtifactCache.java69
2 files changed, 198 insertions, 0 deletions
diff --git a/src/shared/java/net/minecraftforge/artifactural/base/cache/ArtifactCacheBase.java b/src/shared/java/net/minecraftforge/artifactural/base/cache/ArtifactCacheBase.java
new file mode 100644
index 0000000..3268871
--- /dev/null
+++ b/src/shared/java/net/minecraftforge/artifactural/base/cache/ArtifactCacheBase.java
@@ -0,0 +1,129 @@
+/*
+ * Artifactural
+ * Copyright (c) 2018-2021.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package net.minecraftforge.artifactural.base.cache;
+
+import net.minecraftforge.artifactural.api.artifact.Artifact;
+import net.minecraftforge.artifactural.api.artifact.ArtifactIdentifier;
+import net.minecraftforge.artifactural.api.artifact.ArtifactMetadata;
+import net.minecraftforge.artifactural.api.artifact.ArtifactType;
+import net.minecraftforge.artifactural.api.artifact.MissingArtifactException;
+import net.minecraftforge.artifactural.api.cache.ArtifactCache;
+import net.minecraftforge.artifactural.api.transform.ArtifactTransformer;
+import net.minecraftforge.artifactural.base.artifact.StreamableArtifact;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public abstract class ArtifactCacheBase implements ArtifactCache {
+
+ Artifact.Cached doStore(File path, Artifact artifact) {
+ return wrap(
+ StreamableArtifact.ofStreamable(
+ artifact.getIdentifier(),
+ artifact.getType(),
+ () -> stream(path, artifact)
+ ).withMetadata(artifact.getMetadata()),
+ path
+ );
+ }
+
+ private InputStream stream(File path, Artifact artifact) throws IOException {
+ if (!path.exists()) {
+ path.getParentFile().mkdirs();
+ path.createNewFile();
+ FileOutputStream fos = new FileOutputStream(path);
+ InputStream is = artifact.openStream();
+ int read;
+ byte[] bytes = new byte[256];
+ while ((read = is.read(bytes)) > 0) {
+ fos.write(bytes, 0, read);
+ }
+ fos.close();
+ is.close();
+ }
+ return new FileInputStream(path);
+ }
+
+ public static Artifact.Cached wrap(Artifact artifact, File file) {
+ return new Artifact.Cached() {
+
+ @Override
+ public ArtifactIdentifier getIdentifier() {
+ return artifact.getIdentifier();
+ }
+
+ @Override
+ public ArtifactMetadata getMetadata() {
+ return artifact.getMetadata();
+ }
+
+ @Override
+ public ArtifactType getType() {
+ return artifact.getType();
+ }
+
+ @Override
+ public Artifact withMetadata(ArtifactMetadata metadata) {
+ return artifact.withMetadata(metadata);
+ }
+
+ @Override
+ public Artifact apply(ArtifactTransformer transformer) {
+ return artifact.apply(transformer);
+ }
+
+ @Override
+ public Artifact.Cached cache(ArtifactCache cache) {
+ return artifact.cache(cache);
+ }
+
+ @Override
+ public boolean isPresent() {
+ return artifact.isPresent();
+ }
+
+ @Override
+ public InputStream openStream() throws IOException, MissingArtifactException {
+ return artifact.openStream();
+ }
+
+ @Override
+ public File asFile() throws IOException, MissingArtifactException {
+ if(!file.exists()) {
+ artifact.openStream().close();
+ }
+ return file;
+ }
+
+ @Override
+ public File getFileLocation() throws MissingArtifactException {
+ return file;
+ }
+ @Override
+ public String toString() {
+ return "wrapped(" + artifact + ", " + file + ")";
+ }
+ };
+ }
+
+}
diff --git a/src/shared/java/net/minecraftforge/artifactural/base/cache/LocatedArtifactCache.java b/src/shared/java/net/minecraftforge/artifactural/base/cache/LocatedArtifactCache.java
new file mode 100644
index 0000000..5627b50
--- /dev/null
+++ b/src/shared/java/net/minecraftforge/artifactural/base/cache/LocatedArtifactCache.java
@@ -0,0 +1,69 @@
+/*
+ * Artifactural
+ * Copyright (c) 2018-2021.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package net.minecraftforge.artifactural.base.cache;
+
+import net.minecraftforge.artifactural.api.artifact.Artifact;
+import net.minecraftforge.artifactural.api.artifact.ArtifactIdentifier;
+import net.minecraftforge.artifactural.base.util.PatternReplace;
+
+import java.io.File;
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class LocatedArtifactCache extends ArtifactCacheBase {
+ private static final String PATTERN = "[group]/[name](/[meta_hash])/[version]/[name]-[version](-[classifier])(-[specifier]).[extension]";
+ private final File path;
+
+ public LocatedArtifactCache(File path) {
+ this.path = path;
+ }
+
+ @Override
+ public Artifact.Cached store(Artifact artifact) {
+ return doStore(getPath(artifact), artifact);
+ }
+
+ public File getPath(Artifact artifact) {
+ ArtifactIdentifier identifier = artifact.getIdentifier();
+ Map<String, String> names = Stream.of(
+ entry("group", identifier.getGroup()),
+ entry("name", identifier.getName()),
+ entry("version", identifier.getVersion()),
+ entry("classifier", identifier.getClassifier()),
+ entry("extension", identifier.getExtension()),
+ //entry("specifier", specifier), /?
+ entry("meta_hash", artifact.getMetadata().getHash())
+ ).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+ return new File(path, PatternReplace.replace(PATTERN, names));
+ }
+
+ private static <K,V> Entry<K,V> entry(K key, V value) {
+ return new AbstractMap.SimpleEntry<>(key, value);
+ }
+
+ @Override
+ public String toString() {
+ return "LocatedArtifactCache(" + path + ")";
+ }
+
+}