package io.pcp.parfait.dxm;
import io.pcp.parfait.dxm.semantics.Semantics;
import io.pcp.parfait.dxm.types.TypeHandler;
import javax.measure.Unit;
import java.io.IOException;
import java.nio.ByteBuffer;
public interface PcpWriter {
/**
* Adds a new metric to the writer, with an initial default value. Uses the default
* {@link TypeHandler} based on the runtime type of the initialValue parameter.
*
* @param name
* the name of the metric to export. Must not exceed any byte-length limits specified
* by the implementation
* @param semantics
* the PCP semantics of the metric
* @param unit
* the unit used to measure the metric.
* @param initialValue
* the 'default' value to write into the file at initialisation time
* @throws IllegalArgumentException
* if the name is too long, the metric name has already been added, or this is no
* type handler registered for the runtime class of the initial value
* @throws IllegalStateException
* if this writer has already been started, finalising the file layout
*/
public abstract void addMetric(MetricName name, Semantics semantics, Unit<?> unit,
Object initialValue);
/**
* Adds a new metric to the writer, with an initial default value. Uses the default
* {@link TypeHandler} based on the runtime type of the initialValue parameter.
*
* @param name
* the name of the metric to export. Must not exceed any byte-length limits specified
* by the implementation
* @param semantics
* the PCP semantics of the metric
* @param unit
* the unit used to measure the metric.
* @param initialValue
* the 'default' value to write into the file at initialisation time
* @param pcpType
* the type converter to use to render the initial value (and all subsequent values)
* to the PCP stream
* @throws IllegalArgumentException
* if the name is too long or the metric name has already been added
* @throws IllegalStateException
* if this writer has already been started, finalising the file layout
*/
public abstract <T> void addMetric(MetricName name, Semantics semantics, Unit<?> unit,
T initialValue, TypeHandler<T> pcpType);
/**
* Updates the metric value of the given metric, once the writer has been started
*
* @param name
* the metric to update
* @param value
* the new value (must be convertible by the {@link TypeHandler} used when adding the
* metric)
*/
public abstract void updateMetric(MetricName name, Object value);
/**
* Registers a new {@link TypeHandler} to be used to convert all subsequent values of type
* runtimeClass
*
* @param runtimeClass
* the class to be converted by the new handler
* @param handler
* the handler to use
*/
public abstract <T> void registerType(Class<T> runtimeClass,
TypeHandler<T> handler);
/**
* Starts the Writer, freezing the file format and writing out the metadata and initial values.
*
* @throws IOException
* if the file cannot be created or written.
*/
public abstract void start() throws IOException;
/**
* Sets the help text associated with an instance domain.
*
* @param instanceDomain
* Java pseudo-instance domain identifier (i.e. metric prefix; for
* animals.dog[xxx].size this is the 'animals.dog' part)
* @param shortHelpText
* the short help text; must not exceed any length limits specified by the
* implementation
* @param longHelpText
* the long explanatory text; must not exceed any length limits specified by the
* implementation
*/
public void setInstanceDomainHelpText(String instanceDomain, String shortHelpText, String longHelpText);
/**
* Sets the help text associated with a particular metric
*
* @param metricName
* String version of the metric name, ignoring any possible instance domains. (e.g. for
* animals.dog[xxx].size this is 'animals.dog.size')
* @param shortHelpText
* the short help text; must not exceed any length limits specified by the
* implementation
* @param longHelpText
* the long explanatory text; must not exceed any length limits specified by the
* implementation
*/
public void setMetricHelpText(String metricName, String shortHelpText, String longHelpText);
/**
* Prepares this object such that it can be restarted by invoking the {@link #start()} method
* again.
*/
public void reset();
}