package com.ibm.nmon.data.definition;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.data.DataType;
import com.ibm.nmon.data.matcher.FieldMatcher;
import com.ibm.nmon.data.matcher.HostMatcher;
import com.ibm.nmon.data.matcher.TypeMatcher;
import com.ibm.nmon.data.transform.name.NameTransformer;
import com.ibm.nmon.analysis.Statistic;
/**
* <p>
* Standard {@link DataDefintion} that uses various <code>matcher</code> classes to define the data this class will
* match. Data is renamed using various {@link NameTransformer} classes.
* </p>
*
* <p>
* By default, this definition matches all hosts, types and fields; it does no renaming.
* </p>
*
* @see HostMatcher
* @see TypeMatcher
* @see FieldMatcher
* @see NameTransformer
*/
public final class DefaultDataDefinition extends DataDefinition {
/**
* Use this key to specify the <code>NameTransformer</code> to use by default in the rename methods.
*/
public static final String DEFAULT_NAME_TRANSFORMER_KEY = "$ALL";
private Map<String, NameTransformer> hostTransformers;
private Map<String, NameTransformer> typeTransformers;
private Map<String, NameTransformer> fieldTransformers;
private final HostMatcher hostMatcher;
private final TypeMatcher typeMatcher;
private final FieldMatcher fieldMatcher;
public DefaultDataDefinition(HostMatcher hostMatcher, TypeMatcher typeMatcher, FieldMatcher fieldMatcher,
Statistic stat, boolean useSecondaryYAxis) {
super(stat, useSecondaryYAxis);
this.hostMatcher = hostMatcher == null ? HostMatcher.ALL : hostMatcher;
this.typeMatcher = typeMatcher == null ? TypeMatcher.ALL : typeMatcher;
this.fieldMatcher = fieldMatcher == null ? FieldMatcher.ALL : fieldMatcher;
}
private DefaultDataDefinition(DefaultDataDefinition copy, HostMatcher hostMatcher, TypeMatcher typeMatcher,
FieldMatcher fieldMatcher) {
this(hostMatcher, typeMatcher, fieldMatcher, copy.getStatistic(), copy.usesSecondaryYAxis());
this.hostTransformers = copy.hostTransformers == null ? null : new java.util.HashMap<String, NameTransformer>(
copy.hostTransformers);
this.typeTransformers = copy.typeTransformers == null ? null : new java.util.HashMap<String, NameTransformer>(
copy.typeTransformers);
this.fieldTransformers = copy.fieldTransformers == null ? null
: new java.util.HashMap<String, NameTransformer>(copy.fieldTransformers);
}
public void addHostnameTransformer(String hostname, NameTransformer transformer) {
if (transformer != null) {
if (hostTransformers == null) {
hostTransformers = new java.util.HashMap<String, NameTransformer>(2);
}
hostTransformers.put(hostname, transformer);
}
}
public void addTypeTransformer(String typeId, NameTransformer transformer) {
if (transformer != null) {
if (typeTransformers == null) {
typeTransformers = new java.util.HashMap<String, NameTransformer>(2);
}
typeTransformers.put(typeId, transformer);
}
}
public void addFieldTransformer(String field, NameTransformer transformer) {
if (transformer != null) {
if (fieldTransformers == null) {
fieldTransformers = new java.util.HashMap<String, NameTransformer>(2);
}
fieldTransformers.put(field, transformer);
}
}
public HostMatcher getHostMatcher() {
return hostMatcher;
}
public TypeMatcher getTypeMatcher() {
return typeMatcher;
}
public FieldMatcher getFieldMatcher() {
return fieldMatcher;
}
@Override
public boolean matchesHost(DataSet data) {
return hostMatcher.matchesHost(data);
}
@Override
public List<DataSet> getMatchingHosts(Collection<DataSet> toMatch) {
return hostMatcher.getMatchingHosts(toMatch);
}
@Override
public List<DataType> getMatchingTypes(DataSet data) {
return typeMatcher.getMatchingTypes(data);
}
@Override
public List<String> getMatchingFields(DataType type) {
return fieldMatcher.getMatchingFields(type);
}
@Override
public String renameHost(DataSet data) {
String hostname = data.getHostname();
if (hostTransformers != null) {
NameTransformer transformer = hostTransformers.get(hostname);
if (transformer != null) {
return transformer.transform(hostname);
}
else {
transformer = hostTransformers.get(DEFAULT_NAME_TRANSFORMER_KEY);
if (transformer != null) {
return transformer.transform(hostname);
}
else {
return hostname;
}
}
}
else {
return hostname;
}
}
@Override
public String renameType(DataType type) {
String typeId = super.renameType(type);
if (typeTransformers != null) {
NameTransformer transformer = typeTransformers.get(typeId);
if (transformer != null) {
return transformer.transform(typeId);
}
else {
transformer = typeTransformers.get(DEFAULT_NAME_TRANSFORMER_KEY);
if (transformer != null) {
return transformer.transform(typeId);
}
else {
return typeId;
}
}
}
else {
return typeId;
}
}
public String renameField(String field) {
field = super.renameField(field);
if (fieldTransformers != null) {
NameTransformer transformer = fieldTransformers.get(field);
if (transformer != null) {
return transformer.transform(field);
}
else {
transformer = fieldTransformers.get(DEFAULT_NAME_TRANSFORMER_KEY);
if (transformer != null) {
return transformer.transform(field);
}
else {
return field;
}
}
}
else {
return field;
}
}
public DefaultDataDefinition withNewHosts(HostMatcher matcher) {
if (matcher != null) {
if (hostMatcher.equals(matcher)) {
return this;
}
else {
return new DefaultDataDefinition(this, matcher, this.typeMatcher, this.fieldMatcher);
}
}
else {
return this;
}
}
public DefaultDataDefinition withNewTypes(TypeMatcher matcher) {
if (matcher != null) {
if (typeMatcher.equals(matcher)) {
return this;
}
else {
return new DefaultDataDefinition(this, this.hostMatcher, matcher, this.fieldMatcher);
}
}
else {
return this;
}
}
public DefaultDataDefinition withNewFields(FieldMatcher matcher) {
if (matcher != null) {
if (fieldMatcher.equals(matcher)) {
return this;
}
else {
return new DefaultDataDefinition(this, this.hostMatcher, this.typeMatcher, matcher);
}
}
else {
return this;
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(256);
builder.append('{');
builder.append("host: ");
builder.append("match=");
builder.append(hostMatcher);
if (hostTransformers != null) {
builder.append(", ");
builder.append("transforms=");
builder.append(hostTransformers);
}
builder.append("; ");
builder.append("type: ");
builder.append("match=");
builder.append(typeMatcher);
if (typeTransformers != null) {
builder.append(", ");
builder.append("transforms=");
builder.append(typeTransformers);
}
builder.append("; ");
builder.append("field: ");
builder.append("match=");
builder.append(fieldMatcher);
if (fieldTransformers != null) {
builder.append(", ");
builder.append("transforms=");
builder.append(fieldTransformers);
}
if (!Statistic.AVERAGE.equals(getStatistic())) {
builder.append("; ");
builder.append("stat=");
builder.append(getStatistic());
}
builder.append('}');
return builder.toString();
}
}