summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/DistributableResource.java
blob: ffa9cbe9ba5de4ee1d5389cf898d3cf488f4ca99 (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
package com.yahoo.searchdefinition;

import com.yahoo.config.FileReference;
import com.yahoo.path.Path;
import com.yahoo.vespa.model.AbstractService;
import com.yahoo.vespa.model.utils.FileSender;

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

public class DistributableResource {
    public enum PathType { FILE, URI, BLOB };

    /** The search definition-unique name of this constant */
    private final String name;
    private final ByteBuffer blob;
    private String path;
    private String fileReference = "";
    private PathType pathType = PathType.FILE;

    public PathType getPathType() {
        return pathType;
    }

    public DistributableResource(String name) {
        this.name = name;
        blob = null;
    }
    public DistributableResource(String name, String path) {
        this.name = name;
        this.path = path;
        blob = null;
    }
    public DistributableResource(String name, ByteBuffer blob) {
        Objects.requireNonNull(name, "Blob name cannot be null");
        Objects.requireNonNull(blob, "Blob cannot be null");
        this.name = name;
        this.blob = blob;
        pathType = PathType.BLOB;
    }

    public void setFileName(String fileName) {
        Objects.requireNonNull(fileName, "Filename cannot be null");
        this.path = fileName;
        this.pathType = PathType.FILE;
    }

    public void setUri(String uri) {
        Objects.requireNonNull(uri, "uri cannot be null");
        this.path = uri;
        this.pathType = PathType.URI;
    }

    /** Initiate sending of this constant to some services over file distribution */
    public void sendTo(Collection<? extends AbstractService> services) {
        fileReference = sendToServices(services).value();
    }
    private FileReference sendToServices(Collection<? extends AbstractService> services) {
        switch (pathType) {
            case FILE:
                return FileSender.sendFileToServices(path, services);
            case URI:
                return FileSender.sendUriToServices(path, services);
            case BLOB:
                return FileSender.sendBlobToServices(blob, services);
        }
        throw new IllegalArgumentException("Unknown path type " + pathType);
    }

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

    public void validate() {
        if (path == null || path.isEmpty())
            throw new IllegalArgumentException("Distributable resource must have a file or uri.");
    }

    public String toString() {
        StringBuilder b = new StringBuilder();
        b.append("resource '").append(name).append(" of type '").append(pathType)
                .append("' with ref '").append(fileReference).append("'");
        return b.toString();
    }
}