package com.buschmais.xo.impl;
import com.buschmais.xo.spi.datastore.DatastorePropertyManager;
import com.buschmais.xo.spi.datastore.DatastoreRelationManager;
import com.buschmais.xo.spi.datastore.DatastoreRelationMetadata;
import com.buschmais.xo.spi.metadata.method.EntityReferencePropertyMethodMetadata;
import com.buschmais.xo.spi.metadata.method.PrimitivePropertyMethodMetadata;
import com.buschmais.xo.spi.metadata.type.RelationTypeMetadata;
public class RelationPropertyManager<Entity, Relation> extends AbstractPropertyManager<Relation> {
private final SessionContext<?, Entity, ?, ?, ?, Relation, ?, ?, ?> sessionContext;
/**
* Constructor.
*
* @param sessionContext The {@link SessionContext}.
*/
public RelationPropertyManager(SessionContext<?, Entity, ?, ?, ?, Relation, ?, ?, ?> sessionContext) {
this.sessionContext = sessionContext;
}
@Override
protected DatastorePropertyManager<Relation, ?> getDatastorePropertyManager() {
return sessionContext.getDatastoreSession().getDatastoreRelationManager();
}
@Override
protected AbstractInstanceManager<?, Relation> getInstanceManager() {
return sessionContext.getRelationInstanceManager();
}
public Entity getEntityReference(Relation relation, EntityReferencePropertyMethodMetadata metadata) {
return sessionContext.getEntityInstanceManager().readInstance(getReferencedEntity(relation, metadata.getDirection()));
}
private Entity getReferencedEntity(Relation relation, RelationTypeMetadata.Direction direction) {
DatastoreRelationManager<Entity, ?, Relation, ? extends DatastoreRelationMetadata<?>, ?, ?> relationManager = sessionContext.getDatastoreSession().getDatastoreRelationManager();
switch (direction) {
case TO:
return relationManager.getTo(relation);
case FROM:
return relationManager.getFrom(relation);
default:
throw direction.createNotSupportedException();
}
}
}