package org.infinispan.scripting.impl; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Collections; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import org.infinispan.commons.marshall.AbstractExternalizer; import org.infinispan.container.versioning.EntryVersion; import org.infinispan.metadata.Metadata; /** * ScriptMetadata. Holds meta information about a script obtained either implicitly by the script * name and extension, or explicitly by its header. See the "Script metadata" chapter in the User Guide for * the syntax and format. * * @author Tristan Tarrant * @since 7.2 */ public class ScriptMetadata implements Metadata { private final String name; private final ExecutionMode mode; private final String extension; private final Set<String> parameters; private final Optional<String> language; private final Optional<String> role; private final Optional<String> reducer; private final Optional<String> collator; private final Optional<String> combiner; private final DataType dataType; ScriptMetadata(String name, Optional<String> language, String extension, ExecutionMode mode, Set<String> parameters, Optional<String> role, Optional<String> reducer, Optional<String> collator, Optional<String> combiner, DataType dataType) { this.name = name; this.language = language; this.extension = extension; this.mode = mode; this.parameters = Collections.unmodifiableSet(parameters); this.role = role; this.reducer = reducer; this.collator = collator; this.combiner = combiner; this.dataType = dataType; } public Optional<String> language() { return language; } public String extension() { return extension; } public Set<String> parameters() { return parameters; } public Optional<String> role() { return role; } public String name() { return name; } public ExecutionMode mode() { return mode; } public Optional<String> reducer() { return reducer; } public Optional<String> combiner() { return combiner; } public Optional<String> collator() { return collator; } public DataType dataType() { return dataType; } @Override public long lifespan() { return -1; } @Override public long maxIdle() { return -1; } @Override public EntryVersion version() { return null; } @Override public Builder builder() { return new Builder().name(name).extension(extension).mode(mode).parameters(parameters); } @Override public String toString() { return "ScriptMetadata [name=" + name + ", language=" + language + ", mode=" + mode + ", extension=" + extension + ", parameters=" + parameters + ", role=" + role + ", reducer=" + reducer + ", collator=" + collator + ", combiner=" + combiner + "]"; } public static class Builder implements Metadata.Builder { String name; String extension; Optional<String> language = Optional.empty(); ExecutionMode mode; Set<String> parameters = Collections.emptySet(); Optional<String> role = Optional.empty(); Optional<String> combiner = Optional.empty(); Optional<String> collator = Optional.empty(); Optional<String> reducer = Optional.empty(); DataType dataType = DataType.DEFAULT; public ScriptMetadata.Builder name(String name) { this.name = name; return this; } public ScriptMetadata.Builder mode(ExecutionMode mode) { this.mode = mode; return this; } public ScriptMetadata.Builder extension(String extension) { this.extension = extension; return this; } public ScriptMetadata.Builder language(String language) { this.language = Optional.of(language); return this; } public ScriptMetadata.Builder parameters(Set<String> parameters) { this.parameters = parameters; return this; } public ScriptMetadata.Builder role(String role) { this.role = Optional.of(role); return this; } public ScriptMetadata.Builder reducer(String reducer) { this.reducer = Optional.of(reducer); return this; } public ScriptMetadata.Builder collator(String collator) { this.collator = Optional.of(collator); return this; } public ScriptMetadata.Builder combiner(String combiner) { this.combiner = Optional.of(combiner); return this; } public ScriptMetadata.Builder dataType(DataType dataType) { this.dataType = dataType; return this; } @Override public ScriptMetadata.Builder lifespan(long time, TimeUnit unit) { return this; } @Override public ScriptMetadata.Builder lifespan(long time) { return this; } @Override public ScriptMetadata.Builder maxIdle(long time, TimeUnit unit) { return this; } @Override public ScriptMetadata.Builder maxIdle(long time) { return this; } @Override public ScriptMetadata.Builder version(EntryVersion version) { return this; } @Override public ScriptMetadata build() { return new ScriptMetadata(name, language, extension, mode, parameters, role, reducer, collator, combiner, dataType); } @Override public ScriptMetadata.Builder merge(Metadata metadata) { return this; } } public static class Externalizer extends AbstractExternalizer<ScriptMetadata> { /** The serialVersionUID */ private static final long serialVersionUID = 6882540247700043640L; public Externalizer() { } @Override public Integer getId() { return ExternalizerIds.SCRIPT_METADATA; } @Override public Set<Class<? extends ScriptMetadata>> getTypeClasses() { return Collections.singleton(ScriptMetadata.class); } @Override public void writeObject(ObjectOutput output, ScriptMetadata object) throws IOException { output.writeUTF(object.name); output.writeUTF(object.extension); output.writeUTF(object.mode.name()); output.writeObject(object.parameters); output.writeObject(object.language); output.writeObject(object.role); output.writeObject(object.reducer); output.writeObject(object.collator); output.writeObject(object.combiner); output.writeObject(object.dataType); } @Override public ScriptMetadata readObject(ObjectInput input) throws IOException, ClassNotFoundException { String name = input.readUTF(); String extension = input.readUTF(); ExecutionMode mode = ExecutionMode.valueOf(input.readUTF()); Set<String> parameters = (Set<String>) input.readObject(); Optional<String> language = (Optional<String>) input.readObject(); Optional<String> role = (Optional<String>) input.readObject(); Optional<String> reducer = (Optional<String>) input.readObject(); Optional<String> collator = (Optional<String>) input.readObject(); Optional<String> combiner = (Optional<String>) input.readObject(); DataType dataType = (DataType) input.readObject(); return new ScriptMetadata(name, language, extension, mode, parameters, role, reducer, collator, combiner, dataType); } } }