package rocks.inspectit.shared.all.communication;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import org.codehaus.jackson.annotate.JsonIgnore;
import rocks.inspectit.shared.all.cmr.cache.IObjectSizes;
import rocks.inspectit.shared.all.communication.data.ParameterContentData;
import rocks.inspectit.shared.all.indexing.IIndexQuery;
/**
* The {@link MethodSensorData} abstract class is extended by all data & value objects which are
* used for gathered measurements from instrumented methods. Thus an additional identifier is
* necessary to store the unique method identifier.
*
* @author Patrice Bouillet
*
*/
@Entity
public abstract class MethodSensorData extends DefaultData {
/**
* The serial version UID.
*/
private static final long serialVersionUID = 7655082885002510364L;
/**
* The unique identifier of the method.
*/
private long methodIdent;
/**
* Contains optional information about the contents of some fields / parameters etc.
*/
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<ParameterContentData> parameterContentData;
/**
* Default no-args constructor.
*/
public MethodSensorData() {
}
/**
* Constructor which accepts four parameters to initialize itself.
*
* @param timeStamp
* The timestamp.
* @param platformIdent
* The unique identifier of the platform.
* @param sensorTypeIdent
* The unique identifier of the sensor type.
* @param methodIdent
* The unique identifier of the method.
*/
public MethodSensorData(Timestamp timeStamp, long platformIdent, long sensorTypeIdent, long methodIdent) {
super(timeStamp, platformIdent, sensorTypeIdent);
this.methodIdent = methodIdent;
}
/**
* Constructor which accepts four parameters to initialize itself.
*
* @param timeStamp
* The timestamp.
* @param platformIdent
* The unique identifier of the platform.
* @param sensorTypeIdent
* The unique identifier of the sensor type.
* @param methodIdent
* The unique identifier of the method.
* @param parameterContentData
* the parameter contents.
*/
public MethodSensorData(Timestamp timeStamp, long platformIdent, long sensorTypeIdent, long methodIdent, List<ParameterContentData> parameterContentData) {
this(timeStamp, platformIdent, sensorTypeIdent, methodIdent);
if (null != parameterContentData) {
this.parameterContentData = new HashSet<ParameterContentData>(parameterContentData);
}
}
/**
* Gets {@link #methodIdent}.
*
* @return {@link #methodIdent}
*/
public long getMethodIdent() {
return methodIdent;
}
/**
* Sets {@link #methodIdent}.
*
* @param methodIdent
* New value for {@link #methodIdent}
*/
public void setMethodIdent(long methodIdent) {
this.methodIdent = methodIdent;
}
/**
* Adds parameter content data.
*
* @param parameterContent
* the data to add.
*/
public void addParameterContentData(ParameterContentData parameterContent) {
if (null == parameterContentData) {
parameterContentData = new HashSet<ParameterContentData>();
}
parameterContentData.add(parameterContent);
}
/**
* Gets {@link #parameterContentData}.
*
* @return {@link #parameterContentData}
*/
@JsonIgnore
public Set<ParameterContentData> getParameterContentData() {
return parameterContentData;
}
/**
* Sets {@link #parameterContentData}.
*
* @param parameterContentData
* New value for {@link #parameterContentData}
*/
public void setParameterContentData(Set<ParameterContentData> parameterContentData) {
this.parameterContentData = parameterContentData;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = (prime * result) + (int) (methodIdent ^ (methodIdent >>> 32));
result = (prime * result) + ((parameterContentData == null) ? 0 : parameterContentData.hashCode());
return result;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MethodSensorData other = (MethodSensorData) obj;
if (methodIdent != other.methodIdent) {
return false;
}
if (parameterContentData == null) {
if (other.parameterContentData != null) {
return false;
}
} else if (!parameterContentData.equals(other.parameterContentData)) {
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
@Override
public long getObjectSize(IObjectSizes objectSizes, boolean doAlign) {
long size = super.getObjectSize(objectSizes, doAlign);
size += objectSizes.getPrimitiveTypesSize(1, 0, 0, 0, 1, 0);
if (parameterContentData instanceof HashSet) {
size += objectSizes.getSizeOfHashSet(parameterContentData.size(), 0);
for (ParameterContentData paramContentData : parameterContentData) {
size += objectSizes.getSizeOf(paramContentData);
}
}
if (doAlign) {
return objectSizes.alignTo8Bytes(size);
} else {
return size;
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean isQueryComplied(IIndexQuery query) {
if ((query.getMethodIdent() != 0) && (query.getMethodIdent() != methodIdent)) {
return false;
}
return super.isQueryComplied(query);
}
}