package com.sap.runlet.abstractinterpreter.objects;
import com.sap.runlet.abstractinterpreter.repository.RepositoryObject;
import com.sap.runlet.abstractinterpreter.repository.SnapshotIdentifier;
/**
* Represents an object that is instance of a class.
*
* @author Axel Uhl (D043530)
*/
public abstract class ClassTypedObject<LinkEndMetaObject, TypeUsage, ClassUsage extends TypeUsage>
extends RunletObject<LinkEndMetaObject, TypeUsage, ClassUsage> implements RepositoryObject {
/**
* Snapshot this object originates from and in which association navigation starting
* at this object shall be interpreter. May be a special {@link SnapshotPointer} that
* means that the object will be interpreted as part of the snapshot that the
* {@link RiverInterpreter interpreter} considers its default snapshot.
*/
private SnapshotIdentifier origin;
private boolean persistent = false;
public ClassTypedObject(ClassUsage type, SnapshotIdentifier snapshot) {
super(type);
assert snapshot != null;
this.origin = snapshot;
}
@SuppressWarnings("unchecked")
@Override
public ClassUsage getType() {
return (ClassUsage) super.getType();
}
@Override
public ClassTypedObject<LinkEndMetaObject, TypeUsage, ClassUsage> getCopyWithOrigin(SnapshotIdentifier snapshotIdentifier) {
ClassTypedObject<LinkEndMetaObject, TypeUsage, ClassUsage> result;
if (getOrigin() != snapshotIdentifier) {
result = this.clone();
result.origin = snapshotIdentifier;
} else {
result = this;
}
return result;
}
@Override
public SnapshotIdentifier getOrigin() {
return origin;
}
@Override
public boolean isPersistent() {
return persistent;
}
@Override
public void setPersistent(boolean persistent) {
this.persistent = persistent;
}
@SuppressWarnings("unchecked")
@Override
public ClassTypedObject<LinkEndMetaObject, TypeUsage, ClassUsage> clone() {
try {
return (ClassTypedObject<LinkEndMetaObject, TypeUsage, ClassUsage>) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Internal error: ClassTypedObject should be cloneable: "+this, e);
}
}
}