aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/schema/DistributableResource.java
blob: 0bdbf7c0e6eda19fffcf280b19afaa9ff9bcbc58 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.schema;

import com.yahoo.config.FileReference;
import com.yahoo.config.application.api.FileRegistry;
import com.yahoo.path.Path;

import java.nio.ByteBuffer;
import java.util.Objects;

public class DistributableResource implements Comparable <DistributableResource>, Cloneable {

    public enum PathType { FILE, URI, BLOB }

    /** The search definition-unique name of this constant */
    private final String name;
    // TODO: Make path/pathType final
    private PathType pathType;
    private String path;
    private FileReference fileReference = new FileReference("");

    public PathType getPathType() {
        return pathType;
    }

    public DistributableResource(String name) {
        this(name, null, PathType.FILE);
    }
    public DistributableResource(String name, String path) {
        this(name, path, PathType.FILE);
    }
    public DistributableResource(String name, String path, PathType type) {
        this.name = name;
        this.path = path;
        this.pathType = type;
    }

    @Override
    public DistributableResource clone() throws CloneNotSupportedException {
        return (DistributableResource) super.clone();
    }

    // TODO: Remove and make path/pathType final
    public void setFileName(String fileName) {
        Objects.requireNonNull(fileName, "Filename cannot be null");
        this.path = fileName;
        this.pathType = PathType.FILE;
    }

    // TODO: Remove and make path/pathType final
    public void setUri(String uri) {
        Objects.requireNonNull(uri, "uri cannot be null");
        this.path = uri;
        this.pathType = PathType.URI;
    }

    public String getName() { return name; }
    public String getFileName() { return path; }
    public Path getFilePath() { return Path.fromString(path); }
    public String getUri() { return path; }
    public String getFileReference() { return fileReference.value(); }

    public void validate() {
        switch (pathType) {
            case FILE:
            case URI:
                if (path == null || path.isEmpty())
                    throw new IllegalArgumentException("Distributable URI/FILE resource must have a file or uri.");
                break;
        }
    }

    public void register(FileRegistry fileRegistry) {
        switch (pathType) {
            case FILE -> fileReference = fileRegistry.addFile(path);
            case URI -> fileReference = fileRegistry.addUri(path);
            default -> throw new IllegalArgumentException("Unknown path type " + pathType);
        }
    }

    protected void register(FileRegistry fileRegistry, ByteBuffer blob) {
        fileReference = fileRegistry.addBlob(path, blob);
    }

    @Override
    public String toString() {
        return "resource '" + name + " of type '" + pathType + "' with ref '" + fileReference + "'";
    }

    @Override
    public int compareTo(DistributableResource o) {
        return name.compareTo(o.getName());
    }

}